ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-1-12 19:56 | 显示全部楼层 |阅读模式
本帖最后由 aoe1981 于 2020-1-12 20:51 编辑

本来是这样:
1.jpg

参数是这样:

11.jpg

又或者是这样:

2.jpg


参数折腾成这样:

21.jpg


然而还可以这样:

3.jpg


参数如下:

31.jpg


再或者继续折腾:

5.jpg


参数又成了这样:

51.jpg


或许还能更疯狂:

4.jpg


参数又成了:

41.jpg

这就是我做的“二叉分形树”。
代码如下:


  1. Option Explicit
  2. Public Sub FX_ecs()
  3.     Dim DD0(), DDi(), m&, n&, ni&, i&, j&, csjd0#(), csjdi#(), jd1#, jd2#, cd#, bl#, sz(), gd
  4.     ReDim csjd0#(1 To 3)
  5.     DD0 = Range("b2:c4").Value
  6.     csjd0(2) = Range("c5").Value
  7.     jd1 = Range("c6").Value
  8.     jd2 = Range("c7").Value
  9.     cd = Range("b9").Value
  10.     bl = Range("b10").Value
  11.     m = Range("b12").Value
  12.     sz = Range("b24:c36").Value
  13.     n = 0
  14.     Range("e2").Resize(20000, 26).ClearContents
  15.     Range("e2").Offset(, 2 * n).Resize(3 * 2 ^ n, 2).Value = DD0
  16.     Application.ScreenUpdating = False
  17.     gd = Split(sz(1, 2), ",")
  18.     Sht1.Unprotect
  19.     Sht1.ChartObjects("图表 3").Activate
  20.     With ActiveChart.FullSeriesCollection(1).Format.Line
  21.         .Weight = sz(1, 1)
  22.         .ForeColor.RGB = RGB(gd(0), gd(1), gd(2))
  23.     End With
  24.     Range("d1").Select
  25.     Application.ScreenUpdating = True
  26.     If Range("d20").Value = "是" Then GFTB: Sht1.Unprotect
  27.     Delay (Range("b13").Value)
  28.     For i = 1 To m
  29.         n = 2 ^ (i - 1)
  30.         ni = 3 * 2 ^ i
  31.         ReDim DDi(1 To ni, 1 To 2), csjdi#(1 To ni)
  32.         cd = cd * bl
  33.         For j = 1 To n
  34.             DDi(6 * (j - 1) + 1, 1) = DD0(3 * (j - 1) + 2, 1)
  35.             DDi(6 * (j - 1) + 1, 2) = DD0(3 * (j - 1) + 2, 2)
  36.             csjdi(6 * (j - 1) + 2) = csjd0(3 * (j - 1) + 2) + jd1
  37.             DDi(6 * (j - 1) + 2, 1) = DD0(3 * (j - 1) + 2, 1) + cd * Cos(csjdi(6 * (j - 1) + 2))
  38.             DDi(6 * (j - 1) + 2, 2) = DD0(3 * (j - 1) + 2, 2) + cd * Sin(csjdi(6 * (j - 1) + 2))
  39.             DDi(6 * (j - 1) + 4, 1) = DD0(3 * (j - 1) + 2, 1)
  40.             DDi(6 * (j - 1) + 4, 2) = DD0(3 * (j - 1) + 2, 2)
  41.             csjdi(6 * (j - 1) + 5) = csjd0(3 * (j - 1) + 2) - jd2
  42.             DDi(6 * (j - 1) + 5, 1) = DD0(3 * (j - 1) + 2, 1) + cd * Cos(csjdi(6 * (j - 1) + 5))
  43.             DDi(6 * (j - 1) + 5, 2) = DD0(3 * (j - 1) + 2, 2) + cd * Sin(csjdi(6 * (j - 1) + 5))
  44.         Next j
  45.         DD0 = DDi
  46.         csjd0 = csjdi
  47.         Range("e2").Offset(, 2 * i).Resize(3 * 2 ^ i, 2).Value = DDi
  48.         Application.ScreenUpdating = False
  49.         gd = Split(sz(i + 1, 2), ",")
  50.         Sht1.ChartObjects("图表 3").Activate
  51.         With ActiveChart.FullSeriesCollection(i + 1).Format.Line
  52.             .Weight = sz(i + 1, 1)
  53.             .ForeColor.RGB = RGB(gd(0), gd(1), gd(2))
  54.         End With
  55.         Range("d1").Select
  56.         Application.ScreenUpdating = True
  57.         If Range("d20").Value = "是" Then GFTB: Sht1.Unprotect
  58.         Delay (Range("b13").Value)
  59.     Next i
  60.     Sht1.Protect
  61. End Sub
  62. Public Sub GFTB()
  63.     Application.ScreenUpdating = False
  64.     Sht1.Unprotect
  65.     Sht1.ChartObjects("图表 3").Activate
  66.     With ActiveChart
  67.         .Axes(xlValue).MinimumScale = Range("c17").Value
  68.         .Axes(xlValue).MaximumScale = Range("d17").Value
  69.         .Axes(xlValue).MajorUnit = Range("b20").Value
  70.         .Axes(xlCategory).MinimumScale = Range("a17").Value
  71.         .Axes(xlCategory).MaximumScale = Range("b17").Value
  72.         .Axes(xlCategory).MajorUnit = Range("b20").Value
  73.     End With
  74.     Range("d1").Select
  75.     Sht1.Protect
  76.     Application.ScreenUpdating = True
  77. End Sub
  78. Public Sub Delay(T As Single) '延时
  79.     Dim time1!, time2!
  80.     time1 = Timer()
  81.     Do
  82.         DoEvents
  83.         time2 = Timer() - time1
  84.         If time2 < 0 Then time2 = time2 + 86400
  85.     Loop While time2 < T
  86. End Sub
