Совмещение координатных осей (реперов)
Сегодня решаем простую задачу. Даны два координатных репера (reference frames), произвольным образом расположенные в пространстве моделирования. Требуется их совместить, например, повернуть и сдвинуть фрейм B так, чтобы он совпал с фреймом A:
Часто с координатными реперами ассоциированы некоторые геометрические объекты, например, CAD-модели, сетки, облака точек и проч. Таким образом, совмещая координатные реперы мы, тем самым, совмещаем ассоциированные с ними объекты, то есть решаем задачу регистрации. Точное совмещение объектов (например, облака точек и CAD-модели) обычно требует выполнения некоторого алгоритма, нередко с привлечением методов оптимизации. Совмещение же фреймов является линейным оператором и достигается умножением на матрицу перехода (понятно, что точность совмещения в этом случае зависит от того, насколько соответствуют друг другу используемые фреймы).
Чтобы совместить координатный репер B с репером A достаточно выполнить следующие простые действия:
- Подсчитать трансформацию TB для совмещения B с глобальной системой координат.
- Подсчитать трансформацию TA для совмещения A с глобальной системой координат.
- Подсчитать обратную трансформацию [TA]-1.
- Применить к реперу B цепочку трансформаций T = [TA]-1 TB.
Для выполнения этой операции средствами OpenCascade можно использовать следующий код (команда test-transform-axes в Analysis Situs):
// First frame. gp_Ax3 A( gp_Pnt(-1., -2., -3.), gp_Dir(1., 1., 1.), gp_Dir(1., -1., -1.) ); // Second frame. gp_Ax3 B( gp_Pnt(4., 2., 3.), gp_Dir(1., -1., 0.25), gp_Dir(-1., 1., 0.5) ); // B goes to global origin. gp_Trsf T_B; T_B.SetTransformation(B); // Global origin goes to A. gp_Trsf T_A; T_A.SetTransformation(A); T_A.Invert(); // Final transformation from B to A. gp_Trsf T = T_A*T_B; // Transformed B. gp_Ax3 TB = B.Transformed(T);