Фрактальный алгоритм "Лист папоротника"

Результат построения.Фигура,похожая на листочек папоротника (фото с экрана монитора)

Фрактальная графика. Используя фрактал, построить лист папоротника.

Лист папоротника - достаточно простой и наглядный пример построения фрактала с помощью вероятностных распределений. С их помощью можно строить достаточно красивые и сложные фигуры.
Суть метода заключается в фиксировании на начальном этапе какой-либо точки,и в дальнейшем циклическом афинном преобразовании системы координат,в которой точка строится.
Иными словами,если на начальном этапе имеется точка Ао(Хо,Уо),при следующей итерации цикла мы должны изображать
точку А1(а*Хо+в*Yо+с,е*Хо+f*Yо+g) ("старая" система координат выражается в "новой"),где коэффициеты выбираются с учетом "попадания" некой случайной величины в соответствующий диапазон значений.
В приведенном мною примере случайная величина - число с плавающей запятой в диапазоне от О до 1.
Вот распределения:
0..0.85 - максимальный промежуток.Из этого преобразования получается множество точек,общая "густота" и "высота" листика папоротника.
0.85..0.93 и 0.93..0.99 - рисует листики соответственно справа и слева от стебля папоротника.Стебель изгибается вправо,следовательно,лискики ближе и гуще справа,поэтому диапазон для них больше.

Остальные точки образуют стебель папоротника.

/*Efanov N. 2009
ICQ #358603806 */
#include <graphics.h>
#include <iostream.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
#define MAXIT 20
double x,y,newx,newy,t,p;
int main()
{
 
int i=0,randnum;
randomize();
int gdriver=DETECT,gmode,errorcode;
initgraph(&gdriver,&gmode,"C:\\borlandc\\bgi");
double k;
int mid_x,mid_y,radius;
mid_x=640/2;
mid_y=480/2;
radius=(int)(0.1*mid_y);
x=1.0;y=1.0;
for (i=0;i<19000;i++)
{
  p=random(RAND_MAX)/(double)(RAND_MAX);
  t=x;
  if (p<=0.85)
  {  //vysota
    x=0.84*x+0.04*y;
    y=0.04*t+0.85*y+1.6;
  }
  else if (p<0.93)
  {             //simm sleva
    x=0.20*x-0.26*y;
    y=0.26*t+0.212*y+0.44;
  }
  else if (p<0.99)
  {        //simmetr sprava
   x=-0.15*x+0.28*y;
   y=0.26*t+0.24*y+0.44;
   }
   else
   {   //stvol
   x=0.0;
   y=0.16*y;
   }
   putpixel(320+floor(61*x)+1,470-(floor(40*y)+1),170);
   }
 
while(!kbhit());
 
 
closegraph();
return 0;
}

Ключевые слова: 
Фрактал, вероятность, координаты, графика, папоротник, IFS-метод, iterated function system
ВложениеРазмер
fern.rar135.01 кб