Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
комп графика Лекции.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
200 Кб
Скачать

Лекция 7. Сплайновые поверхности

7.1 Кривые Безье

Для изображения гладких линий или поверхностей в компьютерной графике используются сплайновые кривые (Кривая Безье).

Кривая Безье, описываемая уравнением (7.1)

где - коэффициенты в разложении бинома Ньютона (число сочетаний из m по i);

Vi – вершины, называемые контрольными точками кривой Безье, а ломаная прямая соединяющая вершины- контрольной линией;

t – параметр определяющий длину линии от вершины V0 до Vm;

m число вершин

Из уравнения (7.1) видно , что кривая Безье обладает следующими свойствами:

  • кривая Безье- гладкая;

  • начинается в точке V0 и кончается в точке Vm ;

  • отрезки V0 V1 и Vm-1 Vm контрольной линии являются касательными к кривой;

  • параметр t определяет точку на кривой;

  • кривая Безье целиком лежит в выпуклой оболочке порождаемой массивом вершин .

Рис. 7.1 Кубическая парабола Безье (m=3).

.

И з элементарных бикубических поверхностей можно строить составные поверхности. Для обеспечения гладкости составных поверхностей, смежные наборы контрольных точек должны иметь общую контрольную линию.

Линия, составленная из фрагментов, будет гладкой, если контрольные точки V31 и V02 лежат на одной прямо. (Это требование является следствием свойства кривых Безье: крайние ребра являются касательными к кривой).

Порядок следования контрольных точек существенно влияет на вид кривой.

7.2 Отображение кривых Безье в OpenGl

В OpenGL отображение кривых Безье осуществляется следующим образом:

  • в глобальных переменных задается массив контрольных точек

ctrlpoints : Array [0..3, 0..2] of GLfloat = (( -4.0, -4.0, 0.0), (-2.0, 4.0, 0.0),(2.0, -4.0, 0.0), (4.0, 4.0, 0.0));

  • в обработчике создания формы FormCreate или там, где контрольные точки могут изменять своё значение, задаётся одномерный вычислитель

glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, @ctrlpoints);

где

GL_MAP1_VERTEX_3 – символьная константа соответствующая случаю, когда каждая контрольная точка представляет собой набор трёх чисел;

Второй и третий параметр соответствуют диапазону изменения параметр ;

Четвёртый параметр 3- размерность вектора, определяющего контрольную точку;

Пятый параметр 4-число контрольных точек;

Шестой параметр @ctrlpoints – адрес массива контрольных точек;

  • Для построения сплайновой кривой в процедуре FormPaint используется стандартная команда OpenGL вывода точек или линий, но место векторов задаётся команда glEvalCoord1f.

Например.

procedure TfrmGL.FormPaint(Sender: TObject);

var

i : GLint;

begin

glClear (GL_COLOR_BUFFER_BIT); // очистка буфера цвета

glColor3f(1.0, 1.0, 1.0);

glBegin(GL_LINE_STRIP);

For i := 0 to 30 do

glEvalCoord1f(i / 30.0);

glEnd;

SwapBuffers(DC);

end;

В этой процедуре команда glEvalCoord1f(i / 30.0); выводит сплайновую кривую, аппроксимировав её тридцатью отрезками (то есть последовательно выводит тридцать отрезков по всему диапазону t от 0 до 1 c шагом 1/30).