给定任意维度( D )空间中的一组点的凸包,并给出凸包外部的单独点。有一组可见(来自单独的点)构面(假设所有构面和其他几何对象(面)都是单形的,id est simplicial faces)。有一组不可见的方面。有一个可见方面的子集,每个方面都与不可见方面中的一个或多个相邻。让我们称之为之前的方面及其不可见的对手 - 超视距方面。调用脊的两个相邻面((D - 1) - 维面)共有的几何对象及其维数为(D - 2)。所有的山脊形成一个连续和封闭的链。因此,存在另一种邻接(仅适用于地平线前方面):每两个相邻的脊具有两个对应的可见小平面,这些小平面又可以是或者可以在通常意义上不相邻,但是相邻的衍生意义(它们通过其地平线的邻接而相邻弱)。两个相邻脊((D - 2) - 面)的共同对象是所谓的 peak ((D - 3) - 面)。
我们希望通过添加单独的点来完成凸包。我们可以从第一个已知的可见方面开始,并递归地检查所有邻居的可见性等等,以便生成可见方面或其他一些合理数据结构的图形(对于第一种情况,在另一个列表中只是两个列表(不是以某种方式排序):超视距方面和地平线之前的方面)。
我们有下一个问题:我们应该构造一个新的facets而不是可见的facet(稍后会被删除),并在所有新构造的facet之间提供邻接关系。
至少有两种方法:
对于每个超视距构面,通过复制其地平线((D - 1)顶点)和单独的点来构造新构面。使用相应的超视距小平面初始化其邻居集。在完成构建不完整的新构面之后,我们应该用其他(D - 1)其他构面严格地从新创建的构面集补充其邻居列表。它可以通过上次提到的所有可能对的完全枚举来完成,并检查两个成分是否具有(D-1)公共点,并且每个自己的唯一点,它不存在于其对应物的顶点列表中。关于〜 N 2 * D 平均比较操作平均需要检测所有相邻对。
我们可以跟踪每一步的facet的邻接结构。我的意思是下一个方法:要么是广度优先遍历方面,要么是深度优先遍历(我无法推断出哪一个(这是我怀疑的主要问题的方式))从第一个已知的可见方面开始为我们提供了一组前视界面及其超视距邻居。如果我们要小心,那么我们将获得完全(除了其不可见的叶子)由 D -degree节点(代表facet)组成的树。其每个节点包含其邻居的列表(即,每个小平面数据结构包含其相邻小平面的列表)。学位是邻居的数量。
我对第二种方法的开发感兴趣。我的问题是理解之前在地平线方面之间的弱邻接关系(在上述意义上)以及如何在遍历期间跟踪它:如何找到(或如何知道最后一步)所有"邻居"对于给定的地平线方面而言,前方面是什么?
There is我手写的 C ++ Quickhull算法实现代码;如果能够派上用场我会感到高兴。