如何在限制转弯的同时沿着基本方向在笛卡尔空间内移动?

时间:2011-09-14 23:20:55

标签: algorithm math coordinates coordinate-systems

给定是笛卡尔坐标系,从位置A(X / Y)和到位置B(X / Y)。我想从A移动到B.但是,我只能在N,NE,E,SE,S,SW,W,NW八个方向上移动。

我知道我可以通过点积与轴的单位向量(八个方向)从当前位置A计算这些方向中的“最佳”,其中最大的点积是要采取的方向。但是这种方法导致两个方向之间出现某种“振荡”,如果A正好在这两个方向之间。

所以我现在正在寻找一种算法来解决从A到B只有一个或最大的问题。两个方向使用。当然我现在忽略了任何障碍,所以理论上我总是可以从A到B获得最多两个不同的方向。我可以通过一堆if语句解决这个问题,但我更喜欢更优雅的解决方案......

我希望这有点可以理解:)

提前感谢任何想法!

亲切的问候,马蒂亚斯

4 个答案:

答案 0 :(得分:5)

最简单的解决方案是沿“对角线”方向前进,直到与目标位于同一行/列,然后使用水平/垂直方向。

换句话说,

  • 检查您是否水平/垂直对齐。如果是这样,朝那个方向移动并完成。
  • 否则,使用您拥有的方法找到最接近的对角线方向。
  • 沿着对角线移动,直到您水平或垂直对齐。然后向那个方向移动并完成。

答案 1 :(得分:1)

对于两个段最大的情况,这似乎相对容易:

  1. A -> B然后从B -> A投射一行。选择最接近此线的基数,以顺时针逆时针方向四舍五入。始终如一。 (一旦从A -> B确定角度,最好只添加Pi以最小化非常奇怪的数学边缘情况......不确定它是否真的可以发生。)
  2. 沿着选定的基本方向重新投影来自A -> BB -> A的行。
    1. 如果线条是平行的(需要在一个基本方向上移动,因此也可以在步骤#1中被视为终止),则有一个线段A -> B
    2. 如果线条不平行,则找到线条的交点,指向C。 然后有两个细分A -> CC -> B
  3. 我认为更智能的解决方案会为每个转弯(相对于距离)赋予权重 - 然后通过配置权重,允许的转数可以增加或减少。

    不确定这是否有意义,但是编码很快!

答案 2 :(得分:1)

您可以从计算任何给定点与目的地之间的实际步数开始;这可能类似"taxicab geometry",但更复杂。如果所有8个步骤都是相同的“真实”(即欧几里德)距离,那么您的步数应该是这样的:

dist(dx,dy) = |dx|+|dy| + sqrt(0.5)(|dx+dy|+|dx-dy|)

然后,通常,将有两个可能的步骤具有相同的,最小的距离到目的地。然后,您可以选择与最后一个方向相同的方向(如果可能)。

实际上,如果你按照上面的说明进行数学计算,你可能会遇到浮点精度问题。不过,你仍然可以做出一个强有力的决定,给予首选方向一个小的“折扣”(比如一步的1%)。

答案 3 :(得分:0)

听起来你的问题源于重新评估沿途的最佳路线。这将导致在例如N和NE之间,然后是N,然后是NE等之间的持续切换。这是基于距离的最佳路线,但是您想要基于方向变化的最佳路线。

对此的解决方案是

  • 预先规划路线,而不是沿途重新评估,并坚持计划
  • 计算允许的最大方向更改数/最小数量,并且只有在最小数量范围内达到目标时才重新评估。

为了解释我的第二个建议,你应该知道(没有障碍物)可以通过两个“动作”达到任何一点。初始移动是第一次移动,并且沿着该路径行进时,仅允许另外一个方向改变。你的算法需要允许“再一次” - 除非能够在剩余的移动次数内达到目标,否则不应该采取任何可能的目标路线。

看起来你的算法专注于最小距离而不是最小移动 - 或者它是两者的某种组合?