Основные фигуры
Общие положения
Для описания тела в трехмерном пространстве нужно задать совокупность участков поверхностей (граней), граничивающих его объем, т.е. позволяющих отделить множество внутренних точек от внешних. Эти грани пересекаются по некоторым кривым (ребрам), а ребра граничат друг с другом точками (вершинами). Совокупность перечисленных элементов называют топологией тела.
В OpenCascade выделяют следующие топологические элементы
- Вершина (точка)— vertex, элемент класса TopoDS_Vertex.
- Ребро (участок кривой) — edge, элемент класса TopoDS_Edge.
- Контур (связанная совокупность ребер и вершин) — wire, элемент класса TopoDS_Wire.
- Грань (участок поверхности, ограниченный ребрами) — face, элемент класса TopoDS_Face.
- Оболочка (связанная совокупность граней) — shell, элемент класса TopoDS_Shell.
- Тело (область пространства, ограниченная оболочкой) — solid, элемент класса TopoDS_Solid.
- Составной элемент — TopoDS_Compound.
- Составное тело — TopoDS_CompSolid.
Все эти элементы имеют общее название фигура — shape, объект класса TopoDS_Shape.
Но прежде, чем описывать работу с элементами топологии, рассмотрим примитивы, предоставляемые системой. Это параллелепипед (box), клин (wedge), цилиндр (cylinder), конус (cone), шар (sphere), тор (torus).
Параллелепипед (Box)
Построение параллелепипеда выполняется процедурами класса BRepPrimAPI_MakeBox. Он имеет несколько конструкторов наиболее общий из которых
BRepPrimAPI_MakeBox (const gp_Ax2 &Axes, const Standard_Real dx,
const Standard_Real dy, const Standard_Real dz)
позволяет построить параллелепипед со сторонами dx, dy, dz, направленными вдоль координатных осей, задаваемых системой координат Axes.
Пример. Параллелепипед со сторонами $dx = 2, dy = 3, dz = 1$, начало локальной системы координат (угол параллелепипеда) находится в точке $(1,1,1)$, с главным направлением (осью $z$), направленной по вектору $(1.,2.,3.)$ и осью $x$, направленной по $(-3.,0.,1.))$ строится так:
// Локальная система координат
gp_Ax2 axes(gp_Pnt(1.,1.,1.),gp_Dir(1.,2.,3.),
gp_Dir(-3.,0.,1.));
// Создаем объект
Standard_Real dx, dy, dz;
dx = 2.; dy = 3.; dz = 1.;
BRepPrimAPI_MakeBox makeBox(axes,dx,dy,dz);
// Фигура параллелепипеда
TopoDS_Shape shape = makeBox.Shape();;
Handle(AIS_Shape) aisShape = new AIS_Shape(shape);
// Отображаем
myAISContext->Display(aisShape,Standard_True);

Кроме описанного выше конструктора, имеются его "усеченные" варианты.
- Создание параллелепипеда в начале мировой системы координат (локальная система координат совпадает с мировой)
BRepPrimAPI_MakeBox(const Standard_Real dx, const Standard_Real dy,
const Standard_Real dz)
- Создание параллелепипеда в точке P (оси локальной системы координат параллельны осям мировой, а начало сдвинуто в точку P)
BRepPrimAPI_MakeBox (const gp_Pnt &P,
const Standard_Real dx, const Standard_Real dy, const Standard_Real dz)
- Создание параллелепипеда с противоположными вершинами, расположенными в точках P1 и P2 в начале мировой системы координат (оси локальной системы координат параллельны осям мировой)
BRepPrimAPI_MakeBox (const gp_Pnt &P1, const gp_Pnt &P2)
Клин (Wedge)
Параллелепипед является частным случаем клина (усеченного), построение которого выполняется процедурами класса BRepPrimAPI_MakeWedge. Наиболее общий конструктор класса имеет вид
BRepPrimAPI_MakeWedge (const gp_Ax2 &Axes, const Standard_Real dx,
const Standard_Real dy, const Standard_Real dz, const Standard_Real xmin,
const Standard_Real zmin, const Standard_Real xmax, const Standard_Real zmax)
Первый параметр Axes задает локальную систему координат, в которой строится фигура. Клин представляет собой два прямоугольника-основания, соединенных боковыми сторонами-трапециями. Одно основание-прямоугольник лежит в плоскости $y=0$, его угол находится в начале координат, а стороны направлены по координатным осям и имеют длины $dx$, $dz$. Второе основание лежит в плоскости $y=dy$. Это прямоугольник, противоположные углы которого имеют координаты (xmin, zmin) и (xmax, zmax).
В частности, при xmin = zmin = 0, xmax = dx, zmax = dz, мы получаем параллелепипед, при xmin = xmax = dx/2, zmin = 0, zmax = dz — равнобочный клин, а при xmin = xmax = dx/2, zmin = zmax = dz/2 — равнобочную пирамиду.
Другие конструкторы позволяют задавать частные случаи клина.
- Создание клина в мировой системе координат
BRepPrimAPI_MakeWedge (const Standard_Real dx, const Standard_Real dy,
const Standard_Real dz, const Standard_Real xmin, const Standard_Real zmin,
const Standard_Real xmax, const Standard_Real zmax)
- Усеченный равнобочный клин с шириной верхнего основания ltx относительно мировой и локальной систем координат:. Данный случай получается из общего при xmin = dx/2 - ltx/2, xmax = dx/2 + ltx/2, zmin = 0, zmax = dz,
BRepPrimAPI_MakeWedge (const gp_Ax2 &Axes, const Standard_Real dx,
const Standard_Real dy, const Standard_Real dz, const Standard_Real ltx)
BRepPrimAPI_MakeWedge (const Standard_Real dx, const Standard_Real dy,
const Standard_Real dz, const Standard_Real ltx)
Пример. Будем строить усеченную пирамиду с нижним основанием — единичным квадратом $0 \le x, y \le 1$ в плоскости $(x, y)$, верхним основанием $0 \le x \le 0.25$, $0.125 \le y \le 0.25$, лежащим в плоскости $z=1$. Таким образом, ось $y$ локальной системы координат должна быть направлена по оси $z$ мировой системы, ось $z$ по оси $x$, а ось $x$ — по $y$. Вот соответствующий участок программы:
// Локальная система координат
gp_Ax2 axes(gp_Pnt(0.,0.,0.),gp_Dir(1.,0.,0.),gp_Dir(0.,1.,0.));
// Клин
BRepPrimAPI_MakeWedge makeWedge(axes,1.,1.,1.,0.,0.125,0.25,0.25);
TopoDS_Shape shape = makeWedge.Shape();
// Отображение
Handle(AIS_Shape) aisShape = new AIS_Shape(shape);
myAISContext->SetColor(aisShape,Quantity_NOC_RED,Standard_False);
myAISContext->SetMaterial(aisShape,Graphic3d_NOM_PLASTIC,Standard_False);
myAISContext->Display(aisShape,Standard_True);

