9.5. Создание изображений с использованием системы итерируемых функций Для реализации этого алгоритма предположим, что аффинные отображения записаны в глобальном массиве Affine affines[N].

Данный метод работоспособен, однако имеет ряд недостатков. Один из них - это неэффективность: в нем содержится много рекурсивных вызовов, каждый из которых требует дополнительных вычислений. Еще хуже то, что требуется огромное количество памяти: при k-ïi итерации нужно нарисовать Nk точек, и каждый вызов подпрограммы superCcpierO выделяет память под новый список точек. Все активные в данный момент рекурсивные вызовы вынуждены хранить полный список точек. (А обычно они записывают эти списки в системный стек!) К счастью, существует и нерекурсивный метод рисования аттрактора для IFS, известный под названием «Игра в Хаос» («Chaos Game»).

9.5.4, «Игра в Хаос» Возможно, ангел Господень обследовал бесконечное море хаоса, затем слегка прикоснулся к нему пальцем.

В этом крошечном и преходящем водовороте уравнений приобрел форму наш космос.

Мартин Гарднер (Martin Gardner)

«Игра в Хаос», известная также под названием «Алгоритм случайных итераций» («Random Iteration Algorithm*), предлагает простой нерекурсивный метод создания изображения аттрактора IFS [Barnsley, 11, Barnsley, 12]. Пример этого мы уже видели в главе 2 (см. тематическое задание 2.2) при рисовании ковра Серпинского. В листинге 9.5 приводится псевдокод, вкратце показывающий, как это было сделано.

Листинг 9.5. Краткое описание процесса рисования ковра Серпинского (псевдокод)

Set corners of triangle: p[0]-(0.0).p[l]=(1.0).p[2]-(.5.1)

I! задаем углы треугольника: ...

Set P to one of these, chosen randomly:

II Задаем в качестве точки Р один из них. выбранный случайно

do{

Draw a dot at P: II рисуем точку P

Choose one of the 3 points at random: II выбираем случайным образом одну из трех точек

Set nowPt to the midpoint of P and the chosen point: II Задаем в качестве newPt середину отрезка между // точкой Р и выбранной точкой


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