我正在寻找一种算法来获得一组连接顶点的外壳:图中的黑线。该图是多组链接顶点的组合,导致多余的顶点和边。图像显示了这个想法:需要删除红色边缘。
数据看起来像:(v00,v01,v02,...),(v10,v11,v12,...),...数据确实共享公共节点(顶点的数值数据是相同的) )。
可以这样做吗?
谢谢
PS。目标代码是Python。任何接近Python的东西都是完美的。
答案 0 :(得分:2)
听起来好像你想要计算planar straight-line graph的无限面,表示为线段列表,例如
[((x1, y1), (x2, y2)), ((x3, y3), (x4, y4)), ...].
第一步是计算组合嵌入。将每个段及其反转插入到列表的dict中。 (所有这些Python都是未经测试。)
graph = collections.defaultdict(list)
for p1, p2 in segments:
graph[p1].append(p2)
graph[p2].append(p1)
现在,按角度对每个列表进行排序。为简单起见,我将使用atan2
。
for (x1, y1), p2s in graph.items():
p2s.sort(key=lambda (x2, y2): math.atan2(y2 - y1, x2 - x1))
在无限面上找到一个顶点。最左边的,最左边的打破了关系(代码打破最底层的关系,而不是重要)。
v0 = min(graph.keys())
v0
邻接列表中的第一个边缘在无限面上逆时针方向。从反向开始,顺时针方向。
e0 = (graph[v0][0], v0)
现在,以下列方式迭代边缘。
e = e0
while True:
yield e
v = e[1]
neighbors = graph[v]
e = (v, neighbors[neighbors.index(e[0]) - 1])
if e == e0:
break
给定在无限面上顺时针定向的边缘,通过反转获得下一个边缘,然后以顺时针顺序定位具有相同尾部的下一个边缘。重复,直到我们回到起始边缘。
答案 1 :(得分:1)
这将构建外边缘列表。
如果您有多个多边形,则可以删除已开始使用的图形的连接组件,然后重复该算法。请注意,它无法识别带孔的多边形。如果你有洞,你需要运行单独的测试来找出哪个轮廓在哪个。