复制代码


附件如下:

二叉分形树.zip (854.48 KB, 下载次数: 81)

原理及附件中的其他特点,容后介绍。

点评

兄弟你玩的越来越高深了  发表于 2020-1-15 07:39

评分

6

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-1-12 20:07 | 显示全部楼层
主楼附件其实还有一些作用,就是:关于VBA中56种颜色代码。

这个问题受以下两帖帮助:

1.
56种颜色和数字值对照表
http://club.excelhome.net/thread-927286-1-1.html
(出处: ExcelHome技术论坛)



2.
EXCEL  VBA中的颜色代码
http://club.excelhome.net/thread-326227-1-1.html
(出处: ExcelHome技术论坛)


以下为帖2的18楼链接:
http://club.excelhome.net/forum. ... 227&pid=5095299

我改做成了下面的代码:

  1. Option Explicit
  2. Sub ColNum()
  3.     Dim i%, ColName_C(), ColName_E()
  4.     ColName_C = Array("黑色", "白色", "红色", "鲜绿色", "蓝色", "黄色", "粉红色", "青绿色", "深红色", "绿色", "深蓝色", "深黄色", "紫罗兰", "青色", "灰-25%", "灰-50%", "海螺色", "梅红色", "象牙色", "浅青绿", "深紫色", "珊瑚红", "海蓝色", "冰蓝", "深蓝色", "粉红色", "黄色", "青绿色", "紫罗兰", "深红色", "青色", "蓝色", "天蓝色", "浅青绿", "浅绿色", "浅黄色", "淡蓝色", "玫瑰红", "淡紫色", "茶色", "浅蓝色", "水绿色", "酸橙色", "金色", "浅橙色", "橙色", "蓝-灰", "灰-40%", "深青", "海绿", "深绿", "橄榄色", "褐色", "梅红色", "靛蓝", "灰-80%")
  5.     ColName_E = Array("Black", "White", "Red", "Bright Green", "Blue", "Yellow", "Pink", "Turquoise", "Dark Red", "Green", "Dark Blue", "Dark Yellow", "Violet", "Teal", "Gray-25%", "Gray-50%", "Periwinkle", "Plum+", "Ivory", "Lite Turquoise", "Dark Purple", "Coral", "Ocean Blue", "Ice Blue", "Dark Blue+", "Pink+", "Yellow+", "Turquoise+", "Violet+", "Dark Red+", "Teal+", "Blue+", "Sky Blue", "Light Turquoise", "Light Green", "Light Yellow", "Pale Blue", "Rose", "Lavender", "Tan", "Light Blue", "Aqua", "Lime", "Gold", "Light Orange", "Orange", "Blue-Gray", "Gray-40%", "Dark Teal", "Sea Green", "Dark Green", "Olive Green", "Brown", "Plum", "Indigo", "Gray-80%")
  6.     With Sht2
  7.         .Range("A1:D1").Value = Array("颜色显示", "颜色名", "数字值", "英文名")
  8.         For i = 1 To 56
  9.             .Cells(i + 1, 1).Interior.ColorIndex = i
  10.             .Cells(i + 1, 2) = ColName_C(i - 1)
  11.             .Cells(i + 1, 3) = i
  12.             .Cells(i + 1, 4) = ColName_E(i - 1)
  13.         Next i
  14.     End With
  15. End Sub
  16. Sub GetRGB()
  17.     Dim i&, C&, R&, G&, B&
  18.     With Sht2
  19.         .Range("e1").Value = "RGB值"
  20.         For i = 2 To 2000
  21.             If .Range("A" & i).Interior.ColorIndex = xlNone Then Exit For
  22.             C = .Range("A" & i).Interior.Color
  23.             R = C Mod 256
  24.             G = (C - R) / 256 Mod 256
  25.             B = (C - R - G * 256) / 256 ^ 2
  26.             .Cells(i, "E").Value = "'" & R & "," & G & "," & B
  27.         Next i
  28.     End With
  29. End Sub
