}

}

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


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