В качестве примера процедур OpenGL работы с кривыми Безье приведем код, в котором четыре контрольные точки из программы в разделе 8.10 используются для получения двухмерной кубической кривой Безье. В этом примере на кривой изображается 50 точек, соединенных прямыми отрезками. Траектория кривой отображается как синяя ломаная линия, а контрольные точки выводятся на экран как красные точки размера 5 (рис. 8.53).

GLfloat ctrlPts [4][3] = { {-40.0, 40.0, 0.0},

{-10.0, 200.0, 0.0}, {10.0, -200.0, 0.0},

{40.0, 40.0, 0.0} };

glMaplf (GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, *ctrlPts); glEnable (GL_MAP1_VERTEX_3);

GLint k;

glColor3f (0.0, 0.0, 1.0); // Цвет линии выбран синим.

glBegin (GL_LINE_STRIP); // Генерируется "кривая" Безье,

for (k = 0; k <= 50; k++)

glEvalCoordlf (GLfloat (k) / 50.0); glEnd ( );

glColor (1.0, 0.0, 0.0); // Цвет точек выбран красным.

glPointSize (5.0); // Точки имеют размер 5,0.

glBegin (GL_POINTS); // Контрольные точки выводятся на экран, for (к = 0; к < 4; к++);

glVertex3fv (SctrlPts [к][0]);

glEnd ( );

Набор из четырех контрольных точек и соответствующая кривая Безье, отображенная с помощью процедур OpenGL в виде аппроксимирующей ломаной линии

Рис. 8.53. Набор из четырех контрольных точек и соответствующая кривая Безье, отображенная с помощью процедур OpenGL в виде аппроксимирующей ломаной линии Хотя в предыдущем примере сплайновая кривая генерировалась с равномерно расположенными значениями параметра, можно использовать функцию glEval-Coordlf и получить любую расстановку значений параметра и. Обычно, однако, сплайновая кривая генерируется с равномерным шагом по параметру, и OpenGL предлагает следующие функции, которые можно использовать для получения равномерно расположенных значений параметра.

glMapGridl* (n, ul, u2); glEvalMeshl (mode, nl, n2); Код-суффикс glMapGridl может иметь значение f или d. Параметр п задает целое число равномерных делений в диапазоне от ul до и2, а параметры nl и п2 задают целочисленный диапазон, соответствующий промежутку от ul и и2. Параметру mode присваивается значение GL_POINT или GL_LINE, в зависимости от того, требуется изобразить кривую с использованием дискретных точек или прямых отрезков. Если кривая отображается как ломаная линия, выход данных двух функций такой же, как выход приведенного ниже кода, за исключением того, что аргументу glEvalCoordl присваивается значение ul или и2, если к = 0 или к = п соответственно, чтобы избежать ошибок округления. Другими словами, при mode = GL_LINE указанные выше команды OpenGL эквивалентны следующему коду.

glBegin (GL_LINE_STRIP);

for (k = nl; k <= n2; k++)

glEvalCoordlf (ul + k * (u2 - ul) / n); glEnd ( ); Таким образом, в предыдущем примере можно заменить блок кода, содержащий цикл генерации кривой Безье, следующими операторами.

glColor3f (0.0, 0.0, 1.0); glMapGridlf (50, 0.0, 1.0); glEvalMeshl (GL_LINE, 0, 50); Используя функции glMapGridl и glEvalMeshl, можно разделить кривую на несколько сегментов и выбрать шаг по параметру (расположение значений параметра) каждого сегмента согласно его кривизне. Следовательно, сегмент с большим числом осцилляций может разбиваться на большее число интервалов, а для более пологого участка такие меры излишни.


⇐ вернуться назад | | далее ⇒