确定转弯的方向?

时间:2012-03-20 14:39:32

标签: c algorithm

我想顺时针或逆时针转动物体。几个整数(从0 - > 7)表示对象正在寻找的方向(例如,左,左,上,直,右......)。向对象的当前方向添加+1会顺时针旋转,减去-1会逆时针旋转。

如果我希望对象转向某个方向(=整数),我该如何确定所需的最小转弯量?

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

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

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

6 个答案:

答案 0 :(得分:2)

如果你真的不喜欢“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... */
};

答案 1 :(得分:2)

我认为

(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

答案 2 :(得分:2)

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

所以(1,0)代表面对面; (0,1)代表面朝上; (-1, 0)将面向左边; (1,1)面朝上;等


然后你可以使用基于法线向量的常规解决方案来解决问题:采取你所面对的方向和你想要面对的方向,然后选择两者的cross-product

result = x1y2 - x2y1

如果结果为正,则逆时针旋转;如果结果是否定的,则顺时针旋转(这是因为定义了交叉产品的right-hand rule

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

答案 3 :(得分:1)

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

N=8
diff = (new-old+N)%N;
turns = diff - (diff>N/2 ? N/2 : 0)

答案 4 :(得分:1)

int N = 8, turns = abs(current-goal);
if (turns > N/2) turns = N-turns;

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

答案 5 :(得分:1)

min,没有abs,一个表达式,没有分割:

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

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

中的等价物