Сначала задумайтесь над тем, как представлять геометрические данные в программе. При работе в трехмерном пространстве можно использовать базовое представление в форме трех раздельных переменных 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().


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