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.
Se pega a la izquierda y derecha, 114854 partículas, la capa inicial es el ancho de la imagen |
Se pega a la izquierda y derecha, 60642 partículas, la capa inicial es un punto en el medio |
Se pega a la izquierda y derecha, 90978 partículas, la capa inicial es el tercio del medio |
Se pega sólo por la derecha, 135070 partículas, la capa inicial es el ancho de la imagen |
Se pega sólo por la derecha, 41995 partículas, la capa inicial es un punto en el medio |
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
|
|