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);
page revision: 15, last edited: 06 Mar 2014 05:25