1. Тут как бы запаковать перенос туда и обратно не получится же? они взаимоисключающие... всё равно придётся их использовать отдельно друг от друга?
Не, можно. Перенос на
, поворот
и перенос обратно дают
, что нормально задаётся парой
. Вот проективные преобразования сюда уже не влезут.
Про размеры. Ну, если повороты оставляют кирпич ориентированным по осям, то если взять векторы
и повернуть так же, новое
будет модулем того из результатов, который коллинеарен
и т. д.. Практически, если не прибегать всё-таки к явной записи перестановок (со знаками) вместо поворотов, можно это сделать, записав
друг за другом в матрицу (получится диагональная
), действовать поворотом на неё, а потом взять максимальное по модулю число в первой строке как
, максимальное по модулю во второй строке как
, ну и с третьей
. (Беря максимум по модулю, избежим потенциального превращения нулей во что-то маленькое. Впрочем если у вас можно сделать всё целочисленным, можно будет прямо проверять на не нулевые значения, и даже просто брать суммы элементов строки, что должно быть чуть быстрее на процессорах, угадывающих альтернативы if.)
Но если у вас только повороты—симметрии куба (переставляющие декартовы оси местами, плюс-минус знаки), я бы это закодировал (что упомянуто выше) именно тем, какая перестановка и какое изменение знаков. Тогда перестановку можно применять к
и получать новые размерности кирпича, да и к координатам точек тоже можно применять, ну а перенос делать отдельно, что уж. Где-то с кем-то вроде эти перестановки обсуждали недавно, но забыл где и с кем.
И номер 3.: имея начальный и конечный вектор получить кватернион поворота. Тут как я понимаю порядок действий обратный, но делить мы матрицы не можем, потому умножаем конечную на инвертированную начальную?
Не, тут хитрее. Во-первых, можно повернуть один вектор в другой не единственным способом. Ну, вам наверно нужен был поворот на наименьший угол — тогда всё почти всегда хорошо, если только векторы не противоположны. Тогда есть куча равноценных поворотов (на 180°), где ничего уже не уточнить. В этом случае стоит поворачивать пару (неколлинеарных) векторов в пару векторов — вот тогда результат будет однозначен (но и угол не обязательно будет наименьшим).
Определять для одиночных векторов
можно, найдя, раз тут трёхмерие, вектор, ортогональный плоскости
, просто взяв их векторное произведение. Заодно оно же даст и угол, на который надо будет поворачивать. По оси и углу можно найти матрицу поворота.
Для пар векторов иначе: дополняем их до правой тройки каждую, а вот уже после этого можно записать из столбцов координат первых матрицу
, из столбцов вторых матрицу
, и взять
.
(В представлении перестановками можно было бы просто посмотреть, куда переходит
, куда
, куда
, причём третий вектор по двум заданным можно опять определить векторным произведением, или сократить вычисления, просто поставив единицу в оставшейся координате и поставив там минус, если тройка получается левая.)