Модульное тестирование реализации euler-to-quaternion завершается неудачно - PullRequest
0 голосов
/ 04 февраля 2020

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

void Quaternion::FromEuler(double x, double y, double z)
{
    z *= Math::DegToRad;
    y *= Math::DegToRad;
    x *= Math::DegToRad;

    double xCos = Math::Cos(x / 2);
    double xSin = Math::Sin(x / 2);
    double yCos = Math::Cos(y / 2);
    double ySin = Math::Sin(y / 2);
    double zCos = Math::Cos(z / 2);
    double zSin = Math::Sin(z / 2);

    W = zCos * yCos * xCos + zSin * ySin * xSin;
    X = zCos * yCos * xSin - zSin * ySin * xCos;
    Y = zSin * yCos * xSin + zCos * ySin * xCos;
    Z = zSin * yCos * xCos - zCos * ySin * xSin;
}

. Я тестирую реализацию с помощью следующего модульного теста

TEST(Quaternions, FromEuler)
{
    Quaternion quaternion(45, 90, 180);


    ExpectNear(quaternion, 0.6532815, -0.2705981, 0.6532815, 0.270598);
}

, который происходит сбой следующим образом.

  Expected | Actual     
X  0.6533   -0.6533
Y -0.2706    0.2706
Z  0.6533    0.6533
W  0.2706    0.2706

Ожидаемое значение было получено от множества веб-сайтов, которое дает одинаковые значения, но с разными признаками, подобно тому, как мой текущий результат отличается от ожидаемого результата.

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

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

1 Ответ

1 голос
/ 08 февраля 2020

По простой математике можно сделать вывод, что ваши ожидания в отношении результатов неверны: z_deg == 180, то есть z_rad == PI, даст значение zCos 0,0: cos PI / 2 равно 0,0. Зная это, вы можете упростить вычисления W, X, Y, Z, игнорируя все продукты с zCos.

Так как x / 2 и y / 2 находятся в В первом квадранте все значения для xCos, xSin, yCos, ySin и zSin являются положительными. Следовательно, результат для X должен быть отрицательным (0,0 минус некоторый положительный продукт). И результат для Y должен быть положительным: некоторый положительный продукт плюс 0.0.

Это просто следует из вашего кода и приведенных аргументов. Вывод таков: либо ожидания неверны, либо вы обнаружили ошибку в своем алгоритме. По крайней мере (как и следовало ожидать) фактические результаты правдоподобны: -)

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

...