// перемещение и масштабирование фрактала 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;