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));
            }
        }
Exemplo n.º 2
0
        /// <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);
            }
        }