如果目标是:
1) 最小化边数。
2) 最小化距离。
按照这个顺序,你可以尝试这样的一件事:
1) 从头到尾画一条线。
2)计算你的线碰撞的每个对象。
3) 对于这些对象中的每一个,计算垂直于对象的两个点,以便将路径分成两个路径段。您可以通过将线分成两段来对矩形执行此操作,对于段 A,查看它可以通过的四个角中的哪个,对于段 B,查看它可以通过的四个角中的哪个并尝试所有组合,直到找到位移最小的两个。对于圆圈,我忘记了怎么做,但是在两侧只有一个解决方案,两个路径段与圆圈齐平,所以你可以使用三角函数或其他东西来做(我会试着弄清楚:))
对于两条新路径,以递归分支方式调用 4)。
4) 对于你生成的两条线段,重复计算直到没有碰撞。与 A* 类似,您应该首先计算看起来最好的路径(剩下的碰撞最少,或者如果太难,就先做最浅的碰撞)。
5)通过您喜欢的任何指标选择最佳路径。以 A* 方式,您应该对列表进行排序,以便通过您的指标的最佳路径位于顶部,因此您可以选择第一条路径来完成。
我无法在脑海中证明这将永远有效,但我以前见过类似的东西。
编辑
要计算两个线段在一个方向上绕圆的最近路径,请对每个线段执行
-A 面:从行首(或行尾)xs,ys 到圆心 xc,yc,长度 = a
-B 面:从中心 xc,yc 到圆周上的某处,所以长度 = r
-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。
这让我们可以完全构建路径段的一侧。对另一侧重复,我们将路径分成两部分,在两个部分上都与圆齐平 -> 最小化添加的距离。