我想顺时针或逆时针转动物体。几个整数(从0 - > 7)表示对象正在寻找的方向(例如,左,左,上,直,右......)。向对象的当前方向添加+1会顺时针旋转,减去-1会逆时针旋转。
如果我希望对象转向某个方向(=整数),我该如何确定所需的最小转弯量?
目前我正在使用这种思维方式:
int minimumRequiredTurns = min(abs(currentDirection.intvalue - goalDirection.intvalue),
8 - abs(currentDirection.intvalue - goalDirection.intvalue));
是否可以在没有min
声明的情况下执行此操作?
答案 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]