13Обращаю ваше внимание на то, что, работая с OpenGL, нам часто придется передавать данные в функции с обратным вызовом через глобальные переменные. Хотя желательно избегать использования глобальных переменных, но при обращении к функциям с обратным вызовом у нас просто нет иного выхода.
Графическое программирование
Первым делом нужно внести определенную коррекцию в функцию display (). Определим в ней тип данных для представления трехмерной точки:
typedef GLfloat point3[3];
Затем определим вершины исходного тетраэдра:
/* Вершины произвольного тетраэдра */ point3 vertices[4]={{0.0, 0.0, 0.0},{250.0, 500.0, 100.0}, {500.0, 250.0, 250.0},{250.0, 100.0, 250.0}};
/* Произвольная исходная точка */ point3 р={250.0,100.0,250.0}; Для формирования точек в программе будем использовать функцию glPoint3fv(). Одна из проблем, которая специфична именно для трехмерного случая, состоит в том, что формируемые точки не лежат в одной плоскости, а потому на двухмерном изображении трудно будет рассматривать трехмерную структуру. Чтобы "обойти" ее, не используя геометрические построения, о которых речь еще впереди, воспользуемся цветовым кодированием - цвет каждой формируемой точки будет нести информацию о ее положении в глубину. Это несколько облегчит восприятие изображения, хотя до полной иллюзии пространства при этом, конечно же, очень далеко. Ниже приведен текст функции формирования изображения display ().
void display() {
/* Вычислить и вывести на экран единственную новую точку */ int rand(); int i;
j=rand()%4; /* Случайным образом выбрать индекс вершины */
/* Вычислить координаты точки, расположенной на полпути между выбранной вершиной и точкой, сформированной в предыдущем цикле */
р[0] = (p[0]+vertices[j][0])/2.0; р[1] = (p[l]+vertices[j][l])/2.0; Р[2] = (p[2]+vertices[j][2])/2.0;
/* Вывести точку на экран */ glBegin(GL_POINTS);
glColor3f(р[0]/250.0,р[1]/250.0,р[2]/250.0);
glVertex3fv( р ); glEnd();
/* Заменить координаты прежней точки */
old.x=new.x; old.y=new.y; old.z=new.z;
glFlush();