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-henon-mixing.jva

applet-math-fractal-henon-mixing.jva / applet-math-fractal-henon-mixing


  // Henon Mixing,  Evgeny Demidov,  25 June 2007
  
  import java.awt.*;
  import java.awt.image.*;
  import java.awt.event.*;
  import java.util.StringTokenizer;
  
  public class applet-math-fractal-henon-mixing extends java.applet.Applet implements MouseListener,
    KeyListener, ActionListener {
  double Yc=.0, Xc=.0, dx=4, dy=dx, R=.3,  a=-1.5, b=.5;
  int maxColor=96, N=1, w, h, w2, h2,  pixArr[];
  Image img;             IndexColorModel RainbowColor;
  Label     lbA, lbB, lbN;
  TextField tfXY, tfA, tfB, tfN;
  Button    btPl, btMn;
  
  public void init() {
    String s=getParameter("XYmidDelCD"); if (s != null) {
      StringTokenizer st = new StringTokenizer(s);
      Xc = Double.valueOf(st.nextToken()).doubleValue();
      Yc = Double.valueOf(st.nextToken()).doubleValue();
      dx = Double.valueOf(st.nextToken()).doubleValue();
      dy = Double.valueOf(st.nextToken()).doubleValue();}
    s=getParameter("ab"); if (s != null) {
      StringTokenizer st = new StringTokenizer(s);
      a = Double.valueOf(st.nextToken()).doubleValue();
      b = Double.valueOf(st.nextToken()).doubleValue();}
    s=getParameter("R"); if (s != null) R = Double.valueOf(s).doubleValue();
    s=getParameter("N"); if (s != null) N=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);}
    rColor[maxColor] = gColor[maxColor] = bColor[maxColor] = (byte)255;
    RainbowColor = new IndexColorModel( 8, maxColor+1, rColor,gColor,bColor);
    w = getSize().width;   h = getSize().height;
    w2 = w/2;  h2 = h/2;
    pixArr = new int[w*h];
    this.setLayout( new FlowLayout(FlowLayout.LEFT, 0, 0) );
    tfXY = new TextField( ""+(float)Xc+" "+(float)Yc+"; "+(float)dx+
      " "+(float)dy, 25);   add(tfXY);
    lbA = new Label("A", Label.RIGHT); add(lbA);
    tfA = new TextField( "" + a, 3);   add(tfA);
    tfA.addKeyListener(this);
    lbB = new Label("B", Label.RIGHT); add(lbB);
    tfB = new TextField( "" + b, 3);   add(tfB);
    tfB.addKeyListener(this);
    lbN = new Label("N", Label.RIGHT); add(lbN);
    tfN = new TextField( "" + N, 2);   add(tfN);
    tfN.addKeyListener(this);
    btPl = new Button("+"); btPl.addActionListener(this); add(btPl);
    btMn = new Button("-"); btMn.addActionListener(this); add(btMn);
    Draw();
    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) {
    Xc = Xc+(e.getX()-w2)*dx/w;
    Yc = Yc-(e.getY()-h2)*dx/w;
    if (e.isControlDown()){
      dy *= 2.; if (!e.isShiftDown()) dx *= 2.;}
    else {
      dy /= 2.; if (!e.isShiftDown()) dx /= 2.;}
    tfXY.setText( ""+(float)Xc+" "+(float)Yc+"; "+(float)dx+" "+(float)dy);
    Draw();
    repaint();
  }
  public void actionPerformed(ActionEvent e){
    if ( e.getActionCommand().equals("+") ) N++;
      else N--;
    tfN.setText(""+N);
    Draw();
    repaint();
  }
  public void keyTyped(KeyEvent e) {}
  public void keyPressed(KeyEvent e) {}
  public void keyReleased(KeyEvent e) {
    final int keyEnter = 10;
    if (e.getKeyCode() == keyEnter) {
      try{
        a = Double.valueOf(tfA.getText()).doubleValue();
        b = Double.valueOf(tfB.getText()).doubleValue();
        N = Integer.parseInt(tfN.getText());
        Draw();
        repaint();
      }catch ( NumberFormatException ne) {}
    }
    e.consume();
  }
  
  public void paint(Graphics g) {
    g.drawImage(img, 0, 0, this);
    double X, b1 = (1-b)*.5, d=b1*b1-a;
    if (d > 0){
      g.setColor(Color.white);
      X = b1 - Math.sqrt(d);
      int ix = w2 + (int)((X - Xc)*w/dx);
      int iy = h2 - (int)((X - Yc)*h/dy);
      g.drawLine(ix-3,iy, ix+3,iy); g.drawLine(ix,iy-3, ix,iy+3);
      X = b1 + Math.sqrt(d);
      ix = w2 + (int)((X - Xc)*w/dx);
      iy = h2 - (int)((X - Yc)*h/dy);
      g.drawLine(ix-3,iy, ix+3,iy); g.drawLine(ix,iy-3, ix,iy+3);}
  }
  
  public void Draw(){
    for (int p = h*w; p > 0;) pixArr[--p] = maxColor;
    int pix, ix,iy;
    pix = 0;
    double X,Y, Xo,Yo, t;
    for (iy=0; iy < h; iy++) {
     Yo = Yc + (h2-iy)*dy/h;
     for (ix=0; ix < w; ix++){
      Xo = X = Xc + (ix-w2)*dx/w;  Y = Yo;
      if (N >=0){
       for(int i=N; i>0; i--){
         t = (X-Y*Y-a)/b;
         X = Y;  Y = t; }}
      else{
       for(int i=-N; i>0; i--){
         t = a + X*X +b*Y;
         Y = X;   X = t; }}
      if((Math.abs(Xo) < R)&&(Math.abs(Yo) < R))
         pixArr[pix] = (int)(maxColor*0.35*(Xo/R+1.));
      if((Math.abs(X) < R)&&(Math.abs(Y) < R))
         pixArr[pix] = (int)(maxColor*0.35*(X/R+1.));
      pix++;}
    }
  //System.out.println(""+Xc +"  "+Yc);
    img = createImage(new MemoryImageSource(w, h, RainbowColor, pixArr, 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.