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

如何使用Python为给定边界的不规则菱形区域生成等间距网格点

问题核心原因

  • 你写的if (x,y) in border逻辑完全错误:这个判断是检查网格点是否恰好等于边界上的离散采样点,但你生成的网格点坐标和border里的采样点几乎不可能完全匹配,更重要的是你需要筛选的是落在菱形区域内部/边界上的点,而不是排除边界点,所以这个判断完全起不到区域裁剪的作用,才会输出整个正方形的网格。
  • 你生成y坐标时直接复用了x的width数组,y的范围错设为0√3/2,和菱形实际的y范围(-√3/4√3/4)不符,就算判断逻辑正确也会丢失下半部分区域的点,同时多出上半部分无效区域的点。
  • 后续测试相邻点距离异常的原因:你把不同行的点扁平化后直接按索引求相邻距离,这时候上一行最后一个点和下一行第一个点会被误认为是相邻点,自然会出现距离突变,不是网格本身的间距问题。

正确实现步骤

步骤1:构造多边形路径用于点区域判断

直接用matplotlib.path.Path的内置方法做区域判断,不需要自行实现几何算法,效率更高:

import numpy as np
import matplotlib.path as mpath

# 你的原有边界构造代码
xlim = list(np.linspace(0,1/4*(np.sqrt(3)+1), num=56)) + list(np.linspace(1/4*(np.sqrt(3)+1),np.sqrt(3)/2, num=20)) + \
list(np.linspace(np.sqrt(3)/2, 1/4*(np.sqrt(3)+1), num=20)) + list(np.linspace( 1/4*(np.sqrt(3)+1),0, num=56))

ylim = list(np.linspace(0, np.sqrt(3)/4, num=56)) + list(np.linspace(np.sqrt(3)/4,0, num=20)) +\
list(np.linspace(0, -np.sqrt(3)/4,num=20)) + list(np.linspace(-np.sqrt(3)/4,0, num=56))

border = []
for i in range(len(xlim)):
    border.append((xlim[i],ylim[i]))

# 构造多边形路径对象
border_arr = np.array(border)
poly_path = mpath.Path(border_arr)

步骤2:生成网格并筛选区域内的点

调整grid_density参数即可控制点的疏密,数值越大点越密:

grid_density = 30 # 可自行修改调整点数量
# 生成覆盖菱形完整范围的正交网格
x_grid = np.linspace(0, np.sqrt(3)/2, grid_density)
y_grid = np.linspace(-np.sqrt(3)/4, np.sqrt(3)/4, grid_density)
X, Y = np.meshgrid(x_grid, y_grid)
# 把二维网格展平为所有点的坐标数组
all_points = np.column_stack([X.ravel(), Y.ravel()])

# 筛选落在菱形内部/边界上的点
mask = poly_path.contains_points(all_points)
kgrid = all_points[mask]

步骤3:验证点间距(规避之前的错误计算逻辑)

网格本身是正交等距的,不需要逐点遍历计算相邻距离,直接计算网格步长即可:

dx = x_grid[1] - x_grid[0]
dy = y_grid[1] - y_grid[0]
print(f"横向固定间距:{dx:.6f}, 纵向固定间距:{dy:.6f}")

如果需要斜向等距的菱形网格而非正交网格,可先对正交网格做仿射变换,再用上述同样的路径判断方法做区域裁剪即可。

内容的提问来源于stack exchange,提问作者Madlad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 03:48:03