F#: マンデルブロ集合

なんとなくF#でマンデルブロ集合の計算をやってみたくなったので、ちょっとコーディング。

インターフェイスとしては、中心座標、計算箇所の間隔、計算範囲、発散判定回数を引数として、発散しなければ-1、発散した場合は発散に要した回数を返す、というものに。

module Masaminh.Mandelbrot.Mandelbrot

open System.Numerics;

let public Calc (center : Complex) step width height threshold =
        let xStart = center.Real - (float width * step / 2.0)
        let yStart = center.Imaginary - (float height * step / 2.0)
        let xSeq = seq {
            for y in 0 .. height - 1 do
                for x in 0 .. width - 1 do
                    yield Complex(xStart + float x * step, yStart + float y * step)
        }
        let rec CalcPoint threshold (z : Complex) n c =
            let z2 = z * z + c;

            if z2.Magnitude > 2.0
            then n
            elif threshold <= n
            then -1
            else CalcPoint threshold z2 (n + 1) c

        Seq.map (CalcPoint threshold (new Complex()) 0) xSeq

計算結果をC#で作ったGUIで表示した結果が以下。

mandelbrot

スポンサーリンク

フォローする

スポンサーリンク