以最短的方式相互增加或减去角度

时间:2013-12-22 15:08:09

标签: java math

我遇到了一些关于角度的问题。我有一个角度A和另一个角度B,我想以最短的方式为A动画,使它达到B.对我来说,第一个困惑是角度从0到180,从0到-180。不确定那是什么优点。无论如何,我会举一个例子:

float a = -35;
float b = 90;

对于每次更新,我想要添加1或从a减去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;
    }
}

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

1 个答案:

答案 0 :(得分:3)

所以你想要从ab的最短路线。

因为我们正在考虑差异,所以减去:

 float d = a-b;

如果结果的值大于180,那么我们要减去360。

 if (d > 180) {
    d -= 360;
 } else if (d<-180) {
    d += 360;
 }

现在d是旅行的总距离。您可以将其与0进行比较,以了解要走哪条路。你也可以做更好的事情,比如进一步移动更大的d。例如,让它总是移动10%(请注意,这个系列将永远不会结束,因为它将不断接近越来越小的数量,因此你需要应对这种情况):

 a += d/10;

如果想要平滑的动画,还需要考虑帧速率。

如果你计算tpf(每帧时间)作为一秒的浮点分数。

long frameTook = lastFrame - System.currentTimeMillis();
long lastFrame = System.currentTimeMillis();
float tpf = frameTook / 1000;

现在可以使用以下方法执行常量动画(其中degreesPerFrame是动画的速度):

float move = degreesPerFrame * tpf;

如果我们转移到目的地,请检查我们是否会移动到目的地。

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