指向多边形

时间:2011-05-23 17:51:50

标签: polygon point

我正在尝试做一些SPOJ问题https://www.spoj.pl/problems/FSHEEP/

我们必须找出点是否在多边形内。 我们看到它不是凸多边形(来自问题的图像)。

我试图用维基百科或任何其他网站上描述的Ray Casting算法在O(n * m)时间内解决它。

但如何在O(n log m)中解决它? 那么换句话说如何在对数时间内检查点是否为多边形?

干杯

1 个答案:

答案 0 :(得分:1)

由于这是一个家庭作业问题,我会给你做作业式的帮助。

经验法则:每当你看到log n时,你应该想到“二进制 - 某事”(搜索,树等)。当你看到n log n时,你应该考虑“排序”。你经常会感到惊讶。你能在big-O约束中对顶点和二进制搜索进行排序吗?

更新:

我不想破坏你的乐趣:实际上你按照排序顺序给出了多边形顶点,因此重要的排序就是为你完成的。您不需要在角度空间中创建间隔,使用已排序顶点数组的索引作为间隔。

将光线从农民身上投射到顶点。如果是顺时针,顺时针二进制搜索。如果是逆时针方向,二进制搜索那个方向。两个顶点和农夫形成一个边界三角形。羊是三角形的吗?

疯狂懒惰的伪代码:

if vertex[m] and vertex[0] trivially bound the sheep
  l=m, r=0
else
  l=0, r=m
  while (r-l > 1)
    middle = (r-l)/2
    if vertex[l] and vertex[middle] bound sheep
       r = middle
       continue
    else if vertex[middle] and vertex[r] bound sheep
       l = middle
       continue
    else some_jerk_gave_you_a_sheep_on_a_ray

check vertex[l],vertex[r],farmer triangle

二进制搜索是O(log m)。三角形检查是O(1)。迭代n只羊给你O(n)* O(log m)* O(1)= O(n log m)。