You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 13:16:04