public void TurnTowardsPoint(double DestinationX, double DestinationY)
{
int distX = (int) (DestinationX - x);
int distY = (int) (DestinationY - y);
double angleRadians = Math.atan2(distY, distX);
int angleDegrees = (int)Math.toDegrees(angleRadians);
//angleDegrees = Math.abs(angleDegrees);
Log.w("Angle", Integer.toString(angleDegrees));
Log.w("Degrees", Integer.toString((int) this._degrees));
if((this._degrees) - 360 != angleDegrees)
{
if(this._degrees >= 0)
{
RotateItem(true);
}
else
{
RotateItem(false);
}
}
}
RotateItem(true是顺时针false是反,它永远不会减去否则它会重置为0,虽然这是可更改的。)
我想要实现的是获得最短的旋转方式。当它指向角度原点时也会完成。
我已经在这几个小时了,现在我的问题是我从来没有在学校教过三角学,所以我在努力学习这些概念&了解什么时候使用。 (我一直在读它)。
我该怎么做?我在网上找不到任何东西,所以我不得不最终放弃,在盯着一张纸看了2个小时并且没有在哪里之后问你们。
注意: 面向右边的船是360 / 0D。 如果船直接位于-90点以上,则高于+90。如果船直接在右边,则为180D。
问题在于2 if语句。第一个if语句需要在指向角度时停止旋转,第二个if假设决定哪个方式最短。这两个陈述是错误的。
问题出在这一部分:
if((this._degrees) - 360 != angleDegrees)
{
if(this._degrees >= 0)
{
RotateItem(true);
}
else
{
RotateItem(false);
}
}
答案 0 :(得分:1)
好吧,如果我没有误解,你有this._degrees
,它给出了你的对象当前指向的方向,整数度,标准化为介于0(含)和360(不含或独有) ?)。然后计算物体在旋转后指向angleDegrees
的方向。
如果我理解正确,你在该计算中有一个符号错误,因为惯例是逆时针转动为正方向(但如果你的Y轴有0高于1,那将取消,你必须检查并确定angleDegrees
是否应当或必须否定。
无论如何,angleDegrees
给出你要转向的方向,范围从-180到180度。将其标准化,使方向位于0到360范围内,
if (angleDegrees < 0) {
angleDegrees += 360;
}
现在,可以通过减法获得转弯的数量和方向,
int turn = angleDegrees - this._degrees;
该值介于-360和360度之间(更精确地介于-this._degrees
和angleDegrees
之间)。并且它可能还没有给出最短的转弯,如果差值小于-180度或大于180度,则超过半圈,而另一种方式则更短,因此我们再次标准化,
if (turn < -180) {
turn += 360;
} else if (turn > 180) {
turn -= 360;
}
现在在-180和180之间转弯,并将最短的转弯转向所需的方向。如果turn >= 0
,则要顺时针转动,否则逆时针转动
boolean clockwise = (turn >= 0);
现在你只需要旋转abs(turn)
度,例如
int amount = (turn < 0) ? (-turn) : turn;
for(int i = 0; i < amount; ++i) {
RotateItem(clockwise);
}