Euler углы по сравнению с Кватернионами - проблемы, вызванные силой между внутренней памятью и презентацией пользователю?

Проблема в том, что элемент подменю является членом объединения, поэтому его необходимо определить до объединения.

Да.

Но у него есть указатель на массив экземпляров этого объединения, что вызывает ошибку компиляции, потому что объединение еще не определено.

Для объявления указателя на этот тип необязательно указывать объединение. Это должно быть только объявлено . Определение может прийти позже.

Существует ли типобезопасный способ справиться с этим, или мой указатель в записи подменю должен быть пустым *?

Да. Форвард-объявлять объединение перед определением структуры, а потом помещать определение объединения. Это требует от вас предоставления тега для вашего типа объединения, иначе прямое объявление и последующее определение не будут ссылаться на тот же тип.

Пример:

typedef union entry tuEntry;

typedef struct {
  // ...
  tuEntry *entries[];
} ts_EntrySubmenu;


union entry
{
  // ...
  ts_EntrySubmenu entrySubmenu;
};

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

11
задан starblue 28 October 2010 в 19:52
поделиться

6 ответов

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

  1. Выполнение любого процесса, который изменяет ориентацию с помощью углов Эйлера, практически невозможно. Углы Эйлера страдают от сингулярностей - углы мгновенно изменяются на величину до 180 градусов, когда другие углы проходят через сингулярность; Углы Эйлера практически невозможно использовать для последовательных вращений. Кватернионы не страдают ни одной из этих проблем
  2. . Существует 12 различных возможных последовательностей вращения углов Эйлера - XYZ, XYX, XZY и т. Д. Не существует единого «простейшего» или «правильного» набора углов Эйлера. Чтобы получить набор углов Эйлера, вы должны знать, какую последовательность вращения вы используете, и придерживаться ее.
  3. Я предлагаю вам выполнять все операции хранения и вращения с кватернионами и преобразовывать кватернионы в углы Эйлера только тогда, когда требуется вывод. Когда вы это делаете, вы должны определить, какую последовательность вращения Эйлера вы используете.

У меня есть алгоритмы для всех этих операций и многого другого: кватернионы в / из углов Эйлера любой последовательности вращения в / из матриц вращения (матрицы направляющих косинусов) , кватернионная интерполяция, согласование положения, скорости и т. д. в конечных или промежуточных точках, динамика и кинематика жесткого и гибкого тела с использованием кватернионов.

Пожалуйста, свяжитесь со мной, если я могу быть полезен в nhughes1ster@gmail.com

18
ответ дан 3 December 2019 в 06:47
поделиться

Я фанат кватернионов. Не могли бы вы пересмотреть свою презентацию пользователю, чтобы заставить их работать? Вместо того, чтобы представлять вращение пользователю как серию углов Эйлера в текстовой форме, вы могли бы вместо этого выбрать какой-нибудь простой трехмерный объект и применить к нему вращение кватерниона, чтобы визуально отобразить действующее вращение.

0
ответ дан 3 December 2019 в 06:47
поделиться

Почему бы не использовать в коде кватернионы и не преобразовать Q в углы, когда это необходимо для отображения?

0
ответ дан 3 December 2019 в 06:47
поделиться

Вы можете представить вращение как ось + угол поворота, что по сути то же, что и кватернион (до знак)

0
ответ дан 3 December 2019 в 06:47
поделиться

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

0
ответ дан 3 December 2019 в 06:47
поделиться

О скольких конверсиях идет речь. Похоже, вы платите примерно за две трансцендентные операции за преобразование, которые на современном оборудовании доступны со скоростью порядка 100 миллионов в секунду. Я бы сохранил оба, Quaternions для точности и эстетики и вращения Эйлера для сохранения информации о пользователе. Может быть, добавить флаг, чтобы указать, что предпочтительнее для любого данного объекта. Вдобавок к этому вам нужно выполнить преобразование только один раз для каждого повернутого элемента. После того, как вы вычислили матрицу преобразования, ее умножение-складывание, пока у вас не закончатся вершины.

0
ответ дан 3 December 2019 в 06:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: