gpt4 book ai didi

java - 如何找到从0到180和-180到0的最近角度

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:33:23 25 4
gpt4 key购买 nike

例如我当前的角度位置是170,我点击物体将它旋转到-170度,这里的问题是在178、179、180之后,下一个数字是-180、-179、-178和等等……

即使在数值上很难达到 170 度,也与 -170 度相去甚远,但从视觉上看,它们看起来很近,一个物体正在旋转最长的距离以达到该数字,例如:

if(currentAngle < targetAngle)
{
currentAngle += 1;

}

if(currentAngle > targetAngle)
{
currentAngle -= 1;
}

这样我可以达到目标角度,但是如何在 180 和 -180 之间越过这个障碍,也许有一个公式?

更新:

    onclick() {
double angle = Math.atan2(dy, dx);
targetAngle = (int)Math.toDegrees(angle); //180 to //-179
}

onFrame() {

//here happens the animation

if(currentAngle < targetAngle)
{

currentAngle +=1;

}

if(currentAngle > targetAngle)
{
currentAngle -= 1;
}
}

现在,如果我当前处于 -179 度,我点击了 160 度,它应该向左旋转以尽可能快地达到该角度,但在我的情况下它是向右旋转(更长),那是因为它被限制在 -180 到 179 之间,因此如何突破限制并从 179 到 -180、-181、-182...如果你明白我的意思

enter image description here

1) 我的点击处理程序:

onClick() { 

double angle = Math.atan2(dy, dx);
angle = (int)Math.toDegrees(angle);
Log.d("test", "angler:" + angle);
if(angle < 0)
angle += 360;
}

所以在这里我使用 angle += 360 将度数转换为正值,然后:

2) 我的 onFrame 处理程序:

onFrame() {

if(currentAngle != angle)
{

if(angle < currentAngle)
{
currentAngle -= 5;
}
else
{
currentAngle += 5;
}
int diff = Math.abs(angle - currentAngle);
if(diff <= 5)
{
currentAngle = angle; // if its near we put it exact to that angle
}
invalidate(); //update the view
}


}

这就是我的全部

最佳答案

请注意,我假设您的角度在 0 到 359 之间,而不是负值。

这里有两个不同的问题。

  1. 给定一个currentAngle 和一个targetAngle,如何确定旋转方向以在最短帧数内完成旋转?
  2. 我们如何处理角度从 359 到 0/360 的边界条件?

解决方案

问题 1 主要在@ellitron 的回答中得到解决,但您必须稍微分开各个部分以确定移动currentAngle 的方向。问题 2 需要一个 360 度模组,它在每次更新 currentAnglethis answer 后处理负数。给了我们一个很好的技巧。

if (currentAngle - targetAngle == 0) return;

if (Math.abs(currentAngle - targetAngle) < 180) {
// Rotate current directly towards target.
if (currentAngle < targetAngle) currentAngle++;
else currentAngle--;
} else {
// Rotate the other direction towards target.
if (currentAngle < targetAngle) currentAngle--;
else currentAngle++;
}
currentAngle = ((currentAngle % 360) + 360) % 360;

为了将来引用,下面介绍了如何在渲染环境之外测试此代码。我们可以简单地传入两个命令行参数,并根据输出确定我们是否以正确的方式旋转。

public class Angle {
public static void main(String[] args) {
int currentAngle = Integer.parseInt(args[0]);
int targetAngle = Integer.parseInt(args[1]);

while (currentAngle - targetAngle != 0) {
if (Math.abs(currentAngle - targetAngle) < 180) {
// Rotate current directly towards target.
if (currentAngle < targetAngle) currentAngle++;
else currentAngle--;
} else {
// Rotate the other direction towards target.
if (currentAngle < targetAngle) currentAngle--;
else currentAngle++;
}
currentAngle = ((currentAngle % 360) + 360) % 360;
System.out.printf("CurrentAngle = %d, targetAngle = %d\n",
currentAngle, targetAngle);
}

}
}

关于java - 如何找到从0到180和-180到0的最近角度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28909231/

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