flakeMotifO:

cvs.scale2D(1.0. -1.0):

cvs.rotate2D(60.0): // concatenate a 60-degree rotation // добавляем поворот на 60 градусов }

}

Пример 5.5.3. Шквал из снежинок Шквал из снежинок, подобный приведенному на рис. 5.40, можно создать посредством многократного рисования снежинки в случайных позициях. Вот соответствующий код на OpenGL:

while(! bored) {

cvs.initCTO:

cvs.translate2D(randon amount, random amount): II (аргументами являются два случайных числа) drawFlakeO:

}

Отметим, что СТ необходимо инициализировать каждый раз во избежание концентрации снежинок в одном месте.

Френсис Хилл

Рис. 5.40. Шквал из снежинок Пример 5.5.4. Создание узоров из мотива На рис. 5.41 показаны две конфигурации из мотивов динозавра. В обоих вариантах динозавры распределены вокруг окружности, но в одном случае каждый динозавр повернут так, что его ноги направлены к началу координат, а во втором случае все динозавры расположены вертикально. В обоих случаях для создания узора используется комбинация поворотов и перемещений. Интересно посмотреть, как на получающуюся картину влияет порядок операций.

Допустим, что подпрограмма drawDinoO рисует вертикального динозавра, помещенного в начало координат. На рис. 5.41, а система координат для каждого мотива вначале поворачивается вокруг начала на нужный угол, а затем перемещается вдоль своей оси у на Я единиц. Ниже приведен код, выполняющий эти операции. Отметим, что CT заново инициализируется на каждом шаге цикла, так что экземпляры не концентрируются в одном месте. Подумайте, какие преобразования вы использовали бы, если бы захотели создавать этот узор путем преобразования точек самого мотива.

const int numMotifs - 12:

for(int i - 0: i < numMotifs: i++)

{

5.5. Использование аффинных преобразований в программах

cvs.initCTO; // init СТ at each iteration // инициализируем СТ при каждой итерации

cvs.rotate2D(i * 360 / nuraMotifs): // rotate // поворачиваем

cvs.translate2D(0.0. Н): // shift along the y-axis // смещаемся вдоль оси у

drawDinoO:

}

Френсис Хилл

а б Рис. 5.41. Два узора на основе одного мотива: а) каждый мотив повернут автономно; б) все мотивы расположены вертикально


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