我正在尝试为发现here的Delaunay Triangulation实施分而治之算法,但是遇到了问题。合并两个集合时,我应该找到它们之间的最底端边缘,该边缘不与图中已经存在的任何边缘相交。
我的第一个问题是,最底层根本没有定义,也不是很明显。我读过很多文字,例如,可以安全地使用两组中y值最低的顶点之间的边缘,但事实并非如此,如该图所示:
我很确定,至少这些要点之一必须是该优势的一部分,但是我还是无法证明这一点。
我不想对照图表检查每一对边,因为对于较大的数据集,这可能会花费太长时间。
所以我正在寻找一种找到该基本边缘的方法。任何帮助将不胜感激。
答案 0 :(得分:1)
我很确定,我只是想通了。在获得具有最低y值的顶点之后,我浏览了这两个集合并寻找了两个顶点,它们位于由先前选择的顶点形成的线(或其上)下方,并且与该顶点之间的距离最大。如果两个点之间的距离相等,则在左边的情况下,我选择x值最大的一个,在右边的情况下,我选择最小的x值。
这似乎效果很好。这是因为我注意到,为了发生相交,在该线下需要一个点,该点是与基本边相交的边的一部分。这样,我想我找到了与这两个集合相切的最低边缘,这意味着,如果我旋转该集合,则此线是水平的,则它下方将不存在任何点。
答案 1 :(得分:0)
我最终得到了以下算法:
关于第三步的注意事项:如果S1
的方向(其端点按S2
坐标升序排列),则将段S2
认为在另一个段x
之下。 S1
的两个端点都不是逆时针方向的,即如果我们在S1
上移动,则S2
永远不会在S2
的左侧。
x
依次对点进行排序,然后再按y
进行分类,所以建立子三角凸包的方式将是O(n)
(不进行排序)需要),其中n
是两个子三角图中的点数。O(1)
个子三角形边缘查找功能的容器(例如哈希表),并在O(n)
中进行过滤。O(n)
中完成。因此整个过程将需要进行O(n)
个操作。