home *** CD-ROM | disk | FTP | other *** search
/ Rat's Nest 1 / ratsnest1.iso / prgmming / c / ca.cpp < prev    next >
C/C++ Source or Header  |  1996-02-19  |  6KB  |  204 lines

  1. //
  2. //+------------------------------------------------------------+
  3. //+ Program Cellular_Automata (AUTOMATA.CPP)                   +
  4. //+ By Ramiro Perez {RPEREZ@UTPVM1.BITNET}                     +
  5. //+ and Fausto A. A. Barbuto {BJ06@C53000.PETROBRAS.ANRJ.BR}.  +
  6. //+ C++ 3.1 programme's creator: Fausto A. A. Barbuto, 1993.   +
  7. //+ After a TURBO BASIC program by Ramiro Perez, 1993.         +
  8. //+ TRIANGLE and digital pattern added by Fausto Barbuto, 1993.+
  9. //+                                                            +
  10. //+ Requires VGA screen with 640 x 480 points, 16 colours.     +
  11. //+ C++ and TURBO BASIC are trademarks of Borland Int., Inc.   +
  12. //+------------------------------------------------------------+
  13. //
  14. #include <dos.h>
  15. #include <graphics.h>
  16. #include <stdlib.h>
  17. #include <conio.h>
  18. #include <stdio.h>
  19.  
  20. void Create_Cellular(int, int, int [53][53]);
  21.  
  22. void main()
  23.  
  24. {
  25.    int i, j, k, u, t, a[53][53], b[53][53], c[53][53], poly[8];
  26.    int ipal[15] = {45,5,33,1,9,11,19,26,22,54,38,36,32,4,8};
  27.    int nx, ny, a1, b1, irand1, irand2, option;
  28.  
  29.    int graphdriver=DETECT, graphmode;
  30.  
  31.    clrscr();
  32.    printf("\n Cellular Automata of four sides");
  33.    printf("\n By Ramiro Perez & Fausto A. A. Barbuto, 1993");
  34.    printf("\n States = 12");
  35.    printf("\n Select initial pattern");
  36.    printf("\n\n 1 - CIRCLES");
  37.    printf("\n 2 - SQUARES");
  38.    printf("\n 3 - CENTRAL POINT");
  39.    printf("\n 4 - RAMDOM POINTS");
  40.    printf("\n 5 - TRIANGLE");
  41.    printf("\n <1 or >5 - SURPRISE!!!");
  42.    printf("\n (Press any key to stop the execution)");
  43.    printf("\n\n");
  44.    scanf("%d",&option);
  45.  
  46.    clrscr();
  47.    t = 210;
  48.    u = 70;
  49.  
  50.    initgraph(&graphdriver, &graphmode, "c:\\borlandc\\bgi");
  51.    cleardevice();
  52.  
  53. //
  54. // Initialization of vectors a[][], b[][], c[][]
  55. //
  56.    for (i=0;i<=52;i++) {
  57.       for (j=0;j<=52;j++) {
  58.          a[i][j] = 0;
  59.          b[i][j] = 0;
  60.          c[i][j] = 0;
  61.       }
  62.    }
  63.  
  64.    for (i=0;i<=14;i++) {
  65.      setpalette(i,ipal[i]);
  66.    }
  67.    setbkcolor(3);
  68.  
  69.    k = 0;
  70. //
  71. // The initial pattern in defined below.
  72. //
  73.    switch(option) {
  74.       case 1:  /* Circle */
  75.          for (i=12;i>=1;i--) {
  76.             k++;
  77.             setcolor(k);
  78.             circle(26,26,i);
  79.             setfillstyle(SOLID_FILL,k);
  80.             floodfill(26,26,k);
  81.          }
  82.          break;
  83.       case 2: /* Square */
  84.          for (i=12;i>=1;i--) {
  85.             k++;
  86.             setcolor(k);
  87.             rectangle (26-i, 26+i, 26+i, 26-i);
  88.          }
  89.          break;
  90.       case 3: /* Single Central Point */
  91.          putpixel(26,26,12);
  92.          break;
  93.       case 4: /* Ramdomized Points */
  94.          randomize();
  95.          for (i=1;i<=12;i++) {
  96.             irand1 = (int)(1.4e-3*rand());
  97.             irand2 = (int)(1.4e-3*rand());
  98.             putpixel(irand1,irand2,i);
  99.          }
  100.          break;
  101.       case 5: /* Triangle */
  102.          for (i=12;i>=1;i--) {
  103.             k++;
  104.             setcolor(k);
  105.             poly[0] = 26-i;
  106.             poly[1] = poly[0];
  107.             poly[2] = 26+i;
  108.             poly[3] = poly[0];
  109.             poly[4] = 26;
  110.             poly[5] = poly[2];
  111.             poly[6] = poly[0];
  112.             poly[7] = poly[1];
  113.             drawpoly(4,poly);
  114.             setfillstyle(SOLID_FILL,k);
  115.          }
  116.          break;
  117.       default: /* Surprise! */
  118.          printf("\n %d",option);
  119.          break;
  120.    }
  121.  
  122.    for (nx=0;nx<=52;nx++) {
  123.       for (ny=0;ny<=52;ny++) {
  124.          k = getpixel(nx,ny);
  125.          a[nx][ny] = k;
  126.          c[nx][ny] = k;
  127.       }
  128.    }
  129.  
  130.    Create_Cellular(t,u,c);     /* 1st call of Create_Cellular */
  131.  
  132.    do {
  133.      for (i=1;i<=51;i++) {
  134.         for (j=1;j<=51;j++) {
  135.            a1 = a[i][j-1] + a[i][j+1] + a[i-1][j] + a[i+1][j] + a[i][j];
  136.            b[i][j] = a1 % 13;
  137.            c[i][j] = b[i][j];
  138.         }
  139.      }
  140.  
  141.      Create_Cellular(t,u,c);   /* 2nd call of Create_Cellular */
  142.  
  143.      for (i=1;i<=51;i++) {
  144.         for (j=1;j<=51;j++) {
  145.            b1 = b[i][j-1] + b[i][j+1] + b[i-1][j] + b[i+1][j] + b[i][j];
  146.            a[i][j] = b1 % 13;
  147.            c[i][j] = a[i][j];
  148.         }
  149.      }
  150.  
  151.      Create_Cellular(t,u,c);   /* 3rd call of Create_Cellular */
  152.  
  153.    } while (!kbhit());         /* Escape */
  154. //
  155. // Sound effects and clean-up.
  156. //
  157.    sound(740);
  158.    delay(600);
  159.    nosound();
  160.    closegraph();
  161. }
  162.  
  163. void Create_Cellular(int t, int u, int c[53][53])
  164.  
  165. {
  166.    int i, k, nx, nx1, nx2, ny, ny1, ny2, cx, cy, kcolorx, kcolory;
  167.  
  168.    setcolor(4);
  169.    for (nx=0;nx<=51;nx++) {
  170.       for (ny=0;ny<=51;ny++) {
  171.          k = c[nx][ny];
  172.          nx1 = 4*nx;
  173.          ny1 = 4*ny;
  174.          if (k !=0) {
  175.            for (i=1;i<=k;i++) {
  176.               nx2 = nx1 - i + t;
  177.               ny2 = ny1 - i + u;
  178.               setcolor(14);
  179.               line (nx2, ny2+3, nx2+3, ny2+3);
  180.               setcolor(13);
  181.               line (nx2+3, ny2, nx2+3, ny2+3);
  182.            }
  183.            setcolor(k);
  184.            cx = nx1-k+t+1;
  185.            cy = ny1-k+u+1;
  186.            rectangle (nx1-k+t, ny1-k+u, nx1+3-k+t, ny1+3-k+u);
  187.            kcolorx = getpixel(nx1-k+t,ny1-k+u);
  188.            setfillstyle(SOLID_FILL,k);
  189.            floodfill(cx,cy,kcolorx);
  190.          }
  191.          else {
  192.            setcolor(1);
  193.            cx = nx1+t+1;
  194.            cy = ny1+u+1;
  195.            rectangle (nx1+t, ny1+u, nx1+3+t, ny1+3+u);
  196.            kcolorx = getpixel(nx1-k+t,ny1-k+u);
  197.            setfillstyle(SOLID_FILL,1);
  198.            floodfill(cx,cy,kcolorx);
  199.          }
  200.       }
  201.    }
  202.    return;
  203. }
  204.