Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找/删除多边形中的多余边_Python_Algorithm_Polygon_Computational Geometry - Fatal编程技术网

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

Python 查找/删除多边形中的多余边,python,algorithm,polygon,computational-geometry,Python,Algorithm,Polygon,Computational Geometry,我正在寻找一种算法来获得一组链接顶点的外壳:图中的黑线。该图是链接顶点集的组合,导致多余的顶点和边。图中显示了这样的想法:红色的边缘需要去除 数据看起来像:v00,v01,v02,…,v10,v11,v12。。。数据共享公共节点。顶点的数字数据相同 这能做到吗 多谢各位 目标代码是Python。任何接近Python的东西都是完美的。听起来好像你想要计算一个由线段列表表示的无限面,例如 [((x1, y1), (x2, y2)), ((x3, y3), (x4, y4)), ...]. 第一步是

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

数据看起来像:v00,v01,v02,…,v10,v11,v12。。。数据共享公共节点。顶点的数字数据相同

这能做到吗

多谢各位


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

听起来好像你想要计算一个由线段列表表示的无限面,例如

[((x1, y1), (x2, y2)), ((x3, y3), (x4, y4)), ...].
第一步是计算组合嵌入。将每个片段及其反面插入一个列表中,如下所示。所有这些Python都未经测试

现在,按角度对每个列表进行排序。为了简单起见,我将使用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
给定无限面上的一条顺时针方向的有向边,通过将其反转,然后按顺时针顺序定位具有相同尾部的下一条边,即可获得下一条边。重复上述步骤,直到我们回到起始边缘

制作顶点及其坐标的列表,以及边的列表。 对于每个顶点,按逆时针角度对其入射边进行排序。 如果有多个顶点,则从最左边的顶点开始。 拾取角度大于-π/2的第一条边。 穿过边缘。 按排序顺序拾取传入边之后的第一条边。 如果这不是您开始使用的顶点,请转到5。 这将生成外部边的列表


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

这个问题不是很清楚。你能将示例输入和所需输出一起添加吗?你在寻找凸壳吗?图片中的多边形不是凸的;但是,如果所考虑的所有多边形都是凸的,那么计算所有顶点的凸包多边形的算法可能会有所帮助。可能性也在一定程度上取决于特定设置中多边形的表示。请编辑问题,使其包含您想要的输入和所需的输出。这幅图很有帮助,但与实际数据结构相比,数据结构的自然语言描述更难推理。顶点是不同的,但几乎重合,还是相同?也就是说,多边形是否共享公共节点?我需要仔细考虑一下,但看起来这就是我要寻找的。非常感谢。我会回来的,就这样!。一个缺点:当一个形状的边上有一个顶点,而另一个形状上没有顶点时,舍入误差可能会/将产生问题。因此,需要进一步观察一步边/顶点来检测这些问题。舍入误差是计算几何中的一个巨大问题。如果可以的话,将问题简化为整数坐标问题。
e = e0
while True:
    yield e
    v = e[1]
    neighbors = graph[v]
    e = (v, neighbors[neighbors.index(e[0]) - 1])
    if e == e0:
        break