Algorithm 从随机列出的边检测多边形

Algorithm 从随机列出的边检测多边形,algorithm,geometry,2d,computational-geometry,Algorithm,Geometry,2d,Computational Geometry,我有一张矢量图,里面有很多多边形的边。每条边由起点和终点表示。边缘之间的连接未明确指示。我需要从这些数据中提取多边形。做这件事的一个明显的方法是,取每条边的一个顶点,搜索所有其他边,寻找一个匹配的顶点,然后用这样定位的边的下一个顶点重复这个过程,直到我有一个闭合的循环。但这是非常低效的 有什么好的算法可以在没有特定顺序的边的起点和终点的情况下提取多边形?尝试类似的方法(python伪代码): 现在你有了所有的顶点和每个顶点的边。现在,您可以对算法进行初步构思,但不必在所有边上搜索匹配的顶点,这种

我有一张矢量图,里面有很多多边形的边。每条边由起点和终点表示。边缘之间的连接未明确指示。我需要从这些数据中提取多边形。做这件事的一个明显的方法是,取每条边的一个顶点,搜索所有其他边,寻找一个匹配的顶点,然后用这样定位的边的下一个顶点重复这个过程,直到我有一个闭合的循环。但这是非常低效的

有什么好的算法可以在没有特定顺序的边的起点和终点的情况下提取多边形?

尝试类似的方法(python伪代码):


现在你有了所有的顶点和每个顶点的边。现在,您可以对算法进行初步构思,但不必在所有边上搜索匹配的顶点,这种查找是即时的。

一种简单的方法是:

Sort the list of edges by end point. Call that array edges
Create a new array, polygon, size is num_edges 
edgeIndex = 0
copy edge from edges[0] to polygon[0]
count = 1
while (count < number_of_edges)
{
    starting_point = edges[edgeIndex].endpoint
    // do a binary search to find the segment that starts
    // at this edge's end point
    newIndex = binary_search(edges, starting_point)
    copy edge[newIndex] to polygon[count]
    ++count
    edgeIndex = newIndex
}
虽然不一定按那个顺序。如果第二条边被指定为
{(10,0),(10,10)}
(即开始和结束是相反的),那么问题就稍微困难一些

您可以使用哈希映射和直接查找来做同样的事情,这将比二进制搜索更快


还请注意,这假设连接到任何一个点的边不超过两条。

边是否交叉?如果他们这样做了,你希望发生什么?@angelatlarge:这很重要,因为如果这种情况经常发生,那么最坏的情况可能会变得相当糟糕。@angelatlarge@M C,边缘不会交叉。它们仅在端点相交。涉及多个多边形。
Sort the list of edges by end point. Call that array edges
Create a new array, polygon, size is num_edges 
edgeIndex = 0
copy edge from edges[0] to polygon[0]
count = 1
while (count < number_of_edges)
{
    starting_point = edges[edgeIndex].endpoint
    // do a binary search to find the segment that starts
    // at this edge's end point
    newIndex = binary_search(edges, starting_point)
    copy edge[newIndex] to polygon[count]
    ++count
    edgeIndex = newIndex
}
{(0, 0), (10, 10)}
{(10, 10), (10, 0)}
{(10, 0), (0, 0)}