Можно построить пирамиду-клин в мировых координатах, а затем выполнить преобразование системы координат. Это преобразование должно переводить ось $y$ в ось $z$, ось $z$ в ось $x$, а $x$ в $y$. Итак:
// Клин
BRepPrimAPI_MakeWedge makeWedge(1.,1.,1.,0.,0.125,0.25,0.25);
TopoDS_Shape shape = makeWedge.Shape();
// Преобраование системы координат
gp_Ax2 axes(gp_Pnt(0.,0.,0.),gp_Dir(0.,1.,0.),gp_Dir(0.,0.,1.));
gp_Trsf transform;
transform.SetTransformation(gp_Ax3(axes));
TopLoc_Location location(transform);
shape.Move(location);
// Отображение
Handle(AIS_Shape) aisShape = new AIS_Shape(shape);
myAISContext->SetColor(aisShape,Quantity_NOC_RED,Standard_False);
myAISContext->SetMaterial(aisShape,Graphic3d_NOM_PLASTIC,Standard_False);
myAISContext->Display(aisShape,Standard_True);
Результат тот же самый.
Цилиндр (Cylinder)
Под цилиндром в данном случае понимается прямой круговой цилиндр, точнее часть цилиндра, получающаяся при повороте отрезка на некоторый угол. В локальной системе координат вращение выполняется относительно оси $z$, нижнее основание лежит в плоскости $(x, y)$, угол поворота отсчитывается от оси $x$ в направлении против часовой стрелки, если смотреть на плоскость с положительных значений $z$.
BRepPrimAPI_MakeCylinder (const gp_Ax2 &Axes, const Standard_Real R,
const Standard_Real H, const Standard_Real Angle)
Здесь, как и выше, Axes задает локальную систему координат, R — радиус цилиндра, H — высота, а Angle — угол поворота. Доступны также конструкторы со значениями параметров "по умолчанию":
BRepPrimAPI_MakeCylinder (const Standard_Real R, const Standard_Real H)
BRepPrimAPI_MakeCylinder (const Standard_Real R, const Standard_Real H,
const Standard_Real Angle)
BRepPrimAPI_MakeCylinder (const gp_Ax2 &Axes, const Standard_Real R,
const Standard_Real H)
Конус (Cone)
Конус (точнее прямой, круговой конус) определяется положением локальной системы координат, радиусами нижней и верхней круговых граней (они перпендикулярны оси конуса) и расстоянием между ними. Ось конуса совпадает с осью $z$, а нижняя грань лежит в плоскости $(x, y)$. Конус может представлять собой сектор кругового конуса, задаваемый некоторым углом поворота образующей прямой. Конструктор класса имеет вид
BRepPrimAPI_MakeCone (const gp_Ax2 &Axes, const Standard_Real R1,
const Standard_Real R2, const Standard_Real H, const Standard_Real angle)
Здесь Axes — локальная система координат, R1 — радиус нижнего основания, R2 — радиус верхнего основания, H — высота конуса, расстояние между основаниями, а Angle — угол поворота образующей. При R1=R2 конус переходит в цилиндр.
Доступны также следующие конструкторы:
BRepPrimAPI_MakeCone (const Standard_Real R1, const Standard_Real R2,
const Standard_Real H)
BRepPrimAPI_MakeCone (const Standard_Real R1, const Standard_Real R2,
const Standard_Real H, const Standard_Real angle)
BRepPrimAPI_MakeCone (const gp_Ax2 &Axes, const Standard_Real R1,
const Standard_Real R2, const Standard_Real H)
Шар (Sphere)
Процедуры класса BRepPrimAPI_MakeSphere позволяют построить часть шара, ограниченного участком сферы и плоскостями сечения. Участок сферы лежит между двумя меридианами и двумя широтами. Центр сферы расположен в начале локальной системы координат, а ось сферических координат направлена по оси $z$. Угол меридиана $\varphi$ отсчитывается от оси $x$ против часовой стрелки, $(0 \le \varphi \le 2\pi)$, а углы широт $\theta_1$ и $\theta_2$ — от экватора. Они должны удовлетворять соотношению $( -\pi/2 \le \theta_1 < \theta_2 \le \pi/2)$.
В частности, при $\theta_1 = -\pi/2$, $\theta_2 = +\pi/2$ получается полный шар, при $\theta_1 = -\pi/2$, $\theta_2 = 0$ — нижняя половина (южное полушарие), а при $\theta_1 = 0$, $\theta_2 = +\pi/2$ — верхняя половина (северное полушарие).
Приведем несколько конструкторов класса. Шар радиуса R с центром в начале координат формирует конструктор
BRepPrimAPI_MakeSphere (const Standard_Real R)
Шар радиуса R с центром в точке Center задается так:
BRepPrimAPI_MakeSphere (const gp_Pnt &Center, const Standard_Real R)
В общем случае, как сказано выше, шар задается локальной системой координат, радиусом и тремя углами:
BRepPrimAPI_MakeSphere (const gp_Ax2 &Axis, const Standard_Real R,
const Standard_Real theta1, const Standard_Real theta2, const Standard_Real phi)
Пример. Построим область шара единичного радиуса с центром в начале координат, соответствующую параметрам $\varphi = \pi/4$, $\theta_1 = \pi/8$, $\theta_2 = \pi/4$.
// Параметры фигуры
Standard_Real r, phi, theta1, theta2;
r = 1;
theta1 = M_PI / 8.;
theta2 = M_PI / 4.;
phi = M_PI / 4.;
// Построение и отображение
BRepPrimAPI_MakeSphere makeSphere(r, theta1, theta2, phi);
TopoDS_Shape shape = makeSphere.Shape();
Handle(AIS_Shape) aisShape = new AIS_Shape(shape);
myAISContext->Display(aisShape,Standard_True);
Тор (Torus)
Тор представляет собой фигуру, получаемую (в локальной системе координат) при вращении окружности, лежащей в плоскости $(x, z)$ с центром на оси $x$, вокруг оси $z$. Тор определяется локальной системой координат и двумя радиусами: большим ]]$r_1$]] и меньшим $r_2$. Параметрами на поверхности тора служат углы $\varphi$ и $\theta$, изменяющиеся в диапазоне от 0 до $2\pi$. Для построения тора (или его части) предназначен класс BRepPrimAPI_MakeTorus.
В общем случае участок тора задается следующими параметрами
- Локальной системой координат фигуры. Если она не задана, то фигура строится в мировой системе координат. Центр тора располагается в начале координат. Линия центров (окружность радиуса $r_1$) лежит в плоскости $(x, y)$.
- Радиусом $r_1$ окружности центров.
- Радиусом $r_2$ окружностей-образующих.
- Углом $\varphi$, отсчитываемого от оси $x$ против часовой стрелки, до которого строится часть тора. Этот угол может лежать в диапазоне от 0 до $2\pi$.
- Углами $\theta_1$ и $\theta_2$, отсекающими часть поверхности тора вдоль образующей. При этом предполагается, что угол $\theta_1$ меньше $\theta_2$, так что выполнено неравенство $0 < \theta_2-\theta_1 \le 2\pi$.
Рассмотрим несколько конструкторов класса. Полный тор описывается конструктором
BRepPrimAPI_MakeTorus (const Standard_Real R1, const Standard_Real R2)
а часть тора с полным набором параметров конструктором
BRepPrimAPI_MakeTorus (const gp_Ax2 &Axes, const Standard_Real R1,
const Standard_Real R2, const Standard_Real theta1,
const Standard_Real theta2, const Standard_Real phi)
Обратим внимание на то, что построение части тора выполняется несколько странным образом, как показывает приведенный ниже пример.
Standard_Real r1, r2;
Standard_Real phi, theta1, theta2;
r1 = 1.;
r2 = 0.2;
phi = M_PI / 4.;
theta1 = 0.;
theta2 = 3.*M_PI / 4.;
BRepPrimAPI_MakeTorus makeTorus(r1, r2, theta1, theta2, phi);
TopoDS_Shape shape = makeTorus.Shape();
//
Handle(AIS_Shape) aisShape = new AIS_Shape(shape);
myAISContext->Display(aisShape,Standard_True);