/*
Compilar con la opcion c99:
gcc -std=c99 -c filename.c -o filename.o* Enlazar con
la opcion de librerías matematicas y con allegro:
gcc -lm -o filename filename.o `allegro-config --libs`* En Anjuta, ejecutar en terminal allegro-config --libs, y su
salida son las librerías que
tenemos que pasar al gcc. Así que vamos a Opciones->
Comandos -> Construir Archivo y le
ponemos ahí todas las opciones.
*/
/*mandelbrot.c y sus derivados
Un punto
del plano complejo pertenece al conjunto de Mandelbrot si su
distancia al origen
después de realizar infinitas iteraciones es menor o igual
que 2.La iteración es: z=z**2+c
Inicialmente z siempre vale: z=0+0I y c es el punto a
evaluar.
El resultado queda mejor si evaluamos 25
iteraciones y si pertenece al conjunto le damos
un color. A continuación realizamos 25 iteraciones
más y si pertenece le damos otro color.
Y repetimos esto una tercera vez.Así vemos
mejor el fractal en su límite, porque hay puntos que con
pocas iteraciones
pertenecen a Mandelbrot y tendrán un color, pero con
más no, y se quedan con ese color.
Sin embargo los puntos que realmente son de Mandelbrot
pasarán por los tres colores pero
se quedarán con el último.Por lo
anterior no podemos dibujar el fractal pintando los puntos que no
pertenecen al conjunto
(en vez de los que pertenecen) porque entonces todos los puntos en
la frontera se quedarán al
final con el mismo color.En la iteración se
produce para muchos puntos overflow. Tal como
está escrito el programa no hay problema. Hay problema si
ponemos:if (cabs(z)>2)
putpixel(screen,i,j,azul);
porque un punto overflow no dirá que sea mayor que dos. Si
ponemos
printf("%e\n",cabs(z)); nos mostrará nan,que
quiere decir not a number, vaya que es el overflow.
Una manera por tanto de saber cuáles son los mayores
de 2 es
poner:if (cabs(z)<2)
putpixel(screen,i,j,azul);
else {
aquí están los mayores de 2
}
Si queremos poner directamente if
(cabs(z)>2) tendremos que
poner un control en el bucle for con un break:if
(cabs(z)>1e30) break;
*/#include "allegro.h"
#include <math.h>
#include <complex.h>int main(void)
{PALETTE palette;
int i,j,n;
int amarillo,verde, rojo, azul;
double x, y ,a,id,jd;
_Complex double z;/*Iniciar modo grafico*/
if (allegro_init() != 0)
return 1;
install_keyboard();
set_color_depth(16);
if (set_gfx_mode(GFX_AUTODETECT, 1024, 768, 0, 0) !=0) {
if (set_gfx_mode(GFX_AUTODETECT,640, 480, 0, 0) != 0) {
allegro_message("Error setting graphics
mode\n%s\n",allegro_error);
return 1;
}
}
set_palette(black_palette);
set_palette(palette);amarillo=makecol(255,255,50);
verde=makecol(0,255,0);
azul=makecol(0,0,255);
rojo=makecol(255,0,0);/* Código del
fractal*/
/* Para una monitor de 1024 por 768
píxeles*/
for (i=0; i<=1024;i++) {
for (j=0; j<=768; j++) {/* Le restamos 512 y 384
para que el punto (0,0) del plano complejo quede en la mitad de
la
pantalla. O le restamos otras cantidades para que esté en
otro sitio.
*/
id=i-712;
jd=j-368;/* Variamos la escala de -512, 512 a -1.5,
1.5. Igual para el eje y*/
id=(id*3)/1024;
jd=(jd*3)/1024;z=(0+0*I);
for
(n=1;n<=25 ;n++) z=z*z+(id+jd*I);
if (cabs(z)<=2) putpixel(screen,i,j,rojo);
for (n=1;n<=25 ;n++) z=z*z+(id+jd*I);
if (cabs(z)<=2) putpixel(screen,i,j,azul);
for (n=1;n<=25 ;n++) z=z*z+(id+jd*I);
if (cabs(z)<=2) putpixel(screen,i,j,amarillo);}
}
do {} while (!keypressed());
return 0;
}
END_OF_MAIN();