RU: Ruled Surface

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

Линейчатая поверхность

Линейчатая поверхность строится как линейная интерполяция точек, лежащих на двух кривых.

Пусть заданы две кривые $\mathbf{r}_1(u)$ и $\mathbf{r}_2(u)$ с согласованной параметризацией $0 \le u \le 1$. Мы можем построить поверхность, соединив прямыми точки на кривых с одинаковым значением параметра:

(1)
\begin{align} \mathbf{r}(u,v) = (1-v)\mathbf{r}_1(u) + v\mathbf{r}_2(u) \end{align}

Частными случаями такой поверхности являются плоскость. цилиндр и конус.

В openCascade построение линейчатой поверхности выполняется процедурой

   Handle_Geom_Surface GeomFill::Surface(const Handle(Geom_Curve)& Curve1,const Handle(Geom_Curve)& Curve2) ;

Следует обратить внимание на то, что эта процедура по заданным кривым пытается вначале построить плоскость, цилиндр или конус, и только в случае неудачи формирует поверхность по приведенной выше формуле. Чтобы проиллюстрировать это, возьмем две окружности единичного радиуса с центрами в точках $(0,0,0$ и $(0,0,1)$, лежащие в плоскости $(X.O.Y)$ и параллельной ей. Параметр (угол) нижней окружности будем отсчитывать от оси $X$, а параметр верхней — от оси $Y$. Иначе говоря, верхняя окружность повернута относительно нижней на угол $\pi/2$ вокруг оси $z$. Согласно уравнению, линейчатой поверхностью в таком случае служит однополостный гиперболоид, скрученный цилиндр. Однако, процедура GeomFill::Surface дает другой результат (см. пример ниже). И только в том случае, если мы не дадим ей "понять", что она имеет дело с окружностями, поучится ожидаемая поверхность.

Итак, построим две окружности со сдвинутой параметризацией, а по ним линейчатую поверхность;

// Первая окружность. Она лежит в плоскости (XOY), а параметр отсчитывается от оси X
    gp_Ax2 axis1(gp_Pnt(0.,0.,0.),gp_Dir(0.,0.,1.),gp_Dir(1.,0.,0.));
    Handle(Geom_Circle) circle1 = new Geom_Circle(axis1, 1.);
// Вторая окружность. Она сдвинута на единицу вверх, а параметр отсчитывается от оси Y
    gp_Ax2 axis2(gp_Pnt(0.,0.,1.),gp_Dir(0.,0.,1.),gp_Dir(0.,1.,0.));
    Handle(Geom_Circle) circle2 = new Geom_Circle(axis2, 1.);
//
// Создаем поверхность 
    Handle(Geom_Surface) surface = GeomFill::Surface (circle1,circle2);

Результат (цилиндр) представлен на рисунке слева. Изменим теперь тип кривых (не меняя их формы)
// Первая окружность. Она лежит в плоскости (XOY), а параметр отсчитывается от оси X
    gp_Ax2 axis1(gp_Pnt(0.,0.,0.),gp_Dir(0.,0.,1.),gp_Dir(1.,0.,0.));
    Handle(Geom_Circle) circle1 = new Geom_Circle(axis1, 1.);
// Вторая окружность. Она сдвинута на единицу вверх, а параметр отсчитывается от оси Y
    gp_Ax2 axis2(gp_Pnt(0.,0.,1.),gp_Dir(0.,0.,1.),gp_Dir(0.,1.,0.));
    Handle(Geom_Circle) circle2 = new Geom_Circle(axis2, 1.);
// Превратим окружности в TrimmedCurve
     Handle(Geom_TrimmedCurve) segm1 = new Geom_TrimmedCurve(circle1, 0., 2.*PI);
     Handle(Geom_TrimmedCurve) segm2 = new Geom_TrimmedCurve(circle2, 0., 2.*PI);
//
// Создаем поверхность 
    Handle(Geom_Surface) surface = GeomFill::Surface (segm1,segm2);

Результат представлен на рисунке справа.

OCC_SurfRuked02.jpg
OCC_SurfRuked01.jpg