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 середину отрезка между // точкой Р и выбранной точкой