private static void FinalizationConvexHull(DTSweepContext tcx) { AdvancingFrontNode n1, n2; DelaunayTriangle t1, t2; TriangulationPoint first, p1; n1 = tcx.Front.Head.Next; n2 = n1.Next; first = n1.Point; TurnAdvancingFrontConvex(tcx, n1, n2); n1 = tcx.Front.Tail.Prev; if (n1.Triangle.Contains(n1.Next.Point) && n1.Triangle.Contains(n1.Prev.Point)) { t1 = n1.Triangle.NeighborAcrossFrom(n1.Point); RotateTrianglePair(n1.Triangle, n1.Point, t1, t1.OppositePoint(n1.Triangle, n1.Point)); tcx.MapTriangleToNodes(n1.Triangle); tcx.MapTriangleToNodes(t1); } n1 = tcx.Front.Head.Next; if (n1.Triangle.Contains(n1.Prev.Point) && n1.Triangle.Contains(n1.Next.Point)) { t1 = n1.Triangle.NeighborAcrossFrom(n1.Point); RotateTrianglePair(n1.Triangle, n1.Point, t1, t1.OppositePoint(n1.Triangle, n1.Point)); tcx.MapTriangleToNodes(n1.Triangle); tcx.MapTriangleToNodes(t1); } first = tcx.Front.Head.Point; n2 = tcx.Front.Tail.Prev; t1 = n2.Triangle; p1 = n2.Point; n2.Triangle = null; do { tcx.RemoveFromList(t1); p1 = t1.PointCCWFrom(p1); if (p1 == first) { break; } t2 = t1.NeighborCCWFrom(p1); t1.Clear(); t1 = t2; } while (true); first = tcx.Front.Head.Next.Point; p1 = t1.PointCWFrom(tcx.Front.Head.Point); t2 = t1.NeighborCWFrom(tcx.Front.Head.Point); t1.Clear(); t1 = t2; while (p1 != first) { tcx.RemoveFromList(t1); p1 = t1.PointCCWFrom(p1); t2 = t1.NeighborCCWFrom(p1); t1.Clear(); t1 = t2; } tcx.Front.Head = tcx.Front.Head.Next; tcx.Front.Head.Prev = null; tcx.Front.Tail = tcx.Front.Tail.Prev; tcx.Front.Tail.Next = null; }
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); } }
private static void FlipEdgeEvent(DTSweepContext tcx, TriangulationPoint ep, TriangulationPoint eq, DelaunayTriangle t, TriangulationPoint p) { DelaunayTriangle ot = t.NeighborAcrossFrom(p); TriangulationPoint op = ot.OppositePoint(t, p); if (ot == null) { throw new InvalidOperationException("[BUG:FIXME] FLIP failed due to missing triangle"); } if (tcx.IsDebugEnabled) { tcx.DTDebugContext.PrimaryTriangle = t; tcx.DTDebugContext.SecondaryTriangle = ot; } bool inScanArea = TriangulationUtil.InScanArea(p, t.PointCCWFrom(p), t.PointCWFrom(p), op); if (inScanArea) { RotateTrianglePair(t, p, ot, op); tcx.MapTriangleToNodes(t); tcx.MapTriangleToNodes(ot); if (p == eq && op == ep) { if (eq == tcx.EdgeEvent.ConstrainedEdge.Q && ep == tcx.EdgeEvent.ConstrainedEdge.P) { if (tcx.IsDebugEnabled) { Console.WriteLine("[FLIP] - constrained edge done"); } t.MarkConstrainedEdge(ep, eq); ot.MarkConstrainedEdge(ep, eq); Legalize(tcx, t); Legalize(tcx, ot); } else { if (tcx.IsDebugEnabled) { Console.WriteLine("[FLIP] - subedge done"); } } } else { Orientation o = TriangulationUtil.Orient2d(eq, op, ep); t = NextFlipTriangle(tcx, o, t, ot, p, op); FlipEdgeEvent(tcx, ep, eq, t, p); } } else { TriangulationPoint newP = null; if (NextFlipPoint(ep, eq, ot, op, out newP)) { FlipScanEdgeEvent(tcx, ep, eq, t, ot, newP); EdgeEvent(tcx, ep, eq, t, p); } } }
public DTSweepDebugContext(DTSweepContext tcx) : base(tcx) { }