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(); } }
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 }); }