Изучая материал данной главы, мы будем анализировать разные аспекты достаточно простой и в то же время весьма информативной задачи - построения так называемого узора Серпинского (Sierpinski gasket). На примере этой задачи будет показано, как с помощью довольно небольшого набора функций можно строить сложные узоры. Как и было обещано ранее, в качестве графического API будет использоваться OpenGL, но обсуждение основных концепций выходит далеко за рамки этого конкретного пакета и при-ложимо к большинству существующих графических систем, в том числе PHIGS (Programmer's Hierarchical Graphics System) и GKS (Graphical Kernel System). Те функциональные возможности, с которыми читатель познакомится в этой главе, вполне достаточны для разработки довольно сложных программ построения изображения двухмерных объектов, которые, правда, не оснащены средствами взаимодействия с пользователем. В конце этой главы читатели познакомятся с простой программой построения изображения трехмерных объектов.
2.1. Узор Серпинского Для демонстрации принципов программирования задач двухмерной графики мы будем использовать в качестве примера узор Серпинского. История исследования этого узора достаточно длинная, а сам узор представляет особый интерес в такой области, как геометрия фракталов. Узор Серпинского является случайным объектом, определенным рекурсивно, но в пределе его форма стремится к детерминированному объекту.
Предположим, что в исходном состоянии у нас есть три точки на плоскости, причем их положение описано координатами в некоторой подходящей системе координат1: {*\,у\\ (х2, у2) и (х3, у3). Далее выполняется следующая процедура.
1. Случайно выбирается некоторая точка внутри треугольника, образованного заданными вершинами.
2. Случайно выбирается одна из трех вершин.
3. Выбирается точка, равноотстоящая от первой выбранной точки и от выбранной вершины.
4. Новая точка включается в изображение и помечается маркером, например кружком.
5. Исходная точка заменяется этой новой точкой.