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)"
    }
スポンサーリンク

フォローする

スポンサーリンク