Exploring Ballistic Deposition with PNGwriter


As opposed to Diffusion-Limited Aggregates (see a page I made comparing simulated DLAs (made with PPMWriter, PNGwriter's precursor) with real, copper-based DLAs for more info), which model particles undergoing brownian motion in a solution, Ballistic Deposition aggregates are simulated by modelling particles hitting a sticky surface from one direction only. They will stick to particles already a part of the growing mass from the front or sides.

Here are some images generated with different rules.

LR000114854.png
Sticks on right and left, 114854 particles, initial layer is the width of the image
LR000060642.png
Sticks on right and left, 60642 particles, initial layer is one point in the middle
LR000090978.png
Sticks on right and left, 90978 particles, initial layer is the middle third
R000135070.png
Sticks only on right side, 135070 particles, initial layer is the width of the image
R000041995.png
Sticks only on right side, 41995 particles, initial layer is one point in the middle
R000075423.png
Sticks only on right side, 75423 particles, initial layer is the middle third


Here's the code:
/* Ballistic Deposition - Test program for PNGwriter
 * http://pngwriter.sourceforge.net/
 * By Paul Blackburn
 * */

#include <pngwriter.h>
#include <stdlib.h>
#include <time.h>

#define rand_max 2147483647

int main()
{
   int width = 500;
   int height = 500;
   int maxiter = 50000000;

   // Create PNGwriter instance
   pngwriter out(width, height, 0, "out.png");

   unsigned long int number_particles=0;

   // Seed random number generator.
   srandom( time(NULL) );   
   
   int rrr, iii;
   double r;
   int rr;
   
   bool end = 0;
   
   // Plot a line at the bottom to serve as a deposition site.
   out.line(width/2.0,1,width/2.0,1,65535,0,0);
   
   for( iii = 0; iii < maxiter; iii++)
     {
	// Go down one pixel, and if your neighbour is occupied, stop there.
	rr = 1 + (random()%width);	
	for( rrr = height; rrr > 0; rrr--)
	  {
	     if(out.read(rr,rrr,1) == 65535)
	       {
		  end = 1;
		  break;
	       }
	     
	     if( (out.read(rr-1, rrr, 1) == 65535)||(out.read(rr+1, rrr, 1) == 65535)||(out.read(rr, rrr-1, 1) == 65535) )
	       {
		  out.plot(rr, rrr, 65535, 0, 0);
		  number_particles++;
		  break;
	       }
	  }
	
	if(end == 1)
	  {
	     break;
	  }
     }
   
   // Rename the image given the number of particles and write the image to disk.
   out.pngwriter_rename(number_particles);
   out.close();
   
   return 0;
}




syntax highlighted by Code2HTML, v. 0.9.1
Valid CSS!


© 2002, 2003, 2004, 2005, 2006, 2007 Paul Blackburn