media @ VU
applet-math-fractal-fjulia.jva
applet-math-fractal-fjulia.jva
/ applet-math-fractal-fjulia
/* Filled Julia set Evgeny Demidov, 1 October 2000
URL: www.ipm.sci-nnov.ru/~demidov/eng/java_e.htm */
import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;
import java.util.StringTokenizer;
public class applet-math-fractal-fjulia extends java.applet.Applet implements MouseListener {
double maxIZI2=4., Ymid=.0, Xmid=-.5, DelX=3., paramC,paramD, eps, Rorb,Iorb;
int MaxIt = 256, maxColor = 96, w, h, pixArr[];
Image img; IndexColorModel RainbowColor;
long generTime; boolean showXY = true;
FormulaFJ formBT; TextField tfXY;
public void init() {
String s=getParameter("XYmidDelCD"); if (s != null) {
StringTokenizer st = new StringTokenizer(s);
Xmid = Double.valueOf(st.nextToken()).doubleValue();
Ymid = Double.valueOf(st.nextToken()).doubleValue();
DelX = Double.valueOf(st.nextToken()).doubleValue();
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+1], bColor[] = new byte[maxColor+1],
gColor[] = new byte[maxColor+1];
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);}
RainbowColor = new IndexColorModel( 8, maxColor+1, rColor,gColor,bColor);
w = getSize().width; h = getSize().height;
s=getParameter("showXY");
if ( (s != null) && (s.equalsIgnoreCase("N")) ) showXY = true;
else{
setLayout(new BorderLayout());
if (Ymid < 0.) s = ""+Xmid+" "+Ymid+"*i; "+(float)DelX;
else s = ""+Xmid+" +"+Ymid+"*i; "+(float)DelX;
tfXY = new TextField( s );
add("South", tfXY);
h -= tfXY.getPreferredSize().height;}
pixArr = new int[w*(h+2)];
s=getParameter("Formula");
if (s != null)
try{ formBT = (FormulaFJ)Class.forName( s ).newInstance();
}catch(Exception e){}
else formBT = new FilledJulZ2();
formBT.set(3*MaxIt, maxColor, maxIZI2, 0, 10., 10.);
formBT.iterate(0., 0., paramC, paramD);
Rorb = formBT.lastR; Iorb = formBT.lastI;
formBT.set(MaxIt, maxColor, maxIZI2, 1e-6, Rorb, Iorb);
formBT.iterate(0., 0., paramC, paramD);
double tr = Rorb - formBT.lastR, ti = Iorb - formBT.lastI;
eps =tr*tr + ti*ti;
formBT.set(MaxIt, maxColor, maxIZI2, eps, Rorb, Iorb);
generTime = System.currentTimeMillis();
Direct(Xmid, Ymid, DelX/w, formBT, paramC, paramD );
img = createImage(new MemoryImageSource(w, h, RainbowColor, pixArr, w, w));
generTime = System.currentTimeMillis()-generTime;
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) {
Xmid = Xmid+(e.getX()-w/2)*DelX/w;
Ymid = Ymid-(e.getY()-h/2)*DelX/w;
if ( e.isControlDown() ) {
if ( e.isShiftDown() ) DelX *=4.; else DelX *=2.;}
else {
if ( e.isShiftDown() ) DelX /=4.; else DelX /=2.;}
generTime = System.currentTimeMillis();
Direct(Xmid, Ymid, DelX/w, formBT, paramC, paramD);
img.flush();
img = createImage(new MemoryImageSource(w, h, RainbowColor, pixArr, w, w));
generTime = System.currentTimeMillis()-generTime;
if (showXY) {
if (Ymid < 0.) tfXY.setText( ""+Xmid+" "+Ymid+"*i; "+(float)DelX);
else tfXY.setText( ""+Xmid+" +"+Ymid+"*i; "+(float)DelX);};
repaint();
}
public void paint(Graphics g) {
g.drawImage(img, 0, 0, this);
drawLabel(g);
showStatus( "Time=" + generTime + " msec");
}
public void drawLabel(Graphics gra) {
double R=0.,I=0., StZ=DelX/w;
gra.setColor(Color.white);
int ix,iy;
String s=getParameter("sqrRID"); if (s != null) {
StringTokenizer st = new StringTokenizer(s);
double sqrRmid = Double.valueOf(st.nextToken()).doubleValue(),
sqrImid = Double.valueOf(st.nextToken()).doubleValue();
int sqr = (int)(Double.valueOf(st.nextToken()).doubleValue()/StZ);
ix = (w - sqr)/2 + (int)((sqrRmid-Xmid)/StZ);
iy = (h - sqr)/2 + (int)((Ymid - sqrImid) /StZ);
gra.drawRect(ix,iy, sqr,sqr);}
gra.setFont(
new Font( gra.getFont().getName(), Font.BOLD, 15 ) );
int maxLabel=0, w2 = w/2, h2 = h/2;
double dw2 = w2, dh2 = h2;
while (true) {
s=getParameter("lb"+maxLabel);
if (s == null) break;
StringTokenizer st = new StringTokenizer(s);
double x=(Double.valueOf(st.nextToken()).doubleValue()-Xmid)/StZ,
y=(Ymid-Double.valueOf(st.nextToken()).doubleValue())/StZ;
if ( (Math.abs(x)<dw2)&&(Math.abs(y)<dh2) ){
ix = w2+(int)x; iy = h2+(int)y;
gra.drawString(st.nextToken(), ix,iy);}
maxLabel++; }
}
public void Direct( double Xmid, double Ymid, double Step,
FormulaFJ form, double parC, double parD){
double X,Y;
int pix=w, ix,iy;
for (iy=0, Y=Ymid+Step*h/2; iy < h; iy++, Y-=Step) {
for (ix=0, X=Xmid-Step*(w/2-1); ix < w; ix++, X+=Step, pix++) {
pixArr[pix] =form.iterate(X, Y, parC, parD);
}
}
}
}
abstract class FormulaFJ{
int MaxIt, maxColor;
double maxIZI2, eps, Rorb, Iorb, lastR, lastI;
void set(int mIt, int mCol, double mIZI2, double e, double Ro, double Io) {
MaxIt = mIt; maxColor = mCol; maxIZI2 = mIZI2; eps = e;
Rorb = Ro; Iorb = Io;
}
abstract int iterate(double x, double y, double paramC, double paramD);
}
class FilledJulZ2 extends FormulaFJ {
int iterate(double re, double im, double Cr, double Ci) {
double I=im, R=re, I2=I*I, R2=R*R; int n=0;
do { I=(R+R)*I+Ci; R=R2-I2+Cr; R2=R*R; I2=I*I; n++;
if (R2+I2 > maxIZI2) return n % maxColor;
} while (((R-Rorb)*(R-Rorb)+(I-Iorb)*(I-Iorb) > eps) && (n < MaxIt) );
lastR = R; lastI = I;
if (n == MaxIt) return maxColor; else return n % maxColor;
}
}
class FilledJulZ2black extends FormulaFJ {
int iterate(double re, double im, double Cr, double Ci) {
double I=im, R=re, I2=I*I, R2=R*R; int n=0;
do { I=(R+R)*I+Ci; R=R2-I2+Cr; R2=R*R; I2=I*I; n++;
if (R2+I2 > maxIZI2) return maxColor;
} while (((R-Rorb)*(R-Rorb)+(I-Iorb)*(I-Iorb) > eps) && (n < MaxIt) );
lastR = R; lastI = I;
if (n == MaxIt) return maxColor; else return n % maxColor;
}
}
class HenonInt extends FormulaFJ{
int iterate(double Xo, double Yo, double a, double b){
double X=a + Xo*Xo + b*Yo, X2=X*X, X1, Y=Xo; int n=0;
do{
X1 = a + X2 + b*Y; Y = X;
X = X1; X2 = X*X; n++;
if (X2 > 1000.) return n % maxColor;
} while (((X-Rorb)*(X-Rorb)+(Y-Iorb)*(Y-Iorb) > eps) && (n < MaxIt) );
lastR = X; lastI = Y;
if (n == MaxIt) return maxColor; else return n % maxColor;
}
}
(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.