Сначала задумайтесь над тем, как представлять геометрические данные в программе. При работе в трехмерном пространстве можно использовать базовое представление в форме трех раздельных переменных x,y,z, но многие программисты предпочитают подход, более близкий в объектно-ориентированному, например использовать структурный тип point3 для трехмерных вершин и point2 - для двухмерных. Тогда в объектно-ориентированной программе можно было бы определить операции с переменными такого структурного типа вроде приведенной ниже:
new_point = old_point + random_number
Но ни язык С, ни язык OpenGL не располагают такими возможностями (по крайней мере на сегодняшний день). Для представления двухмерных точек в качестве компромисса между низкоуровневым представлением и абстракцией на высоком уровне будем использовать массив из двух элементов:
typedef GLfloat point2[2];
Ниже приведен текст функции display( ), которая формирует 5000 точек узора после каждого вызова. Массив вершин базового треугольника узора vertices[3] определен в самой функции display ( ) как массив элементов типа point2.
void display(void) {
point2 vertices[3] = {{0.0, 0.0}, {250.0. 500.0},
{500.0, 0.0}}; /* Произвольный треугольник */ static point2 p = {75.0 ,50.0};
/* Установка исходной точки */ int j, k;
int rand(); /* Стандартный генератор случайных чисел */
for(k=0;k<5000;k++) {
/* Случайным образом выбрать индекс
вершины из множества 0,1,2 */ j=rand()%3;
/* Вычисление новой точки */ р[0] = (р[0] + triangle[j][0])/2;
Графическое программирование
р[1] = (р[1] + triangle[j][l])/2;
/* Вывод на экран новой точки */
glBegin(GL_POINTS);
glVertex2fv(p); glEnd();
}
glFlush();
}
Функция rand() в этой программе- стандартный генератор случайных чисел. Для формирования случайной последовательности, элементами которой могут быть только три целых числа 0, 1 и 2, используется операция вычисления остатка при целочисленном делении. При небольшом количестве итераций статистические характеристики генератора случайных чисел большого значения не имеют, а потому в программе можно использовать любой другой генератор, а не только тот, который вызывается стандартной функцией rand().