// Henon attractor, Evgeny Demidov, 27 June 2004 import java.awt.*; import java.awt.image.*; import java.awt.event.*; import java.util.StringTokenizer; public class @file 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)= 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; } }