枚举任意维度的六面体单元顶点和面

计算科学 高维 网格遍历 组合学
2021-12-02 01:19:36

我有一个笛卡尔网格d尺寸,我想枚举给定六面体单元格的所有子单元格。如果我只是枚举一个单元格(或包含一个顶点的单元格)的顶点,我可以使用格雷码,这是我的代码

您可以看到这是有效的,因为格雷码序列遍历超立方体的顶点,这正是d维六面体单元是。如果网格是张量积(笛卡尔积),那么对偶网格也是由超立方体组成的,我们可以使用相同的算法遍历顶点周围的单元。

如何将此策略扩展到处理边缘和面?或者,什么策略可以以独立于维度的方式处理它们?

2个回答

正如您所建议的,二进制表示有效,因为二进制数与d数字可以被认为是表示顶点坐标的向量d维超立方体现在请注意,可以通过平均两个(相邻)顶点的坐标来获得边缘中点的坐标,并且可以通过平均两个边缘中点的坐标来获得人脸中点的坐标。

这建议使用三元(以 3 为底)系统,每个数字等于 0、1 或 2。考虑一个超立方体,其体积是区间的张量积[0,2]. 那么顶点的坐标都是d-digit 三进制数,每个数字等于 0 或 2。边缘中点坐标都是d-digit 三进制数,一位等于 1,其余位等于 0 或 2。人脸中点坐标都是d-digit 三进制数,其中两位等于 1,其余数字等于 0 或 2。这以明显的方式扩展到面的更高维类似物。

例如,立方体的顶点(d=3) 是

(0,0,0)
(0,0,2)
(0,2,0)
(2,0,0)
(0,2,2)
(2,0,2)
(2,2,0)
(2,2,2)

边缘_

(0,0,1)
(2,0,1)
(0,2,1)
(2,2,1)
(0,1,0)
(2,1,0)
(0,1,2)
(2,1,2)
(1,0,0)
(1,0,2)
(1,2,2)
(1,2,0)

_

(1,1,0)
(1,1,2)
(1,0,1)
(1,2,1)
(0,1,1)
(2,1,1)

考虑这些坐标甚至给出了一种简单的方法来确定n- 一张脸d维超立方体。这些对应所有d-digit 三进制数n位数等于 1,其余位数等于 0 或 2,因此有2dn(dn)

我没有解决的两件事是:

  1. 订购;格雷码的巧妙之处在于列表中相邻的顶点在空间上是相邻的。我认为您可以通过我描述的表示使用类似于 Gray 的方法来实现这一点,但问题没有具体提到排序,所以我并不担心。

  2. 如何编码。这更像是一个编程问题,应该不会太难。

除了标记所有边缘和面之外,我还发现在相同的上下文中还有其他重要的问题:

  • 以某种特定方式对它们进行编号。deal.II 使用编号,我们首先考虑所有平行于 x 轴的边,并按它们的 y、z 值(0 或 1)按字典顺序对它们进行排序,然后是所有平行于 y 轴的边和按 x、z 值等对它们进行编号。

  • 至于总数:在1d中,有ne_1=1条边。在 2d 中,正方形是通过在 y=0 和 y=1 处复制 1d 线两次形成的,形成两条线,但是我们还必须连接旧线和复制线的所有 nv_1=2 顶点,所以 ne_2=2* ne_1+nv_1=2+2=4。然后通过复制两个正方形并连接所有顶点来构造立方体,因此ne_3=2*ne_2+nv_2=2*4+4=12。你得到递归。