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 EdgeContext Merge(TriMesh.Edge edge, Vector3D position) { TriMesh mesh = (TriMesh)edge.Mesh; EdgeContext context = new EdgeContext() { LeftPos = edge.Vertex0.Traits.Position, MidPos = position, RightPos = edge.Vertex1.Traits.Position, Left = edge.Vertex0.Index, Right = edge.Vertex1.Index, Top = edge.HalfEdge1.Next.ToVertex.Index, Bottom = edge.HalfEdge0.Next.ToVertex.Index, }; TriMeshModify.MergeEdge(edge); return(context); }
private void mergeToolStripMenuItem_Click(object sender, EventArgs e) { TriMeshModify.MergeEdge(Mesh); OnChanged(EventArgs.Empty); }
protected override TriMesh.Vertex Merge(MergeArgs args) { return(TriMeshModify.MergeEdge(args.Target, args.Pos)); }