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

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


  // Henon attractor,  Evgeny Demidov,  27 June 2004
  
  import java.awt.*;
  import java.awt.image.*;
  import java.awt.event.*;
  import java.util.StringTokenizer;
  
  public class applet-math-fractal-henon-str extends java.applet.Applet implements MouseListener,
     MouseMotionListener{
  double Ymid, Xmid, DelX=3., A=-1,B=0, Xo=0,Yo=0;
  int MaxIt = 1000, N=0,  w,h,w2,h2,  pixArr[];
  boolean showXY = true;
  long generTime;
  Image img;             IndexColorModel iColor;
  TextField tfXY;
  
  public void init() {
    String s=getParameter("XYmidDel"); 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();
      A = Double.valueOf(st.nextToken()).doubleValue();
      B = Double.valueOf(st.nextToken()).doubleValue();}
    s=getParameter("MaxIt"); if (s != null) MaxIt=Integer.parseInt(s);
    s=getParameter("N"); if (s != null) N=Integer.parseInt(s);
    byte rColor[] = new byte[2], bColor[] = new byte[2],
         gColor[] = new byte[2];
    rColor[0] = gColor[0] = bColor[0] = (byte)255;
    rColor[1] = gColor[1] = bColor[1] = 0;
    iColor = new IndexColorModel( 8, 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());
      tfXY = new TextField( ""+Xmid+", "+Ymid+"; "+(float)DelX );
      add("South",  tfXY);
      h -= tfXY.getPreferredSize().height;}
    h2 = h/2;  w2 = w/2;
    pixArr = new int[w*h];
    addMouseListener(this);
    addMouseMotionListener(this);
    Draw();
  }
  
  public void destroy() {
    removeMouseListener(this); 
    removeMouseMotionListener(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.;}
    if (showXY)
      tfXY.setText( ""+(float)Xmid+", "+(float)Ymid+"; "+(float)DelX);
    Draw();
    repaint();
  }
  public void mouseMoved(MouseEvent e){}  //1.1 event handling
  public void mouseDragged(MouseEvent e) {}
  
  public void paint(Graphics g) {
    g.drawImage(img, 0, 0, this);
    drawLabel(g);
    showStatus( "T=" + generTime + " msec");
  }
  
  public void drawLabel(Graphics gra) {
   double  StZ=DelX/w;
   gra.setColor(Color.blue);
   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);
     if (sqr < 3000){
       ix = (w - sqr)/2 + (int)((sqrRmid-Xmid)/StZ);
       iy = (h - sqr)/2 + (int)((Ymid - sqrImid) /StZ);
       gra.drawRect(ix,iy, sqr,sqr);}}
   gra.setColor(Color.black);
   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);
     double x=(Double.valueOf(st.nextToken()).doubleValue()-Xmid)/StZ,
     y=(Ymid-Double.valueOf(st.nextToken()).doubleValue())/StZ;
     if ( (Math.abs(x)<w)&&(Math.abs(y)<h) ){
       ix = w/2+(int)x;  iy = h/2+(int)y;
       gra.drawString(st.nextToken(), ix,iy);}
     maxLabel++; }
  }
  
  public void Draw(){
    for (int it=0; it < w*h; it++) pixArr[it] = 0;
    double X=Xo, X2=X*X, X1, Y=Yo, St = DelX/w;
    int ix,iy;
    generTime = System.currentTimeMillis();
    for (int it=0; it <= MaxIt; it++){
      X1 = A + X2 + B*Y;  Y = X;  X = X1;  X2 = X*X;
      ix = (int)((X - Xmid)/St) + w2;
      iy = -(int)((Y - Ymid)/St) + h2;
  //System.out.println(""+X +"  "+Y+"  "+it);
      if ((ix >= 0)&&(ix < w)&&(iy >= 0)&&(iy < h)) pixArr[ix+iy*w] = 1;
    }
    img = createImage(new MemoryImageSource(w, h, iColor, pixArr, 0, w));
    generTime = System.currentTimeMillis()-generTime;
  }
  
  }
  


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