お馬の写真 別館

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

F#: インターフェイスの使用 (マンデルブロ集合)

   

mandelbrot

F#: マンデルブロ集合でマンデルブロ集合の計算をF#でやってみましたが、ロジックの差し替えをしやすくするために、インターフェイスを継承する形に書き換えてみました。

まずインターフェイス。F#で書いてもよかったのですが、敢えてC#で記述してみました。

using System.Collections.Generic;
using System.Numerics;
namespace Masaminh.Mandelbrot
{
public interface IMandelbrot
{
string Name { get; }
IEnumerable<int> Calc(Complex center, double step, int width, int height, int threshold);
}
}

これをクラスライブラリとした上で、F#プロジェクトから参照する形に。

F#の方はMSDNのインターフェイス (F#)を参照に以下のように実装。
はまったところですが、Calcメソッドのパラメータはタプルで記述する必要がありました。

module Masaminh.Mandelbrot.Mandelbrot
open System.Numerics;
let createMandelbrot() =
{
new IMandelbrot with
member this.Calc (center:Complex, step:float, width:int, height:int, threshold:int) =
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
member this.get_Name() = "F#ロジック (1)"
}

 - プログラミング