如何使用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
相关产品推荐
相关产品推荐

