在F#中不同深度绘制xFractal的算法

时间:2018-03-20 17:53:50

标签: recursion f# fractals

enter image description here

以上是本文标题中提到的xFractal。我需要实现一个函数,它允许f#sharp使用辅助img_Util模块在不同的dephts中绘制分形。我被建议使用以下代码,允许在不同深度绘制sierpinski三角形作为模板:

    open ImgUtil

    let rec triangle bmp len (x,y) =

        if len < 33 then 
            setBox red (x,y) (x+len,y+len) bmp
        else 
            let half = len / 2
            do triangle bmp half (x+half/2,y)
            do triangle bmp half (x,y+half)
            do triangle bmp half (x+half,y+half)

    do runSimpleApp "Sierpinski" 600 600 (fun bmp -> triangle bmp 512 
    (30,30) |> ignore)

但我尝试了很多不同的东西以上作为模板。香港专业教育学院尝试在基础案例中画一个方格。我也试过让基础案例成为一个雪花可以这么说。我可以让递归绘制每个新深度的最内层元素,但所有其他我无法绘制。谁能帮我?向我解释算法?

1 个答案:

答案 0 :(得分:0)

这是另一个提示。对于Sierpiński的三角形,从等腰三角形开始,其高度和宽度为单位长度。这样我们就不必担心我们绘制它的画布的尺寸了。对于每一代,将高度和宽度除以2。

对于你的X,你需要将边数除以3,而儿童位置的偏移量用单位平方尺寸的两倍来描述。

请注意,程序中存在故意错误:在三角形的情况下,它会从起点两次抽出几代。

open System.Drawing
open System.Windows.Forms

let genLoops depth scale extent figure startPt =
    let offsets dist (x, y) =
        List.map (fun (ox, oy) ->
            x + ox * dist, y + oy * dist )
    let rec aux n size pt =
        if n = 0 then
            match offsets (size / extent) pt figure with
            | [] -> invalidOp "Empty figure"
            | p::ps -> [p::ps @ [p]]
        else
            pt::offsets (size / scale) pt figure
            |> List.collect (aux (n - 1) (size / scale))
    aux depth 1. startPt

type MyForm(loops) as this =
    inherit Form()
    let bm() = new Bitmap(this.ClientSize.Width, this.ClientSize.Height)
    let mutable bitmap = bm()
    let mapToPoint(x, y) =
        Point(int(x * float(bitmap.Width - 1)),
              int(y * float(bitmap.Height - 1)) )
    override me.OnResize _ =
        bitmap <- bm()
        me.Invalidate()
    override __.OnPaint arg =
        let g = arg.Graphics
        g.Clear Color.White
        for loop in loops do
            Seq.map mapToPoint loop
            |> Seq.pairwise
            |> Seq.iter (fun (p0, p1) ->
                g.DrawLine (new Pen(Color.Black), p0, p1) )
        g.DrawImage(bitmap, 0, 0)

let triangle = [0., 0.; -0.5, 1.; 0.5, 1.]
(new MyForm(genLoops 5 2. 1. triangle (0.5, 0.))).Show()