示例#1
0
        public void Split(EdgeContext ctx)
        {
            TriMesh.HalfEdge[] hfs = this.FindGroup(ctx.Left, ctx.Top, ctx.Buttom);

            TriMesh mesh = (TriMesh)ctx.Left.Mesh;

            ctx.Left.Traits.Position = ctx.LeftPos;

            ctx.Left.HalfEdge = hfs[0];

            ctx.Right.HalfEdge = hfs[1];
            mesh.Add(ctx.Right);

            for (int i = 0; i < hfs.Length - 1; i++)
            {
                hfs[i].Opposite.ToVertex = ctx.Right;
            }

            TriMesh.HalfEdge[] triangle1 = this.AddInnerTriangle(mesh, ctx.AboveFace, ctx.Left, ctx.Right, ctx.Top);
            this.InsertEdge(mesh, ctx.TopLeftEdge, triangle1[1], hfs[0]);

            TriMesh.HalfEdge[] triangle2 = this.AddInnerTriangle(mesh, ctx.UnderFace, ctx.Right, ctx.Left, ctx.Buttom);
            this.InsertEdge(mesh, ctx.ButtomRightEdge, triangle2[1], hfs[hfs.Length - 1]);

            ctx.MidEdge.HalfEdge0 = triangle2[0];
            triangle1[0].Edge     = ctx.MidEdge;
            triangle2[0].Edge     = ctx.MidEdge;
            triangle1[0].Opposite = triangle2[0];
            triangle2[0].Opposite = triangle1[0];
            mesh.Add(ctx.MidEdge);
        }
示例#2
0
        private TriMesh.HalfEdge[] AddInnerTriangle(TriMesh mesh, TriMesh.Face face, params TriMesh.Vertex[] verteces)
        {
            mesh.Add(face);

            TriMesh.HalfEdge[] hfs = new TriMesh.HalfEdge[3];
            for (int i = 0; i < hfs.Length; i++)
            {
                hfs[i] = new TriMesh.HalfEdge();
                hfs[i].ToVertex = verteces[(i + 1) % hfs.Length];
                hfs[i].Face = face;
                mesh.AppendToHalfedgeList(hfs[i]);
            }
            face.HalfEdge = hfs[0];
            this.ConnectHalfEdge(hfs);
            return hfs;
        }
示例#3
0
        private TriMesh.HalfEdge[] AddInnerTriangle(TriMesh mesh, TriMesh.Face face, params TriMesh.Vertex[] verteces)
        {
            mesh.Add(face);

            TriMesh.HalfEdge[] hfs = new TriMesh.HalfEdge[3];
            for (int i = 0; i < hfs.Length; i++)
            {
                hfs[i]          = new TriMesh.HalfEdge();
                hfs[i].ToVertex = verteces[(i + 1) % hfs.Length];
                hfs[i].Face     = face;
                mesh.AppendToHalfedgeList(hfs[i]);
            }
            face.HalfEdge = hfs[0];
            this.ConnectHalfEdge(hfs);
            return(hfs);
        }
示例#4
0
        private void InsertEdge(TriMesh mesh, TriMesh.Edge edge, TriMesh.HalfEdge inner, TriMesh.HalfEdge outer)
        {
            TriMesh.Edge left = edge;
            left.HalfEdge0  = outer;
            outer.Edge      = left;
            inner.Next.Edge = left;

            TriMesh.Edge right = outer.Edge;
            right.HalfEdge0     = inner;
            inner.Edge          = right;
            outer.Opposite.Edge = right;

            inner.Opposite          = outer.Opposite;
            inner.Next.Opposite     = outer;
            outer.Opposite.Opposite = inner;
            outer.Opposite          = inner.Next;

            mesh.Add(edge);
        }
示例#5
0
        private void InsertEdge(TriMesh mesh, TriMesh.Edge edge, TriMesh.HalfEdge inner, TriMesh.HalfEdge outer)
        {
            TriMesh.Edge left = edge;
            left.HalfEdge0 = outer;
            outer.Edge = left;
            inner.Next.Edge = left;

            TriMesh.Edge right = outer.Edge;
            right.HalfEdge0 = inner;
            inner.Edge = right;
            outer.Opposite.Edge = right;

            inner.Opposite = outer.Opposite;
            inner.Next.Opposite = outer;
            outer.Opposite.Opposite = inner;
            outer.Opposite = inner.Next;

            mesh.Add(edge);
        }