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