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-shoe.jva

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


  // Henon Horseshoe,  Evgeny Demidov,  4 Jujy 2007
  
  import java.awt.*;
  import java.awt.image.*;
  import java.awt.event.*;
  import java.util.StringTokenizer;
  
  public class applet-math-fractal-henon-shoe extends java.applet.Applet implements MouseListener,
    KeyListener, ActionListener, MouseMotionListener {
  double Yc=0, Xc=0, dx=35, dy=dx, R=3.9, Xm, Ym,  a=-8, b=1;
  int maxColor=8, N=2, w, h, w2, h2, ix,ixo,iy,iyo, ir=5, ir2=ir*2,
    mx,my,mxo,myo,  pixArr[];
  Image img;             IndexColorModel RainbowColor;
  Label     lbA, lbB, lbN;
  TextField tfXY, tfA, tfB, tfN;
  Button    btPl, btMn;
  boolean   bXOR=false;
  
  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();}
    Xm = Xc;  Ym = Yc;
    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);
    if (N < 2) N = 2;
    s=getParameter("MaxColor"); if (s != null) maxColor=Integer.parseInt(s);
    byte rColor[] = new byte[maxColor], bColor[] = new byte[maxColor],
         gColor[] = new byte[maxColor];
    rColor[0] = gColor[0] = bColor[0] = (byte)255;
    rColor[1] = bColor[1] = (byte)150; gColor[1] = (byte)255;
    rColor[2] = gColor[2] = (byte)150; bColor[2] = (byte)255;
    bColor[3] = gColor[3] = (byte)150; rColor[3] = (byte)255;
    gColor[4] = (byte)255;
    bColor[5] = (byte)255;
    rColor[6] = (byte)255;
    bColor[7] = gColor[7] = rColor[7] = (byte)150;
    RainbowColor = new IndexColorModel( 8, maxColor, 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, 30);   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);
    addMouseListener(this);
    addMouseMotionListener(this);
    Draw();
  }
  
  public void destroy() {
    removeMouseMotionListener(this);
    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) {
    if (e.isControlDown()||e.isAltDown()){
      Xc = Xc+(e.getX()-w2)*dx/w;
      Yc = Yc-(e.getY()-h2)*dx/w;}
    else return;
    if (e.isControlDown()){
      dy *= 2.; if (!e.isShiftDown()) dx *= 2.;}
    if (e.isAltDown()) {
      dy /= 2.; if (!e.isShiftDown()) dx /= 2.;}
    tfXY.setText( ""+(float)Xc+" "+(float)Yc+"; "+(float)dx+" "+(float)dy);
    Draw();
    repaint();
  }
  
  public void mouseMoved(MouseEvent e){}  //1.1 event handling
  
  public void mouseDragged(MouseEvent e) {
    if (e.isControlDown()||e.isAltDown()) return;
    ix = e.getX(); iy = e.getY();
    Xm = Xc+(ix-w2)*dx/w;  Ym = Yc-(iy-h2)*dx/w;
    mx = w2 + (int)((a + Xm*Xm +b*Ym - Xc)*w/dx);
    my = h2 - (int)((Xm - Yc)*h/dy);
    bXOR = true;
    repaint();
  }
  
  public void actionPerformed(ActionEvent e){
    if ( e.getActionCommand().equals("+") ) N++;
      else N--;
    if (N < 2) N = 2;
    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());
        if (N < 2) { N = 2; tfN.setText(""+N); }
        Draw();
        repaint();
      }catch ( NumberFormatException ne) {}
    }
    e.consume();
  }
  
  public void update(Graphics g){ paint(g); }
  
  public void paint(Graphics g) {
    if(!bXOR){
     g.drawImage(img, 0, 0, this);
     g.setColor(Color.black);
     drawLabel(g);
     g.setColor(Color.white);
     g.setXORMode(Color.black);
     double X, b1 = (1-b)*.5, d=b1*b1-a;
     if (d > 0){
       X = b1 - Math.sqrt(d);
       int ix = w2 + (int)((X - Xc)*w/dx);
       int iy = h2 - (int)((X - Yc)*h/dy);
       g.drawLine(ix-5,iy, ix+5,iy); g.drawLine(ix,iy-5, ix,iy+5);
       X = b1 + Math.sqrt(d);
       ix = w2 + (int)((X - Xc)*w/dx);
       iy = h2 - (int)((X - Yc)*h/dy);
       g.drawLine(ix-5,iy, ix+5,iy); g.drawLine(ix,iy-5, ix,iy+5);}
     g.drawLine(mx-10,my, mx+10,my);   g.drawLine(mx,my-10, mx,my+10);
     g.drawRect(ix-ir,iy-ir,ir2,ir2);
     g.setPaintMode();}
    else{
     g.setXORMode(Color.black);
     g.setColor(Color.white);
     g.drawRect(ixo-ir,iyo-ir,ir2,ir2);
     g.drawLine(mxo-10,myo, mxo+10,myo);   g.drawLine(mxo,myo-10, mxo,myo+10);
     mxo = mx; myo = my;
     ixo = ix; iyo = iy;
     g.drawRect(ix-ir,iy-ir,ir2,ir2);
     g.drawLine(mx-10,my, mx+10,my);   g.drawLine(mx,my-10, mx,my+10);
     g.setPaintMode();
     bXOR=false;}
  }
  
  public void Draw(){
    ix = ixo = w2 + (int)((Xm - Xc)*w/dx);
    iy = iyo = h2 - (int)((Ym - Yc)*h/dy);
    mx = mxo = w2 + (int)((a + Xm*Xm +b*Ym - Xc)*w/dx);
    my = myo = h2 - (int)((Xm - Yc)*h/dy);
    for (int p = h*w; p > 0;) pixArr[--p] = 0;
    int pix, ix,iy;
    pix = 0;
    double X,Y, Xo,Yo, X1,Y1, 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;
      for(int i=N-1; i>0; i--){
         t = (X-Y*Y-a)/b;
         X = Y;  Y = t; }
      if((Math.abs(X) < R)&&(Math.abs(Y) < R)) pixArr[pix] = 2;
      Y1 = (X-Y*Y-a)/b;
      X1 = Y;
      Y = Yo; X = Xo;
      for(int i=N-1; i>0; i--){
         t = a + X*X +b*Y;
         Y = X;   X = t; }
      if((Math.abs(X) < R)&&(Math.abs(Y) < R)) pixArr[pix] += 1;
      if((Math.abs(X1) < R)&&(Math.abs(Y1) < R)) pixArr[pix] = 5;
      X1 = a + X*X +b*Y;
      Y1 = X;
      if((Math.abs(X1) < R)&&(Math.abs(Y1) < R)){
       if(pixArr[pix] == 5) pixArr[pix] = 6;
       else pixArr[pix] = 4;}
      if((Math.abs(Xo) < R)&&(Math.abs(Yo) < R)&&(pixArr[pix] == 0))
         pixArr[pix] = 7;
      pix++;}
    }
  //System.out.println(""+Xc +"  "+Yc);
    img = createImage(new MemoryImageSource(w, h, RainbowColor, pixArr, 0, w));
  }
  
  public void drawLabel(Graphics gra) {
   gra.setColor(Color.black);
   int x,y;
   gra.setFont(
     new Font( gra.getFont().getName(), Font.BOLD, 15 ) );
   int maxLabel=0;
   while (true) {
     String s=getParameter("lb"+maxLabel);
     if (s == null) break;
     StringTokenizer st = new StringTokenizer(s);
     x=w2+(int)((Double.valueOf(st.nextToken()).doubleValue()-Xc)*w/dx);
     y=h2+(int)((Yc-Double.valueOf(st.nextToken()).doubleValue())*h/dy);
     gra.drawString(st.nextToken(), x,y);
     maxLabel++; }
  }
  
  }
  


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