A quick search for “F# Mandelbrot” gave an article written by Luke Hoban back in 2007, that draws a Fractal to the console.
Time for a makeover with a sprinkling of Active patterns, Reactive programming, Parallel execution and Silverlight.
Simply draw a rectangle onto the Fractal to zoom in:
“Complex” maths using F# PowerPack library and an Active Pattern:
open Microsoft.FSharp.Math
let maxIteration = 255
let modSquared (c : Complex) =
c.RealPart * c.RealPart + c.ImaginaryPart * c.ImaginaryPart
let (|Escaped|DidNotEscape|) c =
let rec compute z iterations =
if(modSquared z >= 4.0)
then Escaped iterations
elif iterations = maxIteration
then DidNotEscape
else compute ((z * z) + c) (iterations + 1)
compute c 0
Tomas Petricek’s original Reactive Rectangles sample to select the zoom area:
let rec waiting() = async {
let! md = Async.AwaitObservable(main.MouseLeftButtonDown)
let rc = new Canvas(Background = transparentGray)
main.Children.Add(rc)
do! drawing(rc, md.GetPosition(main)) }
and drawing(rc:Canvas, pos) = async {
let! evt = Async.AwaitObservable(main.MouseLeftButtonUp, main.MouseMove)
match evt with
| Choice1Of2(up) ->
rc.Background <- SolidColorBrush(colorSelect.CurrentColor)
do! waiting()
| Choice2Of2(move) ->
moveControl rc pos (move.GetPosition(main))
do! drawing(rc, pos) }
do waiting() |> Async.StartImmediate
Parallel rendering over up to 4 cores using Async workflows:
do! [0..3]
|> List.map (fun y -> async {
render points (y,(height/4),4) buffer
})
|> Async.Parallel
Resources:
Source: FractalZoom.zip (3.89 kb)