FRACTAL DE MANDELBROT:




 

Resultado del applet;

Ampliación realizada por el applet

 

 

Creamos una aplicación de applet con una pagina page1.html y un código en java en un fichero Applet1.java.

 

Introducimos el siguiente código:

 

 

import java.awt.*;

import java.applet.*;

import java.awt.event.*;

 

public class Applet1 extends Applet implements MouseListener, MouseMotionListener

{

                private final int MAX = 256;      // max iteracciones

                private final double SX = -2.025; // valor real inicial

                private final double SY = -1.125; // valor imaginario inicial

                private final double EX = 0.6;    // valor real final

                private final double EY = 1.125;  // valor real imaginario

                private static int x1, y1, xs, ys, xe, ye;

                private static double xstart, ystart, xende, yende, xzoom, yzoom;

                private static boolean action, rechteck, fertig;

                private static float xy;

                private Image bild;

                private Graphics g1;

                private Cursor c1, c2;

 

                public void init() // all instances will be prepared

                {

                               fertig = false;

                               addMouseListener(this);

                               addMouseMotionListener(this);

                               c1 = new Cursor(Cursor.WAIT_CURSOR);

                               c2 = new Cursor(Cursor.CROSSHAIR_CURSOR);

                               x1 = getSize().width;

                               y1 = getSize().height;

                               xy = (float)x1 / (float)y1;

                               bild = createImage(x1, y1);

                               g1 = bild.getGraphics();

                               fertig = true;

                }

 

                public void destroy() // delete all instances

                {

                               if (fertig)

                               {

                                               removeMouseListener(this);

                                               removeMouseMotionListener(this);

                                               bild = null;

                                               g1 = null;

                                               c1 = null;

                                               c2 = null;

                                               System.gc(); // garbage collection

                               }

                }

 

                public void start()

                {

                               action = false;

                               rechteck = false;

                               startwerte();

                               xzoom = (xende - xstart) / (double)x1;

                               yzoom = (yende - ystart) / (double)y1;

                               mandelbrot();

                }

 

                public void stop()

                {

                }

               

                public void paint(Graphics g)

                {

                               update(g);

                }

               

                public void update(Graphics g)

                {

                               g.drawImage(bild, 0, 0, this);

                               if (rechteck)

                               {

                                               g.setColor(Color.white);

                                               if (xs < xe)

                                               {

                                                               if (ys < ye) g.drawRect(xs, ys, (xe - xs), (ye - ys));

                                                               else g.drawRect(xs, ye, (xe - xs), (ys - ye));

                                               }

                                               else

                                               {

                                                               if (ys < ye) g.drawRect(xe, ys, (xs - xe), (ye - ys));

                                                               else g.drawRect(xe, ye, (xs - xe), (ys - ye));

                                               }

                               }

                }

               

                private void mandelbrot() // calculate all points

                {

                               int x, y;

                               float h, b, alt = 0.0f;

                              

                               action = false;

                               setCursor(c1);

                               showStatus("Mandelbrot-Set will be produced - please wait...");

                               for (x = 0; x < x1; x+=2)

                                               for (y = 0; y < y1; y++)

                                               {

                                                               h = punktfarbe(xstart + xzoom * (double)x, ystart + yzoom * (double)y); // color value

                                                               if (h != alt)

                                                               {

                                                                              b = 1.0f - h * h; // brightnes

                                                                              g1.setColor(Color.getHSBColor(h, 0.8f, b));

                                                                              alt = h;

                                                               }          

                                                               g1.drawLine(x, y, x + 1, y);

                                               }

                               showStatus("Mandelbrot-Set ready - please select zoom area with pressed mouse.");

                               setCursor(c2);

                               action = true;

                }

               

                private float punktfarbe(double xwert, double ywert) // color value from 0.0 to 1.0 by iterations

                {

                               double r = 0.0, i = 0.0, m = 0.0;

                               int j = 0;

                              

                               while ((j < MAX) && (m < 4.0))

                               {

                                               j++;

                                               m = r * r - i * i;

                                               i = 2.0 * r * i + ywert;

                                               r = m + xwert;

                               }

                               return (float)j / (float)MAX;

                }

               

                private void startwerte() // reset start values

                {

                               xstart = SX;

                               ystart = SY;

                               xende = EX;

                               yende = EY;

                               if ((float)((xende - xstart) / (yende - ystart)) != xy )

                                               xstart = xende - (yende - ystart) * (double)xy;

                }

 

                public void mousePressed(MouseEvent e)

                {

                               e.consume();

                               if (action)

                               {

                                               xs = e.getX();

                                               ys = e.getY();

                               }

                }

               

                public void mouseReleased(MouseEvent e)

                {

                               int z, w;

                              

                               e.consume();

                               if (action)

                                {

                                               xe = e.getX();

                                               ye = e.getY();

                                               if (xs > xe)

                                               {

                                                               z = xs;

                                                               xs = xe;

                                                               xe = z;

                                               }

                                               if (ys > ye)

                                               {

                                                               z = ys;

                                                               ys = ye;

                                                               ye = z;

                                               }

                                               w = (xe - xs);

                                               z = (ye - ys);

                                               if ((w < 2) && (z < 2)) startwerte();

                                               else

                                               {

                                                               if (((float)w > (float)z * xy)) ye = (int)((float)ys + (float)w / xy);

                                                               else xe = (int)((float)xs + (float)z * xy);

                                                               xende = xstart + xzoom * (double)xe;

                                                               yende = ystart + yzoom * (double)ye;

                                                               xstart += xzoom * (double)xs;

                                                               ystart += yzoom * (double)ys;

                                               }

                                               xzoom = (xende - xstart) / (double)x1;

                                               yzoom = (yende - ystart) / (double)y1;

                                               mandelbrot();

                                               rechteck = false;

                                               repaint();

                               }

                }

 

                public void mouseEntered(MouseEvent e)

                {

                }

 

                public void mouseExited(MouseEvent e)

                {

                }

 

                public void mouseClicked(MouseEvent e)

                {

                }

               

                public void mouseDragged(MouseEvent e)

                {

                               e.consume();

                               if (action)

                               {

                                               xe = e.getX();

                                               ye = e.getY();

                                               rechteck = true;

                                               repaint();

                               }

                }

               

                public void mouseMoved(MouseEvent e)

                {

                }

 

                public String getAppletInfo()

                {

                               return "fractal.class - Mandelbrot Set a Java Applet by Eckhard Roessel 2000-2001";

                }

}