public static void basic_tests() { DMesh3 mesh = TestUtil.LoadTestInputMesh("three_edge_crack.obj"); MergeCoincidentEdges merge = new MergeCoincidentEdges(mesh); merge.Apply(); Util.gDevAssert(mesh.BoundaryEdgeIndices().Count() == 0); mesh.CheckValidity(true, FailMode.DebugAssert); TestUtil.WriteTestOutputMesh(mesh, "three_edge_crack_merged.obj"); DMesh3 mesh2 = TestUtil.LoadTestInputMesh("crack_loop.obj"); MergeCoincidentEdges merge2 = new MergeCoincidentEdges(mesh2); merge2.Apply(); Util.gDevAssert(mesh2.BoundaryEdgeIndices().Count() == 0); mesh2.CheckValidity(true, FailMode.DebugAssert); TestUtil.WriteTestOutputMesh(mesh2, "crack_loop_merged.obj"); DMesh3 mesh3 = TestUtil.LoadTestInputMesh("cracks_many.obj"); MergeCoincidentEdges merge3 = new MergeCoincidentEdges(mesh3); merge3.Apply(); Util.gDevAssert(mesh3.BoundaryEdgeIndices().Count() == 0); mesh3.CheckValidity(true, FailMode.DebugAssert); TestUtil.WriteTestOutputMesh(mesh3, "cracks_many_merged.obj"); DMesh3 mesh4 = TestUtil.LoadTestInputMesh("cracks_duplicate_edge.obj"); MergeCoincidentEdges merge4 = new MergeCoincidentEdges(mesh4); merge4.Apply(); Util.gDevAssert(mesh4.BoundaryEdgeIndices().Count() == 0); mesh4.CheckValidity(true, FailMode.DebugAssert); TestUtil.WriteTestOutputMesh(mesh4, "cracks_duplicate_edge_merged.obj"); }
public static void merge_test_closed_mesh() { DMesh3 mesh = TestUtil.MakeCappedCylinder(true, 4); mesh.CheckValidity(); DMesh3.MergeEdgesInfo info; int merges = 0; while (true) { List <int> be = new List <int>(mesh.BoundaryEdgeIndices()); if (be.Count == 0) { break; } int ea = be[0]; int eo = find_pair_edge(mesh, ea, be); if (eo != DMesh3.InvalidID) { var result = mesh.MergeEdges(ea, eo, out info); Util.gDevAssert(result == MeshResult.Ok); TestUtil.WriteTestOutputMesh(mesh, "after_last_merge.obj"); mesh.CheckValidity(); merges++; } } mesh.CheckValidity(); DMesh3 originalMesh = TestUtil.LoadTestInputMesh("three_edge_crack.obj"); List <int> bdryedges = new List <int>(originalMesh.BoundaryEdgeIndices()); for (int k = 0; k < bdryedges.Count; ++k) { DMesh3 copyMesh = new DMesh3(originalMesh); List <int> be = new List <int>(copyMesh.BoundaryEdgeIndices()); int ea = be[k]; int eo = find_pair_edge(copyMesh, ea, be); if (eo != DMesh3.InvalidID) { var result = copyMesh.MergeEdges(ea, eo, out info); Util.gDevAssert(result == MeshResult.Ok); if (k == 3) { TestUtil.WriteTestOutputMesh(copyMesh, "after_last_merge.obj"); } mesh.CheckValidity(); } } // this should fail at every edge because it would create bad-orientation edges DMesh3 dupeMesh = TestUtil.LoadTestInputMesh("duplicate_4tris.obj"); List <int> dupeBE = new List <int>(dupeMesh.BoundaryEdgeIndices()); for (int k = 0; k < dupeBE.Count; ++k) { int ea = dupeBE[k]; int eo = find_pair_edge(dupeMesh, ea, dupeBE); if (eo != DMesh3.InvalidID) { var result = dupeMesh.MergeEdges(ea, eo, out info); Util.gDevAssert(result == MeshResult.Failed_SameOrientation); mesh.CheckValidity(); TestUtil.WriteTestOutputMesh(dupeMesh, "after_last_merge.obj"); } } }