Переместитесь от угла A к B, найдите кратчайшее направление - PullRequest
3 голосов
/ 30 августа 2011

У меня есть угол A и целевой угол B

Диапазон углов от -180 до 180

Я хочу, чтобы угол A переместился на X градусов в сторону угла B

Проблема, с которой я сталкиваюсь, заключается в том, что если А, скажем, 170, а В - -170, то явно быстрее увеличить до 180 и прыгнуть до -180, но я всегда получаю отрицательный Х при сравнении углов. Поэтому вместо того, чтобы идти по самому быстрому пути, он пойдет по самому длинному.

Надеюсь, кто-то поймет мой плохо сформулированный вопрос:)

A = A + ((A-B) / Math.Abs(A-B)) * speed * -1;

Редактировать: добавлен код

Ответы [ 3 ]

6 голосов
/ 30 августа 2011

Рассчитайте разницу между двумя углами.Если полученный угол x больше 180 градусов, то идите в другом направлении, используя этот угол: 360-x.

Если вы используете диапазон от 0 до 360, вы можете легче вычислить разницу.

1 голос
/ 30 августа 2011

Вот полный пример:

void Main()
{
    int speed = 5;

    int angleA = 170;
    int angleB = -170;

    int antiClockwiseDistance = Math.Abs(180 - angleA) + Math.Abs(-180 - angleB);
    int clockwiseDistance = angleB - angleA;

    Console.WriteLine(clockwiseDistance);
    Console.WriteLine(antiClockwiseDistance);

    if(clockwiseDistance < antiClockwiseDistance)
    {
        angleA += speed;
    }
    else
    {
        angleA -= speed;
    }

    // TODO: Code to wrap an angle outside the range (i.e. 190 => -170)

    Console.WriteLine(angleA);
}
0 голосов
/ 30 августа 2011

Представьте, что вы человек, и вам дано решение этой проблемы. Как бы вы это сделали?

Напишите пять или шесть примеров, включая «специальные» углы, такие как 0, 180, -180 и близкие к ним значения.

Нарисуйте каждый пример.

Нетрудно найти простой и понятный алгоритм, который использует одно или два условия и дает результат.

В частности, вам нужно только найти самый короткий из двух путей , поэтому хорошей абстракцией является выяснение длины каждого пути, а затем просто сравните их и выберите тот меньшая длина.

...