Алгоритм расчета вращения - PullRequest
2 голосов
/ 05 марта 2011

Я пытаюсь вычислить вращение от одного креста к другому.Соответствия между линиями в крестах известны.

Вращение должно быть рассчитано в пределах 180 градусов по часовой стрелке или против часовой стрелки, в настоящее время я могу вычислить в пределах 90 градусов, но алгоритмы не работают с чем-то большим.Проблема, по-видимому, заключается в том, что соответствующие подшипники проходят вокруг 360 градусов, так что A = 350 и A '= 80. Повторение этого для каждой линии креста приводит к неправильному общему вращению.

Алгоритм в настоящее время работает следующим образом для сравнения вращения между двумя линиями, из двух крестиков есть;где crossB и crossA - соответствующие подшипники для каждого креста.

                if ((crossB < 360 && crossB >= 270)
                    && (crossA >= 0 && crossA < 90))
                {
                    angle = -((360) - crossB) - crossA;
                }
                else if ((crossA <  360 && crossA >= 270)
                    && (crossB >= 0 && crossB < 90)
                {
                    angle = crossB + (360 - crossA);
                }
                else
                {
                    angle = crossB - crossA;
                }

Есть какие-нибудь мысли о том, как улучшить или изменить алгоритм так, чтобы он позволял определять любую величину вращения?

1 Ответ

2 голосов
/ 05 марта 2011

Если я правильно понимаю, вы хотите найти наименьший угол между двумя векторами, где векторы выражаются в угле подшипника в градусах.Если это так, вы можете использовать следующий код из проекта WorldWind с открытым исходным кодом НАСА

/**
 * Computes the shortest distance between this and angle, as an angle.
 *
 * @param angle the angle to measure angular distance to.
 *
 * @return the angular distance between this and <code>value</code>.
 */
public Angle angularDistanceTo(Angle angle)
{
    if (angle == null)
    {
        String message = Logging.getMessage("nullValue.AngleIsNull");
        Logging.logger().severe(message);
        throw new IllegalArgumentException(message);
    }

    double differenceDegrees = angle.subtract(this).degrees;
    if (differenceDegrees < -180)
        differenceDegrees += 360;
    else if (differenceDegrees > 180)
        differenceDegrees -= 360;

    double absAngle = Math.abs(differenceDegrees);
    return Angle.fromDegrees(absAngle);
}

Где вычитание работает так, как вы думаете.Алгоритм должен легко адаптироваться к не объектно-ориентированному подходу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...