Recursion 在F中不同深度绘制X分形的算法#
以上是本文标题中提到的分形。我需要实现一个函数,该函数允许f#sharp使用辅助img#u Util模块在不同深度绘制分形。我被建议使用以下代码,允许在不同深度绘制sierpinski三角形作为模板:Recursion 在F中不同深度绘制X分形的算法#,recursion,f#,fractals,Recursion,F#,Fractals,以上是本文标题中提到的分形。我需要实现一个函数,该函数允许f#sharp使用辅助img#u Util模块在不同深度绘制分形。我被建议使用以下代码,允许在不同深度绘制sierpinski三角形作为模板: open ImgUtil let rec triangle bmp len (x,y) = if len < 33 then setBox red (x,y) (x+len,y+len) bmp else
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)
打开ImgUtil
让rec三角形bmp len(x,y)=
如果len<33,则
立根盒红色(x,y)(x+len,y+len)bmp
其他的
设一半=len/2
做三角形bmp对半(x+对半/2,y)
做三角形bmp对半(x,y+对半)
做三角形bmp对半(x+对半,y+对半)
运行SimpleApp“Sierpinski”600 600(有趣的bmp->三角形bmp 512)
(30,30)|>忽略)
但我尝试了很多不同的东西,以上面的作为模板。我试着在基本情况下画一个正方形。我也试着让基本情况可以说是一片雪花。我可以让递归为每个新深度绘制最里面的元素,但其他所有元素我都无法绘制。有人能帮我吗?给我解释一下算法 这里还有一个提示。对于Sierpiński三角形,从高度和宽度为单位长度的等腰三角形开始。这样我们就不必担心画图时画布的尺寸。对于每一代,将高度和宽度除以2 对于X,需要将边除以三,而子对象位置的偏移由单位正方形大小的两倍的图形描述 请注意,程序中有一个故意的bug:在三角形的情况下,它会两次绘制从起点发出的生成
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()
opensystem.Drawing
打开System.Windows.Forms
让genLoops深度比例范围图开始=
设偏移距离(x,y)=
List.map(乐趣(牛羊)->
x+ox*距离,y+oy*距离)
让rec aux n尺寸pt=
如果n=0,则
将偏移量(大小/范围)pt图形与
|[]->invalidOp“空图”
|p::ps->[p::ps@[p]]
其他的
pt::偏移量(尺寸/比例)pt图
|>列表.收集(辅助(n-1)(尺寸/比例))
辅助深度1。startPt
键入MyForm(loops),如下所示=
继承表单()
让bm()=新位图(this.ClientSize.Width,this.ClientSize.Height)
设可变位图=bm()
设mapToPoint(x,y)=
点(int(x*float(bitmap.Width-1)),
int(y*float(bitmap.Height-1)))
覆盖me.OnResize\u=
位图顺序成对
|>序列iter(乐趣(p0,p1)->
g、 抽绳(新钢笔(黑色),p0,p1)
g、 DrawImage(位图,0,0)
设三角形=[0,0.-0.5,1.-0.5,1.]
(新的MyForm(genloops2.1.triangle(0.5,0.)).Show()
这里有一个提示:Sierpinski三角形由3个自身大小为一半的副本组成(每个副本都有一些与原始位置相对应的偏移量)。看起来你的X是由5个副本组成的,每个副本的大小是三分之一。