ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1789|回复: 3

[原创] 玩一玩简单的分形:分形树

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-1-10 19:26 | 显示全部楼层 |阅读模式
图如下:
1.jpg


2.jpg


3.jpg


4.jpg


6.jpg


原理如下:
b.jpg

(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)。

代码如下:
  1. Option Explicit
  2. Public Sub FX_s()
  3.     Dim X#, Y#, p, i&, j&, ds&, sjd#(), n%, r#
  4.     Dim a11#(), a12#(), a21#(), a22#(), b11#(), b21#()
  5.     n = Range("k2").Value
  6.     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)
  7.     For i = 1 To n
  8.         a11(i) = Cells(2 + (i - 1) * 4, 3).Value
  9.         a12(i) = Cells(2 + (i - 1) * 4, 4).Value
  10.         a21(i) = Cells(3 + (i - 1) * 4, 3).Value
  11.         a22(i) = Cells(3 + (i - 1) * 4, 4).Value
  12.         b11(i) = Cells(2 + (i - 1) * 4, 7).Value
  13.         b21(i) = Cells(3 + (i - 1) * 4, 7).Value
  14.     Next i
  15.     Range("m2").Resize(1000000, 3).ClearContents
  16.     p = Range("k11").Resize(n).Value
  17.     For i = UBound(p, 1) To LBound(p, 1) + 1 Step -1
  18.         For j = 1 To i - 1
  19.             p(i, 1) = p(i, 1) + p(j, 1)
  20.         Next j
  21.     Next i
  22.     Randomize
  23.     ds = Range("k3").Value
  24.     X = Range("k5").Value
  25.     Y = Range("k6").Value
  26.     ReDim sjd#(1 To ds, 1 To 3)
  27.     For i = 1 To ds
  28.         r = Rnd()
  29.         For j = 1 To n
  30.             If r < p(j, 1) Then Exit For
  31.         Next j
  32.         sjd(i, 1) = j
  33.         sjd(i, 2) = a11(j) * X + a12(j) * Y + b11(j)
  34.         sjd(i, 3) = a21(j) * X + a22(j) * Y + b21(j)
  35.         X = sjd(i, 2)
  36.         Y = sjd(i, 3)
  37.     Next i
  38.     Range("m2").Resize(ds, 3).Value = sjd
  39. End Sub
复制代码


这次向通用方向改了下,反而短了。

附件如下:

分形树.zip (329.57 KB, 下载次数: 30)

想来,那些发现“特定变换参数”的人,真是生猛!

评分

3

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-1-10 20:12 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2020-1-10 20:18 | 显示全部楼层
厉害!论坛里还有一位大神在分形方面做的很牛塔!

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-3-23 19:28 | 显示全部楼层
老师,你好
我有的数据改成数组,改编后,47行,出现下标越界,请帮我看看是哪里有问题。如果使用数组,怎么改,谢谢。

  1. Option Explicit

  2. Public Sub FX_s()
  3.     Dim X#, Y#, i&, j&, ds&, sjd#(), n%, r#
  4.     Dim a11#(), a12#(), a21#(), a22#(), b11#(), b21#()
  5.     n = 6 'Range("k2").Value
  6.     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)
  7.     For i = 1 To n
  8.         a11(i) = Cells(2 + (i - 1) * 4, 3).Value
  9.         a12(i) = Cells(2 + (i - 1) * 4, 4).Value
  10.         a21(i) = Cells(3 + (i - 1) * 4, 3).Value
  11.         a22(i) = Cells(3 + (i - 1) * 4, 4).Value
  12.         b11(i) = Cells(2 + (i - 1) * 4, 7).Value
  13.         b21(i) = Cells(3 + (i - 1) * 4, 7).Value
  14.     Next i
  15.     a11(1) = 0: a11(2) = -0.05: a11(3) = 0.46: a11(4) = 0.47: a11(5) = 0.43: a11(6) = 0.42
  16.     a12(1) = 0: a12(2) = 0: a12(3) = -0.15: a12(4) = -0.15: a12(5) = 0.28: a12(6) = 0.26
  17.     a21(1) = 0: a21(2) = -0.5: a21(3) = 0.39: a21(4) = 0.17: a21(5) = -0.25: a21(6) = -0.35
  18.     a22(1) = 0.6: a22(2) = 0: a22(3) = 0.38: a22(4) = 0.42: a22(5) = 0.45: a22(6) = 0.31
  19.     b11(1) = 0.55: b11(2) = 0.525: b11(3) = 0.27: b11(4) = 0.265: b11(5) = 0.285: b11(6) = 0.29
  20.     b21(1) = 0: b21(2) = 0.75: b21(3) = 0.105: b21(4) = 0.465: b21(5) = 0.625: b21(6) = 0.525
  21.     Range("m2").Resize(1000000, 3).ClearContents
  22.     Dim p(6, 1) As Integer
  23.     'p = Range("k11").Resize(n).Value
  24.     p(1, 1) = 0.1: p(2, 1) = 0.1: p(3, 1) = 0.2: p(4, 1) = 0.2: p(5, 1) = 0.2: p(6, 1) = 0.2
  25.     For i = UBound(p, 1) To LBound(p, 1) + 1 Step -1
  26.         For j = 1 To i - 1
  27.             p(i, 1) = p(i, 1) + p(j, 1)
  28.         Next j
  29.     Next i
  30.     Randomize
  31.     'ds = Range("k3").Value
  32.     'X = Range("k5").Value
  33.     'Y = Range("k6").Value
  34.     ds = 5000: X = 0: Y = 0
  35.     ReDim sjd#(1 To ds, 1 To 3)
  36.     For i = 1 To ds
  37.         r = Rnd()
  38.         For j = 1 To n
  39.             If r < p(j, 1) Then Exit For
  40.         Next j
  41.         sjd(i, 1) = j
  42.         sjd(i, 2) = a11(j) * X + a12(j) * Y + b11(j)
  43.         sjd(i, 3) = a21(j) * X + a22(j) * Y + b21(j)
  44.         X = sjd(i, 2)
  45.         Y = sjd(i, 3)
  46.     Next i
  47.     Range("m2").Resize(ds, 3).Value = sjd
  48. End Sub
复制代码

麻烦老师了。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-25 16:49 , Processed in 0.038645 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表