Algorithm 检查二维平面上两点之间的连接

Algorithm 检查二维平面上两点之间的连接,algorithm,graph,complexity-theory,Algorithm,Graph,Complexity Theory,所以 问题 我有一个关于确定两点在二维平面上是否连通的算法的问题。我有: 二维线的数组。每条线的起点和终点都受到限制。每个点都是由两个元素组成的简单数组,即每一行看起来都像['start'=>[X0,Y0],'end'=>[X1,Y1]]让这些行被命名为L。线可以属于另一条线(即一条线可以是另一条线的一部分),它们只能与一个点e.t.c相交-即它们在二维平面上没有限制。但直线不能是点,即直线的起点不能等于直线的终点 两点S和E,即数组[Xs,Ys]和[Xe,Ye] 现在,L中的所有线都绘制在

所以

问题

我有一个关于确定两点在二维平面上是否连通的算法的问题。我有:

  • 二维线的数组。每条线的起点和终点都受到限制。每个点都是由两个元素组成的简单数组,即每一行看起来都像
    ['start'=>[X0,Y0],'end'=>[X1,Y1]]
    让这些行被命名为
    L
    。线可以属于另一条线(即一条线可以是另一条线的一部分),它们只能与一个点e.t.c相交-即它们在二维平面上没有限制。但直线不能是点,即直线的起点不能等于直线的终点
  • 两点
    S
    E
    ,即数组
    [Xs,Ys]
    [Xe,Ye]
现在,
L
中的所有线都绘制在平面上。然后,
S
E
也被画出来,我需要回答这个问题——从S到E能不能不与L中的任何直线相交?更具体地说,哪种算法是最优的?所谓“可以到达”,我的意思是在从
S
E
的平面上有一条路,从
L
E的任何直线都没有交叉点,当然,这种路可以是任何东西,而不仅仅是直线

样品

-如您所见,在示例中,
S
E
未连接。在示例中,还存在一条线完全属于另一条线(灰色和紫色线)的情况,以及一条线在另一条线(绿色和玫瑰色线)上具有起点/终点的情况

我的方法

目前,我有非确定性多项式(NP)算法来实现这一点。其步骤如下:

  • 找到每对线的所有交点
  • 从第一步的点创建一组新的线。如果两条线有一个交点,则在每条新线的起点处将有4条新线与交点,或者如果第一条线的起点/终点在第二条线上,则可以有3条新线;如果第一条线的起点/终点与第二条线的起点/终点完全匹配,则可以有2条新线。即:

因此,第1个病例将产生4个新品系,3个新品系中有2-4个病例,2个新品系中有5个病例。(行是
[A,B]
[C,D]

  • 下一步,在第二步的直线中,我搜索所有多边形。多边形是一个闭合线集(即,它包含区域的闭合部分)
  • 我正在确定包含
    S
    的多边形的
    S
    子集。为了做到这一点,我使用了一个简单的算法——计算从
    s
    到外平面的多边形边和一些线的交点数(如果是奇数,则
    s
    在多边形内部,如果是偶数,则在外部)。这是一个算法。然后我为
    E
  • 现在,当我为
    S
    E
    设置多边形时,我只是比较这两个集合。如果它们相等,则可以从
    S
    访问
    E
    ,否则无法访问
为什么这是NP

答案很简单:在第三步中,我正在搜索2D图形中的所有循环。因为如果NP是最大/最小循环长度,那么我的也是(因为我可以简单地通过排序结果循环集获得最大/最小循环长度)。关于这方面的好信息位于

问题


由于我目前的解决方案是NP,我想知道-我对这个问题的解决方案可能是一种过度的杀伤力吗?也就是说,可能有更简单的解决方案会导致多项式时间?

您可以构造一个所谓的连接两个障碍物顶点iif的方法,如果它们直接可见。此图中的最短路径(添加了S和E)将是配置空间中S和E之间的最短无障碍路径。关于可见性图的算法和优化是众所周知的,并且被广泛描述

您将遇到的主要困难是处理拐角情况,这样您就不会在某些不正确的交点处“泄漏”到线段的另一侧(共享线段、端点为交点等)。处理这种极端情况在算法上并不困难,但需要耐心

编辑:


所以让我更正式一点:构建一个图
G(Ver,Edg)
,其中
Ver
包含所有段的端点,
s
E
;而
Edg
包含所有直接可见的顶点对(包括线段后面)。

基本上问题归结为:
1) 确定包含不包含任何其他多边形的空间的所有多边形。在上面的示例中,您有3个不包含任何其他形状/循环/多边形:包含S的四边形、包含E的四边形以及其中2个下方的三角形
2) 确定S和E是否在这些多边形的内部/外部相对。

对于第1部分,您必须构建一个图表:

创建给定直线的交点数组,这是N^2。记住每个交点来自哪两条线。这些交点是图形的顶点

如果两个顶点来自同一条直线,并且它们之间没有其他交点,则它们是“连接”的。显然,不要依赖浮点的精度来确定这一点

现在,您希望在布局中查找多边形。一个图通常可以包含指数数量的循环。然而,每条边可能只与2个“内部”多边形相邻,所以我们只对循环的多项式子集感兴趣。因此,拾取一条边,然后找到多边形中的下一条边,并不断重复,直到回到开始的位置或确定第一条边不是多边形的一部分

因此,假设您来自边E=(U,V),并且希望找到多边形中的下一条边(共享相同的顶点V)。CrossProductChecker(2D T, 2D R) { return (T.x*R.y - T.y*R.x); // cross product for 2 dimensions }
1. Find out the maximum polyogn encompassing S and E 
    (which could possibly be an open polygon, so convex hull algorithm needs 
    to be modified)
2. E can be reached from S if
    (Case 1) The polygons are the same
    (Case 2) Both are open polygons.
Form a set of points by adding the end-points and all possible 
    intersections. (O(n^2))
Eliminate points that can only be reached from P by crossing another line. 
    This can be done by finding the intersection of the line joining P to each 
    point with all other lines (O (n^3)).
Form a convex hull of the remaining points. 
    Here it should be noted that the resulting polygon may not be closed. 
    So, the convex hull algorithm needs to be modified to get rid of 
    those possible edges which don't have a direct connection. 
    This can be efficiently done by an appropriate data structure 
    like a graph (O(n^2) in worst case)