给定是笛卡尔坐标系,从位置A(X / Y)和到位置B(X / Y)。我想从A移动到B.但是,我只能在N,NE,E,SE,S,SW,W,NW八个方向上移动。
我知道我可以通过点积与轴的单位向量(八个方向)从当前位置A计算这些方向中的“最佳”,其中最大的点积是要采取的方向。但是这种方法导致两个方向之间出现某种“振荡”,如果A正好在这两个方向之间。
所以我现在正在寻找一种算法来解决从A到B只有一个或最大的问题。两个方向使用。当然我现在忽略了任何障碍,所以理论上我总是可以从A到B获得最多两个不同的方向。我可以通过一堆if语句解决这个问题,但我更喜欢更优雅的解决方案......
我希望这有点可以理解:)
提前感谢任何想法!
亲切的问候,马蒂亚斯
答案 0 :(得分:5)
最简单的解决方案是沿“对角线”方向前进,直到与目标位于同一行/列,然后使用水平/垂直方向。
换句话说,:
答案 1 :(得分:1)
对于两个段最大的情况,这似乎相对容易:
A -> B
然后从B -> A
投射一行。选择最接近此线的基数,以顺时针或逆时针方向四舍五入。始终如一。 (一旦从A -> B
确定角度,最好只添加Pi以最小化非常奇怪的数学边缘情况......不确定它是否真的可以发生。)A -> B
和B -> A
的行。
A -> B
。C
。
然后有两个细分A -> C
和C -> B
。我认为更智能的解决方案会为每个转弯(相对于距离)赋予权重 - 然后通过配置权重,允许的转数可以增加或减少。
不确定这是否有意义,但是编码很快!
答案 2 :(得分:1)
您可以从计算任何给定点与目的地之间的实际步数开始;这可能类似"taxicab geometry",但更复杂。如果所有8个步骤都是相同的“真实”(即欧几里德)距离,那么您的步数应该是这样的:
dist(dx,dy) = |dx|+|dy| + sqrt(0.5)(|dx+dy|+|dx-dy|)
然后,通常,将有两个可能的步骤具有相同的,最小的距离到目的地。然后,您可以选择与最后一个方向相同的方向(如果可能)。
实际上,如果你按照上面的说明进行数学计算,你可能会遇到浮点精度问题。不过,你仍然可以做出一个强有力的决定,给予首选方向一个小的“折扣”(比如一步的1%)。
答案 3 :(得分:0)
听起来你的问题源于重新评估沿途的最佳路线。这将导致在例如N和NE之间,然后是N,然后是NE等之间的持续切换。这是基于距离的最佳路线,但是您想要基于方向变化的最佳路线。
对此的解决方案是
为了解释我的第二个建议,你应该知道(没有障碍物)可以通过两个“动作”达到任何一点。初始移动是第一次移动,并且沿着该路径行进时,仅允许另外一个方向改变。你的算法需要允许“再一次” - 除非能够在剩余的移动次数内达到目标,否则不应该采取任何可能的目标路线。
看起来你的算法专注于最小距离而不是最小移动 - 或者它是两者的某种组合?