/* The Computer Language Benchmarks Game http://shootout.alioth.debian.org/ contributed by Stefan Krause slightly modified by Chad Whipkey */ import java.io.IOException; import java.io.PrintStream; class mandelbrot { public static void main(String[] args) throws Exception { new Mandelbrot(Integer.parseInt(args[0])).compute(); } public static class Mandelbrot { private static final int BUFFER_SIZE = 8192; public Mandelbrot(int size) { this.size = size; fac = 2.0 / size; out = System.out; shift = size % 8 == 0 ? 0 : (8- size % 8); } final int size; final PrintStream out; final byte [] buf = new byte[BUFFER_SIZE]; int bufLen = 0; final double fac; final int shift; public void compute() throws IOException { out.format("P4\n%d %d\n",size,size); for (int y = 0; y<size; y++) computeRow(y); out.write( buf, 0, bufLen); out.close(); } private void computeRow(int y) throws IOException { int bits = 0; final double Ci = (y*fac - 1.0); final byte[] bufLocal = buf; for (int x = 0; x<size;x++) { double Zr = 0.0; double Zi = 0.0; double Cr = (x*fac - 1.5); int i = 50; double ZrN = 0; double ZiN = 0; do { Zi = 2.0 * Zr * Zi + Ci; Zr = ZrN - ZiN + Cr; ZiN = Zi * Zi; ZrN = Zr * Zr; } while (!(ZiN + ZrN > 4.0) && --i > 0); bits = bits << 1; if (i == 0) bits++; if (x%8 == 7) { bufLocal[bufLen++] = (byte) bits; if ( bufLen == BUFFER_SIZE) { out.write(bufLocal, 0, BUFFER_SIZE); bufLen = 0; } bits = 0; } } if (shift!=0) { bits = bits << shift; bufLocal[bufLen++] = (byte) bits; if ( bufLen == BUFFER_SIZE) { out.write(bufLocal, 0, BUFFER_SIZE); bufLen = 0; } } } } }