Beispiel #1
0
        public static TriMesh.Vertex MergeEdge(TriMesh.Edge edge, Vector3D position)
        {
            TriMesh mesh = (TriMesh)edge.Mesh;

            TriMesh.Vertex   v0  = edge.Vertex0;
            TriMesh.Vertex   v1  = edge.Vertex1;
            TriMesh.HalfEdge hf0 = edge.HalfEdge0;
            TriMesh.HalfEdge hf1 = edge.HalfEdge1;

            v0.Traits.Position = position;

            foreach (var item in v1.HalfEdges)
            {
                //if (item.ToVertex != v0)
                {
                    item.Opposite.ToVertex = v0;
                }
            }

            MergeOneSide(hf0);
            MergeOneSide(hf1);

            mesh.RemoveVertex(v1);
            mesh.RemoveEdge(edge);
            v1.HalfEdge    = null;
            edge.HalfEdge0 = null;

            return(v0);
        }
Beispiel #2
0
        public static void RemoveVertex(TriMesh.Vertex vertex)
        {
            TriMesh mesh = (TriMesh)vertex.Mesh;

            foreach (TriMesh.HalfEdge halfEdge in vertex.HalfEdges)
            {
                if (halfEdge.Next != null)
                {
                    halfEdge.Next.Face = null;
                    halfEdge.Opposite.Previous.Next = halfEdge.Next;
                    halfEdge.Next.Previous          = halfEdge.Opposite.Previous;
                }
                if (halfEdge.ToVertex.HalfEdge == halfEdge.Opposite)
                {
                    halfEdge.ToVertex.HalfEdge = halfEdge.Next;
                }
                mesh.RemoveHalfedge(halfEdge.Opposite);
                mesh.RemoveHalfedge(halfEdge);
            }
            foreach (TriMesh.Face face in vertex.Faces)
            {
                mesh.RemoveFace(face);
            }
            foreach (TriMesh.Edge edge in vertex.Edges)
            {
                mesh.RemoveEdge(edge);
            }
            mesh.RemoveVertex(vertex);
        }
