你如何实现一个程序来找到2d平面中的最短路径?

时间:2012-11-05 18:39:51

标签: algorithm visual-c++ geometry artificial-intelligence

如果在2d飞机上有一个没有。所有可能的2d形状(圆形,四边形,三角形,不规则形状......)的障碍物,那么如何实现一种机制来找到障碍物周围的最短路径?我正在考虑使用visual c ++,因为它提供了许多图形类来绘制这些数字。

我来得很远

1)首先,我将使用A *搜索(A-star)找到成本最低的路径

2)直线路径位移最小的路径将被视为最佳路径。 (虽然不太确定)

3)绕过一个数字的最短路径,例如从一开始,就是从这一点开始的一条线:

a) the farthest vertex in case of a polygon/quadrilateral
b) a point on the circumference such that the line drawn would be tangential to the circle, in case of a circle or arc
c) (not sure about irregular figures)

enter image description here


现在回到2)点 - 通过将这些线的垂线与它们各自侧面上的物体的最远点进行比较,可以确定2个或更多个路径之间的最小位移。 (希望我已经让自己明白了)。

那么 - 我们如何将垂线绘制成直线路径? enter image description here

x1,x2,y1,y2,k和l 是已知的。我们只需找到 a,b

直线的斜率*垂直的斜率= -1

=> (y2-y1)/(x2-x1) * (b-l)/(1-k) = -1
hence, b = [(x1-x2)/(y2-y1) * (a-k)] + l

我已经想到通过使用毕达哥拉斯定理,我们可以根据坐标找到另一个方程。通过这种方式可以找到每一行的长度:     dx = x1-x2     dy = y1-y2     dist = sqrt(dx dx + dy dy)

然后通过求解这2个eqns,我们可以找到 a,b 的正确值。


我想不出任何进一步的想法或建议?

3 个答案:

答案 0 :(得分:3)

是否有可能对所有形状使用多边形(即直线段)近似值? 这将简化算法的实现。

假设这确实可行:如果你想使用A *那么你需要一个图表表示 您可以采取的可能路径。该图的节点是:

的组合
  • 所有形状的所有顶点[1]和
  • 起点和终点
  • {起点和终点之间的直线段}与所有形状之间的所有交点。

此图中的边缘仅在

时位于每对节点之间
  • 在它们对应的两个顶点之间存在一条直线
  • 不与任何形状相交[2]。

图中每条边的长度就是它所代表的两个顶点之间的(欧几里德)距离,而最短路径总是这些边的一个子集(我想),你可以通过应用A *找到它们。到这张图。

[1] - 为了减少顶点的数量,可以使所有凹形凸起(除非这会导致开始 或者终点在这样的形状内,那么它应该是凹的)。

[2] - 您可以使用各种数据结构来加速这些查询,例如kD或四叉树,或者可以使用扫描线算法(例如http://en.wikipedia.org/wiki/Bentley%E2%80%93Ottmann_algorithm)与双重结合 - 连接边缘列表。

答案 1 :(得分:0)

嗯,我不确定这是否有所帮助,但无论如何,每个不规则的物体都可以被分成一个常规物体的组合,就像一个圆圈,只是曲线的半径不断变化。所以你可以认为它是一个组合对应于不同半径的弧。

答案 2 :(得分:0)

对于第二点,如果有点(l,k)。考虑位于线(x1,y1),(x2,y2)上的两个点,它们与(l,k)等距。所以垂直将是与(x1,y1)和(x2,y2)等距的所有点的组合。