Graph 高维邻接

Graph 高维邻接,graph,geometry,computational-geometry,adjacency-list,convex-hull,Graph,Geometry,Computational Geometry,Adjacency List,Convex Hull,给定任意维(D)空间中一组点的凸包,并给定凸包内部外部的独立点。有一组可见(从单独的点)面(假设所有面和其他几何对象(面)都是简单面,id为最简单面)。有一组不可见的面。存在可见面的子集,每个可见面与一个或多个不可见面相邻。让我们把它们称为“地平线前的面”和“地平线上的面”。两个相邻面((D-1)-维度面)共同调用脊线的几何对象,其维度为(D-2)。所有的山脊形成一个连续的、封闭的链条。因此,还有另一种邻接(仅适用于地平线前的面):每两个相邻的脊线都有两个对应的可见面,而这两个面在常识上可以相邻

给定任意维(D)空间中一组点的凸包,并给定凸包内部外部的独立点。有一组可见(从单独的点)面(假设所有面和其他几何对象(面)都是简单面,id为最简单面)。有一组不可见的面。存在可见面的子集,每个可见面与一个或多个不可见面相邻。让我们把它们称为“地平线前的面”和“地平线上的面”。两个相邻面((D-1)-维度面)共同调用脊线的几何对象,其维度为(D-2)。所有的山脊形成一个连续的、封闭的链条。因此,还有另一种邻接(仅适用于地平线前的面):每两个相邻的脊线都有两个对应的可见面,而这两个面在常识上可以相邻,也可以不相邻,但在派生意义上相邻(它们通过其地平线脊线的邻接而弱相邻)。两个相邻脊((D-2)-面)的公共对象是所谓的峰值((D-3)-面)

我们希望通过添加分离点来完成凸包。我们可以从第一个已知的可见面开始,递归地检查其所有邻居的可见性,以此类推,以生成可见面图或其他一些合理的数据结构(进一步列表中的第一种情况只是两个列表(不以某种方式排序):地平线上的面和地平线前的面)

我们有下一个问题:我们应该构造一个新的面而不是可见的面(稍后将被删除),并在所有新构造的面之间提供邻接关系

至少有两种方法:

  • 对于每个超水平面,通过复制其水平脊((D-1)顶点)和单独的点来构造新的面。使用相应的超视距方面初始化其邻居集。在构建完不完整的新面之后,我们应该用新创建的面集合中额外的(D-1)其他面来补充它的邻居列表。可以通过对最后提到的集合中的所有可能对进行完整枚举,并检查这两个组分是否具有(D-1)公共点以及每个组分各自的唯一点,这些点不存在于对应组分的顶点列表中。大约~N2*D平均检测所有相邻对所需的相等比较操作

  • 我们可以跟踪每个步骤上的面的邻接结构。我指的是下一种方法:面宽优先遍历,或者深度优先遍历(我无法推断从第一个已知可见面开始的是哪一个(顺便说一下,这是我怀疑的主要问题))为我们提供了一组地平线前的面和它的超地平线邻居。如果我们小心的话,我们会得到一棵树,它完全(除了它的不可见的叶子)由D-度节点组成(表示面)。每个its节点都包含其邻居的列表(即,每个方面数据结构都包含其相邻方面的列表)。程度是邻居的数量

我对第二种方法的发展感兴趣。我的问题是理解水平面之前的面之间的弱邻接关系(在上述意义上)以及如何在遍历过程中跟踪它:如何找到(或如何在最后一步知道)水平面之前的所有“相邻”面,以便在水平面之前给定

我手工编写的Quickhull算法实现的C++代码;如果它能派上用场,我会很高兴的。

每个面都包含(D-1)脊。每个山脊包含(D-2)个峰。所以有大约N*(D-1)*(D-2)个内存来跟踪邻接。