如何基于Shapely多边形边界、半径和间距计算行列数?
计算Shapely多边形内可容纳的圆形行列数
核心逻辑
要确定行列数,首先得明确圆心的排布规则:已知圆形半径r、圆形间间距s,相邻圆心的水平/垂直间距应为2*r + s——这样既能保证圆形不重叠,又能满足间距要求。
接下来先通过多边形的最小外接矩形算出理论行列数,再结合多边形实际形状筛选出落在内部的有效圆心,最终统计实际可容纳的行列数。
分步实现
1. 获取多边形边界范围
利用Shapely对象的bounds属性直接提取最小外接矩形的四至:
min_x, min_y, max_x, max_y = polygon.bounds
2. 计算圆心间隔(单元格尺寸)
统一设置水平/垂直方向的圆心间隔:
cell_size = 2 * r + s
如果要使用更紧凑的六边形网格,垂直间隔可调整为cell_size * math.sqrt(3)/2,后续生成圆心时偶数行的x坐标需偏移cell_size/2。
3. 计算理论行列数
基于外接矩形的尺寸,算出理论上能容纳的行列数:
theoretical_cols = int((max_x - min_x) // cell_size) + 1 theoretical_rows = int((max_y - min_y) // cell_size) + 1
注意:这是外接矩形内的最大值,实际多边形内可能存在无法容纳的区域,需要进一步筛选。
4. 生成并筛选有效圆心
遍历所有理论上的圆心位置,判断是否落在多边形内部,统计有效点:
import math from shapely.geometry import Point r = 1.0 # 替换为你的圆形半径 s = 0.5 # 替换为你的圆形间距 cell_size = 2 * r + s min_x, min_y, max_x, max_y = polygon.bounds theoretical_cols = int((max_x - min_x) // cell_size) + 1 theoretical_rows = int((max_y - min_y) // cell_size) + 1 valid_centers = [] for row_idx in range(theoretical_rows): # 圆心y坐标:从边界偏移r,避免圆形超出外接矩形范围 y = min_y + row_idx * cell_size + r for col_idx in range(theoretical_cols): x = min_x + col_idx * cell_size + r center = Point(x, y) # 确保圆心在多边形内部(也可以用within,视需求选择contains/within) if polygon.contains(center): valid_centers.append((row_idx, col_idx, x, y)) # 统计实际有效行列数 if valid_centers: max_valid_row = max(rc[0] for rc in valid_centers) + 1 max_valid_col = max(rc[1] for rc in valid_centers) + 1 print(f"实际可容纳行数:{max_valid_row},列数:{max_valid_col}") else: print("该多边形无法容纳符合要求的圆形")
补充说明
- 若多边形存在凹陷或不规则边缘,上述代码会自动过滤掉落在外部的圆心,确保所有生成的圆形都在多边形内部。
- 六边形网格的调整:将垂直步长改为
cell_size * math.sqrt(3)/2,同时在偶数行时给x坐标加上cell_size/2,这样能提升空间利用率,容纳更多圆形。
内容的提问来源于stack exchange,提问作者Vismaya Hostcurator
相关产品推荐
相关产品推荐

