// перемещение и масштабирование фрактала void move(int, int, float);

} ;

// построение множества Мандельброта void Fractalset::setM

(int(*F)(complexf,complexf,int,int))

{

float xinc,yinc; xinc=(max-min).real()/w; yinc=(max-min).imag()/h; complexf z(min); int k=0,j;

//

for(j=0;j<h; j++)

I

z=complexf(min.real(),z.imag()); for(int i=0;i<w;i++)

I

data[k++]=F(c,z,maxit,r); z+=xinc;

}

z=complexf(z.real(),z.imag()+yinc);

}

}

// построение множества Жюлиа void Fractalset::setJ

(int(*F)(complexf,complexf,int,int))

{

float xinc,yinc; xinc=(max-min).real()/w; yinc=(max-min).imag()/h; complexf z(min); int k=0,j; for(j=0;j<h;j++) i

z=complexf(min.real(),z.imag());// z.r=min.r; for(int i=0;i<w;i++) i

data[k++]=F(z,c,maxit,r); z+=xinc;

}

z=complexf(z.real(),z.imag()+yinc);

}

}

// перемещение и масштабирование фрактала void Fractalset::move(int x,int y,float zoom) {

complexf delta;

float xinc=(max.real()-min.real())/w; float yinc=(max.imag()-min.imag())/h; xinc*=x; yinc*=y;

min=complexf((min.real()+xinc)/zoom,

(min.imag()+yinc)/zoom) ; max=complexf((max.real()+xinc)/zoom,

(max.imag()+yinc)/zoom) ;

}

// f=z"'2 + c

int complex_f(complexf zO,complexf zc, int color,int rr)

{

while(norm(zO)<=rr&&соlor-)

{z 0 * = z 0; zO+=zc;} return color;

}

// f=z"'3 + c

int complex_fl(complexf zO,complexf zc, int color,int rr)

{

while(norm(zO)<=rr&&color--) zO=pow(zO,3)+zc; return color;

}

// f=z'~4 + c

int complex_f2(complexf zO,complexf zc, int color,int rr)

{

while(norm(zO)<=rr&&color--) zO=pow(zO,4)+zc; return color;

}

// f=zA5+c

int complex_f3(complexf zO,complexf zc, int color,int rr)

{

while (norm ( zO ) <=rrSicolor-) zO=pow(zO,5)+zc; return color;

}

struct IFS {

Vertex v; // координаты начальной точки

int iter; // число итераций

int n; // число матриц преобразований

float* m; // массив матриц преобразований

float* rnd; // массив вероятностей преобразований

IFS(){randomize();m=0;n=0;rnd=0;}

-IFS(){clear();}

void clear(); // освобождение ресурсов int getrnd(); // случайный выбор преобразования void identity!); // сделать матрицы единичными // вычислить nv точек фрактала void eval(Vertex*_v,int nv); void draw(uint 1); // вывод в OpenGl void draw(); // вывод в OpenGl // пример фракталов void leaf(); // лист

void tree!); // дерево

void fern(); // лист папоротника

void dragon(); // дракон Хартера-Хейтуэя

void koh(); // кривая Коха

void ghost(); // приведение

} ;

// случайный выбор преобразования int IFS::getrnd()

{

float r=(float)random(10000)/100.0; for(int i=0;i<n-l;i++) if(r>=rnd[i]&&r<rnd[i+1])return i; return n-1;

}

// освобождение памяти void IFS::clear()

{

if (n)

{

delete[]m; m=0; delete[]rnd; rnd=0; n=0;


⇐ вернуться назад | | далее ⇒