Beispiel #1
0
        public override void Check(IEnumerable <ObjectId> selectedObjectIds)
        {
            if (!selectedObjectIds.Any())
            {
                return;
            }

            var originBspSegments       = GetAllBspSegments(selectedObjectIds);
            var bspSegmentForCollisions = new List <BspSegmentForCollsion>();

            foreach (var bspSegment in originBspSegments)
            {
                // 将每个segment向外扩,形成一个矩形,矩形的宽为tolerance,但为了保险再向外扩0.001
                var bspSegments = BspSegmentForCollsion.CreateSegmentsForCollision(bspSegment, _tolerance / 2.0 + 0.001);
                bspSegmentForCollisions.AddRange(bspSegments);
            }

            var bsptree      = new Curve2dBspTree(bspSegmentForCollisions);
            var nearSegments = SearchNearSegments(bsptree);
            var qualified    = FilterNearSegments(nearSegments);

            // Post process for nearSegmentPairs
            _gaps = GetPolygonGapsFromSegmentPair(qualified);

            foreach (var curveSegment in originBspSegments)
            {
                curveSegment.Dispose();
            }
            foreach (var bspSegmentForCollision in bspSegmentForCollisions)
            {
                bspSegmentForCollision.Dispose();
            }
        }
Beispiel #2
0
        public static IEnumerable <BspSegmentForCollsion> CreateSegmentsForCollision(BspSegment segment, double range)
        {
            var startPoint  = segment.LineSegment.StartPoint;
            var endPoint    = segment.LineSegment.EndPoint;
            var direction   = segment.LineSegment.Direction;
            var perp        = direction.GetPerpendicularVector().GetNormal() * range;
            var topleft     = startPoint + perp;
            var topright    = endPoint + perp;
            var bottomleft  = startPoint - perp;
            var bottomright = endPoint - perp;
            var topSegment  = new BspSegmentForCollsion()
            {
                EntityId      = segment.EntityId,
                LineSegment   = new LineSegment2d(topleft, topright),
                SourceSegment = segment
            };
            var rightSegment = new BspSegmentForCollsion()
            {
                EntityId      = segment.EntityId,
                LineSegment   = new LineSegment2d(topright, bottomright),
                SourceSegment = segment
            };
            var bottomSegment = new BspSegmentForCollsion()
            {
                EntityId      = segment.EntityId,
                LineSegment   = new LineSegment2d(bottomright, bottomleft),
                SourceSegment = segment
            };
            var leftSegment = new BspSegmentForCollsion()
            {
                EntityId      = segment.EntityId,
                LineSegment   = new LineSegment2d(bottomleft, topleft),
                SourceSegment = segment
            };

            return(new BspSegmentForCollsion[]
            {
                topSegment,
                rightSegment,
                bottomSegment,
                leftSegment
            });
        }