如何在Python中实现可调整边长的六边形网格坐标自动更新?
六边形网格局部边长调整的实现方案
核心思路:解析方法+拓扑联动
不需要对所有六边形做全局坐标变换,利用六边形网格的拓扑关联(共享边/顶点),通过解析计算局部调整后的坐标,再联动更新相邻网格即可。
具体步骤
- 构建拓扑关系:给每个六边形标记ID,记录每个六边形的相邻六边形ID,以及它们共享的边/顶点索引,这是联动更新的基础。
- 局部边长调整的解析计算:
- 确定修改边对应的两个顶点坐标,结合六边形内角固定120°的约束,根据新边长计算顶点的新坐标。
- 更新共享这条边的两个六边形的顶点集合。
- 联动更新相邻网格:从修改后的六边形出发,遍历所有相邻六边形,根据共享的顶点/边重新计算它们的完整顶点坐标,保证网格连续性。
基于现有代码的修改示例
以下是对你现有代码的调整,支持局部修改边长并联动更新相邻六边形:
import matplotlib.pyplot as plt import numpy as np # 边连接关系(顶点索引) connect = np.array([[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 1], [0, 1], [0, 2], [0, 3], [0, 4], [0, 5], [0, 6]]) # 六边形数据:[中心x, 中心y, 尺寸] hex_data = np.array([[0, 0, 1], [1.5, 1, 1], [3, -1, 1], [4.5, 1, 1], [6, -1, 1], [7.5, 1, 1], [1.5, -2, 1], [1.5, 3, 1], [1.5, -4, 1]]) # 拓扑关联:键为六边形ID,值为(相邻ID, 共享边索引)的列表(示例手动指定,实际可自动生成) adjacent = { 0: [(1, 3), (6, 5)], 1: [(0, 3), (2, 5), (7, 1)], } def connectpoints(xv, yv): for pt1, pt2 in connect: plt.plot([xv[pt1], xv[pt2]], [yv[pt1], yv[pt2]], 'k-') def generate_hex(center_x, center_y, size): # 生成单个六边形的顶点坐标 x_base = np.array([0, -1., -0.5, 0.5, 1, 0.5, -0.5]) * size y_base = np.array([0, 0, 1, 1, 0, -1, -1]) * size return x_base + center_x, y_base + center_y def update_adjacent_hex(hex_id, new_size): # 更新当前六边形尺寸 hex_data[hex_id][2] = new_size # 联动更新相邻六边形(示例逻辑,实际需根据顶点约束精确计算) for neighbor_id, _ in adjacent[hex_id]: neighbor_size = hex_data[neighbor_id][2] * (new_size / hex_data[hex_id][2]) hex_data[neighbor_id][2] = neighbor_size def main(): # 示例:修改ID0的边长为1.5,并联动更新相邻六边形 update_adjacent_hex(0, 1.5) # 绘制所有六边形 for center_x, center_y, size in hex_data: x, y = generate_hex(center_x, center_y, size) plt.plot(x[0], y[0], 'ro', markersize=13) connectpoints(x, y) plt.axis('equal') plt.show() if __name__ == "__main__": main()
关键说明
- 拓扑关联自动生成:实际项目中无需手动指定
adjacent字典,可通过计算六边形中心坐标的距离,自动识别相邻六边形和共享边。 - 严格坐标约束:若要保证网格完全连续,不能仅调整尺寸,需根据修改后的顶点坐标重新计算相邻六边形的中心位置,确保共享边完全重合。
- GeoPandas适配:如果使用GeoPandas,可将每个六边形的
Polygon对象存储在GeoDataFrame中,添加adjacent_ids列记录关联,修改时直接更新geometry字段,再联动更新相邻行的geometry。
内容的提问来源于stack exchange,提问作者George Johnson
相关产品推荐
相关产品推荐

