Explorando la Acumulación Balísitica con PNGwriter


Al contrario de los Diffusion-Limited Aggregates (para más información ver una página que hice comparando DLAs simulados (usando el precursor de PNGwriter, PPMWriter) con DLAs reales, de cobre), las cuales modelan partículas con movimiento browniano en una solución, la Acumulación Balística se simula modelando partículas incidiendo sobre una superficie pegajosa desde una sola dirección. Se pegarán a las partículas que ya formen parte de la creciente masa, desde el frente o los costados.

Aquí hay algunas imágenes generadas con distintas reglas.

LR000114854.png
Se pega a la izquierda y derecha, 114854 partículas, la capa inicial es el ancho de la imagen
LR000060642.png
Se pega a la izquierda y derecha, 60642 partículas, la capa inicial es un punto en el medio
LR000090978.png
Se pega a la izquierda y derecha, 90978 partículas, la capa inicial es el tercio del medio
R000135070.png
Se pega sólo por la derecha, 135070 partículas, la capa inicial es el ancho de la imagen
R000041995.png
Se pega sólo por la derecha, 41995 partículas, la capa inicial es un punto en el medio
R000075423.png
Se pega sólo por la derecha, 75423 partículas, la capa inicial es el tercio del medio


Aquí está el código:
/* 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_partículas=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_partículas++;
		  break;
	       }
	  }
	
	if(end == 1)
	  {
	     break;
	  }
     }
   
   // Rename the image given the number of partículas and write the image to disk.
   out.pngwriter_rename(number_partículas);
   out.close();
   
   return 0;
}



syntax highlighted by Code2HTML, v. 0.9.1
Valid CSS!


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