コード例 #1
0
        private static void HandleStartVertex(Face face, Vertex vert, IEnumerable <HalfEdge> faceHalfEdges)
        {
            foreach (var halfEdge in faceHalfEdges)
            {
                var he = halfEdge;

                if (he.OriginVertex != vert.Handle)
                {
                    continue;
                }

                var origin = _geometry.GetVertexByHandle(he.OriginVertex);

                int targetH;

                targetH = _geometry.GetHalfEdgeByHandle(he.NextHalfEdge).OriginVertex;

                var target = _geometry.GetVertexByHandle(targetH);

                var ei = new TriStatusEdge(_geometry, face, origin, target, vert);
                ei.HalfEdgeHandle     = he.Handle;
                ei.HelperVertexHandle = vert.Handle;
                ei.IsMergeVertex      = false;

                _triSweepLineStatus.InsertNode(ei.IntersectionPointX, ei);
                break;
            }
        }
コード例 #2
0
        private static void HandleRegularVertex(Face face, Vertex vert, IList <HalfEdge> faceHalfEdges, ICollection <Face> newFaces)
        {
            if (IsPolygonRightOfVert(_geometry, face, faceHalfEdges, vert))
            {
                foreach (var he in faceHalfEdges)
                {
                    if (he.OriginVertex != vert.Handle)
                    {
                        continue;
                    }

                    var eMinOne = _triSweepLineStatus.FindStatusEdgeWithHandle(he.PrevHalfEdge);

                    if (eMinOne.IsMergeVertex)
                    {
                        _geometry.InsertDiagonal(vert.Handle, eMinOne.HelperVertexHandle);
                        newFaces.Add(_geometry.DictFaces[_geometry.DictFaces.Keys.Max()]);
                    }

                    _triSweepLineStatus.DeleteNode(eMinOne.IntersectionPointX);

                    var halfEdge = _geometry.GetHalfEdgeByHandle(vert.IncidentHalfEdge);
                    var origin   = _geometry.GetVertexByHandle(halfEdge.OriginVertex);

                    int targetH;
                    targetH = _geometry.GetHalfEdgeByHandle(he.NextHalfEdge).OriginVertex;

                    var target = _geometry.GetVertexByHandle(targetH);

                    var ei = new TriStatusEdge(_geometry, face, origin, target, vert);
                    ei.HalfEdgeHandle     = he.Handle;
                    ei.HelperVertexHandle = vert.Handle;
                    ei.IsMergeVertex      = false;

                    _triSweepLineStatus.InsertNode(ei.IntersectionPointX, ei);

                    break;
                }
            }
            else
            {
                _triSweepLineStatus.BalanceTree();

                var redXPos = _geometry.Get2DVertPos(face, vert.Handle).x;
                var ej      = _triSweepLineStatus.FindLargestSmallerThanInBalanced(redXPos);

                if (ej.IsMergeVertex)
                {
                    _geometry.InsertDiagonal(vert.Handle, ej.HelperVertexHandle);
                    newFaces.Add(_geometry.DictFaces[_geometry.DictFaces.Keys.Max()]);
                }

                _triSweepLineStatus.FindNode(ej.IntersectionPointX).HelperVertexHandle = vert.Handle;
                _triSweepLineStatus.FindNode(ej.IntersectionPointX).IsMergeVertex      = false;
            }
        }
コード例 #3
0
        private static void HandleSplitVertex(Face face, Vertex vert, IEnumerable <HalfEdge> faceHalfEdges, ICollection <Face> newFaces)
        {
            _triSweepLineStatus.BalanceTree();

            var redXPos = _geometry.Get2DVertPos(face, vert.Handle).x;
            var ej      = _triSweepLineStatus.FindLargestSmallerThanInBalanced(redXPos);

            _geometry.InsertDiagonal(vert.Handle, ej.HelperVertexHandle);
            newFaces.Add(_geometry.DictFaces[_geometry.DictFaces.Keys.Max()]);

            _triSweepLineStatus.FindNode(ej.IntersectionPointX).HelperVertexHandle = vert.Handle;
            _triSweepLineStatus.FindNode(ej.IntersectionPointX).IsMergeVertex      = false;

            var he = new HalfEdge();

            foreach (var halfEdge in faceHalfEdges)
            {
                if (halfEdge.OriginVertex != vert.Handle)
                {
                    continue;
                }
                he = halfEdge;
                break;
            }

            var origin = _geometry.GetVertexByHandle(he.OriginVertex);

            var targetH = _geometry.GetHalfEdgeByHandle(he.NextHalfEdge).OriginVertex;

            var target = _geometry.GetVertexByHandle(targetH);

            var ei = new TriStatusEdge(_geometry, face, origin, target, vert);

            ei.HalfEdgeHandle     = he.Handle;
            ei.HelperVertexHandle = vert.Handle;
            ei.IsMergeVertex      = false;

            _triSweepLineStatus.InsertNode(ei.IntersectionPointX, ei);
        }