如果我知道它周围的所有线条

时间:2017-03-26 15:23:13

标签: algorithm computational-geometry point-in-polygon convex-polygon

我的图表中有一系列线条,我也有一点意见。我想要的是一系列线条,它们将通过有序遍历一起形成一个多边形。我不需要实现或任何我想要的任何东西都可以引导我使用我可以使用的算法。 像这样的类似问题已经被问过,但是因为

而不能为我工作

一个常见的问题是,给定一个多边形,我需要找出该点是否在其中,但这对我不起作用,因为我没有任何多边形我只有一个收集线。

最终的多边形也可以是凸的,所以简单地从那一点开始在每一边绘制光线,找到交叉点不起作用我需要更先进的东西。

对于所有的混淆感到抱歉:为清楚起见,请参阅此https://ibb.co/nzbxGF

1 个答案:

答案 0 :(得分:2)

您需要将段集合存储在合适的数据结构中。也就是说,所选择的数据结构应该支持faces的概念,因为您正在寻找一种方法来查找给定点所在的面。一个这样的数据结构是Doubly Connected Edge List

双重连接边缘列表是一种保存平面细分的数据结构。特别是,它包含细分的每个面,边和顶点的记录。它还支持逆时针绕着脸走动,这样您就可以知道哪些片段绑定了特定的脸部(例如包含您要搜索的点的脸部)。

您可以使用Sweep Line AlgorithmO(nlog(n)+klog(n))中构建双重连接边列表,其中n是段数,k是结果细分的复杂性(顶点,边和面的总数)。您不必从头开始编码,因为此数据结构及其构造算法已经多次实现(例如,您可以使用CGAL's DCEL implementation)。

使用双连接边缘列表数据结构,您可以通过应用您在帖子中建议的方法来解决您的问题:给定输入点,解决双连接边缘中每个面的Point in Polygon problem列出并返回绑定到您找到的面部的一组段。然而,这种方法尽管对于某些简单的细分可能足够好,但对于复杂的方法来说效率不高。

更好的方法是将双连接边缘列表转换为专门用于点位置查询的数据结构:The Trapezoidal Map。此数据结构可以在O(nlog(n))预期时间内构建,对于任何查询点,预期搜索时间为O(log(n))。与Doubly Connected Edge List一样,您不必自己实施(同样,您可以使用CGAL's Trapezoidal Map implementation)。