public override bool Equals(object obj) { if (obj is EdgePair) { EdgePair other = (EdgePair)obj; return((v1 == other.v1) && (v2 == other.v2)); } else { return(false); } }
EdgePair ShortestEdgeOfTriangle(Triangle tri) { Vector3 e2 = mesh.vertices[tri.v3] - mesh.vertices[tri.v2]; Vector3 e3 = mesh.vertices[tri.v1] - mesh.vertices[tri.v3]; EdgePair shortest = new EdgePair(tri.v1, tri.v2); if (e2.magnitude < LengthOfEdgePair(shortest)) { shortest = new EdgePair(tri.v2, tri.v3); } if (e3.magnitude < LengthOfEdgePair(shortest)) { shortest = new EdgePair(tri.v3, tri.v1); } return(shortest); }
/// <summary> /// Take the next triangle off the priority queue and collapse its shortest edge. /// </summary> /// <returns></returns> bool CollapseShortestPQ() { if (triQueue.Count == 0) { return(false); } TriangleNode tNode = triQueue.Dequeue(); if (tNode.Collapsed) { return(true); } EdgePair shortestEdge = ShortestEdgeOfTriangle(tNode.triangle); CollapseEdge(shortestEdge); UpdatePQAroundMerged(shortestEdge.v1); return(true); }
void CollapseEdge(EdgePair ep) { Vector3[] verts = mesh.vertices; Triangle leftTri, rightTri; if (edgeToTri.TryGetValue(ep, out leftTri)) { leftTri.collapsed = true; } if (edgeToTri.TryGetValue(new EdgePair(ep.v2, ep.v1), out rightTri)) { rightTri.collapsed = true; } HashSet <int> pts1 = identifiedPoints[ep.v1]; HashSet <int> pts2 = identifiedPoints[ep.v2]; // Do a weighted average based on how many vertices have // been merged on each side int num1 = identifiedPoints[ep.v1].Count; int num2 = identifiedPoints[ep.v2].Count; Vector3 midpoint = (num1 * verts[ep.v1] + num2 * verts[ep.v2]) / (num1 + num2); pts1.UnionWith(pts2); foreach (int i in pts1) { identifiedPoints[i] = pts1; } foreach (int i in pts1) { verts[i] = midpoint; } mesh.vertices = verts; }
float LengthOfEdgePair(EdgePair ep) { Vector3 vec = mesh.vertices[ep.v2] - mesh.vertices[ep.v1]; return(vec.magnitude); }
public ErrorPair(EdgePair ep, float er) { edgePair = ep; error = er; }