示例#1
0
        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();
        }