home *** CD-ROM | disk | FTP | other *** search
/ CD Action 54 / cdactioncoverdisc54.iso / Bonus / c.exe / Ifs2 / FractR.cpp next >
C/C++ Source or Header  |  2000-09-11  |  7KB  |  300 lines

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