Мы можем обобщить вышеизложенное для произвольной системы IFS и сказать, что «Игра в Хаос» создаст то же изображение, что и суперкопир1. Это верно для любой начальной точки и для любого разумного множества вероятностей, однако при надлежащем подборе вероятностей аттрактор выполнит свою работу быстрее. Например, папоротник на рис. 9.31 был сделан при помощи «Игры в Хаос» и преобразований из уравнения (9.6). Были использованы следующие вероятности: рг, = 0,01, рг2 = 0,07, рг3 = 0,07, рг4 - 0,85 {вероятности для папоротника}. (9.8)
Листинг 9.6. Псевдокод для «Игры в Хаос»
void chaosGame(Affine aff[], double рг[]. int N) {
RealPoint P - {0.0.0.0}:
1 Этот результат известен как эргодическая теорема Элтона (Elton 's ergodic theorem). Ее доказательство, требующее привлечения серьезной математики, представлено в работе [Barnsley, 10].
9.5. Создание изображений с использованием системы итерируемых функций
// set some initial point
// задаем какую-нибудь начальную точку
int index;
do{
index - chooseAffine(pr. N); // choose the next affine // выбираем следующее аффинное преобразование Р - transform(aff[index]. Р); drawRealDot(P): // draw the dot // рисуем точку } whi led bored):
}
В листинге 9.6 приведена схема функции chaosGame(), которая «играет в Хаос». Эта функция рисует аттрактор системы IFS, N преобразований которой записаны в массив äff []. Вероятности, которые надлежит использовать, находятся в массиве рг[]. При каждой итерации одно из N аффинных отображений случайно выбирается с помощью функции chooseAffine() и используется для преобразования предыдущей точки в последующую. Детали реализации функции chooseAffineO рассматриваются в тематическом задании 9.3, где создается проект для рисования нескольких любопытных аттракторов.
На рис. 9.33 приводятся еще два примера. На рис. 9.33, а показан аттрактор системы IFS дракона: Т, = {.824074, .281482, -.212346, .864198, -1.882290, -0.110607}, рг, = .787473; Т2 = {.088272, .520988, -.463889, -.377778, 0.785360, 8.095795}, рг2 = .212527.