void optimize_mesh(DMesh3 mesh) { Reducer reducer = new Reducer(mesh); MeshConstraints constraints = new MeshConstraints(); MeshConstraintUtil.FixAllBoundaryEdges(constraints, mesh); reducer.SetExternalConstraints(constraints); reducer.ReduceToTriangleCount(1); Vector3d a, b, c, d; a = b = c = d = Vector3d.Zero; bool done = false; while (!done) { done = true; for (int eid = 0; eid < mesh.MaxEdgeID; ++eid) { if (mesh.IsEdge(eid) == false) { continue; } Index4i evt = mesh.GetEdge(eid); if (evt.d == DMesh3.InvalidID) { continue; } a = mesh.GetVertex(evt.a); b = mesh.GetVertex(evt.b); Index2i ov = mesh.GetEdgeOpposingV(eid); c = mesh.GetVertex(ov.a); d = mesh.GetVertex(ov.b); if (c.DistanceSquared(d) > a.DistanceSquared(b)) { continue; } if (MeshUtil.CheckIfEdgeFlipCreatesFlip(mesh, eid)) { continue; } DMesh3.EdgeFlipInfo flipInfo; if (mesh.FlipEdge(eid, out flipInfo) == MeshResult.Ok) { done = false; } } } }
bool Sort(ref int v0, ref int v1, ref int v2, ref int v3) { int j0, j1, j2, j3; bool positive; if (v0 < v1) { if (v2 < v3) { if (v1 < v2) { j0 = 0; j1 = 1; j2 = 2; j3 = 3; positive = true; } else if (v3 < v0) { j0 = 2; j1 = 3; j2 = 0; j3 = 1; positive = true; } else if (v2 < v0) { if (v3 < v1) { j0 = 2; j1 = 0; j2 = 3; j3 = 1; positive = false; } else { j0 = 2; j1 = 0; j2 = 1; j3 = 3; positive = true; } } else { if (v3 < v1) { j0 = 0; j1 = 2; j2 = 3; j3 = 1; positive = true; } else { j0 = 0; j1 = 2; j2 = 1; j3 = 3; positive = false; } } } else { if (v1 < v3) { j0 = 0; j1 = 1; j2 = 3; j3 = 2; positive = false; } else if (v2 < v0) { j0 = 3; j1 = 2; j2 = 0; j3 = 1; positive = false; } else if (v3 < v0) { if (v2 < v1) { j0 = 3; j1 = 0; j2 = 2; j3 = 1; positive = true; } else { j0 = 3; j1 = 0; j2 = 1; j3 = 2; positive = false; } } else { if (v2 < v1) { j0 = 0; j1 = 3; j2 = 2; j3 = 1; positive = false; } else { j0 = 0; j1 = 3; j2 = 1; j3 = 2; positive = true; } } } } else { if (v2 < v3) { if (v0 < v2) { j0 = 1; j1 = 0; j2 = 2; j3 = 3; positive = false; } else if (v3 < v1) { j0 = 2; j1 = 3; j2 = 1; j3 = 0; positive = false; } else if (v2 < v1) { if (v3 < v0) { j0 = 2; j1 = 1; j2 = 3; j3 = 0; positive = true; } else { j0 = 2; j1 = 1; j2 = 0; j3 = 3; positive = false; } } else { if (v3 < v0) { j0 = 1; j1 = 2; j2 = 3; j3 = 0; positive = false; } else { j0 = 1; j1 = 2; j2 = 0; j3 = 3; positive = true; } } } else { if (v0 < v3) { j0 = 1; j1 = 0; j2 = 3; j3 = 2; positive = true; } else if (v2 < v1) { j0 = 3; j1 = 2; j2 = 1; j3 = 0; positive = true; } else if (v3 < v1) { if (v2 < v0) { j0 = 3; j1 = 1; j2 = 2; j3 = 0; positive = false; } else { j0 = 3; j1 = 1; j2 = 0; j3 = 2; positive = true; } } else { if (v2 < v0) { j0 = 1; j1 = 3; j2 = 2; j3 = 0; positive = true; } else { j0 = 1; j1 = 3; j2 = 0; j3 = 2; positive = false; } } } } Index4i value = new Index4i(v0, v1, v2, v3); v0 = value[j0]; v1 = value[j1]; v2 = value[j2]; v3 = value[j3]; return(positive); }