private static void RotateTrianglePair(DelaunayTriangle t, TriangulationPoint p, DelaunayTriangle ot, TriangulationPoint op) { DelaunayTriangle n1, n2, n3, n4; n1 = t.NeighborCCWFrom(p); n2 = t.NeighborCWFrom(p); n3 = ot.NeighborCCWFrom(op); n4 = ot.NeighborCWFrom(op); bool ce1, ce2, ce3, ce4; ce1 = t.GetConstrainedEdgeCCW(p); ce2 = t.GetConstrainedEdgeCW(p); ce3 = ot.GetConstrainedEdgeCCW(op); ce4 = ot.GetConstrainedEdgeCW(op); bool de1, de2, de3, de4; de1 = t.GetDelaunayEdgeCCW(p); de2 = t.GetDelaunayEdgeCW(p); de3 = ot.GetDelaunayEdgeCCW(op); de4 = ot.GetDelaunayEdgeCW(op); t.Legalize(p, op); ot.Legalize(op, p); ot.SetDelaunayEdgeCCW(p, de1); t.SetDelaunayEdgeCW(p, de2); t.SetDelaunayEdgeCCW(op, de3); ot.SetDelaunayEdgeCW(op, de4); ot.SetConstrainedEdgeCCW(p, ce1); t.SetConstrainedEdgeCW(p, ce2); t.SetConstrainedEdgeCCW(op, ce3); ot.SetConstrainedEdgeCW(op, ce4); t.Neighbors.Clear(); ot.Neighbors.Clear(); if (n1 != null) { ot.MarkNeighbor(n1); } if (n2 != null) { t.MarkNeighbor(n2); } if (n3 != null) { t.MarkNeighbor(n3); } if (n4 != null) { ot.MarkNeighbor(n4); } t.MarkNeighbor(ot); }
private static void EdgeEvent(DTSweepContext tcx, TriangulationPoint ep, TriangulationPoint eq, DelaunayTriangle triangle, TriangulationPoint point) { TriangulationPoint p1, p2; if (tcx.IsDebugEnabled) { tcx.DTDebugContext.PrimaryTriangle = triangle; } if (IsEdgeSideOfTriangle(triangle, ep, eq)) { return; } p1 = triangle.PointCCWFrom(point); Orientation o1 = TriangulationUtil.Orient2d(eq, p1, ep); if (o1 == Orientation.Collinear) { if (triangle.Contains(eq) && triangle.Contains(p1)) { triangle.MarkConstrainedEdge(eq, p1); tcx.EdgeEvent.ConstrainedEdge.Q = p1; triangle = triangle.NeighborAcrossFrom(point); EdgeEvent(tcx, ep, p1, triangle, p1); } else { throw new PointOnEdgeException("EdgeEvent - Point on constrained edge not supported yet", ep, eq, p1); } if (tcx.IsDebugEnabled) { Console.WriteLine("EdgeEvent - Point on constrained edge"); } return; } p2 = triangle.PointCWFrom(point); Orientation o2 = TriangulationUtil.Orient2d(eq, p2, ep); if (o2 == Orientation.Collinear) { if (triangle.Contains(eq) && triangle.Contains(p2)) { triangle.MarkConstrainedEdge(eq, p2); tcx.EdgeEvent.ConstrainedEdge.Q = p2; triangle = triangle.NeighborAcrossFrom(point); EdgeEvent(tcx, ep, p2, triangle, p2); } else { throw new PointOnEdgeException("EdgeEvent - Point on constrained edge not supported yet", ep, eq, p2); } if (tcx.IsDebugEnabled) { Console.WriteLine("EdgeEvent - Point on constrained edge"); } return; } if (o1 == o2) { if (o1 == Orientation.CW) { triangle = triangle.NeighborCCWFrom(point); } else { triangle = triangle.NeighborCWFrom(point); } EdgeEvent(tcx, ep, eq, triangle, point); } else { FlipEdgeEvent(tcx, ep, eq, triangle, point); } }