Получение более низкого значения вращения из угла и степени - PullRequest
1 голос
/ 22 февраля 2012
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 должен остановить вращение, когда он указывает на угол, второй - решить, какой путь самый короткий. Эти 2 утверждения неверны.

Проблема заключается в этой части:

    if((this._degrees) - 360 != angleDegrees)
    {
        if(this._degrees >= 0)
        {
            RotateItem(true);
        }
        else
        {
            RotateItem(false);
        }


    }

1 Ответ

1 голос
/ 22 февраля 2012

Хорошо, если я не понял неправильно, у вас есть 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);
}
...