Exemplo n.º 1
0
        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");
        }
Exemplo n.º 2
0
        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");
                }
            }
        }