お馬の写真 別館

「お馬の写真」管理者による徒然なるブログ

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

 - プログラミング