Beispiel #1
0
        /// <summary>Creates a new front triangle and legalize it</summary>
        private static AdvancingFrontNode NewFrontTriangle(DtSweepContext tcx, TriangulationPoint point,
                                                           AdvancingFrontNode node)
        {
            DelaunayTriangle triangle = new DelaunayTriangle(point, node.Point, node.Next.Point);

            triangle.MarkNeighbor(node.Triangle);
            tcx.Triangles.Add(triangle);

            AdvancingFrontNode newNode = new AdvancingFrontNode(point)
            {
                Next = node.Next,
                Prev = node
            };

            node.Next.Prev = newNode;
            node.Next      = newNode;

            tcx.AddNode(newNode); // XXX: BST

            if (!Legalize(tcx, triangle))
            {
                tcx.MapTriangleToNodes(triangle);
            }

            return(newNode);
        }
Beispiel #2
0
        /// <summary>
        ///     Find closes node to the left of the new point and create a new triangle. If needed new holes and basins will
        ///     be filled to.
        /// </summary>
        private static AdvancingFrontNode PointEvent(DtSweepContext tcx, TriangulationPoint point)
        {
            AdvancingFrontNode node    = tcx.LocateNode(point);
            AdvancingFrontNode newNode = NewFrontTriangle(tcx, point, node);

            // Only need to check +epsilon since point never have smaller
            // x value than node due to how we fetch nodes from the front
            if (point.X <= node.Point.X + TriangulationUtil.Epsilon)
            {
                Fill(tcx, node);
            }

            tcx.AddNode(newNode);

            FillAdvancingFront(tcx, newNode);
            return(newNode);
        }