home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CD Action 54
/
cdactioncoverdisc54.iso
/
Bonus
/
c.exe
/
Ifs2
/
FractR.cpp
next >
Wrap
C/C++ Source or Header
|
2000-09-11
|
7KB
|
300 lines
# include <stdio.h>
# include <allegro.h>
# define xres 800
# define yres 600
# define rekLev 15
class przekszt_afiniczne {
public:
float a,b,c,d,e,f;
};
class ifs {
public:
int ileprzekszt;
przekszt_afiniczne* funkcje;
ifs(int ilosc);
~ifs();
};
ifs::ifs(int ilosc)
{
ileprzekszt=ilosc;
funkcje=new przekszt_afiniczne[ilosc];
}
ifs::~ifs()
{
delete[] funkcje;
}
ifs* drzewko;
ifs* krysztal;
ifs* piec;
ifs* sierp;
ifs* paproc;
ifs* dywan;
BITMAP* bufor_e;
void init()
{
allegro_init();
set_color_depth(16);
set_gfx_mode(GFX_AUTODETECT, xres, yres, 0, 0);
bufor_e=create_bitmap(xres, yres);
drzewko=new ifs(5);
drzewko->funkcje[0].a=0.195;
drzewko->funkcje[0].b=-0.488;
drzewko->funkcje[0].c=0.344;
drzewko->funkcje[0].d=0.443;
drzewko->funkcje[0].e=0.4431;
drzewko->funkcje[0].f=0.2452;
drzewko->funkcje[1].a=0.462;
drzewko->funkcje[1].b=0.414;
drzewko->funkcje[1].c=-0.252;
drzewko->funkcje[1].d=0.361;
drzewko->funkcje[1].e=0.2511;
drzewko->funkcje[1].f=0.5692;
drzewko->funkcje[2].a=-0.058;
drzewko->funkcje[2].b=-0.070;
drzewko->funkcje[2].c=0.453;
drzewko->funkcje[2].d=-0.111;
drzewko->funkcje[2].e=0.5976;
drzewko->funkcje[2].f=0.0969;
drzewko->funkcje[3].a=-0.035;
drzewko->funkcje[3].b=0.070;
drzewko->funkcje[3].c=-0.469;
drzewko->funkcje[3].d=-0.022;
drzewko->funkcje[3].e=0.4884;
drzewko->funkcje[3].f=0.5069;
drzewko->funkcje[4].a=-0.637;
drzewko->funkcje[4].b=0.0;
drzewko->funkcje[4].c=0.0;
drzewko->funkcje[4].d=0.501;
drzewko->funkcje[4].e=0.8562;
drzewko->funkcje[4].f=0.2513;
piec=new ifs(5);
piec->funkcje[0].a=0.382;
piec->funkcje[0].b=0.0;
piec->funkcje[0].c=0.0;
piec->funkcje[0].d=0.382;
piec->funkcje[0].e=0.3072;
piec->funkcje[0].f=0.6190;
piec->funkcje[1].a=0.382;
piec->funkcje[1].b=0.0;
piec->funkcje[1].c=0.0;
piec->funkcje[1].d=0.382;
piec->funkcje[1].e=0.6033;
piec->funkcje[1].f=0.4044;
piec->funkcje[2].a=0.382;
piec->funkcje[2].b=0.0;
piec->funkcje[2].c=0.0;
piec->funkcje[2].d=0.382;
piec->funkcje[2].e=0.0139;
piec->funkcje[2].f=0.4044;
piec->funkcje[3].a=0.382;
piec->funkcje[3].b=0.0;
piec->funkcje[3].c=0.0;
piec->funkcje[3].d=0.382;
piec->funkcje[3].e=0.1253;
piec->funkcje[3].f=0.0595;
piec->funkcje[4].a=0.382;
piec->funkcje[4].b=0.0;
piec->funkcje[4].c=0.0;
piec->funkcje[4].d=0.382;
piec->funkcje[4].e=0.4920;
piec->funkcje[4].f=0.0595;
krysztal=new ifs(4);
krysztal->funkcje[0].a=0.255;
krysztal->funkcje[0].b=0.0;
krysztal->funkcje[0].c=0.0;
krysztal->funkcje[0].d=0.255;
krysztal->funkcje[0].e=0.3726;
krysztal->funkcje[0].f=0.6714;
krysztal->funkcje[1].a=0.255;
krysztal->funkcje[1].b=0.0;
krysztal->funkcje[1].c=0.0;
krysztal->funkcje[1].d=0.255;
krysztal->funkcje[1].e=0.1146;
krysztal->funkcje[1].f=0.2232;
krysztal->funkcje[2].a=0.255;
krysztal->funkcje[2].b=0.0;
krysztal->funkcje[2].c=0.0;
krysztal->funkcje[2].d=0.255;
krysztal->funkcje[2].e=0.6306;
krysztal->funkcje[2].f=0.2232;
krysztal->funkcje[3].a=0.370;
krysztal->funkcje[3].b=-0.642;
krysztal->funkcje[3].c=0.642;
krysztal->funkcje[3].d=0.370;
krysztal->funkcje[3].e=0.6356;
krysztal->funkcje[3].f=-0.0061;
sierp=new ifs(3);
sierp->funkcje[0].a=0.5;
sierp->funkcje[0].b=0.0;
sierp->funkcje[0].c=0.0;
sierp->funkcje[0].d=0.5;
sierp->funkcje[0].e=0.0;
sierp->funkcje[0].f=0.0;
sierp->funkcje[1].a=0.5;
sierp->funkcje[1].b=0.0;
sierp->funkcje[1].c=0.0;
sierp->funkcje[1].d=0.5;
sierp->funkcje[1].e=0.5;
sierp->funkcje[1].f=0.0;
sierp->funkcje[2].a=0.5;
sierp->funkcje[2].b=0.0;
sierp->funkcje[2].c=0.0;
sierp->funkcje[2].d=0.5;
sierp->funkcje[2].e=0.0;
sierp->funkcje[2].f=0.5;
dywan=new ifs(3);
dywan->funkcje[0].a=0.333;
dywan->funkcje[0].b=0.0;
dywan->funkcje[0].c=0.0;
dywan->funkcje[0].d=0.333;
dywan->funkcje[0].e=0.333;
dywan->funkcje[0].f=0.666;
dywan->funkcje[1].a=0.0;
dywan->funkcje[1].b=0.333;
dywan->funkcje[1].c=1.0;
dywan->funkcje[1].d=0.0;
dywan->funkcje[1].e=0.666;
dywan->funkcje[1].f=0.0;
dywan->funkcje[2].a=0.0;
dywan->funkcje[2].b=-0.333;
dywan->funkcje[2].c=1.0;
dywan->funkcje[2].d=0.0;
dywan->funkcje[2].e=0.333;
dywan->funkcje[2].f=0.0;
paproc=new ifs(4);
paproc->funkcje[0].a=0.0;
paproc->funkcje[0].b=0.0;
paproc->funkcje[0].c=0.0;
paproc->funkcje[0].d=0.199;
paproc->funkcje[0].e=0.5;
paproc->funkcje[0].f=0.0;
paproc->funkcje[1].a=-0.150;
paproc->funkcje[1].b=0.283;
paproc->funkcje[1].c=0.260;
paproc->funkcje[1].d=0.237;
paproc->funkcje[1].e=0.575;
paproc->funkcje[1].f=-0.084;
paproc->funkcje[2].a=0.197;
paproc->funkcje[2].b=-0.226;
paproc->funkcje[2].c=0.226;
paproc->funkcje[2].d=0.197;
paproc->funkcje[2].e=0.4;
paproc->funkcje[2].f=0.049;
paproc->funkcje[3].a=0.849;
paproc->funkcje[3].b=0.037;
paproc->funkcje[3].c=-0.037;
paproc->funkcje[3].d=0.849;
paproc->funkcje[3].e=0.075;
paproc->funkcje[3].f=0.183;
}
void deinit()
{
delete drzewko;
delete piec;
delete krysztal;
delete sierp;
delete paproc;
delete dywan;
destroy_bitmap(bufor_e);
text_mode(0);
}
int FracRek(ifs* frac, int fLev, float x, float y)
{
int i, ex, ey, res;
float nx, ny;
if (kbhit()) return(1);
if (fLev>rekLev) return(0);
for (i=0; i<frac->ileprzekszt; i++)
{
nx=frac->funkcje[i].a*x+
frac->funkcje[i].b*y+
frac->funkcje[i].e;
ny=frac->funkcje[i].c*x+
frac->funkcje[i].d*y+
frac->funkcje[i].f;
ex = xres*nx;
ey = yres-yres*ny;
((short *)bufor_e->line[ey])[ex] = makecol16(255-255*nx, 255*ny, 0);
blit(bufor_e, screen, ex, ey, ex, ey, 1, 1);
res = FracRek(frac, fLev+1, nx, ny);
if (res) return(1);
}
return(0);
}
char rysuj(ifs* frac)
{
char ch=1;
int i=0, j, p, ex, ey;
float x=0,y=0,nx,ny;
clear(bufor_e);
clear(screen);
// opusc 100 pierwszych punktow aby przyblizyc sie
// do atraktora
for (i=0;i<100;i++)
{
p=rand()%(frac->ileprzekszt);
nx=frac->funkcje[p].a*x+
frac->funkcje[p].b*y+
frac->funkcje[p].e;
ny=frac->funkcje[p].c*x+
frac->funkcje[p].d*y+
frac->funkcje[p].f;
x=nx;
y=ny;
}
i=0;
for (i=0; i<xres; i++)
for (j=0; j<yres; j++)
((short*)bufor_e->line[j])[i] = makecol16(0, 0, 128*j/yres);
blit(bufor_e, screen, 0, 0, 0, 0, xres, yres);
FracRek(frac, 0, x, y);
ch = getkey();
return ch;
}
void main()
{
const int maxfr = 6;
char ch, fr=0;
init();
do
{
switch(fr) {
case 0:ch=rysuj(krysztal);break;
case 1:ch=rysuj(piec);break;
case 2:ch=rysuj(drzewko);break;
case 3:ch=rysuj(sierp);break;
case 4:ch=rysuj(paproc);break;
case 5:ch=rysuj(dywan);break;
}
fr++;if (fr>=maxfr) fr=0;
} while (ch!=27);
deinit();
}