Этот фрактал появляется в результате использования системы итерируемых функций (IFS). Производится 20 итераций функций f(x, y). Каждое новое значение получается от предыдущего в зависимости от случайного числа, т.е (x', y') = f(x, y) вычисляется с использованием таблицы распределения:
Вероятность 0.01 0.85 0.07 0.07 | x' 0 0.85x + 0.04y 0.20x - 0.26y -0.15x + 0.28y | y' 0.16y -0.04x + 0.85y + 1.6 0.23x + 0.22y + 1.6 0.26x + 0.24y + 0.44 |
Таким образом, имеем 4 различных отображения, результаты которых изображены на рисунке:
После 20 итераций точка (x20, y20) рисуется зеленой на черном фоне. (Здесь (xn, yn) - точка после n итераций функции f(x,y), начиная с точки (x0, y0)). Затем выбирается случайным образом новая начальная точка... И процесс продолжается до бесконечности или до остановки программы. Общие контуры "папоротника" появляются довольно быстро, в дальнейшем идет лишь более тщательная прорисовка картины.
/* FERN.C -- Generates fractal fern leaf. Initial coding by John Watne * 1/20/92. */
#include <stdio.h> #include <graph.h> #include <stdlib.h> #include <conio.h>
#define MAXIT 20 /* maximum number of iterations */ #define TRUE 1
main() { struct videoconfig vc; /* video configuration -- is it VGA? */ double x, y, newx, newy; unsigned i; /* counter variable */ int rand_num;
_getvideoconfig (&vc); if (vc.adapter != _VGA) { printf ("No VGA adapter. Program halted.\n"); exit (1); } _setvideomode (_VRES16COLOR); /* 640x480, 16-color */ _remappalette (0, _BLACK); _remappalette (1, _LIGHTGREEN); _setcolor (1); /* Set up viewport */ _setviewport (0, 0, 640, 640); /* Set up window coordinate system */ _setwindow (TRUE, -5, 0, 5, 10); srand (0); while (!kbhit()) { x = (double) rand() / 50000.0; y = (double) rand() / 50000.0; for (i = 0; i < MAXIT; i++) { rand_num = rand(); if (rand_num < 0.01 * RAND_MAX) { newx = 0; newy = 0.16 * y; x = newx; y = newy; } else if (rand_num < 0.86 * RAND_MAX) { newx = (0.85 * x) + (0.04 * y); newy = (-0.04 * x) + (0.85 * y) + 1.6; x = newx; y = newy; } else if (rand_num < 0.93 * RAND_MAX) { newx = (0.2 * x) - (0.26 * y); newy = (0.23 * x) + (0.22 * y) + 1.6; x = newx; y = newy; } else { newx = (-0.15 * x) + (0.28 * y); newy = (0.26 * x) + (0.24 * y) + 0.44; x = newx; y = newy; } } /* for loop */ if ((x >= -5.0) && (x <= 5.0) && (y >= 0.0) && (y <= 10.0)) _setpixel_w (x, y); } /* while (!kbhit()) */ if (getch() == 0) getch(); _setvideomode (_TEXTC80); }
8 8 8
| |