Python中在多边形内随机选点的最高效方法是什么?
多边形内随机选点的高效方案
优先用「生成后测试」的方法,比预先生成所有有效点列表靠谱得多,尤其是你这种已经遇到枚举像素耗时问题的场景。
为啥不选预先生成有效点列表?
- 像你之前用matplotlib遍历所有像素的方式,本质是把多边形内每一个点都枚举出来,不仅耗时(你已经碰到30秒的情况),还会占大量内存——如果多边形范围稍大,存全量坐标的内存开销会非常夸张,完全没必要做这种无用功。
「生成后测试」的优势和实操
这种方法逻辑简单,效率拉满:
- 先算出多边形的边界框(取所有顶点的x、y极值,得到min_x/max_x、min_y/max_y)
- 在边界框范围内随机生成(x,y)点
- 用高效的点-in-多边形判断工具验证点是否在内部,符合条件就保留,不符合就丢弃重生成
给你个实际可运行的代码示例,用matplotlib.path做判断(不用额外装库,适合新手):
import numpy as np import matplotlib.path as mpath # 替换成你的多边形顶点坐标 polygon_verts = [(0, 0), (0, 10), (8, 12), (10, 8), (10, 0)] # 构建多边形路径对象 poly_path = mpath.Path(polygon_verts) # 计算边界框 x_coords, y_coords = zip(*polygon_verts) min_x, max_x = min(x_coords), max(x_coords) min_y, max_y = min(y_coords), max(y_coords) # 生成指定数量的多边形内随机点 def generate_random_points(n): result = [] while len(result) < n: # 生成边界框内的随机点 x = np.random.uniform(min_x, max_x) y = np.random.uniform(min_y, max_y) # 判断点是否在多边形内 if poly_path.contains_point((x, y)): result.append((x, y)) return result # 测试生成1000个点 points = generate_random_points(1000)
如果你的多边形是那种“瘦长”或者带很多空洞的特殊形状,边界框内无效区域占比极高,那可以考虑把多边形拆成几个小区域分别处理,减少无效点的生成比例;但绝大多数普通场景下,上面的代码速度已经足够快,完全能满足需求。
内容的提问来源于stack exchange,提问作者jivky
相关产品推荐
相关产品推荐

