【问题标题】:Hexagons from triangles on sphere: constructing a hexagonal/geodesic grid from icosahedronal grid (North Pole only)球体上三角形的六边形:从二十面体网格构建六边形/测地线网格(仅限北极)
【发布时间】:2019-10-02 22:19:41
【问题描述】:

我正在尝试在球体上构建六边形/测地线网格。出于我的目的,我只关注北极。到目前为止,我已经设法使用stripy 包构建了一个基于二十面体的三角形网格。 stripy 包允许我通过二等分来细化网格:每条边被分成两半,或者等效地,每个三角形被分成 4 个较小的三角形。

我想通过组合 6 个三角形(5 个在极点)来创建一个(几乎)六边形网格,如下所示:

我有以下可用信息:

  • 所有顶点的纬度/经度为np.array
  • 三角形顶点索引的三元组

一个限制是索引是相当“随机的”,即它们不会以螺旋形或类似的方式向外增加。

一个选项是找到每个六边形(/五边形)的中点,并将所有以该中点作为三个顶点之一的三角形组合在一起,但我不知道如何通过算法来解决这个问题。找到标记每个六边形中点的顶点的有效方法是什么?会不会以某种方式与网格的较粗版本相关(即在二等分之前)?

【问题讨论】:

  • 你尝试过什么来识别相邻的顶点?蛮力只是为每个顶点(除了极点)搜索最近的六个顶点,不是吗?你试过吗?
  • 不确定如何选择要计算其邻居的顶点以避免重叠...
  • @Spektre:我看过那篇帖子,但这些是构建网格的完全不同的方式,而现在我想使用我已经生成的网格来解决问题。
  • @falidoro 在这种情况下,您应该添加一个包含您的网格的 MCVE,否则这里没有人能够以这种方式提供帮助...

标签: python algorithm mesh triangulation


【解决方案1】:

我想我可能刚刚想到了一个答案,但如果有人能验证这是否可行并提出最佳实施方式,那就太好了。

  1. 令 V0 为包含所有顶点的集合,E0 为包含所有边的集合。让 V1 是一个空集,我们将使用它来存储每次传递的新六边形中点顶点。设 V2 是一个空集,它将保存六边形中点的最终集合。设 E1 是构成已识别六边形“前线”的边的集合,设 E2 是一个空集,它将保存六边形边的最终集合。
  2. 确定北极的顶点。将其从 V0 移动到 V1
  3. 查找与该顶点相对的所有边。将这些边移到 E1。
  4. 从 E0 中删除连接到 V1 中顶点(后面的顶点)的边。
  5. 从 V0 中删除由 E1 中的边连接的顶点。
  6. 将 V1 中的所有顶点移动到 V2。
  7. E1 中的每条边都是另一个三角形的一部分,因此它形成与作为六边形中心的顶点相对的边。识别与 E1 中的边相对的顶点。将这些移至 V1。
  8. 将边缘从 E1 移动到 E2。
  9. 在 E0 中,与 V1 中的顶点相对的所有边。将这些移至 E1。
  10. 从 E0 中删除连接到 V1 中顶点的边。
  11. 从 V0 中删除由 E1 中的边连接的顶点。
  12. 将 V1 中的所有顶点移动到 V2。

等等。等等等等。

【讨论】:

    【解决方案2】:

    或者,可以构建三角剖分的 Voronoi 图;例如使用scipy.spatial.SphericalVoronoi()。二十面体网格的 Voronoi 图产生测地线(六边形)网格。参见例如 Wang 等人。 (2011)。

    同样,除了使用 Voronoi 图,还可以使用每个三角形面的中点创建一个新的三角剖分,这会产生更规则的图案,但确定一个点所在的六边形并不那么简单.

    对于 Voronoi 图,这要容易得多,因为根据定义,包含六边形对应于原始三角剖分中最近顶点生成的六边形。

    Wang、Ning 和 Jin-Luen Lee。 “几何特性 两个球体上的二十面体六边形网格。” SIAM Journal on 科学计算 33.5 (2011):2536-2559。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-16
      • 1970-01-01
      • 1970-01-01
      • 2019-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多