我遇到了一些关于角度的问题。我有一个角度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;
}
}
有更好/更简单的方法吗?
答案 0 :(得分:3)
所以你想要从a
到b
的最短路线。
因为我们正在考虑差异,所以减去:
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;
}
}