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); }
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); }
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; }
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); }
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); }