RU: Frame of Reference (3)

Геометрические примитивы

Система координат

Продолжение 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
    )

В классе имеется также набор процедур, позволяющих выполнять преобразования системы координат: перенос, поворот, отражение, смену направлений осей.