我听说很多人说以编程方式在非凸多边形中找到一个点比在凸多边形中找到一个点更难。我在缠绕这个问题时遇到了麻烦。这是真的?如果是这样,为什么?
答案 0 :(得分:7)
因此,您要检查点P是在多边形内部还是外部。
如果多边形是凸的,那么您可以迭代构成多边形的每个线段,并检查该线P的哪一侧所在。 P位于多边形的内侧,如果它位于每个线段的右侧,则顺时针方向。
如果多边形是凹的,则此算法不起作用。适用于凹多边形的算法是从P沿任意方向跟踪到无穷大,并计算多边形边缘交叉的次数。当且仅当交叉数为奇数时,P在多边形内。该算法有一堆边缘情况需要考虑并且通常更复杂,因此编写算法需要更多的程序员工作。
从某种意义上说,算法更难以正确编写,是的,它更难。
在计算复杂性的意义上,两种算法都具有Θ(N)渐近运行时间。从这个意义上说,这两个问题同样困难。
答案 1 :(得分:3)
对于凸多边形,您可以选择多边形内的任何点p(例如,所有顶点的质心),然后根据它们与p的角度对顶点进行排序。然后,给定查询点x,您可以计算从p到x的角度,并搜索数组并找到数组中的两个相邻顶点,其中x的角度在两个顶点的角度之间。然后计算从p到x的直线与两个顶点之间的边之间的交点。如果从p到交点的距离大于或等于从p到x的距离,则x在多边形内,否则x在多边形外。这给出了O(log n)时间来确定一个点是凸多边形的内部还是外部。另一方面,确定点是在非凸多边形内部还是外部的最着名的算法是O(n)时间。但请注意,您可以根据多边形中的“非凸度”来制作混合算法。您总是可以通过添加额外的内部边缘将多边形分解为凸多边形的并集。假设你的多边形只有几个“转弯”,你可以分解为k个凸多边形,其中k很小。然后,您可以使用凸多边形的策略来确定点是在O(k log n)时间内还是外部。所以一般来说,你拥有的“更多凸性”,你可以更快地确定一个点是否在多边形内部。