From f3627b9d9744ba67762448cd2fd9eff703dab4fd Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Mon, 27 Oct 2014 15:51:26 -0400 Subject: factor this out into a type --- src/renderer.jl | 49 +++++++++++++++++++++++++++++++++---------------- 1 file changed, 33 insertions(+), 16 deletions(-) diff --git a/src/renderer.jl b/src/renderer.jl index d8f97ff..0381eb6 100644 --- a/src/renderer.jl +++ b/src/renderer.jl @@ -3,31 +3,43 @@ using Images using ImageView using Color -mandelbrot() = mandelbrot(createwindow()) -function mandelbrot(canvas::Canvas) - fractal(canvas, z -> z, (z, c) -> z.^2 + c) +type FractalCanvas + c::Canvas + f::FractalExplorer.Fractal + image::Array{HSV{Float64}, 2} + + function FractalCanvas(c::Canvas, make_c::Function, step::Function) + winsize = tuple(get_size(c)...) + f = FractalExplorer.Fractal{Float64}(winsize, make_c, step) + image = [ HSV(0, 0, 0) for y=1:winsize[1], x=1:winsize[2] ] + view(c, image, interactive=false) + setup_handlers(c) + return new(c, f, image) + end +end + +mandelbrot(fc::FractalCanvas) = mandelbrot(fc.c) +function mandelbrot(canvas::Canvas = createwindow()) + return fractal(canvas, z -> z, (z, c) -> z.^2 + c) end -julia(c = 0) = julia(createwindow(), c) -function julia(canvas::Canvas, c::Union(Number, Array{Number, 2}) = 0) - fractal(canvas, z -> c, (z, c) -> z.^2 + c) +julia(fc::FractalCanvas, c = 0) = julia(fc.c, c) +function julia(canvas::Canvas = createwindow(), c::Union(Number, Array{Number, 2}) = 0) + return fractal(canvas, z -> c, (z, c) -> z.^2 + c) end fractal(make_c, step) = fractal(createwindow(), make_c, step) +fractal(fc::FractalCanvas, make_c, step) = fractal(fc.c, make_c, step) function fractal(canvas::Canvas, make_c::Function, step::Function) - imgsize = tuple(get_size(canvas)...) - img = [ HSV(0, 0, 0) for y=1:imgsize[1], x=1:imgsize[2] ] - view(canvas, img, interactive=false) - - f = FractalExplorer.Fractal{Float64}(imgsize, make_c, step) + fc = FractalCanvas(canvas, make_c, step) i = 0 while true - FractalExplorer.step(f) - new_pixels = (abs(f.z) .> 2) & (img .== HSV(0, 0, 0)) - img[new_pixels] = HSV(i * 4, 1, 1) + FractalExplorer.step(fc.f) + new_pixels = (abs(fc.f.z) .> 2) & (fc.image .== HSV(0, 0, 0)) + fc.image[new_pixels] = HSV(i * 4, 1, 1) i = i + 1 - view(canvas, img, interactive=false) + view(fc.c, fc.image, interactive=false) if length(find(new_pixels)) <= 1 break end @@ -35,10 +47,12 @@ function fractal(canvas::Canvas, make_c::Function, step::Function) if (!isinteractive()) cv = Condition() - win = Tk.toplevel(canvas) + win = Tk.toplevel(fc.c) bind(win, "", e->notify(cv)) wait(cv) end + + return fc end function createwindow(winsize::(Integer, Integer) = (640, 480)) @@ -51,3 +65,6 @@ function createwindow(winsize::(Integer, Integer) = (640, 480)) view(canvas, [ 0.0 for y=1:winsize[2], x=1:winsize[1] ], interactive=false) return canvas end + +function setup_handlers(c::Canvas) +end -- cgit v1.2.3