}
}
void IFS::identity()
{
fill_n(m,16,0);
m[0]=l;m[5]=l;m[10]=l;m[15]=l; for(int i=l;i<n;i++) copy(m,m+16,m+16*i);
}
// вычисление точек фрактала void IFS::eval(Vertex*_v,int nv) {
int r;
for(int i=0;i<nv;i++)
{
r=getrnd(); v.mul_matrc(m+r*16) ;
_v[i]=v;
}
}
// вывод фрактала, вместо точки // указанный список отображения void IFS::draw(uint 1)
{
Mtransform M; int г;
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
for (int i=0;i<iter;i + +)
{
glPushMatrix(); glTranslatef(v.x,v.y,v.z) ;
r=getrnd();
M.mul(0,m+r*16, 0) ; glMultMatrixf(M) ; glCallList(1); glPopMatrix();
}
glPopMatrix();
}
// вывод по точкам в OpenGl void IFS::draw()
{
i nt r;
glBegin(GL_POINTS); for(int i=0;i<iter;i++)
{
r=getrnd(); v.mul_matrc(m+r*16) ; glVertex3fv(v);
}
glEnd();
}
void IFS::fern() // лист папоротника
{
clear(); v. set (0,0,-20); iter=10000; n=4 ;
m=new float[n*16]; rnd=new float[n]; identity();
rnd[0]=0;rnd[1]=1;rnd[2]=8 6;rnd[3]=93;
// нулевое преобразование m [ 0]=0; m[4]= 0; m[12]=0;
m[ 1]=0; m[5]= 0.16; m[13]=0;
// первое преобразование
m[ 16 + 0]=0.85; m[16 + 4]=0.04; m[16+12]=0;
m[16+1]=-0.04;m[16+5]=0.85; m[16+13]=1.6;
// второе преобразование
m[32+0]=0.2; m[32+4]=-0.26; m[32+12]=0;
m[32+l]=0.23;m[32+5]=0.22; m[32+13]=1.6;
// третье преобразование m[4 8 + 0]=-0.15; ш[48+4]=0.28; т[48+12]=0; т[48+1]=0.26; т[48+5]=0.22; т[48+13]=0.44; }
void IFS::tree() // дерево {
clear(); v.set(0,0,-2) ; iter=10000; n=4;
m=new float[n*16]; rnd=new float[n]; identity();
rnd[0]=0;rnd[1]=5;rnd[2]=4 5;rnd[3]=85;
// нулевое преобразование m[0]=0; m[4]=0; m[12]=0;
m[1]=0; m[5]=0.5; m[13]=0;
// первое преобразование m[16+0]=0.42; m[16+4]=-0.42; m[16+12]=0; m[16+1]=0.42; m[16+5]=0.42; m[16 + 13]=0.2; // второе преобразование m[32 + 0]=0.42; m[32 + 4]=0.42; m[32 + 12]=0; m[32 + 1]=-0.42; m[32 + 5]=0.42; m[32 + 13]=0.2; // третье преобразование m[48+0]=0.1; m[48+4]=0; m[48+12]=0;
m[48+l]=0; m[48+5]=0.1; m[48+13]=0.2;
}
// дракон Хартера-Хейтуэя void IFS::dragon()
{
clear();
v.set(0,0,-250); iter=l0000; n=2 ;
m=new float[n*16]; rnd=new float[n]; identity(); rnd[0]=0;rnd[1]=50;
// нулевое преобразование m[0]=-0.5; m[4]=-0.5; m[12]=49; m[l]=0.5; m[5]=-0.5; m[13]=12;
// первое преобразование
m[16+0]=0.5; m [ 16 + 4]=-0.5; m[16+12]=-34;
m[16+l]=0.5; m[16+5]=0.5; m[16+13]=-11;
}
// кривая Коха void IFS::koh()
{
clear(}; v.set (0,0,-90); iter=10000; n=4 ;
m=new float[n*16]; rnd=new float[n]; identity();
rnd[0]=0;rnd[1]=25;rnd[2]=50;rnd[3]=7 5;
// нулевое преобразование m[0]= 0.31; m[4]= 0; m[12]=4.12;
m[1 ] = 0; m[5]= 0.29; m[13]=1.6;
// первое преобразование
m[16+0]=0.19; m[16+4]=-0.21; m[16+12]=-0.69; m[16+l]=0.65; m[16+5]=0.09; m[16+13]=5.98; // второе преобразование
m[32+0]=0.19; m[32+4]=0.21; m[32+12]=0.67; m[32+l]=-0.65;m[32+5]=0.09; m[32+13]=5.96;
// третье преобразование
m[48+0]=0.31; m[48+4]=0; m[48+12]=-4.14; m[48 +1]= 0; m[48 + 5]=0.29; m[48 +13]=1.6;
)
// лист
void IFS::leaf()
{
clear (); v.set ( 0,0,-20); iter=10000; n=4 ;
m=new float[n*16]; rnd=new float[n]; identity();
rnd[0]=0; rnd[1]= 6;rnd[2]=43;rnd[3]=79;
// нулевое преобразование m[0]=0.14; m[4]=0.01; m[12]=-0.08; m[1]=0; m[5]=0.51; m[13]=-1.31;
// первое преобразование
m[16+0]=0.43; m[16+4]=0.52; m[16+12]=1.49; m[16+1]=-0.45; m[16+5]=0.5; m[16+13]=-0.75; // второе преобразование
m[32 + 0]=0.45; m[32 + 4]=-0.49; m[32+12]=-1.62; m[32+l]=0.47; m[32+5]=0.47; m[32+13]=-0.74; // третье преобразование
m[48+0]=0.49; m[48+4]=0; m[48+12]=0.02; m[4 8 +1]=0; m[48 + 5]=0.51; m[48 + 13]=1.62;
}
// приведение void IFS::ghost()
{
clear(); v.set(0,0,-20); iter=10000; n=3;
m=new float[n*16]; rnd=new float[n] ; identity() ;
rnd[0]=0;rnd[1]=33;rnd[2]=66;
// нулевое преобразование m[0]=-0.5; m[4]=-0.3; m[12]=-6.07; m[1]= 0.3; m[5]=-0.5; m[13]=-3.58;
// первое преобразование
m[16+0]=-0.5; m[16+4]=-0.3; m[16+12]=5.92; m[16+1]=0.3; m[16+5]=-0.5; m[16+13]=3.5;
// второе преобразование
m[32+0]=0; m[32+4]=-0.59; m[32+12]=-0.09; m[32+1]=0.59; m[32+5]=0; m[32+13]=-0.04;
}
#endi f