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