Вариант функции drawPolyLineFileO, приведенный в листинге 2.9, имеет очень слабый уровень контроля ошибок. Если файл нельзя открыть - возможно, потому, что в функцию передано неверное имя, - подпрограмма просто возвращает управление в главную программу. Если файл содержит неверные данные, например вместо целых чисел стоят вещественные, - результаты будут непредсказуемы. Очевидно, что данную подпрограмму следует рассматривать только как точку отсчета для разработки более адекватной версии.
Листинг 2.9. Вычерчивание ломаных линий, записанных в файле
#include <fstream.h>
void drawPolyLineFile(char * fileName)
{
fstream inStream:
inStream.open(fileName. ios ::in); // open the file // открываем файл
ifdnStream.fail ())
return:
glClear(GL_COLOR_BUFFER_BIT): // clear the screen // очищаем экран
GLint numpolys. numLines. x, y:
inStream » numpolys: // read the number of polylines // читаем число ломаных
2.3. Создание рисунков из линий
for(int j - 0: j < numpolys: // read each polyline // читаем каждую ломаную
{
inStream » numLines:
glBegin(GL_LINE_STRIP): // draw the next polyline // чертим очередную ломаную
for (int i - 0: i < numLines: i++)
{
inStream » x » y: // read the next x. у pair // читаем очередную пару x. у
glVertex2i(x. у);
}
glEndO:
}
glFlushO: inStream.closeO:
}
Пример 2.3.3. Параметризация рисунков На рис. 2.13 изображен простой домик, состоящий из нескольких ломаных. Его можно нарисовать с использованием кода, частично приведенного в листинге 2.10. (Какой код понадобится для рисования двери и окна?)
Листинг 2.10. Рисование домика с «вмонтированными» размерами void hardwirededHouseO {
glBegin(GL_LINE_L00P):
glVertex2i(40. 40): // draw the shell of house // рисуем остов домика
glVertex2i(40. 90):
glVertex2i(70. 120):
glVertex2i(100. 90):
glVertex2i(100. 40):
glEndO:
gl Beg i n(GL_LIN E_STRIP); glVertex2i(50. 100):
продолжение &
Начальная стадия: рисование фигур
Листинг 2.10 (продолжение) // draw the chimney // рисуем трубу
glVertex2i(50. 120):