Как мы увидим, некоторые приложения вычисляют и сохраняют вершины ломаных линий в списке. Поэтому естественно добавить к нашему растущему инструментарию функцию, которая принимает такой список в качестве параметра и строит соответствующую ломаную. Список должен иметь форму массива или связного списка. Здесь мы используем форму массива и определим класс для его инкапсуляции, как показано в листинге 2.12.
Листинг 2.12. Тип данных для связного списка вершин
class GlintPointArrayC const int MAX_NUM = 100; public:
int num;
GLintPoint pt[MAX_NUM]:
}
В листинге 2.13 показана возможная реализация подпрограммы для рисования ломаных линий. Эта подпрограмма имеет, помимо прочих, параметр closed. Если closed не равен нулю, то последняя вершина ломаной соединяется с первой. Значение closed устанавливает аргумент для glBeginO. Эта подпрограмма просто посылает каждую из вершин ломаной в OpenGL.
Листинг 2.13. Тип данных «связный список» и рисование ломаной линии или полигона
void drawPolyLineCGlintPointArray poly, int closed) {
glBegin(closed ? GL_L.INE_L.00P: GL_LINE_STRIP);
fortint 1=0: I < poly.num: I++)
glVertex2i(poly.pt[I].x.poly.pt[I].y): glEndO: glFlushO:
}
2.3.2. Рисование линий с использованием movetoQ и linetoQ
Как мы уже отмечали ранее, многие графические системы имеют инструменты для рисования линий на базе функций raovetoO и 1 inetoO. Эти функции используются столь часто, что представляется важным поближе познакомиться с их использованием. Мы приспособим свои собственные функции movetoO и linetoO, которые действуют при вызове инструментов OpenGL. Кроме того, в главе 3 мы «приоткроем завесу» и покажем, как бы вы создавали функции movetoO и linetoO, исходя из базовых принципов, если бы мощная библиотека типа OpenGL не была доступна.
Напомним, что функции raovetoO и linetoO управляют гипотетическим пером, позиция которого называется текущими координатами (current position), или СР. Мы можем объединить действия обеих этих функций следующим образом: