示例#1
0
        /// <summary>
        ///
        /// </summary>
        /// <typeparam name="V"></typeparam>
        /// <typeparam name="E"></typeparam>
        /// <typeparam name="F"></typeparam>
        /// <param name="mesh"></param>
        private static void QuadSplitTopology <V, E, F>(HeMeshBase <V, E, F> mesh)
            where V : HeVertex <V, E, F>
            where E : Halfedge <V, E, F>
            where F : HeFace <V, E, F>
        {
            var verts  = mesh.Vertices;
            var hedges = mesh.Halfedges;
            var faces  = mesh.Faces;

            int ne = hedges.Count >> 1;
            int nf = faces.Count;

            int ev0 = verts.Count - ne; // index of first edge vertex
            int fv0 = ev0 - nf;         // index of first face vertex (also the number of vertices in the initial mesh)

            // split edges
            for (int i = 0; i < ne; i++)
            {
                var he = hedges[i << 1];
                if (he.IsRemoved)
                {
                    continue;
                }

                var ev = verts[i + ev0];
                mesh.SplitEdgeImpl(he, ev);
            }

            // split faces
            for (int i = 0; i < nf; i++)
            {
                var f = faces[i];
                if (f.IsRemoved)
                {
                    continue;
                }

                var he = f.First;
                if (he.Start.Index >= fv0)
                {
                    he = he.PrevInFace;                        // ensure halfedge starts from an old vertex
                }
                mesh.QuadSplitFace(he, verts[i + fv0]);
            }
        }