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