media @ VU
applet-math-fractal-ahenon.jva
applet-math-fractal-ahenon.jva
/ applet-math-fractal-ahenon
// Henon attractor, Evgeny Demidov, 21 June 2004
import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;
import java.util.StringTokenizer;
public class applet-math-fractal-ahenon extends java.applet.Applet implements MouseListener {
double Ymid=0, Xmid=-.5, stX,stJ, A=-1.4, B=.3, Xj=0,Yj=0;
int MaxIt = 256, maxColor = 96, w,w2,h,h2, pixArr[], pixJ[];
Image img, imgJ; IndexColorModel RainbowColor;
boolean drawM = true, drawJ = true;
public void init() {
w = getSize().width/2; h = getSize().height; w2 = w/2; h2 = h/2;
stX = 3./w; stJ = 5./w;
String s=getParameter("XYmidDelCD"); if (s != null) {
StringTokenizer st = new StringTokenizer(s);
Xmid = Double.valueOf(st.nextToken()).doubleValue();
Ymid = Double.valueOf(st.nextToken()).doubleValue();
stX = Double.valueOf(st.nextToken()).doubleValue()/w;}
// paramC = Double.valueOf(st.nextToken()).doubleValue();
// paramD = Double.valueOf(st.nextToken()).doubleValue();}
s=getParameter("MaxIt"); if (s != null) MaxIt=Integer.parseInt(s);
s=getParameter("MaxColor"); if (s != null) maxColor=Integer.parseInt(s);
int M=maxColor/3, M2=2*M; maxColor = 3*M; // maxColor is 3*int
long M4 = (long)M*M*M*M;
byte rColor[] = new byte[maxColor+3], bColor[] = new byte[maxColor+3],
gColor[] = new byte[maxColor+3];
for (int i = 1; i < M2; i++){ // set Color Map
long dum = M - i; dum *=dum; dum *=dum;
gColor[i] = bColor[(i+M) % maxColor] = rColor[(i+M2) % maxColor] =
(byte)(255 - (255*dum)/M4);}
rColor[maxColor+1] = gColor[maxColor+1] = bColor[maxColor+1] = (byte)200;
rColor[maxColor+2] = gColor[maxColor+2] = bColor[maxColor+2] = (byte)255;
RainbowColor = new IndexColorModel( 8, maxColor+3, rColor,gColor,bColor);
pixArr = new int[w*h]; pixJ = new int[w*h];
Draw(Xmid, Ymid, stX);
DrawJ();
addMouseListener(this);
}
public void destroy() { removeMouseListener(this); }
public void mouseClicked(MouseEvent e) {} //1.1 event handling
public void mousePressed(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {
int ix = e.getX();
double xt,yt;
if (ix < w){
xt = Xmid+(ix-w2)*stX; yt = Ymid-(e.getY()-h2)*stX;
if ( e.isControlDown() ){
if ( e.isShiftDown() ) stX *=4.; else stX *=2.;
Xmid = xt; Ymid = yt; Draw(Xmid, Ymid, stX);}
else if( e.isAltDown() ){
if ( e.isShiftDown() ) stX /=4.; else stX /=2.;
Xmid = xt; Ymid = yt; Draw(Xmid, Ymid, stX);}
else{
A = xt; B = yt;
DrawJ();
showStatus( "a=" + A + " b=" + B);}}
else{
xt = Xj+(ix-w2-w)*stJ; yt = Yj-(e.getY()-h2)*stJ;
if ( e.isControlDown() ){
if ( e.isShiftDown() ) stJ *=4.; else stJ *=2.;
Xj = xt; Yj = yt; DrawJ();}
else if( e.isAltDown() ){
if ( e.isShiftDown() ) stJ /=4.; else stJ /=2.;
Xj = xt; Yj = yt; DrawJ();}}
repaint();
}
public void paint(Graphics g) {
g.drawImage(img, 0, 0, this);
g.drawImage(imgJ, w, 0, this);
g.setColor(Color.white);
int n=0, x,y;
y = h2 + (int)(Ymid/stX); g.drawLine(0,y, w,y);
x = w2 + (int)((A - Xmid)/stX); y = h2 - (int)((B - Ymid)/stX);
if(x < w) g.drawLine(x-3,y, x+3,y); g.drawLine(x,y-3, x,y+3);
}
public void Draw( double Xm, double Ym, double Step){
double X,Y;
int pix=0, ix,iy;
for (iy=0, Y=Ym+Step*h2; iy < h; iy++, Y-=Step) {
for (ix=0, X=Xm-Step*(w2-1); ix < w; ix++, X+=Step, pix++){
pixArr[pix] = iterate(X, Y);}}
img = createImage(new MemoryImageSource(w, h, RainbowColor, pixArr, 0, w));
}
int iterate(double a, double b){
double X, X2, X1, Y; int n=0;
double b1 = (1-b)*.5, d=b1*b1-a;
if (d < 0) X = 0;
else X = b1 - Math.sqrt(d) + 1e-10;
Y = X; X2 = X*X;
do{ X1 = a + X2 + b*Y; Y = X; X = X1; X2 = X*X; n++;
} while ((X2 < 1000.) && (n < MaxIt) );
if (n < MaxIt) return maxColor+1;
double Xo = X, Yo = Y; n = -1;
do{ X1 = a + X*X + b*Y; Y = X; X = X1; n++;
} while ((Math.abs(X - Xo) + Math.abs(Y - Yo) > 1e-8) && (n < 64) );
if (n == 64) return maxColor;
return n % maxColor;
}
public void DrawJ(){
int ix,iy;
for (int it=0; it < w*h; it++) pixJ[it] = maxColor+2;
double X, X2, X1, Y, b1 = (1-B)*.5, d=b1*b1-A;
if (d < 0) X = 0; else X = b1 - Math.sqrt(d) + 1e-10;
Y = X; X2 = X*X;
for (int it=0; it <= 10000*MaxIt; it++){
X1 = A + X2 + B*Y; Y = X; X = X1; X2 = X*X;
ix = (int)((X - Xj)/stJ) + w2;
iy = -(int)((Y - Yj)/stJ) + h2;
//System.out.println(""+X +" "+Y+" "+it);
if ((ix >= 0)&&(ix < w)&&(iy >= 0)&&(iy < h)) pixJ[ix+iy*w] = maxColor;
}
// for (int it=0; it < w*h; it++) pixJ[it] %= maxColor;
imgJ = createImage(new MemoryImageSource(w, h, RainbowColor, pixJ, 0, w));
}
}
(C) A. Eliëns
2/9/2007
You may not copy or print any of this material without explicit permission of the author or the publisher.
In case of other copyright issues, contact the author.