// Visualizador de los conjuntos de MANDELBROT, de JULIA y de PICKOVER con Zoom.
// Applet programado por Pablo López Cienfuegos con JDK 1.0.2.
// CREADO......... 28/04/98.
// MODIFICADO..... 28/05/98.
import java.awt.*; //Biblioteca para la interface de usuario.
import java.applet.*; //Biblioteca para el Applet.
public class dao extends Applet {
//Defino dao como una subclase de la clase Applet.
public String getAppletInfo(){
//Preparo la información sobre el autor del Applet.
return ("\n"+
"Applet programado para las prácticas de D.A.O. del curso 97/98.\n"+
"\n"+
"Desarrollado por Pablo López Cienfuegos con JDK 1.0.2.\n"+
"http://www.fortunecity.com/skyscraper/corel/284/\n"+
"pablete.en.la.red@eudoramail.com\n"+
"\n"+
"CREADO\t\t28/04/98.\n"+
"MODIFICADO\t28/05/98.");
}
//Declaración de variables globales al Applet.
double x1,y1,x2,y2; //Vértices del plano complejo a estudiar.
double LONG_X = 400.0; //La coordenada X oscila entre 0 y 400.
double LONG_Y = 300.0; //La coordenada Y oscila entre 0 y 300.
int OPCION = 1; //Al iniciarse, el Applet muestra información sobre el autor.
int AUMENTO = 3; //El Zoom aumenta el dibujo x3.
int NMAX = 75; //Nº máximo de iteraciones.
int COTA = 5; //Salida de órbita.
int BORDE = 100; //Borde superior para el título del Applet.
//Fin de la declaración de las variables globales.
void botDibujar_Clicked(Event event) {
//Función que gestiona la pulsación del botón DIBUJAR.
if(OPCION==5){
//Tenemos que dibujar el conjunto de Julia.
OPCION = 3;
}
else if(OPCION==6){
//Tenemos que dibujar el conjunto de Pickover.
OPCION = 4;
}
else if(OPCION==7){
//Tenemos que dibujar el conjunto de Mandelbrot.
OPCION = 2;
}
//Redibujamos el Applet.
repaint();
}
void botPikover_Clicked(Event event) {
//Función que gestiona la pulsación del botón PICKOVER.
OPCION = 6;
//Plano complejo a explorar inicialmente.
x1 = -2.0;
y1 = 1.5;
x2 = 2.0;
y2 = -1.5;
//Redibujamos el Applet.
repaint();
}
void botJulia_Clicked(Event event){
//Función que gestiona la pulsación del botón JULIA.
OPCION = 5;
//Plano complejo a explorar inicialmente.
x1 = -2.0;
y1 = 1.5;
x2 = 2.0;
y2 = -1.5;
//Redibujamos el Applet.
repaint();
}
void botMandel_Clicked(Event event){
//Función que gestiona la pulsación del botón MANDELBROT.
OPCION = 7;
//Plano complejo a explorar inicialmente.
x1 = -2.5;
y1 = 1.5;
x2 = 1.5;
y2 = -1.5;
//Redibujamos el Applet.
repaint();
}
void botAutor_Clicked(Event event){
//Función que gestiona la pulsación del botón AUTOR.
OPCION = 1;
//Redibujamos el Applet.
repaint();
}
void dao_MouseDown(Event evento){
//Función que gestiona el manejo del Zoom con el ratón.
if(OPCION!=1 && evento.clickCount==2 && !evento.metaDown()){
//Manejamos el botón principal.(Incrementar el aumento).
//Longitud de los lados del recinto a explorar actual.
double xx = x2-x1;
double yy = y2-y1;
//Nuevos vértices del recinto.
x1 += xx*(evento.x-LONG_X/AUMENTO/2.)/LONG_X;
y1 += yy*(evento.y-BORDE-LONG_Y/AUMENTO/2.)/LONG_Y;
x2 = x1+xx/AUMENTO;
y2 = y1+yy/AUMENTO;
//Redibujamos el Applet.
repaint();
}
else if(OPCION!=1 && evento.clickCount==2 && evento.metaDown()){
//Manejamos el botón secundario.(Disminuir el aumento).
//Longitud de los lados del recinto a explorar actual.
double xx = x2-x1;
double yy = y2-y1;
//Nuevos vértices del recinto.
x1 += xx*(evento.x-LONG_X*AUMENTO/2.)/LONG_X;
y1 += yy*(evento.y-BORDE-LONG_Y*AUMENTO/2.)/LONG_Y;
x2 = x1+xx*AUMENTO;
y2 = y1+yy*AUMENTO;
//Redibujamos el Applet.
repaint();
}
}
public void init(){
//Inicialización del Applet.
super.init();
setLayout(null);
addNotify();
resize(550,400);
setFont(new Font("Dialog", Font.PLAIN, 16));
setBackground(new Color(2936787));
//Definimos la etiqueta del título.
titulo = new java.awt.Label("Conjuntos de Mandelbrot, de Julia, y de Pickover.",Label.CENTER);
titulo.reshape(25,0,500,25);
titulo.setFont(new Font("Dialog", Font.BOLD, 18));
add(titulo);
//Definimos la etiqueta de los mensajes.
mensaje = new java.awt.Label("",Label.CENTER);
mensaje.reshape(25,25,500,20);
mensaje.setFont(new Font("Dialog", Font.BOLD, 14));
add(mensaje);
//Definimos el botón que muestra la opción de AUTOR.
bot_autor = new java.awt.Button("Autor");
bot_autor.reshape(420,160,110,25);
bot_autor.setFont(new Font("Dialog", Font.BOLD, 16));
add(bot_autor);
//Definimos el botón que muestra la opción de MANDELBROT.
bot_mandel = new java.awt.Button("Mandelbrot");
bot_mandel.reshape(420,220,110,25);
bot_mandel.setFont(new Font("Dialog", Font.BOLD, 16));
add(bot_mandel);
//Definimos el botón que muestra la opción de JULIA.
bot_julia = new java.awt.Button("Julia");
bot_julia.reshape(420,280,110,25);
bot_julia.setFont(new Font("Dialog", Font.BOLD, 16));
add(bot_julia);
//Definimos el botón que muestra la opción de PICKOVER.
bot_pikover = new java.awt.Button("Pickover");
bot_pikover.reshape(420,340,110,25);
bot_pikover.setFont(new Font("Dialog", Font.BOLD, 16));
add(bot_pikover);
//Definimos el botón que muestra la opción de DIBUJAR.
bot_dibujar = new java.awt.Button("Dibujar");
bot_dibujar.disable();
bot_dibujar.reshape(420,70,110,25);
bot_dibujar.setFont(new Font("Dialog", Font.BOLD, 16));
add(bot_dibujar);
//Definimos la entrada para la parte real de la semilla.
text_real = new java.awt.TextField();
text_real.setText("XXXXXXXXXX");
text_real.reshape(40,70,100,25);
add(text_real);
//Definimos la entrada para la parte imaginaria de la semilla.
text_imag = new java.awt.TextField();
text_imag.setText("XXXXXXXXXX");
text_imag.reshape(220,70,100,25);
add(text_imag);
//Definimos la etiqueta que identifica la entrada para la parte real.
eti_real = new java.awt.Label("Parte real:");
eti_real.reshape(40,50,130,20);
eti_real.setFont(new Font("Dialog", Font.BOLD, 14));
eti_real.setForeground(new Color(0));
eti_real.setBackground(new Color(11029930));
add(eti_real);
//Definimos la etiqueta que identifica la entrada para la parte imaginaria.
eti_imag = new java.awt.Label("Parte imaginaria:");
eti_imag.reshape(220,50,130,20);
eti_imag.setFont(new Font("Dialog", Font.BOLD, 14));
eti_imag.setForeground(new Color(0));
eti_imag.setBackground(new Color(11029930));
add(eti_imag);
}
public boolean handleEvent(Event event) {
//Función que redirige los eventos del Applet.
if (event.target==this && event.id==Event.MOUSE_DOWN) {
//Se produce una pulsación de un botón del ratón.
dao_MouseDown(event);
return true;
}
if (event.target==bot_autor && event.id==Event.ACTION_EVENT) {
//Se produce una pulsación en el botón Autor.
botAutor_Clicked(event);
return true;
}
if (event.target==bot_mandel && event.id==Event.ACTION_EVENT) {
//Se produce una pulsación en el botón Mandelbrot.
botMandel_Clicked(event);
return true;
}
if (event.target==bot_julia && event.id==Event.ACTION_EVENT) {
//Se produce una pulsación en el botón Julia.
botJulia_Clicked(event);
return true;
}
if (event.target==bot_dibujar && event.id==Event.ACTION_EVENT) {
//Se produce una pulsación en el botón Dibujar.
botDibujar_Clicked(event);
return true;
}
if (event.target == bot_pikover && event.id == Event.ACTION_EVENT) {
//Se produce una pulsación en el botón Pickover.
botPikover_Clicked(event);
return true;
}
//Manejamos el resto de los eventos.
return super.handleEvent(event);
}
//Declaramos los controles.
java.awt.Label titulo;
java.awt.Label mensaje;
java.awt.Button bot_autor;
java.awt.Button bot_mandel;
java.awt.Button bot_julia;
java.awt.Button bot_pikover;
java.awt.Button bot_dibujar;
java.awt.TextField text_real;
java.awt.TextField text_imag;
java.awt.Label eti_real;
java.awt.Label eti_imag;
public void paint(Graphics ARFS){
//Función que pinta el Applet en pantalla.
//ARFS es el objeto Graphics con el que voy a dibujar los conjuntos.
//Defino un vector con los colores.
int NUM_COLORES = 17;
Color[] pinta = new Color[NUM_COLORES];
//Puedo definir cada color así.
pinta[0] = Color.gray;
pinta[1] = new Color(209,225,17);
pinta[2] = Color.blue;
pinta[3] = Color.cyan;
pinta[4] = Color.darkGray;
pinta[5] = Color.pink;
pinta[6] = new Color(155,90,47);
pinta[7] = Color.green;
pinta[8] = Color.lightGray;
pinta[9] = Color.magenta;
pinta[10] = new Color(58,184,62);
pinta[11] = Color.yellow;
pinta[12] = Color.orange;
pinta[13] = Color.red;
pinta[14] = new Color(186,35,207);
pinta[15] = new Color(134,253,70);
pinta[16] = Color.black;
//Dibujo los rectángulos para contener los botones.
ARFS.setColor(new Color(11029930));
ARFS.fillRect(0,45,550,55);
ARFS.fillRect((int)LONG_X,BORDE,150,(int)LONG_Y);
if(OPCION==2 || OPCION==3 || OPCION==4){
//Tengo que dibujar alguno de los conjuntos.
//Desactivo el botón Dibujar, y las entradas de datos.
bot_dibujar.disable();
text_real.disable();
text_imag.disable();
//Dibujo un rectángulo negro que sirva de fondo al conjunto.
ARFS.setColor(pinta[(NUM_COLORES-1)]);
ARFS.fillRect(0,BORDE,(int)LONG_X,(int)LONG_Y);
}
if(OPCION==1){
//Muestro la información sobre el autor.
int sup = 130; //Margen superior.
int margen = 25; //Margen izquierdo.
mensaje.setText("Información del autor y del programa");
//Desactivo los componentes que no necesito.
bot_dibujar.disable();
text_real.setText("XXXXXXXXXX");
text_imag.setText("XXXXXXXXXX");
text_real.disable();
text_imag.disable();
ARFS.setColor(Color.black);
ARFS.drawRect(5,BORDE+5,(int)LONG_X-10,(int)LONG_Y-10);
ARFS.drawRect(6,BORDE+6,(int)LONG_X-12,(int)LONG_Y-12);
ARFS.drawString("<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>",margen,sup);
ARFS.drawString("Programado por Pablo López Cienfuegos.",margen,sup+20);
ARFS.drawString("http://www.fortunecity.com/skyscraper/corel/284/",margen,sup+40);
ARFS.drawString("e-mail: pablete.en.la.red@eudoramail.com",margen,sup+60);
ARFS.drawString("",margen,sup+80);
ARFS.drawString("1º-. Pulse el botón del fractal a dibujar.",margen+20,sup+100);
ARFS.drawString("2º-. Elija los valores de la semilla del",margen+20,sup+120);
ARFS.drawString("método iterativo, y pulse DIBUJAR.",margen+50,sup+140);
ARFS.drawString("3º-. Haga doble clic con el botón principal",margen+20,sup+160);
ARFS.drawString("para incrementar el zoom.",margen+50,sup+180);
ARFS.drawString("4º-. Haga doble clic con el botón secundario",margen+20,sup+200);
ARFS.drawString("para disminuir el zoom.",margen+50,sup+220);
ARFS.drawString("",margen,sup+240);
ARFS.drawString("<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>",margen,sup+260);
}
else if(OPCION==2){
//Conjunto de Mandelbrot.
//Informo de que empiezo a dibujar.
mensaje.setText("Dibujando el conjunto de Mandelbrot...");
//Semilla del conjunto de Mandelbrot.
Double real_aux = new Double(text_real.getText());
double real = real_aux.doubleValue();
Double imag_aux = new Double(text_imag.getText());
double imag = imag_aux.doubleValue();
//Comienzo el bucle en el que dibujo el conjunto de Mandelbrot.
for(int ver=0;ver=COTA){
//Salgo del bucle por superar la cota.
//Sólo quiero usar los NUM_COLORES-1 primeros colores de pinta.
ARFS.setColor(pinta[contador%(NUM_COLORES-1)]);
ARFS.drawLine(hor,ver+BORDE,hor,ver+BORDE);
}
}
}
//Fin del dibujado del conjunto.
mensaje.setText("Conjunto de Mandelbrot finalizado.");
}
else if(OPCION==3){
//Conjunto de Julia.
//Informo de que empiezo a dibujar.
mensaje.setText("Dibujando el conjunto de Julia...");
//Declaro las variables auxiliares.
int contador;
//Semilla del conjunto de Julia.
Double real_aux = new Double(text_real.getText());
double real = real_aux.doubleValue();
Double imag_aux = new Double(text_imag.getText());
double imag = imag_aux.doubleValue();
//Comienzo el bucle en el que dibujo el conjunto de Julia.
for(int ver=0;ver=COTA){
//Salgo del bucle por superar la cota.
//Sólo quiero usar los NUM_COLORES-1 primeros colores de pinta.
ARFS.setColor(pinta[contador%(NUM_COLORES-1)]);
ARFS.drawLine(hor,ver+BORDE,hor,ver+BORDE);
}
}
}
//Fin del dibujado del conjunto.
mensaje.setText("Conjunto de Julia finalizado.");
}
else if(OPCION==4){
//Conjunto de Pickover.
//Informo de que empiezo a dibujar.
mensaje.setText("Dibujando el conjunto de Pickover...");
//Declaro las variables auxiliares.
int contador;
//Semilla del conjunto de Pickover.
Double real_aux = new Double(text_real.getText());
double real = real_aux.doubleValue();
Double imag_aux = new Double(text_imag.getText());
double imag = imag_aux.doubleValue();
//Comienzo el bucle en el que dibujo el conjunto de Pickover.
for(int ver=0;ver=COTA){
//Salgo del bucle por superar la cota.
//Sólo quiero usar los NUM_COLORES-1 primeros colores de pinta.
ARFS.setColor(pinta[contador%(NUM_COLORES-1)]);
ARFS.drawLine(hor,ver+BORDE,hor,ver+BORDE);
}
}
}
//Fin del dibujado del conjunto.
mensaje.setText("Conjunto de Pickover finalizado.");
}
else if(OPCION==5){
//Opciones para la semilla de Julia.
int sup = 130; //Margen superior.
int margen = 25; //Margen izquierdo.
mensaje.setText("Opciones del conjunto de Julia.");
ARFS.setColor(Color.black);
//Activo los elementos que necesito para dibujar el conjunto.
bot_dibujar.enable();
text_real.enable();
text_imag.enable();
text_real.setText("-0.9");
text_imag.setText("0.0");
ARFS.drawRect(5,BORDE+5,(int)LONG_X-10,(int)LONG_Y-10);
ARFS.drawRect(6,BORDE+6,(int)LONG_X-12,(int)LONG_Y-12);
ARFS.drawString("<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>",margen,sup);
ARFS.drawString("",margen,sup+20);
ARFS.drawString("Para representar el gráfico del conjunto de Julia,",margen,sup+40);
ARFS.drawString("introduzca en 'Parte real' y en 'Parte imaginaria',",margen,sup+60);
ARFS.drawString("los valores que desee para la semilla del método",margen,sup+80);
ARFS.drawString("iterativo, (el valor de C en Z=Z^2+C), y pulse en",margen,sup+100);
ARFS.drawString("el botón Dibujar.",margen,sup+120);
ARFS.drawString("",margen,sup+140);
ARFS.drawString("",margen,sup+160);
ARFS.drawString("",margen,sup+180);
ARFS.drawString("",margen,sup+200);
ARFS.drawString("",margen,sup+220);
ARFS.drawString("Programado por Pablo López Cienfuegos.",margen+30,sup+240);
ARFS.drawString("<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>",margen,sup+260);
}
else if(OPCION==6){
//Opciones para la semilla de Pickover.
int sup = 130; //Margen superior.
int margen = 25; //Margen izquierdo.
mensaje.setText("Opciones del conjunto de Pickover.");
ARFS.setColor(Color.black);
//Activo los elementos que necesito para dibujar el conjunto.
bot_dibujar.enable();
text_real.enable();
text_imag.enable();
text_real.setText("-0.7");
text_imag.setText("0.2");
ARFS.drawRect(5,BORDE+5,(int)LONG_X-10,(int)LONG_Y-10);
ARFS.drawRect(6,BORDE+6,(int)LONG_X-12,(int)LONG_Y-12);
ARFS.drawString("<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>",margen,sup);
ARFS.drawString("",margen,sup+20);
ARFS.drawString("Para representar el gráfico del conjunto de Pickover,",margen,sup+40);
ARFS.drawString("introduzca en 'Parte real' y en 'Parte imaginaria',",margen,sup+60);
ARFS.drawString("los valores que desee para la semilla del método",margen,sup+80);
ARFS.drawString("iterativo, (el valor de C en Z=Z^3+C), y pulse en",margen,sup+100);
ARFS.drawString("el botón Dibujar.",margen,sup+120);
ARFS.drawString("",margen,sup+140);
ARFS.drawString("",margen,sup+160);
ARFS.drawString("",margen,sup+180);
ARFS.drawString("",margen,sup+200);
ARFS.drawString("",margen,sup+220);
ARFS.drawString("Programado por Pablo López Cienfuegos.",margen+30,sup+240);
ARFS.drawString("<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>",margen,sup+260);
}
else if(OPCION==7){
//Opciones para la semilla de Mandelbrot.
int sup = 130; //Margen superior.
int margen = 25; //Margen izquierdo.
mensaje.setText("Opciones del conjunto de Mandelbrot.");
ARFS.setColor(Color.black);
//Activo los elementos que necesito para dibujar el conjunto.
bot_dibujar.enable();
text_real.enable();
text_imag.enable();
text_real.setText("0.0");
text_imag.setText("0.0");
ARFS.drawRect(5,BORDE+5,(int)LONG_X-10,(int)LONG_Y-10);
ARFS.drawRect(6,BORDE+6,(int)LONG_X-12,(int)LONG_Y-12);
ARFS.drawString("<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>",margen,sup);
ARFS.drawString("",margen,sup+20);
ARFS.drawString("Para representar el gráfico del conjunto de",margen,sup+40);
ARFS.drawString("Mandelbrot, introduzca en 'Parte real' y en 'Parte",margen,sup+60);
ARFS.drawString("imaginaria', los valores que desee para la semilla del",margen,sup+80);
ARFS.drawString("método iterativo, (el valor inicial de Z en Z=Z^2+C), y",margen,sup+100);
ARFS.drawString("pulse en el botón Dibujar.",margen,sup+120);
ARFS.drawString("",margen,sup+140);
ARFS.drawString("",margen,sup+160);
ARFS.drawString("",margen,sup+180);
ARFS.drawString("",margen,sup+200);
ARFS.drawString("",margen,sup+220);
ARFS.drawString("Programado por Pablo López Cienfuegos.",margen+30,sup+240);
ARFS.drawString("<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>",margen,sup+260);
}
}
//Fin del Applet dao.
}