Программа C++ Quaternion Equation

Я пытаюсь написать программу, которая использует уравнения умножает 2 кватерниона. Вот мои 2 начальных кватерниона:

q1 = 2 − i + j + 3k, и

q2 = −1 + i + 4j − 2k

Я разрешаю пользователю вводить свои собственные числа, представляющие каждый верхний компонент от a1 до a4 и нижние компоненты от b1 до b4, например:

cout << "Enter the [A1] value: ";
cin >> a1;
cout << "Enter the [A2] value: ";
cin >> a2;
cout << "Enter the [A3] value: ";
cin >> a3;
cout << "Enter the [A4] value: ";
cin >> a4;
cout << "Enter the [B1] value: ";
cin >> b1;
cout << "Enter the [B2] value: ";
cin >> b2;
cout << "Enter the [B3] value: ";
cin >> b3;
cout << "Enter the [B4] value: ";
cin >> b4;

Затем я умножаю a1 на каждый элемент "b", a2 на каждый элемент "b" и так далее, затем я сохраняю эти новые значения в переменных, я следил за таблицей и помеял каждую новую переменную, чтобы я знал, представляет ли она либо ij или k:

multiplec1 = b1 * a1;   // num
multiplec2 = b2 * a1;   // i
multiplec3 = b3 * a1;   // j
multiplec4 = b4 * a1;   // k

multiplec5 = b1 * a2;   // -i
multiplec5 = -multiplec5;
multiplec6 = b2 * a2;   // num
multiplec7 = b3 * a2;   // k
multiplec8 = b4 * a2;   // -j
multiplec6 = -multiplec6;

multiplec9 = b1 * a3;   // j
multiplec10 = b2 * a3;  // -k
multiplec10 = -multiplec10;
multiplec11 = b3 * a3;  // num
multiplec12 = b4 * a3;  // i

multiplec13 = b1 * a4;  // num
multiplec14 = b2 * a4;  // i
multiplec15 = b3 * a4;  // j
multiplec16 = b4 * a4;  // k

Наконец, я складываю все подходящие значения ijk:

finalint = multiplec1 + multiplec6 + multiplec11 + multiplec15;
finalI = multiplec2 + multiplec5 + multiplec12 + multiplec14;
finalJ = multiplec3 + multiplec8 + multiplec9 + multiplec15;
finalK = multiplec4 + multiplec7 + multiplec10 + multiplec16;

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

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

[РЕДАКТИРОВАТЬ]

Вот значения, которые я должен получить:

9 -11i - 7j - 12k

Но почему-то вместо этого получаю:

15 2i 21j -15к

Вы использовали отладчик для проверки своей работы на ходу?

Stephen Newell 25.03.2018 00:17

Пожалуйста, опубликуйте ожидаемые числа и полученные числа.

Max Vollmer 25.03.2018 00:17

@StephenNewell Да, у меня есть, и значения умножения кажутся хорошими до и после, похоже, когда я обновляю "конечные" переменные, я считаю

non bee 25.03.2018 00:24

Я только что обновил свой вопрос, показывая вам @MaxVollmer

non bee 25.03.2018 00:27

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

Stephen Newell 25.03.2018 00:27
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
88
1

Ответы 1

Я думаю, что самым удивительным здесь является то, что и ваши бумажные вычисления, и ваша программа ошибочны одновременно, но по-разному. Фактически 2−i+j+3k, умноженный на −1+i+4j−2k, получается 1 - 11 i + 8 j - 12 k и логика

  1   = -2 +1 -4 +6 = 2*(-1) + (-i)*i + j*4j + 3k*(-2k)
-11*i = (+2 +1 -2 -12)*i = 2*i + (-i)*(-1) + j*(-2k) + 3k*4j
  8*j = (+8 -1 -2 +3)*j = 2*4j +j*(-1) + (-i)*(-2k) +  3k*i
-12*k = (-4 -3 -4 -1)*k =  2*(-2k) + (3k)*(-1) + (-i)*4j + j*i

Обратите внимание, что для кватернионов умножение некоммутативно. Например, i*j = k, а j*i = -k. Вы можете найти полный таблица умножения в вики). Поэтому сравните свой код с этой таблицей, потому что там довольно много ошибок.

Другие вопросы по теме