所以,
问题
我有一个关于确定两个点是否在二维平面上连接的算法的问题。我有:
- 二维线阵列。每条线都受其起点终点二维点的限制。每个点都是两个元素的简单数组
[x,y]
- 即每条线看起来像['start'=>[X0, Y0], 'end'=>[X1, Y1]]
让这条线集被命名为L
。线可以属于另一条线(即一条线可以是另一条线的一部分),它们只能与一个点相交,等等 - 即它们在 2D 平面上没有限制。但是线不能是一个点——即线的起点不能等于线的终点。 - 两点
S
和E
,即数组[Xs, Ys]
和[Xe, Ye]
现在,所有的线L
都画在平面上。然后,S
并且E
也被绘制了,我需要回答这个问题 -可以从 S 到达 E 而不与 L 中的任何线相交吗?而且,更具体地说——哪种算法是最优的?通过“可以到达”,我的意思是飞机上有一条从S
到E
没有交叉线的路L
- 而且,当然,这条路可以是任何东西,而不仅仅是线。
样本
- 如您所见,在示例中S
并且E
未连接。同样在示例中,存在一条线完全属于另一条线(灰色和紫色线)的情况 - 以及一条线在另一条线上有开始/结束的情况(绿色和玫瑰线)。
我的方法
目前,我有非确定性多项式(NP)算法来做到这一点。它的步骤是:
- 查找每对线的所有交点。
- 从第一步的点创建新的线集。如果两条线有一个交点,则在每条新线的开头将有 4 条新线与交点 - 或者如果第一条线的开始/结束在第二条线上,则它可以是 3 条新线 - 或者它可以是 2 条新线如果第一行的开始/结束与第二行的开始/结束完全匹配,则行。IE:
所以 1-st case 将产生 4 个新行,2-4 个 case 产生 3 个新行,5 个 case 产生 2 个新行。(线是[A, B]
和[C, D]
)
- 接下来,从第二步开始,我正在搜索所有多边形。多边形是一个封闭的线集(即它包含区域的封闭部分)
- 我正在确定
S
包含S
. 为此,我使用简单的算法 - 计算与多边形边缘的交叉点数以及从S
外平面到外平面的一些线(如果它是奇数,则S
在多边形内部,如果它是偶数 - 然后在外部)。这是一种光线投射算法。然后我这样做是为了E
- 现在,当我为两者设置多边形时
S
,E
我只是比较两组。如果它们相等,则E
可以到达S
并且不能到达 - 否则。
为什么是这个NP?
答案很简单:在第三步,我正在搜索 2D 图中的所有循环。由于如果 NP 存在寻找最大/最小循环长度的问题,那么我的也是(因为我可以简单地通过对结果循环集进行排序来获得最大/最小循环长度)。关于此的良好信息位于此处。
问题
由于我目前的解决方案是 NP,我想知道 - 可能我的问题解决方案是矫枉过正?即可能有更简单的解决方案会导致多项式时间?