我需要一种能够向我提供有关两点之间最短路径的信息的算法。路径应尽可能少,因为每个路点,每个转弯花费时间和时间 - 在我的情况下 - 是昂贵的。
应该计算路径以引导某些形状(大多数是圆形或矩形)的障碍物。
路径存储的信息应该是路径路点的笛卡尔坐标,或者是极坐标(即我单位要执行的命令,如转向角度α,移动距离b)。然而,我更喜欢每个航路点的笛卡尔坐标。
没有导航网或其他东西,只有坐标系和有关障碍物和其他禁区的位置的信息,其中一些是固定的,有些可能(很可能会)移动。
啊,所有这些都应该在.NET中以某种方式提供。
由于
//编辑:为了让事情更清晰一点,这里是我打算做的事情的图片:https://dl.dropbox.com/u/8802336/path.png
答案 0 :(得分:2)
您的问题可以通过两种方式解释。
<强> 1。我想找到最短的路径,通过选择边数最少的那个来打破关系
您可以通过在图形的每个边缘的权重中添加一些非常小的数字ε来实现此目的。该号码必须满足ε < 1/numberOfEdges
。这将通过边缘*ε增加每条路径的长度,这意味着更短的路径将是优选的。这甚至可以用负重边缘工作。注意浮点不准确。
<强> 2。我想找到转弯次数最少的路径,通过选择路径最短的路径打破关系
您可以通过向图表上每条边的权重添加一些大数字E来实现此目的。该号码必须满足E > sumOfAllEdgeWeights
。这将确保仅考虑具有最少边数的路径。 不使用负权重边缘。注意整数溢出。
答案 1 :(得分:0)
如果目标是:
1)最小化边数。
2)最小化距离。
按照这个顺序,你可以这样做一件事:
1)从头到尾画一条线。
2)计算你的线碰撞的每个物体。
3)对于每个对象,计算垂直于对象的两个点,这些点允许您将路径拆分为两个路径段。您可以通过将线分成两段来为矩形执行此操作,对于段A,可以看到它可以通过的四个角中的哪一个,对于段B,可以看到它可以通过的四个角中的哪一个并尝试所有组合,直到找到排放量最小的两个。对于圆圈,我忘了怎么做,但是在两边只有一个解决方案,两个路径段与圆圈齐平,所以你可以使用三角法或其他东西(我会试着弄明白:))
对于两个新路径,以递归分支方式调用4)。
4)对于您生成的两个线段,重复计算,直到没有碰撞为止。与A *类似,你应该首先计算看起来最好的路径(剩下最少的碰撞,或者如果太难,则先做最浅的碰撞)。
5)通过您喜欢的任何指标选择最佳路径。在A *方式中,您应该对列表进行排序,以便通过您的指标获得最佳路径,因此您可以选择第一条完成路径。
我不能在脑海中证明这一切都会有效,但我之前已经看过类似的东西了。
修改
要计算围绕圆的一个方向上两个线段的最近路径,请对每个线段执行
- 边A:从行的起点(或行尾)xs,ys到圆的中心xc,yc,length = a
- 边B:从中心xc,yc到圆周的某个地方,所以长度= r
-Side C:从B侧的端点到xs,ys(斜边)
A和B形成的角度是直角,我们知道A和B的长度,所以我们可以将C的长度计算为sqrt(A ^ 2 + B ^ 2)
最后,我们知道C的长度= A的长度/ sin(角度(B到C))= B的长度/ sin(角度(A到C)),这意味着我们可以用三角法来找出角度A到C和角度B到C。
这让我们可以完全构建路径段的一侧。对另一边重复,我们将路径分成两部分,在两个部分上对齐圆圈 - &gt;最小化距离。