import java.awt.*; import java.awt.image.*; import java.awt.geom.*; import javax.swing.*; import java.util.Random; public class Plotter extends JComponent implements Runnable { int imageWidth, imageHeight; double xLowerLeft, yLowerLeft, xUpperRight, yUpperRight; double pixelWidth, pixelHeight, invPixelWidth, invPixelHeight; double[] pt = new double[2]; double posX, posY; double vertex0X, vertex0Y, vertex1X, vertex1Y, vertex2X, vertex2Y, vertex3X, vertex3Y, vertex4X, vertex4Y, vertex5X, vertex5Y, vertex6X, vertex6Y, vertex7X, vertex7Y; Random randNumGen = new Random(5); BufferedImage bufImage; Graphics2D bufImageGraphic; public Plotter(int w, int h, double xLL, double yLL, double xUR, double yUR) { posX = 0.0; posY = 0.8; pt[0] = posX; pt[1] = posY; vertex0X = vertex0Y = 0; vertex1X = 1; vertex1Y = 0; vertex2X = vertex2Y = 1; vertex3X = 0; vertex3Y = 1; imageWidth = w; imageHeight = h; xLowerLeft = xLL; yLowerLeft = yLL; xUpperRight = xUR; yUpperRight = yUR; pixelWidth = (xUR - xLL)/((double)w); invPixelWidth = ((double)w)/(xUR - xLL); pixelHeight = (yUR - yLL)/((double)h); invPixelHeight = ((double)h)/(yUR - yLL); System.out.println(imageWidth + " " + imageHeight); System.out.println(pixelWidth + " " + pixelHeight); bufImage = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); bufImageGraphic = bufImage.createGraphics( ); bufImageGraphic.setPaint(Color.white); //bufImageGraphic.setPaint(Color.black); bufImageGraphic.fillRect(0, 0, w, h); AffineTransform at = new AffineTransform(invPixelWidth, 0, 0, -invPixelHeight, -invPixelWidth*xLL, invPixelHeight*yUR ); bufImageGraphic.setTransform(at); Thread t = new Thread(this); t.start( ); } public void timeStep( ) { bufImageGraphic.setPaint(Color.blue); Rectangle2D p = new Rectangle2D.Double(pt[0], pt[1], pixelWidth/1.0, pixelHeight/1.0); bufImageGraphic.fill(p); pt = Sierpinski(pt); } public void run( ) { try { //while (true) for(int i = 0; i < 5000; ++i) { //Loopbody: timeStep( ); repaint( ); Thread.sleep(0); } } catch (InterruptedException ie) {} } public void paint(Graphics g) { Graphics2D g2 = (Graphics2D)g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); //g2.setPaint(Color.blue); //g2.drawImage(image, imageX, imageY, this); g2.drawImage(bufImage, 0, 0, this); } public double[] Sierpinski(double[] pt) { int target = Math.abs(randNumGen.nextInt( )) % 4; double[] q = new double[2]; switch (target) { //case 0 : q[0] = pt[0]/2.0 + vertex0X/2.0; q[1] = pt[1]/2.0 //+ vertex0Y/2.0; break; //case 1 : q[0] = pt[0]/2.0 + vertex1X/2.0; q[1] = pt[1]/2.0 + //vertex1Y/2.0; break; //case 2 : q[0] = pt[0]/2.0 + vertex2X/2.0; q[1] = pt[1]/2.0 //+ vertex2Y/2.0; break; case 0 : q[0] = pt[0]/3.0 + (2.0*vertex0X)/3.0; q[1] = pt[1]/3.0 + (2.0*vertex0Y)/3.0; break; case 1 : q[0] = pt[0]/3.0 + (2.0*vertex1X)/3.0; q[1] = pt[1]/3.0 + (2.0*vertex1Y)/3.0; break; case 2 : q[0] = pt[0]/3.0 + (2.0*vertex2X)/3.0; q[1] = pt[1]/3.0 + (2.0*vertex2Y)/3.0; break; case 3 : q[0] = pt[0]/3.0 + (2.0*vertex3X)/3.0; q[1] = pt[1]/3.0 + (2.0*vertex3Y)/3.0; break; } return q; } public static void main(String[] args) { JFrame frame = new JFrame("Plotter"); frame.setBackground(Color.white); Plotter plot = new Plotter(700, 700, -0.1, -0.1, 1.1, 1.1); //Plotter plot = new Plotter(700, 700, -2, -1.5, 1, 1.5); //Plotter plot = new Plotter(700, 700, 0, 0, 700, 700); frame.getContentPane( ).add(plot); frame.setSize(700, 700); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }