home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Rat's Nest 1
/
ratsnest1.iso
/
prgmming
/
c
/
ca.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1996-02-19
|
6KB
|
204 lines
//
//+------------------------------------------------------------+
//+ Program Cellular_Automata (AUTOMATA.CPP) +
//+ By Ramiro Perez {RPEREZ@UTPVM1.BITNET} +
//+ and Fausto A. A. Barbuto {BJ06@C53000.PETROBRAS.ANRJ.BR}. +
//+ C++ 3.1 programme's creator: Fausto A. A. Barbuto, 1993. +
//+ After a TURBO BASIC program by Ramiro Perez, 1993. +
//+ TRIANGLE and digital pattern added by Fausto Barbuto, 1993.+
//+ +
//+ Requires VGA screen with 640 x 480 points, 16 colours. +
//+ C++ and TURBO BASIC are trademarks of Borland Int., Inc. +
//+------------------------------------------------------------+
//
#include <dos.h>
#include <graphics.h>
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
void Create_Cellular(int, int, int [53][53]);
void main()
{
int i, j, k, u, t, a[53][53], b[53][53], c[53][53], poly[8];
int ipal[15] = {45,5,33,1,9,11,19,26,22,54,38,36,32,4,8};
int nx, ny, a1, b1, irand1, irand2, option;
int graphdriver=DETECT, graphmode;
clrscr();
printf("\n Cellular Automata of four sides");
printf("\n By Ramiro Perez & Fausto A. A. Barbuto, 1993");
printf("\n States = 12");
printf("\n Select initial pattern");
printf("\n\n 1 - CIRCLES");
printf("\n 2 - SQUARES");
printf("\n 3 - CENTRAL POINT");
printf("\n 4 - RAMDOM POINTS");
printf("\n 5 - TRIANGLE");
printf("\n <1 or >5 - SURPRISE!!!");
printf("\n (Press any key to stop the execution)");
printf("\n\n");
scanf("%d",&option);
clrscr();
t = 210;
u = 70;
initgraph(&graphdriver, &graphmode, "c:\\borlandc\\bgi");
cleardevice();
//
// Initialization of vectors a[][], b[][], c[][]
//
for (i=0;i<=52;i++) {
for (j=0;j<=52;j++) {
a[i][j] = 0;
b[i][j] = 0;
c[i][j] = 0;
}
}
for (i=0;i<=14;i++) {
setpalette(i,ipal[i]);
}
setbkcolor(3);
k = 0;
//
// The initial pattern in defined below.
//
switch(option) {
case 1: /* Circle */
for (i=12;i>=1;i--) {
k++;
setcolor(k);
circle(26,26,i);
setfillstyle(SOLID_FILL,k);
floodfill(26,26,k);
}
break;
case 2: /* Square */
for (i=12;i>=1;i--) {
k++;
setcolor(k);
rectangle (26-i, 26+i, 26+i, 26-i);
}
break;
case 3: /* Single Central Point */
putpixel(26,26,12);
break;
case 4: /* Ramdomized Points */
randomize();
for (i=1;i<=12;i++) {
irand1 = (int)(1.4e-3*rand());
irand2 = (int)(1.4e-3*rand());
putpixel(irand1,irand2,i);
}
break;
case 5: /* Triangle */
for (i=12;i>=1;i--) {
k++;
setcolor(k);
poly[0] = 26-i;
poly[1] = poly[0];
poly[2] = 26+i;
poly[3] = poly[0];
poly[4] = 26;
poly[5] = poly[2];
poly[6] = poly[0];
poly[7] = poly[1];
drawpoly(4,poly);
setfillstyle(SOLID_FILL,k);
}
break;
default: /* Surprise! */
printf("\n %d",option);
break;
}
for (nx=0;nx<=52;nx++) {
for (ny=0;ny<=52;ny++) {
k = getpixel(nx,ny);
a[nx][ny] = k;
c[nx][ny] = k;
}
}
Create_Cellular(t,u,c); /* 1st call of Create_Cellular */
do {
for (i=1;i<=51;i++) {
for (j=1;j<=51;j++) {
a1 = a[i][j-1] + a[i][j+1] + a[i-1][j] + a[i+1][j] + a[i][j];
b[i][j] = a1 % 13;
c[i][j] = b[i][j];
}
}
Create_Cellular(t,u,c); /* 2nd call of Create_Cellular */
for (i=1;i<=51;i++) {
for (j=1;j<=51;j++) {
b1 = b[i][j-1] + b[i][j+1] + b[i-1][j] + b[i+1][j] + b[i][j];
a[i][j] = b1 % 13;
c[i][j] = a[i][j];
}
}
Create_Cellular(t,u,c); /* 3rd call of Create_Cellular */
} while (!kbhit()); /* Escape */
//
// Sound effects and clean-up.
//
sound(740);
delay(600);
nosound();
closegraph();
}
void Create_Cellular(int t, int u, int c[53][53])
{
int i, k, nx, nx1, nx2, ny, ny1, ny2, cx, cy, kcolorx, kcolory;
setcolor(4);
for (nx=0;nx<=51;nx++) {
for (ny=0;ny<=51;ny++) {
k = c[nx][ny];
nx1 = 4*nx;
ny1 = 4*ny;
if (k !=0) {
for (i=1;i<=k;i++) {
nx2 = nx1 - i + t;
ny2 = ny1 - i + u;
setcolor(14);
line (nx2, ny2+3, nx2+3, ny2+3);
setcolor(13);
line (nx2+3, ny2, nx2+3, ny2+3);
}
setcolor(k);
cx = nx1-k+t+1;
cy = ny1-k+u+1;
rectangle (nx1-k+t, ny1-k+u, nx1+3-k+t, ny1+3-k+u);
kcolorx = getpixel(nx1-k+t,ny1-k+u);
setfillstyle(SOLID_FILL,k);
floodfill(cx,cy,kcolorx);
}
else {
setcolor(1);
cx = nx1+t+1;
cy = ny1+u+1;
rectangle (nx1+t, ny1+u, nx1+3+t, ny1+3+u);
kcolorx = getpixel(nx1-k+t,ny1-k+u);
setfillstyle(SOLID_FILL,1);
floodfill(cx,cy,kcolorx);
}
}
}
return;
}