Creando una imagen del Set de Mandelbrot con PNGWriter


Para mostrar las capacidades gráficas de PNGwriter, mostraré cómo crear una imagen del set de Mandelbrot usando PNGwriter.

En palabras simples, el set de mandelbrot es un subjconjunto del espacio complejo. Contiene aquellos puntos que no divergen al tomarlos como condición inicial de una ecuación que se itera sobre sí misma una determinada cantidad de veces. La imagen corresponde a un cuadrado de condiciones iniciales, y el color del pixel corresponde a si esa condicion inicial pertenece o no al set de Mandelbrot. Si pertenece, es negra. Si diverge, su color corresponde a qué tan rápido diverge.


Esta es la imagen producida por el programa....literalmente!! Corrí el programa, y copié mandel1.png al directorio de mi servidor. Sin conversión, sin cambios, sin trabajo.

Está de más decir que PNGwriter puede generar imágenes en color. Esta es en escala de grises por razones estéticas.








Lo más importante que debes saber es que los coeficientes de color van entre 0 y 65535 y son de tipo int. Desde la version 0.3.2, tambien puedes usar coeficientes de color entre 0 y 1 que sean de tipo double.



#include "src/pngwriter.h"  //  Recuerda incluir pngwriter.h!!.

#include <iostream.h>

#include <math.h>



double rmin = -1.428;

double rmax = -1.3785;

double imin = 0.000937;

double imax = 0.0484;

double  iteratelimit = 150;



double  a,b,i;



double xwidth = 600;

double yheight =600;



double maxcolours = 65535;



double xx1,yy1,xx2,yy2,radio;

double count;







int main()

{

   

pngwriter png1(xwidth,yheight,65535,"mandel1.png"); //  Este es el constructor.

   

for(a=0;a & <xwidth;a++)

   {

      for(b=0;b<yheight;b++)

         {

            xx1 = 0;

	     

            yy1 = 0;

	     

            count = 0;

	     

            i=0;

	    

            radio = 0;

	     

            while((radio<2)&&(i<iteratelimit))

               {

                  xx2 = xx1*xx1 - yy1*yy1 + a*((rmax-rmin)/xwidth)+rmin;

		  

                  yy2 = 2*xx1*yy1 + b*((imax-imin)/yheight)+imin;

		  

                  radio = sqrt(xx2*xx2 +yy2*yy2);

		  

                  count = count + 1;

		  

                  xx1 = xx2;

		  

                  yy1 = yy2;

	

                  i++;

               }

	     //  Asi se plotea.

            png1.plot(a,b,maxcolours - maxcolours*count/iteratelimit,

                                            (maxcolours - maxcolours*count/iteratelimit),

                                             maxcolours - maxcolours*count/iteratelimit);

	     

            if(i == iteratelimit)

               {

                  png1.plot(a,b,0,0,0);  //  La funcion plot usada mas claramente.

               }

            }

         }

   

   //  Recuerda cerrar pngwriter!!.

      png1.close(); 

   

   return 0;

}



Valid HTML 4.01! Valid CSS!


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