private static bool Legalize(DTSweepContext tcx, DelaunayTriangle t) { bool result; for (int i = 0; i < 3; i++) { bool flag = t.EdgeIsDelaunay[i]; if (!flag) { DelaunayTriangle delaunayTriangle = t.Neighbors[i]; bool flag2 = delaunayTriangle != null; if (flag2) { TriangulationPoint triangulationPoint = t.Points[i]; TriangulationPoint triangulationPoint2 = delaunayTriangle.OppositePoint(t, triangulationPoint); int index = delaunayTriangle.IndexOf(triangulationPoint2); bool flag3 = delaunayTriangle.EdgeIsConstrained[index] || delaunayTriangle.EdgeIsDelaunay[index]; if (flag3) { t.EdgeIsConstrained[i] = delaunayTriangle.EdgeIsConstrained[index]; } else { bool flag4 = TriangulationUtil.SmartIncircle(triangulationPoint, t.PointCCW(triangulationPoint), t.PointCW(triangulationPoint), triangulationPoint2); bool flag5 = flag4; if (flag5) { t.EdgeIsDelaunay[i] = true; delaunayTriangle.EdgeIsDelaunay[index] = true; DTSweep.RotateTrianglePair(t, triangulationPoint, delaunayTriangle, triangulationPoint2); bool flag6 = !DTSweep.Legalize(tcx, t); bool flag7 = flag6; if (flag7) { tcx.MapTriangleToNodes(t); } flag6 = !DTSweep.Legalize(tcx, delaunayTriangle); bool flag8 = flag6; if (flag8) { tcx.MapTriangleToNodes(delaunayTriangle); } t.EdgeIsDelaunay[i] = false; delaunayTriangle.EdgeIsDelaunay[index] = false; result = true; return(result); } } } } } result = false; return(result); }
private static void FinalizationConvexHull(DTSweepContext tcx) { AdvancingFrontNode advancingFrontNode = tcx.aFront.Head.Next; AdvancingFrontNode advancingFrontNode2 = advancingFrontNode.Next; DTSweep.TurnAdvancingFrontConvex(tcx, advancingFrontNode, advancingFrontNode2); advancingFrontNode = tcx.aFront.Tail.Prev; bool flag = advancingFrontNode.Triangle.Contains(advancingFrontNode.Next.Point) && advancingFrontNode.Triangle.Contains(advancingFrontNode.Prev.Point); DelaunayTriangle delaunayTriangle; if (flag) { delaunayTriangle = advancingFrontNode.Triangle.NeighborAcross(advancingFrontNode.Point); DTSweep.RotateTrianglePair(advancingFrontNode.Triangle, advancingFrontNode.Point, delaunayTriangle, delaunayTriangle.OppositePoint(advancingFrontNode.Triangle, advancingFrontNode.Point)); tcx.MapTriangleToNodes(advancingFrontNode.Triangle); tcx.MapTriangleToNodes(delaunayTriangle); } advancingFrontNode = tcx.aFront.Head.Next; bool flag2 = advancingFrontNode.Triangle.Contains(advancingFrontNode.Prev.Point) && advancingFrontNode.Triangle.Contains(advancingFrontNode.Next.Point); if (flag2) { delaunayTriangle = advancingFrontNode.Triangle.NeighborAcross(advancingFrontNode.Point); DTSweep.RotateTrianglePair(advancingFrontNode.Triangle, advancingFrontNode.Point, delaunayTriangle, delaunayTriangle.OppositePoint(advancingFrontNode.Triangle, advancingFrontNode.Point)); tcx.MapTriangleToNodes(advancingFrontNode.Triangle); tcx.MapTriangleToNodes(delaunayTriangle); } TriangulationPoint point = tcx.aFront.Head.Point; advancingFrontNode2 = tcx.aFront.Tail.Prev; delaunayTriangle = advancingFrontNode2.Triangle; TriangulationPoint triangulationPoint = advancingFrontNode2.Point; advancingFrontNode2.Triangle = null; DelaunayTriangle delaunayTriangle2; while (true) { tcx.RemoveFromList(delaunayTriangle); triangulationPoint = delaunayTriangle.PointCCW(triangulationPoint); bool flag3 = triangulationPoint == point; if (flag3) { break; } delaunayTriangle2 = delaunayTriangle.NeighborCCW(triangulationPoint); delaunayTriangle.Clear(); delaunayTriangle = delaunayTriangle2; } point = tcx.aFront.Head.Next.Point; triangulationPoint = delaunayTriangle.PointCW(tcx.aFront.Head.Point); delaunayTriangle2 = delaunayTriangle.NeighborCW(tcx.aFront.Head.Point); delaunayTriangle.Clear(); delaunayTriangle = delaunayTriangle2; while (triangulationPoint != point) { tcx.RemoveFromList(delaunayTriangle); triangulationPoint = delaunayTriangle.PointCCW(triangulationPoint); delaunayTriangle2 = delaunayTriangle.NeighborCCW(triangulationPoint); delaunayTriangle.Clear(); delaunayTriangle = delaunayTriangle2; } tcx.aFront.Head = tcx.aFront.Head.Next; tcx.aFront.Head.Prev = null; tcx.aFront.Tail = tcx.aFront.Tail.Prev; tcx.aFront.Tail.Next = null; tcx.FinalizeTriangulation(); }
private static void FlipEdgeEvent(DTSweepContext tcx, TriangulationPoint ep, TriangulationPoint eq, DelaunayTriangle t, TriangulationPoint p) { DelaunayTriangle delaunayTriangle = t.NeighborAcross(p); TriangulationPoint triangulationPoint = delaunayTriangle.OppositePoint(t, p); bool flag = delaunayTriangle == null; if (flag) { throw new InvalidOperationException("[BUG:FIXME] FLIP failed due to missing triangle"); } bool constrainedEdgeAcross = t.GetConstrainedEdgeAcross(p); if (constrainedEdgeAcross) { throw new Exception("Intersecting Constraints"); } bool flag2 = TriangulationUtil.InScanArea(p, t.PointCCW(p), t.PointCW(p), triangulationPoint); bool flag3 = flag2; if (flag3) { DTSweep.RotateTrianglePair(t, p, delaunayTriangle, triangulationPoint); tcx.MapTriangleToNodes(t); tcx.MapTriangleToNodes(delaunayTriangle); bool flag4 = p == eq && triangulationPoint == ep; if (flag4) { bool flag5 = eq == tcx.EdgeEvent.ConstrainedEdge.Q && ep == tcx.EdgeEvent.ConstrainedEdge.P; if (flag5) { bool isDebugEnabled = tcx.IsDebugEnabled; if (isDebugEnabled) { Console.WriteLine("[FLIP] - constrained edge done"); } t.MarkConstrainedEdge(ep, eq); delaunayTriangle.MarkConstrainedEdge(ep, eq); DTSweep.Legalize(tcx, t); DTSweep.Legalize(tcx, delaunayTriangle); } else { bool isDebugEnabled2 = tcx.IsDebugEnabled; if (isDebugEnabled2) { Console.WriteLine("[FLIP] - subedge done"); } } } else { bool isDebugEnabled3 = tcx.IsDebugEnabled; if (isDebugEnabled3) { Console.WriteLine("[FLIP] - flipping and continuing with triangle still crossing edge"); } Orientation o = TriangulationUtil.Orient2d(eq, triangulationPoint, ep); t = DTSweep.NextFlipTriangle(tcx, o, t, delaunayTriangle, p, triangulationPoint); DTSweep.FlipEdgeEvent(tcx, ep, eq, t, p); } } else { TriangulationPoint p2 = DTSweep.NextFlipPoint(ep, eq, delaunayTriangle, triangulationPoint); DTSweep.FlipScanEdgeEvent(tcx, ep, eq, t, delaunayTriangle, p2); DTSweep.EdgeEvent(tcx, ep, eq, t, p); } }