c-确定转弯方向

  • 本文关键字:方向 转弯 c algorithm
  • 更新时间 :
  • 英文 :


我想顺时针或逆时针转动一个对象。两个整数(从0到>7)表示对象的方向(例如左、左上、上、直立、右…)。将+1加到对象的当前方向会使其顺时针旋转,减去-1会使其逆时针旋转。

如果我想让物体转向某个方向(=整数),我该如何确定所需的最小转弯量

目前我使用这种思维方式:

int minimumRequiredTurns = min(abs(currentDirection.intvalue - goalDirection.intvalue),
                       8 - abs(currentDirection.intvalue - goalDirection.intvalue));

是否可以在没有min语句的情况下执行此操作?

我认为

(1-(abs(abs(currentDirection.intvalue - goalDirection.intvalue)/(n/2)-1)))*(n/2)

其中n是可能方向的数量。

为了只进行整数计算,将其转换为

(n/2)-abs(abs(currentDirection.intvalue - goalDirection.intvalue)-(n/2))

说明:使用hat函数生成地图:

0 -> 0
1 -> 1
2 -> 2
3 -> 3
4 -> 4
5 -> 3
6 -> 2
7 -> 1

如果您真的不喜欢"min",可以使用查找表。

int minRequiredTurns[8][8] = {
    0, 1, 2, 3, 4, 3, 2, 1,
    1, 0, 1, 2, 3, 4, 3, 2,
    2, 1, 0, 1, 2, 3, 4, 3,
    /* and so on... */
};

几乎可以肯定的是,更好的设计是使用向量来表示方向;将"方向"视为一对数字(x,y),使x表示水平方向,y表示垂直方向。

所以(1,0)将代表面朝右;CCD_ 9表示面朝上;CCD_ 10将向左;CCD_ 11将面朝右;等


然后,你可以使用基于法向量的解决方案来解决问题:取你所面对的方向和你想要面对的方向,并取两者的叉积。

结果=x1y2-x2y1

如果结果为正,则逆时针旋转;如果结果为负,则顺时针旋转(这是因为定义叉积的右手规则)

注意,这种方法简单地概括为允许任意方向,而不仅仅是水平/垂直/对角线。

首先,强制一个正差,然后强制介于0和N/2(0和4)

N=8
diff = (new-old+N)%N;
turns = diff - (diff>N/2 ? N/2 : 0)
int N = 8, turns = abs(current-goal);
if (turns > N/2) turns = N-turns;

但我不明白你为什么不想要最小的声明。。。

没有min,没有abs,一个表达式,没有除法:

turns = ((((goalDirection + 8 - currentDirection) % 8) + 4) % 8) - 4

它的工作原理:最里面的表达式(goalDirection + 8 - currentDirection)与AShelley给出的相同;顺时针方向所需的圈数。最外层的表达式将其转换为[-4..+3]中的等效表达式

最新更新