如何采取(N) - 简单的边缘?

时间:2011-01-16 22:33:23

标签: computational-geometry

在quickhull算法中,需要在一组边上构建一个圆锥。

边缘被认为是子复形,其中一个顶点被移除。 需要的是,向边添加顶点将形成一个单形,就好像该顶点刚被替换一样。

例如,当将单纯形式存储为vrtices列表时,对于使用vertexen {p0,p1,p2}定义的三角形,边缘为:{p1,p2},{p2,p0},{p0,p1} - 在此索引中订购。 现在,当在边缘顶点列表的末尾添加新的顶点p时,新的三角形是:{p1,p2,p},{p2,p0,p},{p0,p1,p}它们具有与原始相同的方向三角形是倾斜的。

对于三角形,与p1相对的边与剩余顶点的顺序相反。 对于四面体,它用于p0和p2。

什么是存储边缘的正确方法,或找出何时反转顶点顺序的正确方法?

好。 通常,如果顶点 set 的方向很重要,那么存储顶点 set 就不足以表示单纯形。相同的可以表示具有不同体积符号的等效单纯形。 列表可以保留方向,但仅从订单中获取它并非易事。因此,单独的集合和列表都不是好的解决方案(代表单纯形和它们的边缘)。

2 个答案:

答案 0 :(得分:1)

最好使用顶点列表或元组来表示单形;问题是如何确定顶点的顺序。 (因为我不完全确定任意尺寸的快速船体的确切要求,我将在下面详细说明......)

如果要使用新点v[i]依次替换每个顶点p,最简单的一致方法是将其替换为它所替换的点。因此,对于三角形{v0,v1,v2},您将获得新的三角形{p,v1,v2}{v0,p,v1}{v0,v1,p}

如果你想重新排序顶点(例如,p在最后),那么你应该记住,交换任意两个顶点将反转单面的方向。因此,为了保持方向,您必须进行偶数次交换。

在上面的示例中,使用最终顶点交换p将反转方向,除非p已经是最终顶点。您可以通过在这种情况下交换前两个顶点来解决此问题。 (请注意,这是一个仅适用于3个顶点单纯形的唯一解决方案 - 它不适用于2个单纯形,也不适用于N> 3个单纯形的多个解决方案之一。)

您还可以将此视为旋转原始3单纯形的顶点列表。不幸的是,这仅适用于奇数顶点单纯形。对于大小为N的顶点列表,旋转涉及N-1交换,因此对于具有偶数个顶点的单形,旋转将改变方向。

答案 1 :(得分:0)

单面的边缘本身没有方向。

只有N维中的N-simplex定义了方向。 它由N个载体pi-p0(有符号体积)的叉积确定。 对于较高维度空间中的较低维度的类似物,不能构建这样的交叉产物。

对于这个心室任务(构建具有另一个边缘的新单纯形),边缘可以由(有序)顶点列表和索引表示,其中添加新点以使其与移除顶点在同一侧。 考虑到列表的循环顺序(不确定它是否普遍有效),可以旋转它以使索引为0或1。