예제 #1
0
        /// <summary>
        /// Split edge in half
        /// </summary>
        /// <param name="m">Polymesh</param>
        /// <param name="eh">Edge Handle</param>
        /// <returns>New Half-edge Handle for the new Edge</returns>
        public static int SplitEdge(PolyMesh m, int eh)
        {
            int heh     = m.GetHalfedgeEdgeH(eh, 0);
            int opp_heh = m.GetHalfedgeEdgeH(eh, 1);

            int new_heh, opp_new_heh, t_heh;
            int vh, vh1 = m.GetEndVertexH(heh);

            Vector3 midP = m.GetPoint(vh1);

            midP += m.GetPoint(m.GetEndVertexH(opp_heh));
            midP *= 0.5f;

            // new vertex
            vh = m.AddVertex(midP);

            // Re-link mesh entities
            if (m.IsBoundaryEdge(eh))
            {
                for (t_heh = heh;
                     m.GetNextHalfedgeH(t_heh) != opp_heh;
                     t_heh = m.GetOppositeHalfedgeH(m.GetNextHalfedgeH(t_heh)))
                {
                }
            }
            else
            {
                for (t_heh = m.GetNextHalfedgeH(opp_heh);
                     m.GetNextHalfedgeH(t_heh) != opp_heh;
                     t_heh = m.GetNextHalfedgeH(t_heh))
                {
                }
            }

            new_heh     = m.NewEdge(vh, vh1);
            opp_new_heh = m.GetOppositeHalfedgeH(new_heh);
            m.SetVertexH(heh, vh);

            m.SetNextHalfedgeH(t_heh, opp_new_heh);
            m.SetNextHalfedgeH(new_heh, m.GetNextHalfedgeH(heh));
            m.SetNextHalfedgeH(heh, new_heh);
            m.SetNextHalfedgeH(opp_new_heh, opp_heh);

            if (m.GetFaceH(opp_heh).isValidHandle())
            {
                m.SetFaceH(opp_new_heh, m.GetFaceH(opp_heh));
                m.SetHalfedgeFaceH(m.GetFaceH(opp_new_heh), opp_new_heh);
            }

            m.SetFaceH(new_heh, m.GetFaceH(heh));
            m.SetHalfedgeVertexH(vh, new_heh);
            m.SetHalfedgeFaceH(m.GetFaceH(heh), heh);
            m.SetHalfedgeVertexH(vh1, opp_new_heh);

            // Never forget this, when playing with the topology
            m.AdjustOutgoingHalfedge(vh);
            m.AdjustOutgoingHalfedge(vh1);

            return(new_heh);
        }
        public void TestSubPolygon()
        {
            var meshPoints = new[]
            {
                new V3d(5719.47607421875, 10842.48046875, 269.109008789063),
                new V3d(5719.47607421875, 10600.814453125, 269.109008789063),
                new V3d(5719.623046875, 10603.544921875, 271.355010986328),
                new V3d(5719.8662109375, 10608.0615234375, 275.071990966797),
                new V3d(5720.8759765625, 10634.0517578125, 290.489990234375),
                new V3d(5721.4921875, 10657.4775390625, 299.914001464844),
                new V3d(5721.494140625, 10657.50390625, 299.924011230469),
                new V3d(5721.494140625, 10603.6572265625, 299.924011230469),
                new V3d(5721.4921875, 10603.63671875, 299.912994384766),
                new V3d(5721.13623046875, 10594.4521484375, 294.463989257813),
                new V3d(5719.72802734375, 10568.3193359375, 272.963989257813),
                new V3d(5719.47607421875, 10564.873046875, 269.109008789063),
                new V3d(5719.47607421875, 10554.31640625, 269.109008789063),
                new V3d(5721.4921875, 10581.8486328125, 299.912994384766),
                new V3d(5721.494140625, 10581.859375, 299.924011230469),
                new V3d(5721.494140625, 10550.1767578125, 299.924011230469),
                new V3d(5719.51806640625, 10523.21484375, 269.760009765625),
                new V3d(5719.47607421875, 10522.423828125, 269.109008789063),
                new V3d(5719.47607421875, 10498.8857421875, 269.109008789063),
                new V3d(5719.93408203125, 10510.69140625, 276.111999511719),
                new V3d(5721.4912109375, 10539.62109375, 299.911987304688),
                new V3d(5721.4921875, 10581.8486328125, 299.912994384766),
                new V3d(5721.4921875, 10603.63671875, 299.912994384766),
                new V3d(5721.4921875, 10657.4775390625, 299.914001464844),
                new V3d(5721.4921875, 10785.8115234375, 299.915985107422),
                new V3d(5720.8759765625, 10809.2421875, 290.489990234375),
                new V3d(5719.8662109375, 10835.232421875, 275.071990966797),
                new V3d(5719.623046875, 10839.7490234375, 271.355010986328)
            };

            var mesh = new PolyMesh();

            foreach (var p in meshPoints)
            {
                mesh.AddVertex(p);
            }

            mesh.AddFace(0.UpToExclusive(meshPoints.Length).ToArray());

            var triangleMesh = mesh.TriangulatedCopy();

            // Requirement 1: should not crash

            // Requirement 2: valid polygon / TODO
            Assert.That(triangleMesh.FaceCount > 0);
        }