检测给定线段的循环

时间:2014-11-18 18:26:10

标签: algorithm graph computational-geometry

我正在研究用于point location的Slab分解算法的实现,并且我陷入其最后一步。 我有一个顶点列表以及顶点邻居的列表(例如,neighbor [0]具有连接到顶点0的所有顶点)。 我可以很好地创建算法中描述的平板,但是在我检测到一个点之间的线段之后,我不知道如何得到整个分区/周期/面点。

基本上,我有这个

enter image description here

这就是我想要的

enter image description here

我可以尝试以蛮力的方式检测所有周期,但效率在这里很重要。我对如何解决这个问题有任何想法? 所有顶点和线段都来自输入文件,因此如果它有助于检测,我可以以某种方式对它们进行排序。

提前致谢

1 个答案:

答案 0 :(得分:1)

您可以将planar straight-line graph存储为doubly connected edge list。 DCEL表示的相关特征是基础对象是半边(每个分支产生两个相反方向的半边,尾部和头部),有两个操作:

DNext(HalfEdge e) - returns the next half-edge with the same head as e
                    in counterclockwise order around the head
Sym(HalfEdge e) - returns the oppositely oriented half-edge
                  corresponding to the same edge.

然后,您可以使用e = Sym(DNext(e))遍历包含面部的半边,直到e返回其起始值。

首先计算DCEL表示是按角度对半边进行排序然后将它们链接在一起的问题。有一种方法可以使用2x2行列式计算来比较两个半边的角度(避免反正切,如果这与你有关)。