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