如果在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)
现在回到2)点 - 通过将这些线的垂线与它们各自侧面上的物体的最远点进行比较,可以确定2个或更多个路径之间的最小位移。 (希望我已经让自己明白了)。
那么 - 我们如何将垂线绘制成直线路径?
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 的正确值。
我想不出任何进一步的想法或建议?
答案 0 :(得分:3)
是否有可能对所有形状使用多边形(即直线段)近似值? 这将简化算法的实现。
假设这确实可行:如果你想使用A *那么你需要一个图表表示 您可以采取的可能路径。该图的节点是:
的组合此图中的边缘仅在
时位于每对节点之间图中每条边的长度就是它所代表的两个顶点之间的(欧几里德)距离,而最短路径总是这些边的一个子集(我想),你可以通过应用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)等距的所有点的组合。