コード例 #1
0
        public HalfEdge Split(Vertex midpoint)
        {
            Mesh.InformSplitMidpointBegin(this, midpoint);

            if (midpoint.Equals(End) || midpoint.Equals(Twin.End))
            {
                return(this);
            }

            var a = Twin.End;
            var m = midpoint;
            var b = End;

            Twin.End = m;
            var bm = Twin;
            var mb = this;

            var am = Mesh.GetEdge(a, m, Face, Face == null ? null : mb, mb.Twin.Face, mb.Twin.Next);
            var ma = am.Twin;

            if (Face != null)
            {
                bm.Next = ma;
                Face.Edges.Where(e => e.Next == this).First().Next = am;
            }

            if (Twin.Face != null)
            {
                Twin.Face.Edges.Where(e => e.Next == Twin).First().Next = bm;
            }

            Mesh.InformSplitMidpointEnd(this, midpoint);

            return(am);
        }
コード例 #2
0
ファイル: Face.cs プロジェクト: wangzhefeng2000/GeometrySharp
        /// <summary>
        /// Inserts a midpoint into this face
        /// Deletes this face
        /// </summary>
        /// <param name="midpoint">The midpoint.</param>
        public void InsertMidpoint(Vertex midpoint)
        {
            Mesh.InformSplitMidpointBegin(this, midpoint);

            var edges = Edges.ToArray();

            Delete();

            for (int i = 0; i < edges.Length; i++)
            {
                var v1 = edges[i].End;
                var v2 = edges[(i + 1) % edges.Length].End;
                Mesh.GetFace(v1, v2, midpoint);
            }

            Mesh.InformSplitMidpointEnd(this, midpoint);
        }