RU: Frame of Reference (1)

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

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

Продолжение Frame of Reference

В OpenCascade с понятием "система координат" связаны следующие классы:

  • Класс gp_Ax1 описывает совокупность $(O,{\bf e})$, т.е. точки отсчета и единичного вектора — одномерный базис.
  • Класс Geom_Axis1Placement аналогичный gp_Ax1, но … (пока мне не понятно)
  • Класс gp_Ax2 описывает двумерную декартову систему координат.
  • Класс Geom_Axis2Placement аналогичный gp_Ax2, но … (пока мне не понятно)
  • Класс gp_Ax3 описывает трехмерную декартову (правую ли левую) систему координат.

Одномерная система координат

Класс gp_Ax1 предназначен для описания оси координат, представляющей собой совокупность двух объектов: точки $O$ начала координат и единичного вектора $\mathbf{e}$ оси. Членами-переменными данного класса являются:

    gp_Pnt loc
    gp_Dir vdir

Отметим, что

  • процедура gp_Ax1 & gp::OX() возвращает ось с началом координат в точке $(0,0,0)$ и направлением $(1,0,0)$,
  • процедура gp_Ax1 & gp::OY() возвращает ось с началом координат в точке $(0,0,0)$ и направлением $(0,1,0)$,
  • процедура gp_Ax1 & gp::OZ() возвращает ось с началом координат в точке $(0,0,0)$ и направлением $(0,0,1)$.

Для создания объекта данного класса предназначены процедуры-конструкторы

// Создание неопределенной оси
    gp_Ax1();
// Создание оси с началом в точке P и направлением V
    gp_Ax1(const gp_Pnt& P,const gp_Dir& V);

Задание / опрос значений параметров производится с помощью процедур:
// Задание направления V оси
    void SetDirection(const gp_Dir& V)
// Задание начала P оси
    void SetLocation(const gp_Pnt& P)
// Процедура возвращает направление оси
    gp_Dir& Direction()
// Процедура возвращает точку начала оси
    gp_Pnt& Location()

Имеются процедуры для определение положения относительно другой оси и для выполнения преобразований оси. Рассмотрим несколько примеров.

Создадим ось (одномерную систему координат) с началом в точке $(0, 0, 0)$ и направленной по вектору $(1, 1, 1)$:

    gp_Ax1 axis(gp_Pnt(0.,0.,0.),gp_Dir(1.,1.,1.));

Опросим направление оси:
    gp_Dir dir = axis.Direction();  // Результат: (0.5773, 0.5773, 0.5773)

Создадим другую ось с началом в точке $(0, 1, 0)$ и направленную по вектору $(1, -1, 1)$:
    gp_Ax1 axis2;
    axis2.SetLocation(gp_Pnt(0.,1.,0.));
    axis2.SetDirection(gp_Dir(1.,-1.,1.));

Определим угол (в градусах) между осями (не знаю как задается $\pi$ в OpenCascade)
    double angle = axis.Angle(axis2)*180/M_PI;  // Результат:  70.52

Отразим ось относительно точки $(0, 0.5, 0.5)$
    gp_Ax1 axis3 = axis.Mirrored(gp_Pnt(0., 0.5, 0.5));
    gp_Pnt loc = axis3.Location();  // Результат: (0.00, 1.00, 1.00)
    dir = axis3.Direction();    // Результат: (-0.5773, -0.5773, -0.5773)

Для отображения оси можно написать процедуру типа

// scale -- коэффициент масштабирования
// color -- цвет оси-стрелки
Handle_AIS_InteractiveObject drawAxis1(   Handle(AIS_InteractiveContext) aisContext,
    gp_Ax1& axis, Standard_Real scale, Quantity_Color& color)
{
    gp_Pnt location = axis.Location();
    location.SetCoord(location.X()*scale,location.Y()*scale,location.Z()*scale);
    gp_Vec direction = scale*axis.Direction();
//
    Handle(Geom_CartesianPoint) geomPoint1 = new Geom_CartesianPoint(location);
    Handle(Geom_CartesianPoint) geomPoint2 = new Geom_CartesianPoint(location.Translated(direction));
    Handle(AIS_Line) aisLine = new AIS_Line(geomPoint1,geomPoint2);
//
    aisContext->SetColor (aisLine, color);
    Handle(Prs3d_Drawer) aDrawer = aisLine->Attributes()->Link();
    aDrawer->SetLineArrowDraw(Standard_True);
    aDrawer->ArrowAspect()->SetLength(scale/10.);
//
    aisContext->Display (aisLine);

    return aisLine;
}

Используя эту процедуру, оси предыдущего примера будут выглядеть так:
//
// Рисуем систему координат для наглядности
    Handle(AIS_Trihedron) aTrihedron;
    Handle(Geom_Axis2Placement) aTrihedronAxis = 
          new Geom_Axis2Placement(gp::XOY());
    aTrihedron = new AIS_Trihedron(aTrihedronAxis);
    myAISContext->Display(aTrihedron);
//
// Первая ось -- красная
    Quantity_Color color;
    gp_Ax1 axis(gp_Pnt(0.,0.,0.),gp_Dir(1.,1.,1.));
    color = Quantity_Color(Quantity_NOC_RED);
    drawAxis1(myAISContext,axis,100.,color);
//
// Вторая ось -- зеленая    
    gp_Ax1 axis2;
    axis2.SetLocation(gp_Pnt(0.,1.,0.));
    axis2.SetDirection(gp_Dir(1.,-1.,1.));
    color = Quantity_Color(Quantity_NOC_GREEN);
    drawAxis1(myAISContext,axis2,100.,color);
// 
// Третья ось -- желтая    
    gp_Ax1 axis3 = axis.Mirrored(gp_Pnt(0., 0.5, 0.5));
    color  Quantity_Color(Quantity_NOC_YELLOW);
    drawAxis1(myAISContext,axis3,100.,color);
OCC_axis01.JPG