如何选择最短旋转方向的角度

Ali*_*Ali 4 java math

我的游戏中有一个角色必须顺利旋转才能达到理想的角度.考虑angle当前角度和touchAngle所需角度始终在0到360之间.我想在每次游戏更新中将+ 1/-1添加到当前角度以获得所需的角度touchAngle.问题首先是它必须选择方向,它必须在0到360之间.这是我的伪代码:

int touchAngle;
float angle;
public void update()
{
    if ((int)angle != touchAngle) angle += ???
}
Run Code Online (Sandbox Code Playgroud)

Dem*_*plo 7

由于您的值在整个时间间隔内始终是标准化的,因此[0 360]这不应该太难.您只需要区分两种不同的情况:

angle < touchAngle
angle > touchAngle
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,我们想要逆时针旋转,因此必须进行更新angle =+ 1(假设您希望每个更新周期都转1).在第二种情况下,我们想要顺时针转动,所以更新应该是angle -= 1.

问题是这并不总是最短的旋转方式.例如,如果:

angle == 359
touchAngle == 1
Run Code Online (Sandbox Code Playgroud)

我们不想一直使用358,357,356 ...而是我们想要逆时针旋转2个单位:360,1.这可以通过比较角度之间的距离来实现abs(angle - touchAngle).

如果这个值大于180它意味着我们走错了方向,那么我们必须这样做

if(angle < touchAngle) {
    if(abs(angle - touchAngle)<180)
       angle += 1;
    else angle -= 1;
}

else {
    if(abs(angle - touchAngle)<180)
       angle -= 1;
    else angle += 1;
}
Run Code Online (Sandbox Code Playgroud)

当然所有这些直到((int)angale != touchAngle).我可能在案件中犯了错误,但这是原则.