import java.awt.*; import java.applet.*; import java.awt.event.*; import java.awt.image.*; public class Mandelbrot extends Applet implements Runnable,MouseListener,MouseMotionListener { static double RAD=6; int width,height,length; int[] pixels; MemoryImageSource mit; Image image; double[] z_re,z_im; double min_re,max_re; double min_im,max_im; double red_re,green_re,blue_re; double red_im,green_im,blue_im; int last_x,last_y; int dx,dy; boolean running; public void init() { width=getSize().width; height=getSize().height; length=width*height; pixels=new int[length]; mit=new MemoryImageSource(width,height,pixels,0,width); mit.setAnimated(true); image=getToolkit().createImage(mit); z_re=new double[length]; z_im=new double[length]; addMouseListener(this); addMouseMotionListener(this); reset(); } void reset() { min_re=-2.0; max_re=2.0; min_im=-2.0*height/width; max_im=2.0*height/width; red_re=Math.random()*RAD; green_re=Math.random()*RAD; blue_re=Math.random()*RAD; red_im=Math.random()*RAD; green_im=Math.random()*RAD; blue_im=Math.random()*RAD; } public void start() { if (!running) { running=true; new Thread(this,"Plotter").start(); } } public void stop() { running=false; } public void mousePressed(MouseEvent e) { running=false; last_x=e.getX(); last_y=e.getY(); } public void mouseReleased(MouseEvent e) { if (dx==0 && dy==0) { double range_re=max_re-min_re; double range_im=max_im-min_im; double center_re=min_re+range_re*e.getX()/width; double center_im=min_im+range_im*e.getY()/height; max_re=center_re+range_re/4; min_re=center_re-range_re/4; max_im=center_im+range_im/4; min_im=center_im-range_im/4; } else { double d_re=(max_re-min_re)*dx/width; double d_im=(max_im-min_im)*dy/height; max_re-=d_re; min_re-=d_re; max_im-=d_im; min_im-=d_im; dx=dy=0; } running=false; synchronized (this) { for (int i=0;i255) red=255; if (green<0) green=0; else if (green>255) green=255; if (blue<0) blue=0; else if (blue>255) blue=255; pixels[i]=0xff000000|red<<16|green<<8|blue; this.z_re[i]=z_re; this.z_im[i]=z_im; } mit.newPixels(); if (T<1000) T+=10; } } public void update(Graphics g) { paint(g); } public void paint(Graphics g) { g.drawImage(image,dx,dy,this); g.setColor(Color.gray); g.fillRect(0,0,dx,height); g.fillRect(width+dx,0,width,height); g.fillRect(0,0,width,dy); g.fillRect(0,height+dy,width,height); } }