Exemplo n.º 1
0
        /// <summary>
        /// 查找相交线段
        /// </summary>
        /// <param name="lineSegs"></param>
        /// <returns></returns>
        public Vector2[] FindIntersections(LineSegment2D[] lineSegs)
        {
            this.Clear();

            if (lineSegs == null || lineSegs.Length == 0)
            {
                return(null);
            }

            VertexSegment2D[] segs = new VertexSegment2D[lineSegs.Length];

            for (var i = 0; i < lineSegs.Length; i++)
            {
                var seg = new VertexSegment2D(lineSegs[i]);

                segs[i] = seg;

                _upLineSegment.Add(seg.Up, seg);
                _lowLineSegment.Add(seg.Low, seg);

                _sortedVertexes.Add(seg.Up);
                _sortedVertexes.Add(seg.Low);
            }

            while (_sortedVertexes.Count > 0)
            {
                var point = _sortedVertexes.Min;
                _sortedVertexes.Remove(point);
                HandleEventPoint(point);
            }

            return(_sortedVertexes.ToArray());
        }
Exemplo n.º 2
0
        /// <summary>
        /// 处理事件点
        /// </summary>
        /// <param name="point"></param>
        /// <returns></returns>
        private SortedSet <VertexSegment2D> HandleEventPoint(Vector2 point)
        {
            var upList = new List <VertexSegment2D>();

            foreach (var item in _upLineSegment.Values)
            {
                if (item.Up == point)
                {
                    upList.Add(item);
                }
            }

            var lowList      = new List <VertexSegment2D>();
            var containsList = new List <VertexSegment2D>();

            _statusTree.InorderTraversal((a) =>
            {
                if (a.Data.Low == point)
                {
                    lowList.Add(a.Data);
                }
                if (a.Data.Line.Contains(point))
                {
                    containsList.Add(a.Data);
                }
            });

            var allSeg = new SortedSet <VertexSegment2D>();

            allSeg.UnionWith(upList);
            allSeg.UnionWith(lowList);
            allSeg.UnionWith(containsList);

            List <Vector2> intersectionPoints = new List <Vector2>();

            if (allSeg.Count != 0)
            {
                return(allSeg);
            }

            var deleteSeg = new SortedSet <VertexSegment2D>();

            deleteSeg.UnionWith(lowList);
            deleteSeg.UnionWith(containsList);
            if (deleteSeg.Count > 0)
            {
                var ary = new VertexSegment2D[deleteSeg.Count];
                deleteSeg.CopyTo(ary);
                for (var i = 0; i < ary.Length; i++)
                {
                    _statusTree.Remove(ary[i]);
                }
            }

            var addSeg = new SortedSet <VertexSegment2D>();

            containsList.Reverse();

            addSeg.UnionWith(upList);
            addSeg.UnionWith(containsList);
            if (addSeg.Count > 0)
            {
                var ary = new VertexSegment2D[addSeg.Count];
                addSeg.CopyTo(ary);
                for (var i = 0; i < ary.Length; i++)
                {
                    _statusTree.Add(ary[i]);
                }
            }
            return(allSeg);
        }