RU: Surface of Extrusion

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

Цилиндрическая поверхность (поверхность выдавливания)

Цилиндрическая поверхность получается в результате движения прямой по заданной кривой линии. Пусть задана кривая $\mathbf{r}_C(t)$ и постоянный вектор направления $\mathbf{a}$. В этом случае цилиндрическая поверхность имеет уравнение $\mathbf{r}(u,v)=\mathbf{r}_C(u)+v\mathbf{a}$. Кривая, по которой происходит движение прямой, называется направляющей, а сама прямая — образующей. Если направдяющая — прямая, то цилиндрическая поверхность представляет собой плоскость. Если направляющая — окружность, то поверхность — обычный цилиндр.

В OpenCascade с понятием "цилиндрическая поверхность" связаны следующие классы.

  • gp_Cylinder
  • gce_MakeCylinder
  • Geom_CylindricalSurface
  • Geom_SurfaceOfLinearExtrusion

Класс gp_Cylinder описывает бесконечную поверхность кругового цилиндра. Цилиндр определяется радиусом и
образующей — направлением "главной" оси связанной с поверхностью локальной системы координат (объект класса
gp_Ax3). Например, цилиндр единичного радиуса с образующей, направленной по оси $z$, создается так

   gp_Cylinder gpCylinder(gp::XOY(),1.);

а можно сделать и так:
// Создаем неопределенный цилиндр
   gp_Cylinder gpCylinder;
// Устанавливаем ось
   gpCylinder.SetAxis(gp::OZ());
// Задаем радиус
   gpCylinder.SetRadius(1.) ;

Коэффициенты уравнения поверхности цилиндра $a_1 x^2 + a_2 y^2 + a_3 z^2 + 2(b_1 xy + b_2 xz + b_3 yz ) + 2(c_1 x + c_2 y + c_3 z) + d = 0$ можно получить методом класса
   void Coefficients(Standard_Real& A1,Standard_Real& A2,Standard_Real& A3,
      Standard_Real& B1,Standard_Real& B2,Standard_Real& B3,
      Standard_Real& C1,Standard_Real& C2,Standard_Real& C3,
      Standard_Real& D);

Например, для нашего цилиндра
   Standard_Real a[3], b[3], c[3], d;
   gpCylinder.Coefficients(a[0],a[1],a[2],b[0],b[1],b[2],c[0],c[1],c[2],d);
//   a = 1.0000, 1.0000, 0.00000
//   b = 0.0000, 0.0000, 0.00000
//   c = 0.0000,   0.0000, 0.00000
//   d = -1.0000

Процедуры класса gce_MakeCylinder обеспечивают методы построения цилиндра (объекта gp_Cylinder). В частности, имеется метод конструрования цилиндра на основе окружности.

Класс Geom_CylindricalSurface описывает цилиндр как параметрическую поверхность. Параметрам служат: угол $\varphi$ вдоль окружности-направляющей и $z$ — расстояние вдоль образующей, так что уравнение поверхности в локальной системе координат имеет вид: $x = R\cos{\varphi}$, $y = R\sin{\varphi}$, $z = z$. Вектор нормали есть ${\bf N} = \cos{\varphi} {\bf i}+\sin{\varphi} {\bf j}$. Элемент длины дуги равен $ds=\sqrt{R^2d\varphi^2+dz^2}$, а элемент площади поверхности $dS=Rd\varphi dz$. В классе принят следующий порядок параметризации: $(\varphi,z)$, так что первый параметр изменяется от $0$ до $2\pi$, а второй от $-\infty$ до $+\infty$. $u$-линии представлют собой прямые, палаллельные оси цилиндра, а $v$-линии — окружности.

Класс Geom_SurfaceOfLinearExtrusion описывает цилндрическую поверхность (поверхность "выдавливания") на основе кривой (направляющей) и направления (образующей). Диапазон изменения параметра $u$ определяется кривой, а параметр $v$ изменяется от $-\infty$ до $+\infty$. На образующей значение параметра $v$ равно нулю.

В качестве примера построим участок цилндрической поверхности на основе дуги винтовой линии

// Дуга винтовой линии по девяти точкам
// Положение точек
   Handle(TColgp_HArray1OfPnt) points = new TColgp_HArray1OfPnt(1,9);
   double dphi = 3.14159/4.;
   double dz = 1. / 8.;
   int i;
   for( i=0; i<9; i++ )
      points->SetValue(i+1,gp_Pnt(cos(i*dphi),sin(i*dphi),i*dz ));
//
// Выполняем интерполяцию
   GeomAPI_Interpolate interpolate(points,Standard_False,Precision::Approximation());
   interpolate.Perform();
// Проверяем, все ли нормально
   if( ! interpolate.IsDone() ) {
   // Обработка ошибочной ситуации
   }
// Возвращается построенная BSpline-кривая
   Handle(Geom_BSplineCurve) curve = interpolate.Curve();
//
// Цилиндр в направлении оси z
   gp_Dir dir(0.,0.,1.);
   Handle(Geom_SurfaceOfLinearExtrusion) surface = new Geom_SurfaceOfLinearExtrusion(curve,dir);
// Вырезаем кусок поверхности
   Handle(Geom_RectangularTrimmedSurface) trimmedSurface = new Geom_RectangularTrimmedSurface(
    surface,curve->FirstParameter(),curve->LastParameter(),0.,0.5,false);

Вид построенной цилиндрической поверхности показан на риунке справа.

OCC_Cylinder.jpg