Exemplo n.º 1
0
    /// <summary>
    /// Is the edge legal, or does it need to be flipped?
    /// </summary>
    bool LegalEdge(int k, int l, int i, int j)
    {
        Debug.Assert(k != highest && k >= 0);

        var lMagic = l < 0;
        var iMagic = i < 0;
        var jMagic = j < 0;

        Debug.Assert(!(iMagic && jMagic));

        if (lMagic)
        {
            return(true);
        }
        else if (iMagic)
        {
            Debug.Assert(!jMagic);

            var p  = verts[l];
            var l0 = verts[k];
            var l1 = verts[j];

            return(Geom.ToTheLeft(p, l0, l1));
        }
        else if (jMagic)
        {
            Debug.Assert(!iMagic);

            var p  = verts[l];
            var l0 = verts[k];
            var l1 = verts[i];

            return(!Geom.ToTheLeft(p, l0, l1));
        }
         else {
            Debug.Assert(k >= 0 && l >= 0 && i >= 0 && j >= 0);

            var p  = verts[l];
            var c0 = verts[k];
            var c1 = verts[i];
            var c2 = verts[j];

            Debug.Assert(Geom.ToTheLeft(c2, c0, c1));
            Debug.Assert(Geom.ToTheLeft(c2, c1, p));

            return(!Geom.InsideCircumcircle(p, c0, c1, c2));
        }
    }
    /// <summary>
    /// Verify that this is an actual Delaunay triangulation
    /// </summary>
    public bool Verify()
    {
        try {
            for (int i = 0; i < Triangles.Count; i += 3)
            {
                var c0 = Vertices[Triangles[i]];
                var c1 = Vertices[Triangles[i + 1]];
                var c2 = Vertices[Triangles[i + 2]];

                for (int j = 0; j < Vertices.Count; j++)
                {
                    var p = Vertices[j];
                    if (Geom.InsideCircumcircle(p, c0, c1, c2))
                    {
                        return(false);
                    }
                }
            }

            return(true);
        } catch  {
            return(false);
        }
    }