media @ VU
[] readme course(s) preface I 1 2 II 3 4 III 5 6 7 IV 8 9 10 V 11 12 afterthought(s) appendix reference(s) example(s) resource(s) _

talk show tell print

applet-math-fractal-pdirect.jva

applet-math-fractal-pdirect.jva / applet-math-fractal-pdirect


  // "Shrimps hunter",  Evgeny Demidov,  17 June 04
  
  import java.awt.*;
  import java.awt.image.*;
  import java.awt.event.*;
  import java.util.StringTokenizer;
  
  public class applet-math-fractal-pdirect extends java.applet.Applet implements MouseListener {
  double maxIZI2=10., Ymid=.0, Xmid=-.5, DelX=3.,  paramC,paramD;
  int MaxIt = 256,  maxColor = 96, w, h, pixArr[];
  Image img;             IndexColorModel RainbowColor;
  long generTime;        boolean   showXY = true;
  FormulaD formD;        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("MaxIZI2");
    if (s != null) maxIZI2 = Double.valueOf(s).doubleValue();
    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+2], bColor[] = new byte[maxColor+2],
         gColor[] = new byte[maxColor+2];
    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;
    RainbowColor = new IndexColorModel( 8, maxColor+2, rColor,gColor,bColor);
    w = getSize().width;   h = getSize().height;
    s=getParameter("showXY");
    if ( (s != null) && (s.equalsIgnoreCase("N")) ) showXY = false;
    else{
      setLayout(new BorderLayout());
      s = ""+Xmid+", "+Ymid+"; "+(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{  formD = (FormulaD)Class.forName( s ).newInstance();
      }catch(Exception e){}
    else  formD = new HenonH();
    Draw(Xmid, Ymid, DelX/w, formD, paramC, paramD );
    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) {
    double Xo = Xmid+(e.getX()-w/2)*DelX/w,
           Yo = Ymid-(e.getY()-h/2)*DelX/w;
    if ( !(e.isAltDown() || e.isControlDown()) ){
      int p = formD.iterate(Xo, Yo, paramC, paramD, maxIZI2, MaxIt, maxColor)+1;
      if (showXY) tfXY.setText( "p="+p+"   "+(float)Xo+", "+(float)Yo);
  //    repaint();
      return;}
    Xmid = Xo;  Ymid = Yo;
    if ( e.isControlDown() ) {
      if ( e.isShiftDown() )  DelX *=4.;  else  DelX *=2.;}
    else {
      if ( e.isShiftDown() )  DelX /=4.;  else  DelX /=2.;}
    Draw(Xmid, Ymid, DelX/w, formD, paramC, paramD);
    if (showXY)  tfXY.setText( ""+Xmid+", "+Ymid+"; "+(float)DelX);
    repaint();
  }
  
  public void paint(Graphics g) {
    g.drawImage(img, 0, 0, this);
    if (DelX > .01) drawLabel(g);
    showStatus( "Time=" + generTime + " msec");
  }
  
  public void drawLabel(Graphics gra) {
   double  R=0.,I=0., StZ=DelX/w;
   gra.setColor(Color.white);
   int x,y;
   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);
     x = (w - sqr)/2 + (int)((sqrRmid-Xmid)/StZ);
     y = (h - sqr)/2 + (int)((Ymid - sqrImid) /StZ);
     gra.drawRect(x,y, sqr,sqr);}
   gra.setFont(
     new Font( gra.getFont().getName(), Font.BOLD, 15 ) );
   int maxLabel=0;
   while (true) {
     s=getParameter("lb"+maxLabel);
     if (s == null) break;
     StringTokenizer st = new StringTokenizer(s);
     x=w/2+(int)((Double.valueOf(st.nextToken()).doubleValue()-Xmid)/StZ);
     y=h/2+(int)((Ymid-Double.valueOf(st.nextToken()).doubleValue())/StZ);
     gra.drawString(st.nextToken(), x,y);
     maxLabel++; }
  }
  
  public void Draw( double Xmid, double Ymid, double Step,
    FormulaD form, double parC, double parD){
    double X,Y;
    int pix=w, ix,iy, p;
    generTime = System.currentTimeMillis();
    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++) {
        p=form.iterate(X, Y, parC, parD, maxIZI2, MaxIt, maxColor);
        if (p == 999) p = maxColor;
        else if (p > maxColor) p %= maxColor;
        else if (p < 0) p = maxColor + 1;
        pixArr[pix] = p;
     }
    }
    img = createImage(new MemoryImageSource(w, h, RainbowColor, pixArr, w, w));
    generTime = System.currentTimeMillis()-generTime;
  }
  
  }
  
  abstract class FormulaD{
   abstract int iterate(double x, double y, double paramC, double paramD,
     double max, int MaxIt, int maxCol);
  }
  
  class PBiquadH extends FormulaD{
   int iterate(double A, double B, double C, double Ci, double max,
    int MaxIt, int maxCol){
      double X, X2=0, Xo;   int n=0;
      if (C > 0){
       if(A > 0) return maxCol;
       X = Math.sqrt(-A); X2 = X*X;}
      do{  X2 += A; X = X2*X2+B; X2 = X*X;  n++;
      } while ((X2 < 1000.) && (n < MaxIt) );
      if (n < MaxIt) return -1;
      Xo = X;  n = -1;
      do{  X2 += A; X = X2*X2+B; X2 = X*X;  n++;
      } while ((Math.abs(X - Xo) > 1e-8) && (n < 64) );
      if (n == 64) return 999;
      return n;
   }
  }
  class CubicH extends FormulaD{
   int iterate(double A, double B, double C, double Ci, double max,
    int MaxIt, int maxCol){
      double X = A, X2, Xo, A2 = 3*A*A;   int n=0;
      if (C > 0) X = -A;
      X2=A*A;
      do{  X2 -= A2; X = X2*X+B; X2 = X*X;  n++;
      } while ((X2 < 1000.) && (n < MaxIt) );
      if (n < MaxIt) return -1;
      Xo = X;  n = -1;
      do{  X2 -= A2; X = X2*X+B; X2 = X*X;  n++;
      } while ((Math.abs(X - Xo) > 1e-8) && (n < 64) );
      if (n == 64) return 999;
      return n;
   }
  }
  class Circle extends FormulaD{
   int iterate(double A, double B, double C, double Ci, double max,
    int MaxIt, int maxCol){
      double X = .5, Xo, B1=25.13*B;   int n=0;
      do{  X = X + A + B1*X*(X-.5)*(X-1.); X -= Math.floor(X);  n++;
      } while (n < MaxIt);
      Xo = X;  n = -1;
      do{  X = X + A + B1*X*(X-.5)*(X-1.); X -= Math.floor(X);  n++;
      } while ((Math.abs(X - Xo) > 1e-8) && (n < 64) );
      if (n == 64) return 999;
      return n;
   }
  }
  class HenonHJ extends FormulaD{
   int iterate(double a, double b, double Xo, double Yo, double max,
    int MaxIt, int maxCol){
      double b2 = (1-b)*.5, Xs,Ys;
      if (a < 0) Xs = 0;
      else if (Xo > 0)  Xs = -b2 + Math.sqrt(b2*b2 + a) + 1e-10;
      else  Xs = -b2 - Math.sqrt(b2*b2 + a) + 1e-10;
      Ys = Xs;
      double X= a - Xs*Xs + b*Ys, X2=X*X, X1, Y=Ys;   int n=0;
      do{
        X1 = a - X2 + b*Y;  Y = X;
        X = X1;  X2 = X*X;   n++;
      } while ((X2 < 1000.) && (n < MaxIt) );
      if (n < MaxIt) return -1;
      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 999;
      return n;
   }
  }
  class HenonH extends FormulaD{
   int iterate(double a, double b, double Xo, double Yo, double max,
    int MaxIt, int maxCol){
      double b1 = (1-b)*.5, d=b1*b1-a, Xs,Ys;
      if (d < 0) Xs = 0;
      else if (Xo > 0)  Xs = b1 + Math.sqrt(d) + 1e-10;
      else  Xs = b1 - Math.sqrt(d) + 1e-10;
      Ys = Xs;
      double X= a + Xs*Xs + b*Ys, X2=X*X, X1, Y=Ys;   int n=0;
      do{
        X1 = a + X2 + b*Y;  Y = X;
        X = X1;  X2 = X*X;   n++;
      } while ((X2 < 1000.) && (n < MaxIt) );
      if (n < MaxIt) return -1;
      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 999;
      return n;
   }
  }
  


(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.