球体上三角形的六边形:从二十面体网格构建 hexagonal/geodesic 网格(仅限北极)
Hexagons from triangles on sphere: constructing a hexagonal/geodesic grid from icosahedronal grid (North Pole only)
我正在尝试在球体上构建 hexagonal/geodesic 网格。出于我的目的,我只关注北极。到目前为止,我已经成功地使用 stripy
包构建了一个基于二十面体的三角形网格。 stripy
包允许我通过二分法细化网格:每条边被分成两半,或者等效地,每个三角形被分成 4 个较小的三角形。
我想通过组合 6 个三角形(5 个在极点)来创建一个(几乎)六边形网格,如下所示:
我有以下可用信息:
- latitude/longitude 的所有顶点为
np.array
- 三角形顶点索引的三元组
一个限制是指数相当 'random',即它们不会通过向外螺旋或类似的方式增加。
一个选项是找到每个六边形 (/pentagon) 的中点,并将所有以这个中点作为其三个顶点之一的三角形组合在一起,但我不确定如何通过算法来解决这个问题。找到标记每个六边形中点的顶点的有效方法是什么?它会以某种方式与网格的较粗糙版本相关(即在平分之前)吗?
我想我可能刚刚想到了一个答案,但如果有人可以验证这是否可行并建议最佳实施方式,那就太好了。
- 设V0为包含所有顶点的集合,E0为包含所有边的集合。设 V1 为一个空集,我们将使用它来存储每次遍历的新六边形中点顶点。令 V2 为一个空集,它将保存六边形中点的最终集合。设 E1 是形成已识别六边形 'front-line' 的边的集合,设 E2 是一个空集,它将保存最终的六边形边集合。
- 确定北极的顶点。将它从 V0 移动到 V1
- 找到与该顶点相对的所有边。将这些边移动到 E1。
- 从E0开始,删除连接到V1中的顶点(后面的顶点)的边。
- 从V0开始,删除E1中由边连接的顶点。
- 将 V1 中的所有顶点移动到 V2。
- E1中的每条边都是另一个三角形的一部分,为此它形成与六边形中心顶点相对的边。识别与 E1 中的边相对的顶点。将这些移动到 V1。
- 将边从 E1 移动到 E2。
- 在 E0 中,所有与 V1 中的顶点相对的边。将这些移动到 E1。
- 从 E0 开始,删除连接到 V1 中的顶点的边。
- 从V0开始,删除E1中由边连接的顶点。
- 将 V1 中的所有顶点移动到 V2。
等等等等等
或者,可以构建三角剖分的 Voronoi 图;例如使用 scipy.spatial.SphericalVoronoi()
。二十面体网格的 Voronoi 图产生测地线(六角形)网格。参见例如 Wang 等人。 (2011)。
同样,除了使用 Voronoi 图,还可以使用每个三角形面的中点创建一个新的三角剖分,这会产生更规则的图案,但确定哪个六边形点所在。
对于 Voronoi 图,这要容易得多,因为根据定义,包含六边形对应于原始三角剖分中最近顶点生成的六边形。
Wang, Ning, and Jin-Luen Lee. "Geometric properties of the
icosahedral-hexagonal grid on the two-sphere." SIAM Journal on
Scientific Computing 33.5 (2011): 2536-2559.
我正在尝试在球体上构建 hexagonal/geodesic 网格。出于我的目的,我只关注北极。到目前为止,我已经成功地使用 stripy
包构建了一个基于二十面体的三角形网格。 stripy
包允许我通过二分法细化网格:每条边被分成两半,或者等效地,每个三角形被分成 4 个较小的三角形。
我想通过组合 6 个三角形(5 个在极点)来创建一个(几乎)六边形网格,如下所示:
我有以下可用信息:
- latitude/longitude 的所有顶点为
np.array
- 三角形顶点索引的三元组
一个限制是指数相当 'random',即它们不会通过向外螺旋或类似的方式增加。
一个选项是找到每个六边形 (/pentagon) 的中点,并将所有以这个中点作为其三个顶点之一的三角形组合在一起,但我不确定如何通过算法来解决这个问题。找到标记每个六边形中点的顶点的有效方法是什么?它会以某种方式与网格的较粗糙版本相关(即在平分之前)吗?
我想我可能刚刚想到了一个答案,但如果有人可以验证这是否可行并建议最佳实施方式,那就太好了。
- 设V0为包含所有顶点的集合,E0为包含所有边的集合。设 V1 为一个空集,我们将使用它来存储每次遍历的新六边形中点顶点。令 V2 为一个空集,它将保存六边形中点的最终集合。设 E1 是形成已识别六边形 'front-line' 的边的集合,设 E2 是一个空集,它将保存最终的六边形边集合。
- 确定北极的顶点。将它从 V0 移动到 V1
- 找到与该顶点相对的所有边。将这些边移动到 E1。
- 从E0开始,删除连接到V1中的顶点(后面的顶点)的边。
- 从V0开始,删除E1中由边连接的顶点。
- 将 V1 中的所有顶点移动到 V2。
- E1中的每条边都是另一个三角形的一部分,为此它形成与六边形中心顶点相对的边。识别与 E1 中的边相对的顶点。将这些移动到 V1。
- 将边从 E1 移动到 E2。
- 在 E0 中,所有与 V1 中的顶点相对的边。将这些移动到 E1。
- 从 E0 开始,删除连接到 V1 中的顶点的边。
- 从V0开始,删除E1中由边连接的顶点。
- 将 V1 中的所有顶点移动到 V2。
等等等等等
或者,可以构建三角剖分的 Voronoi 图;例如使用 scipy.spatial.SphericalVoronoi()
。二十面体网格的 Voronoi 图产生测地线(六角形)网格。参见例如 Wang 等人。 (2011)。
同样,除了使用 Voronoi 图,还可以使用每个三角形面的中点创建一个新的三角剖分,这会产生更规则的图案,但确定哪个六边形点所在。
对于 Voronoi 图,这要容易得多,因为根据定义,包含六边形对应于原始三角剖分中最近顶点生成的六边形。
Wang, Ning, and Jin-Luen Lee. "Geometric properties of the icosahedral-hexagonal grid on the two-sphere." SIAM Journal on Scientific Computing 33.5 (2011): 2536-2559.