从Angle&获得较低的旋转值学位

时间:2012-02-21 21:56:04

标签: java trigonometry

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);
        }


    }

1 个答案:

答案 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._degreesangleDegrees之间)。并且它可能还没有给出最短的转弯,如果差值小于-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);
}