#![cfg_attr(not(debug_assertions), windows_subsystem = "windows" )]
extern crate kansas;
use kansas::events;
use std::cell::RefCell;
use std::rc::Rc;
fn render_mandelbrot(ctx: &mut kansas::Context, scale: f64, center: [f64; 2], limit: u32) {
let (w, h) = ctx.dimensions();
ctx.fill_by(0, 0, w, h, |x, y| {
let x = (x as f64 - w as f64 / 2.0 ) / scale + center[0];
let y = (y as f64 - h as f64 / 2.0 ) / scale + center[1];
let mut a = 0.0;
let mut b = 0.0;
let mut n = 0;
while a*a + b*b < 4.0 && n < limit {
let a2 = a*a - b*b + x;
b = 2.0*a*b + y;
a = a2;
n += 1;
}
if n == limit {
(0.0, 0.0, 0.0)
} else if n <= 1 {
(0.0, 0.0, 1.0)
} else if n % 100 < 20 {
let n = (n % 100) as f64 / 20.0;
(n, 1.0 - n, n)
} else if n % 100 < 60 {
let n = ((n % 100) as f64 - 60.0) / 40.0;
(1.0, n, 1.0)
} else {
let n = ((n % 100) as f64 - 60.0) / 40.0;
(1.0, 1.0 - n.sqrt(), 1.0 - n.sqrt())
}
});
}
fn main() {
let mut ctx = kansas::Canvas::new();
let state = Rc::new(RefCell::new((
200.0, [0.0, 0.0], [0.0, 0.0] )));
let d = state.clone();
ctx.on::< events::MouseMove>(Box::new(move |ctx, offset|{
let mut state = d.borrow_mut();
let (w, h) = ctx.dimensions();
state.2[0] = (offset.0 - w as f64 / 2.0) / state.0;
state.2[1] = (offset.1 - h as f64 / 2.0) / state.0;
println!("mouse: {:?}", state.2);
}));
let d = state.clone();
ctx.on::< events::MouseScroll>(Box::new(move |ctx, s| {
let mut state = d.borrow_mut();
match s {
events::ScrollEvent::Up(_) => {
state.0 *= 0.5;
},
events::ScrollEvent::Down(_) => {
state.0 *= 2.0;
state.1[0] += state.2[0];
state.1[1] += state.2[1];
},
}
println!("{:?}", state);
render_mandelbrot(ctx, state.0, state.1, 1000);
}));
render_mandelbrot(ctx.context_mut(), 200.0, [0.0, 0.0], 1000);
ctx.pause();
}