/* ------------------------------------------------------------------ º Mandel.c º ------------------------------------------------------------------ º Programa que representa el conjunto de Mandelbrot por el al- º º goritmo de tiempo de escape. Permite zooms de la figura º ------------------------------------------------------------------ */ #include #include #include #define MAX_COLORES 15 /* ------------------------------------------------------------------ , CalcularFactoresEscala() , ------------------------------------------------------------------ , Calcula el rectángulo más grande que cabe en pantalla semejan- , , te a la región compleja de interés, para evitar deformaciones, , , y devuelve el factor de escala apropiado. , ------------------------------------------------------------------ */ float CalcularFactoresEscala(float x0,float y0,float x1,float y1,int *x,int *y) { float s,sx,sy; sx=(x1-x0) / *x; sy=(y1-y0) / *y; if (sx>sy) { s=sx; *y=(int)( (y1-y0)/s ); } else { s=sy; *x=(int)( (x1-x0)/s ); } return s; } // CalcularFactoresEscala() /* ------------------------------------------------------------------ , AsignarColor() , ------------------------------------------------------------------ , Asigna color a un pixel en función del número de iteracio- , , nes, de forma cíclica. , ------------------------------------------------------------------ */ #define AsignarColor(i) ( (i)%MAX_COLORES ) /* ------------------------------------------------------------------ , Mandel() , ------------------------------------------------------------------ , Calcula el conjunto de Mandelbrot, permitiendo zoom y , , coloreando según la velocidad de escape. , ------------------------------------------------------------------ */ Mandel(int iter,float x0,float y0,float x1,float y1) { int xMax=640,yMax=480; // valores máximos de la pantalla float x,y; // (x,y) -> punto del plano complejo que se va obteniendo float x2,y2; // punto del plano candidato a ser del conjunto de Mandelbrot float xx,yy; // complejo auxiliar int px; register int py; // punto de pantalla que se corresponde al (x,y) float s; // factor de escala para convertir de (px,py) a (x,y) register int iaux; // entero auxiliar s=CalcularFactoresEscala(x0,y0,x1,y1,&xMax,&yMax); for (px=0;px10000) // si el módulo es mayor que 100,tiende a infinito { putpixel(px,yMax-1-py,AsignarColor(iaux)); break; // fin del bucle iaux, no hace falta seguir } } } } return 0; } // Mandel() /* ------------------------------------------------------------------ , main() , ------------------------------------------------------------------ */ main() { int gdriver=DETECT, gmode, errorcode; //para inicializar el modo gráfico float x0,y0,x1,y1; // región del plano complejo a representar int nIter; clrscr(); printf("\n Conjunto de Mandelbrot \n"); printf("\n Introduzca el numero de iteraciones: "); scanf("%d",&nIter); printf("\n Introduzca la region del plano complejo:\n"); printf(" esquina inferior izquierda x0 (-2.25): "); scanf("%f",&x0); printf(" esquina inferior izquierda y0 (-1.8): "); scanf("%f",&y0); printf(" esquina superior derecha x1 (+0.75): "); scanf("%f",&x1); printf(" esquina superior derecha y1 (+1.5): "); scanf("%f",&y1); initgraph(&gdriver, &gmode, "c:\\tc\\bgi"); errorcode = graphresult(); if (errorcode != grOk) /* an error occurred */ { printf("Graphics error: %s\n", grapherrormsg(errorcode)); printf("Press any key to halt:"); getch(); exit(1); /* return with error code */ } Mandel(nIter,x0,y0,x1,y1); getch(); closegraph(); return 0; }