Связь и интернет Архив Программирование
   
Сделать стартовойСделать закладку            
   ПОИСК  
   
Главная / Алгоритмы / Графика / Фракталы /
8  Perl
8  PHP
8  JavaScript
8  HTML
8  DHTML
8  XML
8  CSS
8  C / C++
8  Pascal и Delphi
8  Турбо Ассемблер
8  MySQL
8  CASE-технологии
8  Алгоритмы
8  Python
8  Обратная связь
8  Гостевая книга
Новости о мире


Лист папоротника - Программирование от RIN.RU
Лист папоротника




Этот фрактал появляется в результате использования системы итерируемых функций (IFS). Производится 20 итераций функций f(x, y). Каждое новое значение получается от предыдущего в зависимости от случайного числа, т.е (x', y') = f(x, y) вычисляется с использованием таблицы распределения:


Вероятность
0.01 
0.85 
0.07 
0.07
x'

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  Обсудить в чате

 
  
  
    Copyright ©  RIN 2003 - 2004      * Обратная связь