设P是一个简单但不一定是凸的多边形,q是任意的 点不一定在P.
设计一种有效的算法来查找源自q的线段,该线段与P的最小边数相交。
答案 0 :(得分:0)
如果q
是您在2D空间中的要点,我们可以写q(x,y)
。我们知道多面体有边(E),顶点(V)和面(F),所有这些术语都与欧拉定理中的公式V - E + F = 2
有关,但问题变得更容易了,因为它用于多边形。
所以平原是找到一条边并计算点q(x,y)
到边缘中心的方向向量,这样做(如果多边形是凸的)我们确定这个线段只会经历了P的一个边缘。
计算需要一点线性代数,但并不困难,例如:
1 - 找到从一条线到一个点的距离(这样我们就可以找到在这个问题中使用的最近边缘):
2 - 另外,一个好主意是找到最接近(x0,y0)
的这一行上的点有坐标:
行的等式为ax + by + c = 0
且(x0,y0)
为任意点,不一定在P中。
所以,现在我们可以在最接近初始点k(x,y)
的行上找到点q(x0,y0)
,执行|q-k| = d
。其中d是我们计算的距离。之后,您已经拥有了找到源自q的线段所需的一切,该线段与P的最小边数相交。
您可以在这些地方学习并找到有关此主题的更多信息:
答案 1 :(得分:0)
考虑在地图上执行此操作,以便您可以考虑北,南,东,西和方位等方向。
如果你的光线从q out到无穷大的特定方向,它是否与点A和B之间的线相交只取决于光线的方位,以及从q到A和B的方位:如果光线的轴承在轴承从q到A和轴承从q到B的范围内,在线的方向上,然后光线将与线相交。
所以你可以把它减少到一个更简单的问题。想象一下,所有的点都在q周围的圆圈中,并且线条是这个圆圈的弧线。现在你需要在这个圆上找到一个与最小弧数重叠的点。如果将每个跨越0度的弧线分成两个0,切割例如,您也将使生活变得更加容易。弧度从320度到40度,从320度到360度= 0度,一个从0度到40度。
这个好的候选点是圆圈中每个点的顺时针点。现在命令每个弧从低角度到高角度,按小角度对弧进行排序,然后按顺序进行处理,当看到弧的开始时递增计数器,当看到弧时开始递减计数器。弧的结束(你不必担心绕过0 = 360度的弧,因为你刚刚确定没有任何弧)。您要查找的点是与计数器的最小值相关联的点。
答案 2 :(得分:0)
以q
作为坐标的原点,计算顶点的极坐标参数。这是在线性时间内完成的。
然后每个边缘跨越一个角度间隔。要处理环绕,您可以拆分跨越360°边界的间隔。
您在1D间隔重叠的实例中解决了问题。这在O(N Log(N))
时间内很容易解决。