Beispiel #3
0
        public TriMesh.Vertex MergeEdge1(TriMesh.Edge edge, Vector3D position)
        {
            TriMesh mesh = (TriMesh)edge.Mesh;

            TriMesh.Vertex v1 = null;
            TriMesh.Vertex v2 = null;
            if (edge.HalfEdge0 == null || edge.HalfEdge1 == null)
            {
                throw new Exception("Error!");
            }
            if (edge.HalfEdge0.ToVertex == null || edge.HalfEdge1.ToVertex == null)
            {
                throw new Exception("Error!");
            }
            else
            {
                v1 = edge.HalfEdge0.ToVertex;
                v2 = edge.HalfEdge1.ToVertex;
                if (v1.HalfEdge == null || v2.HalfEdge == null)
                {
                    throw new Exception("Error!");
                }
            }
            int count = 0;

            foreach (TriMesh.HalfEdge hf1 in v1.HalfEdges)
            {
                foreach (TriMesh.HalfEdge hf2 in v2.HalfEdges)
                {
                    if (hf1.ToVertex == hf2.ToVertex)
                    {
                        count++;
                    }
                }
            }
            //Find Halfedge which share same to Vertex
            v1.Traits.Position.x = position.x;
            v1.Traits.Position.y = position.y;
            v1.Traits.Position.z = position.z;
            TriMesh.HalfEdge v1Tov2 = null;
            TriMesh.HalfEdge v2Tov1 = null;
            if (edge.HalfEdge0.ToVertex == v2)
            {
                v1Tov2 = edge.HalfEdge0;
                v2Tov1 = edge.HalfEdge1;
            }
            else if (edge.HalfEdge0.ToVertex == v1)
            {
                v2Tov1 = edge.HalfEdge0;
                v1Tov2 = edge.HalfEdge1;
            }
            foreach (TriMesh.HalfEdge hf1 in v1.HalfEdges)
            {
                if (hf1.ToVertex != v2)
                {
                    v1.HalfEdge = hf1;
                    break;
                }
            }
            List <TriMesh.HalfEdge> v2Neibors = new List <TriMesh.HalfEdge>();

            foreach (TriMesh.HalfEdge hfitem in v2.HalfEdges)
            {
                if (hfitem.ToVertex != v1)
                {
                    v2Neibors.Add(hfitem);
                }
            }
            foreach (TriMesh.HalfEdge hfitem in v2Neibors)
            {
                hfitem.Opposite.ToVertex = v1;
            }
            if (!v1Tov2.OnBoundary)
            {
                TriMesh.HalfEdge v1HF1 = v1Tov2.Previous.Opposite;
                TriMesh.HalfEdge v2HF1 = v1Tov2.Next.Opposite;

                v1HF1.Opposite.Next     = v2HF1.Next;
                v2HF1.Next.Previous     = v1HF1.Opposite;
                v1HF1.Opposite.Previous = v2HF1.Previous;
                v2HF1.Previous.Next     = v1HF1.Opposite;
                v1HF1.Opposite.ToVertex = v1;
                v1HF1.Opposite.Face     = v2HF1.Face;
                if (v2HF1.Face != null)
                {
                    v1HF1.Opposite.Face.HalfEdge = v1HF1.Opposite;
                }
                v1HF1.ToVertex.HalfEdge = v1HF1.Opposite;
                mesh.RemoveHalfedge(v2HF1);
                v2HF1.Next     = null;
                v2HF1.Previous = null;

                mesh.RemoveHalfedge(v2HF1.Opposite);
                v2HF1.Opposite.Opposite = null;
                v2HF1.Opposite.Next     = null;
                v2HF1.Opposite.Previous = null;
                v2HF1.Opposite          = null;
                mesh.RemoveHalfedge(v1Tov2);
                v1Tov2.Next     = null;
                v1Tov2.Previous = null;
                mesh.RemoveEdge(v2HF1.Edge);
                v2HF1.Edge.HalfEdge0 = null;
                mesh.RemoveFace(v1Tov2.Face);
                v1Tov2.Face = null;
            }
            else if (v1Tov2.OnBoundary)
            {
                v1Tov2.Next.Previous = v1Tov2.Previous;
                v1Tov2.Previous.Next = v1Tov2.Next;
            }
            if (!v2Tov1.OnBoundary)
            {
                TriMesh.HalfEdge v1HF2 = v2Tov1.Next.Opposite;
                TriMesh.HalfEdge v2HF2 = v2Tov1.Previous.Opposite;
                v1HF2.Opposite.Next     = v2HF2.Next;
                v2HF2.Next.Previous     = v1HF2.Opposite;
                v1HF2.Opposite.Previous = v2HF2.Previous;
                v2HF2.Previous.Next     = v1HF2.Opposite;
                v1HF2.ToVertex          = v1;
                v1HF2.Opposite.Face     = v2HF2.Face;
                if (v2HF2.Face != null)
                {
                    v1HF2.Opposite.Face.HalfEdge = v1HF2.Opposite;
                }
                v2HF2.ToVertex.HalfEdge = v1HF2;
                mesh.RemoveHalfedge(v2HF2);
                v2HF2.Next     = null;
                v2HF2.Previous = null;
                mesh.RemoveHalfedge(v2HF2.Opposite);
                v2HF2.Opposite.Opposite = null;
                v2HF2.Opposite.Next     = null;
                v2HF2.Opposite.Previous = null;
                v2HF2.Opposite          = null;
                mesh.RemoveHalfedge(v2Tov1);
                v2Tov1.Next     = null;
                v2Tov1.Previous = null;
                v1Tov2.Opposite = null;
                v2Tov1.Opposite = null;
                mesh.RemoveEdge(v2HF2.Edge);
                v2HF2.Edge.HalfEdge0 = null;
                mesh.RemoveFace(v2Tov1.Face);
                v2Tov1.Face = null;
            }
            else if (v2Tov1.OnBoundary)
            {
                v2Tov1.Previous.Next = v2Tov1.Next;
                v2Tov1.Next.Previous = v2Tov1.Previous;
            }
            mesh.RemoveEdge(v2Tov1.Edge);
            v2Tov1.Edge.HalfEdge0 = null;
            mesh.RemoveVertex(v2);
            v2.HalfEdge = null;
            // FixIndex();
            return(v1);
        }