/* 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; | |
} | |
} | |
} | |
} | |
} |