在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 就不足以表示单纯形。相同的集可以表示具有不同体积符号的等效单纯形。 列表可以保留方向,但仅从订单中获取它并非易事。因此,单独的集合和列表都不是好的解决方案(代表单纯形和它们的边缘)。
答案 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。