FRACTAL JULIA

 

 

 

 

 

 

 

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,correccion;

                private static float xy;

                                                               double escala;

                private Image bild;

                private Graphics g1;

                private Cursor c1, c2;

                                                               double r,i,m;

                                                               double m2,i2;

 

                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;

                                                                                                                 start();

                                                                                                                 correccion=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;

                                                                                                                

                                                                                                                 escala=xzoom;

 

                               julia();

 

                }

 

 

 

                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));

 

                                               }

 

                               }

                                                                                                                 g.drawString("Escala= "+(int)(escala/xzoom)+":1",10,20);

                                                                                                                               

 

                }

 

              

 

                private void julia() // 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+=1)

 

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

 

                                               {

                                                                                                                                                                                             

 

                                                              // if (correccion)h = punktfarbe((double)x+150, (double)y); // color value

                                                                                                                                                                                                                                             h = punktfarbe((double)x, (double)y);

 

                                                               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 xwer, double ywer) // color value from 0.0 to 1.0 by iterations

                {

                                                                                              double xwert,ywert;

                                                              

                                                                                                              xwert=xstart + xzoom * (xwer);

                                                                                                              ywert=ystart + yzoom * ywer;

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

                                                                                                                 double r2,i2,m2;

                                                                                                                 r2=r*r;

                                                                                                                 i2=i*i;

                                                                                                                 m2=r2+i2;

                               int j = 0;

                             

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

                               {

                                  

                                                                                                                               

                                                                                                                                                             r2=r*r;

                                                                                                                                                             i2=i*i;

                                                                                                                                                             m2=r2+i2;

                                        m = r * r - i * i;

                                             i = 2.0 * r * i + 0.1;

                                             r = (r2-i2) - 0.745;

                                                                                                                                             j++;

                               }

                               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();

                                                                                                                                                                                               correccion=true;

                                                                                                             

                                                                                                                                                                }

                                               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;

                                                                                                                                                                                            correccion=false;

                                               }

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

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

                                                              

                                              julia();

                                             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";

                }

 

}