1. Тут как бы запаковать перенос туда и обратно не получится же? они взаимоисключающие... всё равно придётся их использовать отдельно друг от друга?
Не, можно. Перенос на
![$\vec b$ $\vec b$](https://dxdy-01.korotkov.co.uk/f/0/3/1/031093f97dcd0948be86701544fc6a4782.png)
, поворот
![$R$ $R$](https://dxdy-02.korotkov.co.uk/f/1/e/4/1e438235ef9ec72fc51ac5025516017c82.png)
и перенос обратно дают
![$R(\vec v + \vec b) - \vec b = R\vec v + R\vec b - \vec b$ $R(\vec v + \vec b) - \vec b = R\vec v + R\vec b - \vec b$](https://dxdy-04.korotkov.co.uk/f/7/8/1/781398c4f5633a2fa81795165340fa4482.png)
, что нормально задаётся парой
![$(R, R\vec b - \vec b)$ $(R, R\vec b - \vec b)$](https://dxdy-03.korotkov.co.uk/f/2/5/b/25bb283a2d4cce358bb5d56d8d7e578e82.png)
. Вот проективные преобразования сюда уже не влезут.
Про размеры. Ну, если повороты оставляют кирпич ориентированным по осям, то если взять векторы
![$\Delta x\vec\imath, \Delta y\vec\jmath, \Delta z\vec k$ $\Delta x\vec\imath, \Delta y\vec\jmath, \Delta z\vec k$](https://dxdy-02.korotkov.co.uk/f/1/b/2/1b2087a0fe3ba0c817a10d8fbb2e5f4882.png)
и повернуть так же, новое
![$\Delta x'$ $\Delta x'$](https://dxdy-04.korotkov.co.uk/f/f/a/8/fa8e32404a59d778d9693be877d669fc82.png)
будет модулем того из результатов, который коллинеарен
![$\vec\imath$ $\vec\imath$](https://dxdy-02.korotkov.co.uk/f/d/6/5/d65e49b6d38d451cfe8ff10b9c62f7ed82.png)
и т. д.. Практически, если не прибегать всё-таки к явной записи перестановок (со знаками) вместо поворотов, можно это сделать, записав
![$\Delta x\vec\imath, \Delta y\vec\jmath, \Delta z\vec k$ $\Delta x\vec\imath, \Delta y\vec\jmath, \Delta z\vec k$](https://dxdy-02.korotkov.co.uk/f/1/b/2/1b2087a0fe3ba0c817a10d8fbb2e5f4882.png)
друг за другом в матрицу (получится диагональная
![$\operatorname{diag}(\Delta x, \Delta y, \Delta z)$ $\operatorname{diag}(\Delta x, \Delta y, \Delta z)$](https://dxdy-03.korotkov.co.uk/f/6/c/4/6c442ea6c6a40ac8ace68e3b3854127682.png)
), действовать поворотом на неё, а потом взять максимальное по модулю число в первой строке как
![$\Delta x'$ $\Delta x'$](https://dxdy-04.korotkov.co.uk/f/f/a/8/fa8e32404a59d778d9693be877d669fc82.png)
, максимальное по модулю во второй строке как
![$\Delta y'$ $\Delta y'$](https://dxdy-01.korotkov.co.uk/f/8/8/7/8876fefb39b1dbe1d344517bd7506ae482.png)
, ну и с третьей
![$\Delta z'$ $\Delta z'$](https://dxdy-04.korotkov.co.uk/f/7/9/d/79d17c19d6a0dc9f9860309a13bb2afa82.png)
. (Беря максимум по модулю, избежим потенциального превращения нулей во что-то маленькое. Впрочем если у вас можно сделать всё целочисленным, можно будет прямо проверять на не нулевые значения, и даже просто брать суммы элементов строки, что должно быть чуть быстрее на процессорах, угадывающих альтернативы if.)
Но если у вас только повороты—симметрии куба (переставляющие декартовы оси местами, плюс-минус знаки), я бы это закодировал (что упомянуто выше) именно тем, какая перестановка и какое изменение знаков. Тогда перестановку можно применять к
![$(\Delta x,\Delta y,\Delta z)$ $(\Delta x,\Delta y,\Delta z)$](https://dxdy-01.korotkov.co.uk/f/8/1/9/8197440c8cffc716382af2bb24c19dcd82.png)
и получать новые размерности кирпича, да и к координатам точек тоже можно применять, ну а перенос делать отдельно, что уж. Где-то с кем-то вроде эти перестановки обсуждали недавно, но забыл где и с кем.
И номер 3.: имея начальный и конечный вектор получить кватернион поворота. Тут как я понимаю порядок действий обратный, но делить мы матрицы не можем, потому умножаем конечную на инвертированную начальную?
Не, тут хитрее. Во-первых, можно повернуть один вектор в другой не единственным способом. Ну, вам наверно нужен был поворот на наименьший угол — тогда всё почти всегда хорошо, если только векторы не противоположны. Тогда есть куча равноценных поворотов (на 180°), где ничего уже не уточнить. В этом случае стоит поворачивать пару (неколлинеарных) векторов в пару векторов — вот тогда результат будет однозначен (но и угол не обязательно будет наименьшим).
Определять для одиночных векторов
![$\vec v,\vec v'$ $\vec v,\vec v'$](https://dxdy-03.korotkov.co.uk/f/e/3/b/e3be3b2a2fac1b32bd4127b614cffad582.png)
можно, найдя, раз тут трёхмерие, вектор, ортогональный плоскости
![$\langle\vec v,\vec v'\rangle$ $\langle\vec v,\vec v'\rangle$](https://dxdy-04.korotkov.co.uk/f/b/c/5/bc5b1cbd57507b8f3b157b82f3e85bc882.png)
, просто взяв их векторное произведение. Заодно оно же даст и угол, на который надо будет поворачивать. По оси и углу можно найти матрицу поворота.
Для пар векторов иначе: дополняем их до правой тройки каждую, а вот уже после этого можно записать из столбцов координат первых матрицу
![$A$ $A$](https://dxdy-02.korotkov.co.uk/f/5/3/d/53d147e7f3fe6e47ee05b88b166bd3f682.png)
, из столбцов вторых матрицу
![$B$ $B$](https://dxdy-03.korotkov.co.uk/f/6/1/e/61e84f854bc6258d4108d08d4c4a085282.png)
, и взять
![$BA^{-1}$ $BA^{-1}$](https://dxdy-02.korotkov.co.uk/f/9/4/6/9462c20b8e41a85790a66fbfb1781a7b82.png)
.
(В представлении перестановками можно было бы просто посмотреть, куда переходит
![$(x,0,0)$ $(x,0,0)$](https://dxdy-01.korotkov.co.uk/f/4/e/f/4efd7ee06fef7badd167f490d04286e182.png)
, куда
![$(0,y,0)$ $(0,y,0)$](https://dxdy-02.korotkov.co.uk/f/5/3/c/53c075b239e2bc47c3b9c5c667354ec682.png)
, куда
![$(0,0,z)$ $(0,0,z)$](https://dxdy-03.korotkov.co.uk/f/2/f/6/2f693979ba7d2670e0a7ebea772ee77382.png)
, причём третий вектор по двум заданным можно опять определить векторным произведением, или сократить вычисления, просто поставив единицу в оставшейся координате и поставив там минус, если тройка получается левая.)