如何使用Shapely删除图形或在不同坐标系绘制以生成无重叠矩形域?
核心认知纠正
Shapely 中的几何对象是无状态的纯数据对象,不存在绑定全局坐标系、创建后无法删除的机制,也没有所谓的“画布”概念。你对“对象创建后永久存在”的误解,是把 Shapely 和自带绘图上下文的图形库(比如 matplotlib、pygame)混淆了。所有 Shapely 对象和普通 Python 变量没有区别,不需要直接丢弃即可,完全不需要主动删除。
实现方案
你的矩形填充需求可以通过「自己维护合法对象列表+临时对象碰撞检测」的逻辑实现,流程如下:
- 先定义外层大矩形的边界
- 单独维护一个列表,只存放已经通过碰撞检测、确认可以放置的小矩形
- 每次生成随机坐标后,先创建一个临时的Polygon对象做碰撞校验:
- 校验规则1:临时矩形完全在外层大边界内部
- 校验规则2:临时矩形和列表中所有已存放的矩形都不相交(
intersects方法本身就包含边界接触的判断,正好符合你互不接触的要求)
- 校验通过就把临时对象加入合法列表,不通过直接丢弃即可,Python垃圾回收会自动处理冗余对象
- 连续多次生成都校验失败,说明剩余空间不足,终止流程
可运行示例代码
from shapely.geometry import Polygon import random # 外层大矩形边界:坐标范围0~100的正方形 boundary = Polygon([(0,0), (0, 100), (100, 100), (100, 0)]) # 存储已合法放置的小矩形 placed_rects = [] # 小矩形尺寸范围 min_edge, max_edge = 5, 15 # 连续生成失败超过1000次就判定空间不足,终止循环 max_fail_times = 1000 current_fail = 0 while current_fail < max_fail_times: # 随机生成小矩形的宽高 w = random.randint(min_edge, max_edge) h = random.randint(min_edge, max_edge) # 随机生成左下角坐标,保证初始范围不会超出大边界 x = random.uniform(0, 100 - w) y = random.uniform(0, 100 - h) # 创建临时测试矩形 test_rect = Polygon([(x, y), (x, y+h), (x+w, y+h), (x+w, y)]) # 碰撞校验 is_valid = boundary.contains(test_rect) for rect in placed_rects: if test_rect.intersects(rect): is_valid = False break if is_valid: placed_rects.append(test_rect) current_fail = 0 else: current_fail += 1 print(f"成功放置{len(placed_rects)}个互不接触的小矩形")
关于你给出的示例代码的说明
你写的代码中p1.intersects(p2)返回True是完全符合预期的:这两个多边形的空间坐标完全重合,本来就是相交的,和“能不能删除p1”没有任何关系。如果你不需要p1参与碰撞检测,只要不把它加入你的合法对象列表、不调用它的相交判断方法即可,完全不需要删除这个变量。
内容的提问来源于stack exchange,提问作者Jgd10
相关产品推荐
相关产品推荐

