movetoCx, у) : устанавливаем CP в (х, у),

linetoCx. у) : рисуем прямую линию от CP до (х, у) и затем присваиваем CP значение (х, у).

Таким образом, прямая линия из точки (*,, г/,) до точки (х2, у2) может быть нарисована посредством двух вызовов: movetoCxl, yl) и lineto(x2, у2). Ломаная линия на базе списка точек (х0, у0), (x,, yt),..., (хп-\>Уп-\) легко вычерчивается с помощью такого кода:

moveto(x[0]. у[0]); fordnt 1-1: i < n: 1++) lineto(x[i]. y[i]): Нетрудно построить функции movetoO и linetoO в среде OpenGL. Чтобы осуществить это, нам необходимо определить и поддерживать свое собственное СР. Для случая целых координат проделать этот фокус могла бы реализация, приведенная в листинге 2.14.

Листинг 2.14. Определение moveto() и lineto() в OpenGL

GLintPoint CP:

// global current position

// глобальные текущие координаты (CP)

//««««««< moveto »»»»>»

void moveto(GL1nt x, GLint y)

{

CP.x - x: СР.у - у: // update the CP // обновляем CP }

//««««« i i neto »»»»» void lineto(GLint x. GLint y) {

glBegin(GL_LINES); // draw the line // рисуем линию

glVertex2i(CP.x. CP.y): glVertex2i(x. y);

glEndO:

gIFlushO:

CP.x - x: CP.y - y: // update the CP // обновляем CP }

2.3.3. Рисование выровненных прямоугольников Особым случаем полигона является выровненный прямоугольник (aligned rectangle), названный так потому, что его стороны выровнены параллельно осям координат. Мы могли бы создать свою собственную функцию для рисования выровненного прямоугольника (как?), однако в OpenGL предусмотрена готовая функция

glRecti(GLint xl. GLint yl. GLint x2. GLint y2): // draw a rectangle with opposite corners //(xl. yl) and (x2. y2):

// чертим прямоугольник с противоположными углами

// (xl. yl) и (х2. у2);

// fill rhe rectangle with the current color;

// заполняем начерченный прямоугольник текущим цветом

2.3. Создание рисунков из линий

Френсис Хилл

Рис. 2.15. Два выровненных прямоугольника, закрашенных разными цветами


⇐ Предыдущая| |Следующая ⇒