void divide_triangle(point2 a, point2 b, point2 с, int k) {

point2 ab. ac, bc; int j; if(k>0) {

/* вычисление координат средних точек сторон */

for (И; j<2; j++) ab[ j ]=( а [ j ]+b[ j ]) / 2; for(j=0; j<2; j++) ac[j] = (a[j]+c[j] )/2; for(j=0; j<2; j++) bc[j]=(b[j]+c[j])/2;

/* Разбиение всех треугольников, кроме среднего */

divide_triangle(a, ab, ас, k-1); divide_triangle(c, ас, bc, k-1); divide_triangle(b, bc, ab, k-1);

}

else(triangle(a,b,c)); /* Вывод треугольника на экран и завершение работы */

}

2.8. Многоугольники и рекурсия При такой организации программы функция display() становится тривиальной. В ней используется объявленное глобальным в функции main() значение переменной п, которое задает количество циклов рекурсии13, и вызывается функция divide_triangle().

void display(void) {
glClear(GL_COLOR_BUFFER_BIT); divide_triangle(v[0], v[l], v[2], n); glFlush();
}

Оставшаяся часть программы та же, что и в предыдущем варианте, за исключением того, что в ней считывается значение переменной п. Изображение, которое сформируется после пяти циклов выполнения рекурсивной процедуры, представлено на рис. 2.35.

Полный текст программы приведен в приложении А.

Рис. 2.35. Изображение, которое сформируется после пяти циклов рекурсивного разбиения треугольников

2.9. Трехмерный узор Серпинского Я неоднократно подчеркивал, что двухмерная графика- это только частный случай трехмерной, но мы до сих пор не рассматривали программы, в которых использовалось бы представление трехмерных объектов. В этом разделе будет показано, как преобразовать рассмотренную выше программу построения узора Серпинского в трехмерную. В этом разделе мы воспользуемся обоими методами формирования узора- и точечным, и методом рекурсивного разбиения. В обоих случаях все начинается с пространственного аналога треугольника - тетраэдра (рис. 2.36).

2.9.1. Использование трехмерных точек Поскольку тетраэдр является выпуклым геометрическим телом, то средняя точка отрезка, проведенного между некоторой вершиной и любой точкой внутри тетраэдра, также лежит внутри тетраэдра. Следовательно, можно использовать процедуру, подобную описанной ранее, но на сей раз вместо трех вершин треугольника включить в рассмотрение четыре вершины тетраэдра. Обратите внимание на то, что, до тех пор пока любые три вершины не будут коллинеарны (т.е. лежать на одной прямой), можно случайным образом выбирать любую из четырех вершин тетраэдра и это не повлияет на характер сформированного в результате изображения.


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