home *** CD-ROM | disk | FTP | other *** search
/ CD Action 54 / cdactioncoverdisc54.iso / Bonus / c.exe / Ifs1 / FRACT.CPP next >
C/C++ Source or Header  |  2000-09-06  |  7KB  |  286 lines

  1. # include <stdio.h>
  2. # include <allegro.h>
  3.  
  4. # define xres 800
  5. # define yres 600
  6.  
  7. class przekszt_afiniczne {
  8.   public:
  9.   double a,b,c,d,e,f;
  10. };
  11.  
  12. class ifs {
  13.   public:
  14.   int ileprzekszt;
  15.   przekszt_afiniczne* funkcje;
  16.   ifs(int ilosc);
  17.   ~ifs();
  18. };
  19.  
  20. ifs::ifs(int ilosc)
  21. {
  22.   ileprzekszt=ilosc;
  23.   funkcje=new przekszt_afiniczne[ilosc];
  24. }
  25.  
  26. ifs::~ifs()
  27. {
  28.   delete[] funkcje;
  29. }
  30.  
  31. ifs* drzewko;
  32. ifs* krysztal;
  33. ifs* piec;
  34. ifs* sierp;
  35. ifs* paproc;
  36. ifs* dywan;
  37. BITMAP* bufor_e;
  38.  
  39. void init()
  40. {
  41.   allegro_init();
  42.   set_color_depth(16);
  43.   set_gfx_mode(GFX_AUTODETECT, xres, yres, 0, 0);
  44.  
  45.   bufor_e=create_bitmap(xres, yres);
  46.  
  47.   drzewko=new ifs(5);
  48.   drzewko->funkcje[0].a=0.195;
  49.   drzewko->funkcje[0].b=-0.488;
  50.   drzewko->funkcje[0].c=0.344;
  51.   drzewko->funkcje[0].d=0.443;
  52.   drzewko->funkcje[0].e=0.4431;
  53.   drzewko->funkcje[0].f=0.2452;
  54.   drzewko->funkcje[1].a=0.462;
  55.   drzewko->funkcje[1].b=0.414;
  56.   drzewko->funkcje[1].c=-0.252;
  57.   drzewko->funkcje[1].d=0.361;
  58.   drzewko->funkcje[1].e=0.2511;
  59.   drzewko->funkcje[1].f=0.5692;
  60.   drzewko->funkcje[2].a=-0.058;
  61.   drzewko->funkcje[2].b=-0.070;
  62.   drzewko->funkcje[2].c=0.453;
  63.   drzewko->funkcje[2].d=-0.111;
  64.   drzewko->funkcje[2].e=0.5976;
  65.   drzewko->funkcje[2].f=0.0969;
  66.   drzewko->funkcje[3].a=-0.035;
  67.   drzewko->funkcje[3].b=0.070;
  68.   drzewko->funkcje[3].c=-0.469;
  69.   drzewko->funkcje[3].d=-0.022;
  70.   drzewko->funkcje[3].e=0.4884;
  71.   drzewko->funkcje[3].f=0.5069;
  72.   drzewko->funkcje[4].a=-0.637;
  73.   drzewko->funkcje[4].b=0.0;
  74.   drzewko->funkcje[4].c=0.0;
  75.   drzewko->funkcje[4].d=0.501;
  76.   drzewko->funkcje[4].e=0.8562;
  77.   drzewko->funkcje[4].f=0.2513;
  78.  
  79.   piec=new ifs(5);
  80.   piec->funkcje[0].a=0.382;
  81.   piec->funkcje[0].b=0.0;
  82.   piec->funkcje[0].c=0.0;
  83.   piec->funkcje[0].d=0.382;
  84.   piec->funkcje[0].e=0.3072;
  85.   piec->funkcje[0].f=0.6190;
  86.   piec->funkcje[1].a=0.382;
  87.   piec->funkcje[1].b=0.0;
  88.   piec->funkcje[1].c=0.0;
  89.   piec->funkcje[1].d=0.382;
  90.   piec->funkcje[1].e=0.6033;
  91.   piec->funkcje[1].f=0.4044;
  92.   piec->funkcje[2].a=0.382;
  93.   piec->funkcje[2].b=0.0;
  94.   piec->funkcje[2].c=0.0;
  95.   piec->funkcje[2].d=0.382;
  96.   piec->funkcje[2].e=0.0139;
  97.   piec->funkcje[2].f=0.4044;
  98.   piec->funkcje[3].a=0.382;
  99.   piec->funkcje[3].b=0.0;
  100.   piec->funkcje[3].c=0.0;
  101.   piec->funkcje[3].d=0.382;
  102.   piec->funkcje[3].e=0.1253;
  103.   piec->funkcje[3].f=0.0595;
  104.   piec->funkcje[4].a=0.382;
  105.   piec->funkcje[4].b=0.0;
  106.   piec->funkcje[4].c=0.0;
  107.   piec->funkcje[4].d=0.382;
  108.   piec->funkcje[4].e=0.4920;
  109.   piec->funkcje[4].f=0.0595;
  110.  
  111.   krysztal=new ifs(4);
  112.   krysztal->funkcje[0].a=0.255;
  113.   krysztal->funkcje[0].b=0.0;
  114.   krysztal->funkcje[0].c=0.0;
  115.   krysztal->funkcje[0].d=0.255;
  116.   krysztal->funkcje[0].e=0.3726;
  117.   krysztal->funkcje[0].f=0.6714;
  118.   krysztal->funkcje[1].a=0.255;
  119.   krysztal->funkcje[1].b=0.0;
  120.   krysztal->funkcje[1].c=0.0;
  121.   krysztal->funkcje[1].d=0.255;
  122.   krysztal->funkcje[1].e=0.1146;
  123.   krysztal->funkcje[1].f=0.2232;
  124.   krysztal->funkcje[2].a=0.255;
  125.   krysztal->funkcje[2].b=0.0;
  126.   krysztal->funkcje[2].c=0.0;
  127.   krysztal->funkcje[2].d=0.255;
  128.   krysztal->funkcje[2].e=0.6306;
  129.   krysztal->funkcje[2].f=0.2232;
  130.   krysztal->funkcje[3].a=0.370;
  131.   krysztal->funkcje[3].b=-0.642;
  132.   krysztal->funkcje[3].c=0.642;
  133.   krysztal->funkcje[3].d=0.370;
  134.   krysztal->funkcje[3].e=0.6356;
  135.   krysztal->funkcje[3].f=-0.0061;
  136.  
  137.   sierp=new ifs(3);
  138.   sierp->funkcje[0].a=0.5;
  139.   sierp->funkcje[0].b=0.0;
  140.   sierp->funkcje[0].c=0.0;
  141.   sierp->funkcje[0].d=0.5;
  142.   sierp->funkcje[0].e=0.0;
  143.   sierp->funkcje[0].f=0.0;
  144.   sierp->funkcje[1].a=0.5;
  145.   sierp->funkcje[1].b=0.0;
  146.   sierp->funkcje[1].c=0.0;
  147.   sierp->funkcje[1].d=0.5;
  148.   sierp->funkcje[1].e=0.5;
  149.   sierp->funkcje[1].f=0.0;
  150.   sierp->funkcje[2].a=0.5;
  151.   sierp->funkcje[2].b=0.0;
  152.   sierp->funkcje[2].c=0.0;
  153.   sierp->funkcje[2].d=0.5;
  154.   sierp->funkcje[2].e=0.0;
  155.   sierp->funkcje[2].f=0.5;
  156.  
  157.   dywan=new ifs(3);
  158.   dywan->funkcje[0].a=0.333;
  159.   dywan->funkcje[0].b=0.0;
  160.   dywan->funkcje[0].c=0.0;
  161.   dywan->funkcje[0].d=0.333;
  162.   dywan->funkcje[0].e=0.333;
  163.   dywan->funkcje[0].f=0.666;
  164.   dywan->funkcje[1].a=0.0;
  165.   dywan->funkcje[1].b=0.333;
  166.   dywan->funkcje[1].c=1.0;
  167.   dywan->funkcje[1].d=0.0;
  168.   dywan->funkcje[1].e=0.666;
  169.   dywan->funkcje[1].f=0.0;
  170.   dywan->funkcje[2].a=0.0;
  171.   dywan->funkcje[2].b=-0.333;
  172.   dywan->funkcje[2].c=1.0;
  173.   dywan->funkcje[2].d=0.0;
  174.   dywan->funkcje[2].e=0.333;
  175.   dywan->funkcje[2].f=0.0;
  176.  
  177.  
  178.   paproc=new ifs(4);
  179.   paproc->funkcje[0].a=0.0;
  180.   paproc->funkcje[0].b=0.0;
  181.   paproc->funkcje[0].c=0.0;
  182.   paproc->funkcje[0].d=0.199;
  183.   paproc->funkcje[0].e=0.5;
  184.   paproc->funkcje[0].f=0.0;
  185.   paproc->funkcje[1].a=-0.150;
  186.   paproc->funkcje[1].b=0.283;
  187.   paproc->funkcje[1].c=0.260;
  188.   paproc->funkcje[1].d=0.237;
  189.   paproc->funkcje[1].e=0.575;
  190.   paproc->funkcje[1].f=-0.084;
  191.   paproc->funkcje[2].a=0.197;
  192.   paproc->funkcje[2].b=-0.226;
  193.   paproc->funkcje[2].c=0.226;
  194.   paproc->funkcje[2].d=0.197;
  195.   paproc->funkcje[2].e=0.4;
  196.   paproc->funkcje[2].f=0.049;
  197.   paproc->funkcje[3].a=0.849;
  198.   paproc->funkcje[3].b=0.037;
  199.   paproc->funkcje[3].c=-0.037;
  200.   paproc->funkcje[3].d=0.849;
  201.   paproc->funkcje[3].e=0.075;
  202.   paproc->funkcje[3].f=0.183;
  203.  
  204. }
  205.  
  206. void deinit()
  207. {
  208.   delete drzewko;
  209.   delete piec;
  210.   delete krysztal;
  211.   delete sierp;
  212.   delete paproc;
  213.   delete dywan;
  214.   destroy_bitmap(bufor_e);
  215.   text_mode(0);
  216. }
  217.  
  218. char rysuj(ifs* frac)
  219. {
  220.   char ch=1;
  221.   int i=0, j, p, ex, ey;
  222.   double x=0,y=0,nx,ny;
  223.   clear(screen);
  224.  
  225.   for (i=0; i<xres; i++)
  226.     for (j=0; j<yres; j++)
  227.       ((short*)bufor_e->line[j])[i] = makecol16(0, 128*j/yres, 0);
  228.  
  229.   blit(bufor_e, screen, 0, 0, 0, 0, xres, yres);
  230.  
  231.   // opusc 100 pierwszych punktow aby przyblizyc sie
  232.   // do atraktora
  233.   for (i=0;i<100;i++)
  234.   {
  235.     p=rand()%(frac->ileprzekszt);
  236.     nx=frac->funkcje[p].a*x+
  237.        frac->funkcje[p].b*y+
  238.        frac->funkcje[p].e;
  239.     ny=frac->funkcje[p].c*x+
  240.        frac->funkcje[p].d*y+
  241.        frac->funkcje[p].f;
  242.     x=nx;
  243.     y=ny;
  244.   }
  245.   i=0;
  246.   do
  247.   {
  248.     p=rand()%(frac->ileprzekszt);
  249.     nx=frac->funkcje[p].a*x+
  250.        frac->funkcje[p].b*y+
  251.        frac->funkcje[p].e;
  252.     ny=frac->funkcje[p].c*x+
  253.        frac->funkcje[p].d*y+
  254.        frac->funkcje[p].f;
  255.     x=nx;
  256.     y=ny;
  257.     ex = xres*x;
  258.     ey = yres-yres*y;
  259.     ((short *)bufor_e->line[ey])[ex] = makecol16(255-255*x, 255*y, 100);
  260.     blit(bufor_e, screen, ex, ey, ex, ey, 1, 1);
  261.     i++;
  262.   } while ((!kbhit()) && (i<5000000));
  263.   if (kbhit())
  264.     ch=getkey();
  265.   return ch;
  266. }
  267.  
  268. void main()
  269. {
  270.   const int maxfr = 6;
  271.   char ch, fr=0;
  272.   init();
  273.   do
  274.   {
  275.     switch(fr) {
  276.      case 0:ch=rysuj(krysztal);break;
  277.      case 1:ch=rysuj(piec);break;
  278.      case 2:ch=rysuj(drzewko);break;
  279.      case 3:ch=rysuj(sierp);break;
  280.      case 4:ch=rysuj(paproc);break;
  281.      case 5:ch=rysuj(dywan);break;
  282.     }
  283.     fr++;if (fr>=maxfr) fr=0;
  284.   } while (ch!=27);
  285.   deinit();
  286. }