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   Ads   Donate   Humor

DLA.C - diffusion limited aggregation

This version is in DeSmet C for the Heathkit H-100 computer.

Other versions:

 

/*	DLA.C		5-21-93
	Copyright (C)1993 Steven Whitney.
	Published under GNU GPL (General Public License) Version 2, 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);
}

 

 

Valid HTML 4.01 Transitional Valid CSS
View content labeling at ICRA.
Copyright ©2008 Steven Whitney. Last modified 02/27/2008.