gpt4 book ai didi

java - 增加或减少一个角度以最短的方式到达另一个角度

转载 作者:行者123 更新时间:2023-11-29 05:32:10 26 4
gpt4 key购买 nike

我遇到了一些关于角度的问题。我有一个角度 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;
}
}

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

最佳答案

因此,您需要从 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;
}
}

关于java - 增加或减少一个角度以最短的方式到达另一个角度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20730759/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com