复制代码



做出的效果如下图:

a1.jpg

a2.jpg

这个有时候还是很有用的,在此,对上面两个帖子的作者表示敬意和感谢。

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-1-12 20:28 | 显示全部楼层
本楼备注核心原理如下:

设有线段AB,其中:A为出发点,B为终止点。
令:
A(a,b)
B(c,d)
线段AB的初始角度为:csjd0
线段AB的长度为:cd
分枝递减比例为:bl

左杈角度:θ1
右杈角度:θ2
设:
左杈生长节点为:C(x1,y1)
右杈生长节点为:D(x2,y2)

则有:
(1)左杈生长节点:C(x1,y1)
x1=cd*bl*cos(csjd0+θ1)+c
y1=cd*bl*sin(csjd0+θ1)+d

(2)右杈生长节点:D(x2,y2)
x2=cd*bl*cos(csjd0-θ2)+c
y2=cd*bl*sin(csjd0-θ2)+d

然后反复迭代“生长节点”为新的线段“终止点”,并同时迭代记录各自分枝新的初始角度:csjdi。




基本数学知识如下图:

b.jpg


这些基础知识发挥了很大的作用。

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-1-12 20:53 | 显示全部楼层
进一步胡乱折腾,出来了一个怪图,谁能想到这是“二叉分形树”!

图如下:

6.jpg


参数设置如下:

61.jpg


说不定,进一步折腾还有更多惊奇。

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-1-12 22:02 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
再看看这一组:

7.jpg

71.jpg

够折腾。

TA的精华主题

TA的得分主题

发表于 2020-1-13 09:20 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2020-1-13 09:32 | 显示全部楼层
后排膜拜大神。VBA  完全不懂。 数学也不好。从来不及格。
点赞。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-1-13 17:13 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
思路与数学的结合!
高手,佩服!膜拜!

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-1-13 17:21 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2020-1-13 18:13 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

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

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

GMT+8, 2024-4-19 11:41 , Processed in 0.055893 second(s), 20 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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