从多边形中查找/删除多余的边

时间:2014-09-11 12:43:26

标签: python algorithm polygon computational-geometry

我正在寻找一种算法来获得一组连接顶点的外壳:图中的黑线。该图是多组链接顶点的组合,导致多余的顶点和边。图像显示了这个想法:需要删除红色边缘。

数据看起来像:(v00,v01,v02,...),(v10,v11,v12,...),...数据确实共享公共节点(顶点的数值数据是相同的) )。

enter image description here

可以这样做吗?

谢谢

PS。目标代码是Python。任何接近Python的东西都是完美的。

2 个答案:

答案 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)

  1. 制作顶点列表及其坐标和边缘列表。
  2. 对于每个顶点,按逆时针方向将角度的事件边缘排序。
  3. 从最左边的顶点开始(如果有多个顶点,则最左边 - 最低)。
  4. 选择角度为>-π/ 2的第一条边。
  5. 横穿边缘。
  6. 按排序顺序选择传入边缘之后的第一条边。
  7. 如果这不是您开始使用的顶点,请转到5.
  8. 这将构建外边缘列表。

    如果您有多个多边形,则可以删除已开始使用的图形的连接组件,然后重复该算法。请注意,它无法识别带孔的多边形。如果你有洞,你需要运行单独的测试来找出哪个轮廓在哪个。