protected override MergeArgs GetMin() { List <HeapNode <TriMesh.Vertex> > unMergable = new List <HeapNode <TriMesh.Vertex> >(); HeapNode <TriMesh.Vertex> node = heap.Pull(); while (node != null) { foreach (var hf in node.Item.HalfEdges) { if (TriMeshModify.IsMergeable(hf.Edge)) { foreach (var item in unMergable) { heap.Add(item); } Vector3D pos = hf.ToVertex.Traits.Position; return(new MergeArgs() { Target = hf.Edge, Pos = pos }); } } unMergable.Add(node); node = heap.Pull(); } return(null); }
protected override MergeArgs GetMin() { List <HeapNode <TriMesh.Face> > unMergable = new List <HeapNode <TriMesh.Face> >(); HeapNode <TriMesh.Face> node = this.heap.Pull(); while (node != null && !TriMeshModify.IsMergeable(node.Item)) { unMergable.Add(node); node = heap.Pull(); } foreach (var item in unMergable) { this.heap.Add(item); } if (node == null) { return(null); } else { Vector3D pos = this.GetPos(node.Item); return(new MergeArgs { Target = node.Item, Pos = pos }); } }
public bool EdgeCollapse(TriMesh.Edge edge) { if (this.EdgeCanCollapse(edge) && TriMeshModify.IsMergeable(edge)) { TriMeshModify.MergeEdge(edge); return(true); } else { return(false); } }
public void ClusterVertexs(TriMesh.Vertex[] vertices, Vector3D position) { Queue <TriMesh.Edge> connectedEdge = new Queue <TriMesh.Edge>(); Dictionary <TriMesh.Edge, bool> processedFlag = new Dictionary <HalfEdgeMesh.Edge, bool>(); foreach (TriMesh.Vertex v in vertices) { foreach (TriMesh.HalfEdge hf in v.HalfEdges) { foreach (TriMesh.Vertex vx in vertices) { if (hf.ToVertex == vx && !processedFlag.ContainsKey(hf.Edge)) { connectedEdge.Enqueue(hf.Edge); processedFlag[hf.Edge] = true; } } } } int n = 0; while (connectedEdge.Count > 0) { TriMesh.Edge e = connectedEdge.Dequeue(); if (e.HalfEdge0 == null || e.HalfEdge1 == null) { continue; } if (TriMeshModify.IsMergeable(e)) { TriMeshModify.MergeEdge(e, position); n = 0; } else { connectedEdge.Enqueue(e); n++; if (n > connectedEdge.Count) { break; } ; } } }
public static bool IsMergeable(TriMesh.Face face) { if (face.OnBoundary) { //return false; } foreach (var hf in face.Halfedges) { if (!TriMeshModify.IsMergeable(hf.Edge)) { return(false); } } return(true); }