Algorithm 如何找到与多边形相交次数最少的光线?

Algorithm 如何找到与多边形相交次数最少的光线?,algorithm,geometry,polygon,linear-algebra,computational-geometry,Algorithm,Geometry,Polygon,Linear Algebra,Computational Geometry,设p为简单但不一定是凸多边形,q为任意多边形 点不一定在P 设计一个有效的算法来寻找一条从q开始的线段,该线段与p的最小边数相交。如果q是你在二维空间中的点,我们可以写q(x,y)。我们知道多面体有边(E)、顶点(V)和面(F),所有这些项都与欧拉定理中的公式V-E+F=2有关,但问题变得更容易,因为它是针对多边形的 所以平面就是找到一条边,然后计算点的方向向量q(x,y)到边的中心,这样做(如果多边形是凸的),我们可以确定这条线段将只通过p的一条边 计算将需要一点线性代数,但并不难,例如: 1

设p为简单但不一定是凸多边形,q为任意多边形 点不一定在P


设计一个有效的算法来寻找一条从q开始的线段,该线段与p的最小边数相交。

如果
q
是你在二维空间中的点,我们可以写
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-k |=d
。其中d是我们刚刚计算的距离。在这之后,你已经有了所有你需要的东西来找到一条从q开始的线段,它与P的最小边数相交

您可以在一些地方学习并找到有关此主题的更多信息:


想象一下在地图上这样做,这样你就可以想到北、南、东、西和方位等方向

如果有一条光线从q向外到无穷远,它是否与点a和点B之间的直线相交,只取决于光线的方向角,以及从q到a和B的方向角:如果光线的方向角在从q到a的方向角和从q到B的方向角所跨越的范围内,沿直线方向取此值,则光线将与直线相交

所以你可以把它简化成一个更简单的问题。假设所有的点都在一个围绕q的圆中,直线就是这个圆的圆弧。现在你需要在这个圆上找到一个点,这个点被最小数量的弧重叠。如果您将跨越0度的每个圆弧在0处分成两段,例如将320度到40度的圆弧切割为320度到360度=0度的圆弧,以及0度到40度的圆弧,您的生活也会变得更加轻松


很好的候选点是圆中每个点的顺时针方向的点。现在对每个圆弧进行排序,使其从低角度到高角度,按低角度对圆弧进行排序,并按顺序进行处理,在看到圆弧起点时递增计数器,在看到圆弧终点时递减计数器(您不必担心环绕0=360度的圆弧,因为您刚刚确保没有任何圆弧)。要查找的点是与计数器最小值关联的点。

q
作为坐标原点,计算顶点的极坐标参数。这是在线性时间内完成的

然后每条边都跨越一段角度间隔。要处理环绕,可以分割跨越360°边界的间隔


您在1D间隔重叠的实例中解决了这个问题。这在
O(N Log(N))
time中很容易解决。

Sure
min(直线段)=直线(q,q)
。我想你还没有告诉我们所有的要求。看起来像是一个家庭作业问题好吧,很有趣的问题,但这里没有人喜欢这样的问题。这就是问题所在,所以要想办法解决它。如果你不知道如何解决家庭作业,请尝试先对数据进行排序(这里按相对于给定点的极角对顶点进行排序)@NiklasB,“但不一定是凸的”,这就是他所说的,所以它可以是凸的,在这种特殊情况下,我的解决方案将是有用的。