Java 加减一个角度,以最短的方式到达另一个角度

Java 加减一个角度,以最短的方式到达另一个角度,java,math,Java,Math,我遇到了一些关于角度的问题。我有一个角度A和另一个角度B,我想动画A最短的路径,使它达到B。我的第一个困惑是角度从0到180,0到-180。我不知道这有什么好处。无论如何,我会举一个例子: float a = -35; float b = 90; 对于每次更新,我想从a中加1或减1度,直到它达到b,并且我想确保它以最短的方式进行 这是我的代码,看起来很有效。但它似乎不是很有效: b += 360; if (b > a) { if (b - a < 180) {

我遇到了一些关于角度的问题。我有一个角度A和另一个角度B,我想动画A最短的路径,使它达到B。我的第一个困惑是角度从0到180,0到-180。我不知道这有什么好处。无论如何,我会举一个例子:

float a = -35;
float b = 90;
对于每次更新,我想从a中加1或减1度,直到它达到b,并且我想确保它以最短的方式进行

这是我的代码,看起来很有效。但它似乎不是很有效:

b += 360;
if (b > a) {
    if (b - a < 180) {
        a += 1;
    } else {
        a -= 1;
    }
} else {
    if (a - b < 180) {
        a -= 1;
    } else {
        a += 1;
    }
}
b+=360;
如果(b>a){
如果(b-a<180){
a+=1;
}否则{
a-=1;
}
}否则{
如果(a-b<180){
a-=1;
}否则{
a+=1;
}
}

有更好/更简单的方法吗?

因此您需要从
a
b
的最短路线

因为我们看到的是一个差异,让我们减去:

 float d = a-b;
如果结果的值大于180,那么我们要减去360

 if (d > 180) {
    d -= 360;
 } else if (d<-180) {
    d += 360;
 }
<>你也需要考虑帧率,如果你想要一个平滑的动画。 如果将tpf(每帧时间)计算为每秒的浮点分数

long frameTook = lastFrame - System.currentTimeMillis();
long lastFrame = System.currentTimeMillis();
float tpf = frameTook / 1000;
现在,您可以使用以下方法执行恒定动画(其中degreesPerFrame是动画的速度):

检查一下,如果我们只是去目的地的话,我们不会超过目的地

if (move > FastMath.abs(d)) {
    a = b;
} else {
    if (d>0) {
        a+=move;
    } else {
        a-=move;
    }
}

为什么不把这个循环也包括进去呢,这样我们就有了一个完整的工作示例。使用模运算。并在循环开始之前计算一次方向,而不是每次迭代。@OliCharlesworth OP使用浮点运算,因此模运算不是一个明显的选项。
float move = degreesPerFrame * tpf;
if (move > FastMath.abs(d)) {
    a = b;
} else {
    if (d>0) {
        a+=move;
    } else {
        a-=move;
    }
}