2013-05-20 19:07:24 -05:00
|
|
|
use std::cast::transmute;
|
|
|
|
use std::from_str::FromStr;
|
|
|
|
use std::i32::range;
|
|
|
|
use std::libc::{STDOUT_FILENO, c_int, fdopen, fputc};
|
2013-05-24 21:35:29 -05:00
|
|
|
use std::os;
|
2012-12-10 19:32:48 -06:00
|
|
|
|
2013-04-18 23:44:50 -05:00
|
|
|
static ITER: uint = 50;
|
|
|
|
static LIMIT: f64 = 2.0;
|
2012-02-03 19:46:17 -06:00
|
|
|
|
2013-04-18 23:44:50 -05:00
|
|
|
#[fixed_stack_segment]
|
|
|
|
fn main() {
|
|
|
|
unsafe {
|
|
|
|
let w: i32 = FromStr::from_str(os::args()[1]).get(), h = w;
|
|
|
|
let mut byte_acc: i8 = 0;
|
|
|
|
let mut bit_num: i32 = 0;
|
|
|
|
|
|
|
|
println(fmt!("P4\n%d %d", w as int, h as int));
|
|
|
|
|
|
|
|
let mode = "w";
|
|
|
|
let stdout = fdopen(STDOUT_FILENO as c_int, transmute(&mode[0]));
|
|
|
|
|
|
|
|
for range(0, h) |y| {
|
|
|
|
let y = y as f64;
|
|
|
|
for range(0, w) |x| {
|
|
|
|
let mut (Zr, Zi, Tr, Ti) = (0f64, 0f64, 0f64, 0f64);
|
|
|
|
let Cr = 2.0 * (x as f64) / (w as f64) - 1.5;
|
|
|
|
let Ci = 2.0 * (y as f64) / (h as f64) - 1.0;
|
|
|
|
|
|
|
|
for ITER.times {
|
|
|
|
if Tr + Ti > LIMIT * LIMIT {
|
|
|
|
break;
|
2013-02-17 23:48:06 -06:00
|
|
|
}
|
2013-04-18 23:44:50 -05:00
|
|
|
|
|
|
|
Zi = 2.0*Zr*Zi + Ci;
|
|
|
|
Zr = Tr - Ti + Cr;
|
|
|
|
Tr = Zr * Zr;
|
|
|
|
Ti = Zi * Zi;
|
|
|
|
}
|
|
|
|
|
|
|
|
byte_acc <<= 1;
|
|
|
|
if Tr + Ti <= LIMIT * LIMIT {
|
|
|
|
byte_acc |= 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
bit_num += 1;
|
|
|
|
|
|
|
|
if bit_num == 8 {
|
|
|
|
fputc(byte_acc as c_int, stdout);
|
|
|
|
byte_acc = 0;
|
|
|
|
bit_num = 0;
|
|
|
|
} else if x == w - 1 {
|
|
|
|
byte_acc <<= 8 - w%8;
|
|
|
|
fputc(byte_acc as c_int, stdout);
|
|
|
|
byte_acc = 0;
|
|
|
|
bit_num = 0;
|
|
|
|
}
|
|
|
|
}
|
2012-02-03 21:50:32 -06:00
|
|
|
}
|
|
|
|
}
|
2012-02-03 19:46:17 -06:00
|
|
|
}
|