查询是否位于多边形内的查询

时间:2018-02-08 08:49:16

标签: algorithm polygon computational-geometry binary-search convex-polygon

我获得 S 严格凸多边形 Q 要处理的查询。

多边形和查询点的所有点都以(x,y)对给出。多边形的点以逆时针顺序给出。

上述变量受到限制,1<=S<=10^61<=Q<=10^5以及1<=|x|,|y|<=10^9

对于每个查询,如果给定的点位于多边形内,我应该输出Yes;否则,没有。

我尝试使用O(S) 包含测试 (光线投射)并且它为更大的测试用例超时但是也没有通过所有测试用例初步的。

显然,实现并没有覆盖所有边缘情况,我了解了这个问题的特定算法,它可以回答 O(log S)中的每个查询 使用二分搜索,但我无法弄清楚如何从伪代码实现它(第一次进行计算几何)。

任何人都可以向我提供算法,该算法涵盖了所需时间复杂度 (Q log S) 中的所有边缘情况,或者引导我访问实现它的页面或纸张?

3 个答案:

答案 0 :(得分:1)

您可以执行扫描线算法。 您需要按Q坐标对Q点进行排序。 然后找到具有最低x的S点并考虑沿x轴移动的线。您需要跟踪多边形的两侧。

然后沿着多边形移动,Q设置为上升的x坐标。对于每一点,您现在只需检查它是否在您正在跟踪的两条线之间。

如果Q没有排序,复杂度为O(Q logQ + S),如果Q已经排序,则复杂度为O(Q + S)。

答案 1 :(得分:1)

首先,您可以将凸多边形分为部分,从上部点开始,以下部点结束。这两个部分中的点已经按y - 坐标

排序

假设查询点的坐标为(qx, qy)。现在,您可以尝试查找(使用二进制搜索) left 部分中的一个段和 right 部分中与行y = qy相交的段。如果您可以找到这两个细分,并且qx位于x - 细分的坐标之间。与线y = qy的交叉点,它在多边形内部。

enter image description here

查询的复杂性为O(log(S))

答案 2 :(得分:1)

无需排序,凸多边形已经排序!

对于凸多边形,点位置快速简便:使用顶点0和顶点S / 2之间的直线将多边形分成两部分。签名区域测试将告诉您测试点位于哪一侧以及保留哪一半(一半也是凸多边形)。

以递归方式继续,直到S = 3,并与第三方的支撑线进行比较。

O(Log(S))测试总计每个查询。

enter image description here

(数字显示分组的顺序。)