/* 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 @file 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) 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; } }