Exemplo n.º 1
0
        public static void RemoveEdge(TriMesh.Edge edge)
        {
            TriMesh mesh = (TriMesh)edge.Mesh;

            if (edge.HalfEdge0.Next == edge.HalfEdge1)
            {
                //TriMesh.HalfEdge hf = edge.Vertex0.HalfEdge;
                //hf.Previous.Next = hf.Opposite.Next;
                //hf.Next.Previous = hf.Previous;
                //edge.Vertex1.HalfEdge = hf.Previous;
                edge.HalfEdge0.Previous.Next = edge.HalfEdge1.Next;
                edge.HalfEdge1.Next.Previous = edge.HalfEdge0.Previous;
                edge.Vertex1.HalfEdge        = edge.HalfEdge0.Previous;
                edge.Vertex0.HalfEdge        = null;
            }
            else if (edge.HalfEdge1.Next == edge.HalfEdge0)
            {
                //TriMesh.HalfEdge hf = edge.Vertex1.HalfEdge;
                //hf.Previous.Next = hf.Opposite.Next;
                //hf.Next.Previous = hf.Previous;
                //edge.Vertex0.HalfEdge = hf.Previous;
                edge.HalfEdge1.Previous.Next = edge.HalfEdge0.Next;
                edge.HalfEdge0.Next.Previous = edge.HalfEdge1.Previous;
                edge.Vertex0.HalfEdge        = edge.HalfEdge1.Previous;
                edge.Vertex1.HalfEdge        = null;
            }
            else
            {
                edge.HalfEdge0.Next.Previous     = edge.HalfEdge1.Previous;
                edge.HalfEdge0.Previous.Next     = edge.HalfEdge1.Next;
                edge.HalfEdge1.Next.Previous     = edge.HalfEdge0.Previous;
                edge.HalfEdge1.Previous.Next     = edge.HalfEdge0.Next;
                edge.HalfEdge0.ToVertex.HalfEdge = edge.HalfEdge0.Next;
                edge.HalfEdge1.ToVertex.HalfEdge = edge.HalfEdge1.Next;
                edge.HalfEdge0.Next.Face         = null;
                edge.HalfEdge0.Previous.Face     = null;
                edge.HalfEdge1.Next.Face         = null;
                edge.HalfEdge1.Previous.Face     = null;
                if (edge.Face0 != null)
                {
                    mesh.RemoveFace(edge.Face0);
                }
                if (edge.Face1 != null)
                {
                    mesh.RemoveFace(edge.Face1);
                }
            }

            mesh.RemoveHalfedge(edge.HalfEdge1);
            mesh.RemoveHalfedge(edge.HalfEdge0);
            mesh.RemoveEdge(edge);
        }
Exemplo n.º 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);
        }
Exemplo n.º 3
0
        private static void MergeOneSide(TriMesh.HalfEdge hf)
        {
            TriMesh mesh = (TriMesh)hf.Mesh;

            if (hf.OnBoundary)
            {
                hf.ToVertex.HalfEdge = hf.Next;
                hf.Previous.Next     = hf.Next;
                hf.Next.Previous     = hf.Previous;
            }
            else
            {
                TriMesh.Edge     remain     = hf.Next.Edge;
                TriMesh.Edge     remove     = hf.Previous.Edge;
                TriMesh.HalfEdge outerLeft  = hf.Previous.Opposite;
                TriMesh.HalfEdge outerRight = hf.Next.Opposite;

                if (outerLeft.Next == outerRight || outerLeft.Previous == outerRight)
                {
                    outerLeft.Edge.Traits.SelectedFlag     = 1;
                    hf.FromVertex.Traits.SelectedFlag      = 1;
                    outerLeft.ToVertex.Traits.SelectedFlag = 1;
                    //throw new Exception();
                }

                remain.HalfEdge0 = outerRight;
                outerLeft.Edge   = remain;

                outerLeft.Opposite  = outerRight;
                outerRight.Opposite = outerLeft;

                hf.ToVertex.HalfEdge = outerRight.Next;
                //hf.ToVertex.HalfEdge = outerLeft;
                TriMesh.Vertex top = hf.Next.ToVertex;
                top.HalfEdge = outerRight;

                mesh.RemoveFace(hf.Face);
                mesh.RemoveHalfedge(hf.Previous);
                mesh.RemoveHalfedge(hf.Next);
                mesh.RemoveEdge(remove);

                hf.Previous.Previous = null;
                hf.Previous.Next     = null;
                hf.Previous.Opposite = null;
                hf.Next.Previous     = null;
                hf.Next.Next         = null;
                hf.Next.Opposite     = null;
                remove.HalfEdge0     = null;
            }
            mesh.RemoveHalfedge(hf);
            hf.ToVertex = null;
            hf.Next     = null;
            hf.Previous = null;
            hf.Opposite = null;
            hf.Face     = null;
        }
Exemplo n.º 4
0
        public static void RemoveFace(TriMesh.Face face)
        {
            TriMesh mesh = (TriMesh)face.Mesh;

            foreach (TriMesh.HalfEdge halfedge in face.Halfedges)
            {
                halfedge.Face = null;
            }
            mesh.RemoveFace(face);
        }
Exemplo n.º 5
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);
        }