Геометрические примитивы
Система координат
Продолжение Frame of Reference (2)
Система координат
Для описания ортонормированной (декартовой) системы координат в трехмерном пространстве предназначен класс gp_Ax3. В отличие от двумерной системы координат, описываемой классом gp_Ax2, она может быть правой (direct sense) или левой (indirect sense). Система координат определяется:
- точкой отсчета, началом системы координат (Location point)
- тремя единичным взаимно-ортогональным векторами, называемыми ось $x$ (X Direction), ось $y$ (Y Direction) и главная ось (ось $z$, main Direction)
Ось $z$ называется "главной" потому, что при изменении этого вектора оси $x$ и $y$ пересчитываются, а при изменении осей $x$ и $y$ ось $z$ остается неизменной. Ось $z$ всегда параллельна векторному произведению осей $x$ и $y$ (имеет то же или противоположное направление). Обозначая точку отсчета через $O$, базисные векторы через $\mathbf{e}_x$, $\mathbf{e}_y$, $\mathbf{e}_z$, систему координат можно записать как совокупность четырех элементов: $(O,\mathbf{e}_x, \mathbf{e}_y, \mathbf{e}_z)$. Членами-переменными данного класса являются:
gp_Ax1 axis;
gp_Dir vydir;
gp_Dir vxdir;
Для создания объектов класса служат конструкторы:
// Создание неопределенной системы координат
gp_Ax3();
// Создание системы координат из двумерной (правой)
gp_Ax3(const gp_Ax2& A);
// Создание правой системы координат с началом в точке P, главным
// направлением N и направлением x-оси Vx. Ось Vy вычисляется
gp_Ax3(const gp_Pnt& P,const gp_Dir& N,const gp_Dir& Vx)
// Создание системы координат с началом в точке P и главным направлением V.
// Оси Vx и Vy вычисляются
gp_Ax3(const gp_Pnt& P,const gp_Dir& V)
Приведем некоторые процедуры задания / опроса значений параметров. Отметим, что при изменении значения какого-либо параметра, значения других могут пересчитываться, как описано в комментариях.
// Задание начала и главного направления, определяемых осью A1.
// X и Y направления пересчитываются. Ориентация (правая, левая) сохраняется.
// Направление A1 не должно совпадать со старым X-направлением.
// Новое X-направление вычисляется следующим образом:
// new "X Direction" = V ^(previous "X Direction" ^ V)
// где V -- направление A1.
void SetAxis(const gp_Ax1& A1)
// Задание главного направления, определяемого V.
// X и Y направления пересчитываются аналогично SetAxis.
void SetDirection(const gp_Dir& V)
// Задание начала системы координат
void SetLocation(const gp_Pnt& P)
// Задание X-направления системы координат. Главное направление не изменяется.
// Если новое X-направление не ортогонально главному, оно модифцируется:
// XDirection = Direction ^ (Vx ^ Direction).
// Новое X-направление не должно быть направлено по главному.
void SetXDirection(const gp_Dir& Vx)
// Задание Y-направления системы координат. Главное направление не изменяется.
// Если новое Y-направление не ортогонально главному, оно модифцируется:
// YDirection = Direction ^ (<Vy> ^ Direction).
// Новое Y-направление не должно быть направлено по главному.
void SetYDirection(const gp_Dir& Vy)
// Опрос оси системы координат, т.е. начала и главного направления
gp_Ax1& Axis()
// Опрос главного направления системы координат
gp_Dir& Direction()
// Опрос начала системы координат
gp_Pnt& Location()
// Опрос X-направления системы координат
gp_Dir& XDirection()
// Опрос Y-направления системы координат
gp_Dir& YDirection()
// Вычисление угла между "главными" направлениями двух систем координат.
// Значение угла лежит в пределах от 0 до PI
Standard_Real Angle(const gp_Ax3& Other)
// Вычисление двумерной (право-ориентрованноЙ) системы координат
// на основе данной (с тем же началом и X и Y осями)
gp_Ax2 Ax2()
// Опрос ориентации системы координат. Возвращается "истина",
// если сисиема правая
Standard_Boolean Direct()
// Проверка совпадения (X, Y) плоскостей двух систем координат
// (данной и Other). Возвращается "истина", если расстояние между началами
// не превосходит LinearTolerance, а главные направления параллельны или
// антипараллельны с точностью до угла AngularTolerance
Standard_Boolean IsCoplanar( const gp_Ax3& Other,
const Standard_Real LinearTolerance,
const Standard_Real AngularTolerance
)
// Проверка принадлежности оси A1 плоскости (X, Y).
// Возвращается "истина", если расстояние между началами
// не превосходит LinearTolerance, а ось Z системы координат
// перпендикулярна направлению оси с точностью до угла AngularTolerance
Standard_Boolean IsCoplanar( const gp_Ax1& A1,
const Standard_Real LinearTolerance,
const Standard_Real AngularTolerance
)
В классе имеется также набор процедур, позволяющих выполнять преобразования системы координат: перенос, поворот, отражение, смену направлений осей.