|
25 Years of Programming
An open source source for C, C++, OWL, BASIC, MDB, XLS, DOT, and more... |
Home Projects Up Sitemap Search Blog Forum+Chat About Us Privacy Terms of Use Feedback FAQ Images Services Payments Humor Music |
Diffusion limited aggregation simulator program in DeSmet CDLA.C is a graphical simulation of diffusion limited aggregation. Particles wander around randomly on the screen. When they collide, they stick together into clusters with fractal shapes. This version is in DeSmet C for the Heathkit H-100 computer and requires functions from my DeSmet C graphics library for the H-100. Other versions of this program: |
/* DLA.C 5-21-93
Copyright (C)1993 Steven Whitney.
Published under GNU GPL (General Public License) Version 3, with ABSOLUTELY NO WARRANTY.
SIMULATES DIFFUSION LIMITED AGGREGATION.
PARTICLES RANDOMLY WANDER AROUND THE SCREEN. WHEN THEY COLLIDE, THEY STICK TOGETHER.
ALSO DRAWS THE SAME "COASTLINES" THAT CHAOSGAM.BAS DOES.
12-6-93 SUPPORTS NEW PSET()
*/
#include "stdio.h"
main(argc,argv)
int argc;
char **argv;
{
char ch = '\0'; /* USER INPUT */
int i; /* COUNTER */
int x, y; /* SCREEN COORDINATES */
int xi, yi; /* TEMP SAVE OF OLD COORDINATES */
int test; /* CUMULATIVE TEST OF SURROUNDING POINTS */
int seed, random;
int show = TRUE; /* WHETHER OR NOT TO SHOW POINT'S PATH */
int trail = FALSE; /* ERASE CURRENT POINT BEFORE PLOTTING NEXT? */
int drawcirc = TRUE; /* WHETHER TO START BY DRAWING A CIRCLE */
FILE *infile;
cls();
puts("Usage: DLA option option ...\n");
puts("\nOptions:\n");
puts("H Display this help screen and exit\n");
puts("Lfname Load file before starting\n");
puts("\n\nWhile program is running:\n");
puts("Q Quit\n");
puts("S Toggle show-points flag\n");
puts("T Toggle show point's entire path flag\n");
puts("\nEnter random number seed (-32768 to 32767): ");
scanf("%d",&seed);
srand(seed);
puts("\033z\033x1\033x5\033E"); /* ENABLE 25TH LINE, CURSOR OFF, CLS */
_outb(0x78,0xd8); /* ENABLE ALL PLANES */
for(i = 1 ; i < argc ; i++)
{
if(tolower(argv[i][0]) == 'h') /* HELP ONLY */
exit(0);
if(tolower(argv[i][0]) == 'l') /* LOAD FILE BEFORE START */
{
zedload(&(argv[i][1]));
drawcirc = FALSE;
break;
}
}
if(drawcirc) /* APPEARS AS OVAL ON SCREEN, */
circle(320,112,100,'p',1,2.068686869); /* BUT HAS EQUAL X,Y RADIUS */
x = 320; /* OF 100 ABSOLUTE POINTS */
y = 112;
do
{
if(ch == 't') /* TOGGLE SHOW TRAIL */
trail = !trail;
if(ch == 's') /* TOGGLE SHOW THE POINT */
show = !show;
if(show)
pset(x,y,'p',2);
test = 0;
test |= pset(x-1,y,'s',0); /* MOVE TO FUNCTION FOR TESTING */
test |= pset(x+1,y,'s',0); /* ALL ADJACENT POINTS */
test |= pset(x-1,y-1,'s',0);
test |= pset(x,y-1,'s',0); /* TEST WILL WIND UP WITH VALUE 0-7 */
test |= pset(x+1,y-1,'s',0); /* IF ALL ADJACENT POINTS WERE RED, */
test |= pset(x+1,y+1,'s',0); /* WILL JUST BE 2. */
test |= pset(x,y+1,'s',0); /* ANYTHING ELSE INDICATES A NON-RED */
test |= pset(x-1,y+1,'s',0); /* ADJACENT POINT */
if((test & ~2) != 0) /* IF IT HITS ANOTHER POINT, */
{ /* THAT IS NOT RED */
pset(x,y,'p',4); /* IT STICKS TO IT */
x = 320; /* START AGAIN FROM CENTER */
y = 112;
}
else
{
xi = x; yi = y;
switch(random = (int)(posrnd() * 8))
{ /* INTEGER 0 THROUGH 7 INCLUSIVE */
case 0: x++; break;
case 1: x--; break;
case 2: y++; break;
case 3: y--; break;
case 4: x++; y++; break;
case 5: x++; y--; break;
case 6: x--; y++; break;
case 7: x--; y--; break;
}
if(show && !trail)
pset(xi,yi,'p',0); /* TURN OFF CURRENT POINT */
} /* BEFORE MOVING TO NEXT */
}
while((ch = tolower(csts())) != 'q');
zedsave();
puts("\033z");
exit(0);
}
|
|
|
|
|
Copyright ©2011 Steven Whitney. Last modified Tue 05/24/2011 12:28:23 -0700. |
||