Esempio n. 1
0
        /// <summary>
        /// Split the face with Corner Cutting
        /// </summary>
        /// <param name="m">Polymesh</param>
        /// <param name="heh">Half-edge for the Face</param>
        /// <returns>New Face Handle</returns>
        public static int CornerCutting(PolyMesh m, int heh)
        {
            int heh1 = heh,
                heh5 = heh1,
                heh6 = m.GetNextHalfedgeH(heh1);

            // Cycle around the polygon to find correct Halfedge
            for (; m.GetNextHalfedgeH(m.GetNextHalfedgeH(heh5)) != heh1;
                 heh5 = m.GetNextHalfedgeH(heh5))
            {
            }

            int vh1 = m.GetEndVertexH(heh1),
                vh2 = m.GetEndVertexH(heh5);

            int heh2 = m.GetNextHalfedgeH(heh5),
                heh3 = m.NewEdge(vh1, vh2),
                heh4 = m.GetOppositeHalfedgeH(heh3);

            /* Intermediate result
             *
             *            *
             *         5 /|\
             *          /_  \
             *    vh2> *     *
             *        /|\3   |\
             *     2 /_  \|4   \
             *      *----\*----\*
             *          1 ^   6
             *            vh1 (adjust_outgoing half - edge!)
             */

            // Old and new Face
            int fh_old = m.GetFaceH(heh6);
            int fh_new = m.NewFace();

            // Re-Set Handles around old Face
            m.SetNextHalfedgeH(heh4, heh6);
            m.SetNextHalfedgeH(heh5, heh4);

            m.SetFaceH(heh4, fh_old);
            m.SetFaceH(heh5, fh_old);
            m.SetFaceH(heh6, fh_old);
            m.SetHalfedgeFaceH(fh_old, heh4);

            // Re-Set Handles around new Face
            m.SetNextHalfedgeH(heh1, heh3);
            m.SetNextHalfedgeH(heh3, heh2);

            m.SetFaceH(heh1, fh_new);
            m.SetFaceH(heh2, fh_new);
            m.SetFaceH(heh3, fh_new);

            m.SetHalfedgeFaceH(fh_new, heh1);
            return(fh_new);
        }
Esempio n. 2
0
        public static Vector3 ComputeMidPoint(PolyMesh m, int heh)
        {
            var     opp_heh = m.GetOppositeHalfedgeH(heh);
            Vector3 pos     = m.GetPoint(m.GetEndVertexH(heh));

            pos += m.GetPoint(m.GetEndVertexH(opp_heh));
            if (m.IsBoundaryHalfedge(heh) || m.IsBoundaryHalfedge(opp_heh))
            {
                return(pos * 0.5f);
            }
            else
            {
                pos *= 3.0f;
                pos += m.GetPoint(m.GetEndVertexH(m.GetNextHalfedgeH(heh)));
                pos += m.GetPoint(m.GetEndVertexH(m.GetNextHalfedgeH(opp_heh)));
                pos *= 0.125f;
            }
            return(pos);
        }
Esempio n. 3
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);
        }