GLfloat ctrlPts [4][4][3] = {
{ {-1.5, -1.5, 4.0}, {-0.5, -1.5, 2.0},
{-0.5, -1.5, -1.0}, { 1.5, -1.5, 2.0} },
{ {-1.5, -0.5, 1.0}, {-0.5, -0.5, 3.0},
{ 0.5, -0.5, 0.0}, { 1.5, -0.5, -1.0} },
{ {-1.5, 0.5, 4.0}, {-0.5, 0.5, 0.0},
{ 0.5, 0.5, 3.0}, { 1.5, 0.5, 4.0} },
{ {-1.5, 1.5, -2.0}, {-0.5, 1.5, -2.0},
{ 0.5, 1.5, 0.0}, { 1.5, 1.5, -1.0} } };
glMap2f (GL_MAP2_VERTEX_3, 0.0, 1.0, 3, 4,
0.0, 1.0, 12, 4, &ctrlPts[0][0][0]); glEnable (GL_MAP2_VERTEX_3);
GLint k, j;
glColor3f (0.0, 0.0, 1.0); for (к = 0; к <= 8; k++)
{ glBegin (GL_LINE_STRIP) ;
/* Генерируются поверхностные линии Безье. */ for (j = 0; j <= 40; j++)
glEvalCoord2f (GLfloat (j) / 40.0, GLfloat (k) / 8.0); glEnd ( );
glBegin (GL_LINE_STRIP) ; for (j = 0; j <= 40; j++)
glEvalCoord2f (GLfloat (k) / 8.0, GLfloat (j) / 40.0); glEnd ( );
}
Равномерно размещенные значения параметров можно получить, не используя функцию glEvalCoord2, а применив команды
glMapGrid2* (nu, ul, u2, nv, vl, v2); glEvalMesh2 (mode, nul, nu2, nvl, nv2); Суффикс-код glMapGrid2 снова равен f или d, a параметру mode может присваиваться значение GL_POINT, GL_LINE или GL_FILL. При вызове команды генерируется двухмерная сетка точек с nu равномерно расположенными интервалами между ul и и2 и nv равномерно расположенными интервалами между vl и v2. Со ответствующий целочисленный диапазон параметра и - от nul до пи2, параметра V - от nvl до nv2.
Для поверхности, которая отображается на экран как сетка ломаных линий, выход glMapGrid2 и glEvalMesh2 аналогичен тому, что дает следующий фрагмент программы, кроме условий, которые предотвращают ошибки округления в начальных и конечных значениях переменных цикла. В начале цикла аргумент функции glEvalCoordl полагается равным (ul, vl). В конце цикла аргумент функции glEvalCoordl устанавливается равным (u2, v2).
for (k = nul; k <= nu2; k++) { glBegin (GL_LINES);
for (j = nvl; j <= nv2; j++)
glEvalCoord2f (ul + k * (u2 - ul) / nu,
vl + j * (v2 - vl) / nv) ;
glEnd ( );
)
for (j = nvl; j <= nv2; j++) { glBegin (GL_LINES);
for (k = nul; k <= nu2; k++)
glEvalCoord2f (ul + k * (u2 - ul) / nu,