|
图如下:
原理如下:
(1)6个仿射变换,按指定概率随机选择:
仿射变换1:
X1 = 0 0 X + 0.55
Y1 0 0.6 Y 0
仿射变换2:
X1 = -0.05 0 X + 0.525
Y1 -0.5 0 Y 0.75
仿射变换3:
X1 = 0.46 -0.15 X + 0.27
Y1 0.39 0.38 Y 0.105
仿射变换4:
X1 = 0.47 -0.15 X + 0.265
Y1 0.17 0.42 Y 0.465
仿射变换5:
X1 = 0.43 0.28 X + 0.285
Y1 -0.25 0.45 Y 0.625
仿射变换6:
X1 = 0.42 0.26 X + 0.29
Y1 -0.35 0.31 Y 0.525
(2)初始点:(X,Y),变换点:(X1,Y1);
(3)迭代至指定次数:(X1,Y1)→(X,Y)。
代码如下:
- Option Explicit
- Public Sub FX_s()
- Dim X#, Y#, p, i&, j&, ds&, sjd#(), n%, r#
- Dim a11#(), a12#(), a21#(), a22#(), b11#(), b21#()
- n = Range("k2").Value
- ReDim a11#(1 To n), a12#(1 To n), a21#(1 To n), a22#(1 To n), b11#(1 To n), b21#(1 To n)
- For i = 1 To n
- a11(i) = Cells(2 + (i - 1) * 4, 3).Value
- a12(i) = Cells(2 + (i - 1) * 4, 4).Value
- a21(i) = Cells(3 + (i - 1) * 4, 3).Value
- a22(i) = Cells(3 + (i - 1) * 4, 4).Value
- b11(i) = Cells(2 + (i - 1) * 4, 7).Value
- b21(i) = Cells(3 + (i - 1) * 4, 7).Value
- Next i
- Range("m2").Resize(1000000, 3).ClearContents
- p = Range("k11").Resize(n).Value
- For i = UBound(p, 1) To LBound(p, 1) + 1 Step -1
- For j = 1 To i - 1
- p(i, 1) = p(i, 1) + p(j, 1)
- Next j
- Next i
- Randomize
- ds = Range("k3").Value
- X = Range("k5").Value
- Y = Range("k6").Value
- ReDim sjd#(1 To ds, 1 To 3)
- For i = 1 To ds
- r = Rnd()
- For j = 1 To n
- If r < p(j, 1) Then Exit For
- Next j
- sjd(i, 1) = j
- sjd(i, 2) = a11(j) * X + a12(j) * Y + b11(j)
- sjd(i, 3) = a21(j) * X + a22(j) * Y + b21(j)
- X = sjd(i, 2)
- Y = sjd(i, 3)
- Next i
- Range("m2").Resize(ds, 3).Value = sjd
- End Sub
复制代码
这次向通用方向改了下,反而短了。
附件如下:
分形树.zip
(329.57 KB, 下载次数: 30)
想来,那些发现“特定变换参数”的人,真是生猛!
|
评分
-
3
查看全部评分
-
|