文章目录

  • 画一棵分形树
  • 加入随机量的分形树
  • 加入点缀的圣诞树

画一棵分形树

分形树,就是用分形的逻辑去画一棵树,所谓分形,若从编程的角度去理解,其实就是简单规则的反复迭代。

例如,现在有一条线段,长为LLL,在这个线段的端点处再画两个线段,每个线段的长度为23L\frac23L32​L,与前一个线段的夹角为±10°\pm 10°±10°,将这个规则不断进行下去,直到线段长度小于δ\deltaδ。

接下来,先做一个线段的类

import numpy as np
class segment:def __init__(self, st, th, L):self.st = stself.th = thself.L = Lself.setEd()def setEd(self):x, y = self.stth = np.deg2rad(self.th)dx = self.L*np.cos(th)dy = self.L*np.sin(th)self.ed = (x+dx, y+dy)def getAxis(self):xs = (self.st[0], self.ed[0])ys = (self.st[1], self.ed[1])return (xs, ys)def getChild(self, dTh, L):ths = [self.th + dTh, self.th-dTh]return [segment(self.ed, th, L) for th in ths]

其中setEd用于设置线段的终点;getChild通过给定夹角和线段长度比例,得到连接在当前线段端点处的另外两个线段。

然后,实现分形树的迭代逻辑。由于分形树存在一个代际的关系,所以从组织上来看,可以将分形树写成多个代的列表。

def fractal(L, minL, dL, dTh=15, th0=90):segs = [[segment((0,0), th0, L)]]while L > minL:L *= dLsegs.append([])for seg in segs[-2]:segs[-1] += seg.getChild(dTh, L)return segssegs = fractal(10, 2, 0.8, 10, 90)

接下来,把这棵分形树画出来

from itertools import chain
import matplotlib.pyplot as plt
segs = list(chain(*segs))
for seg in segs:xs, ys = seg.getAxis()plt.plot(xs, ys, color='green')plt.show()

效果如图所示

这棵树要说有什么问题,就是过于死板了,正常的树肯定不会长得这么标致。

加入随机量的分形树

如果让segment在生成子线段的时候,加上一点随机性,效果可能会更好

# 修改segment中的getChild
rand = lambda r : 1 + r*(np.random.rand()-0.5)
def getChild(self, dTh, L, rL=None, rTh=None):if type(L) != list:L = [L, L]if type(dTh) != list:dTh = [dTh, -dTh]if rL:L = [iL*rand(rL) for iL in L]if rTh:dTh = [iTh*rand(rTh) for iTh in dTh]return [segment(self.ed, self.th+dTh[i], L[i])for i in range(len(L))]

相应地,分形逻辑改写为

def fractal(L, minL, dL, dTh=15, th0=90, rL=0.1, rTh=0.1):segs = [[segment((0,0), th0, L)]]while L > minL:L *= dLsegs.append([])for seg in segs[-2]:segs[-1] += seg.getChild(dTh, L, rL, rTh)return segs

最后画图

segs = fractal(10, 1, 0.75, 15, 90, rL=0.5, rTh=0.5)
segs = list(chain(*segs))
for seg in segs:xs, ys = seg.getAxis()plt.plot(xs, ys, color='green')plt.axis("off")
plt.show()

加入点缀的圣诞树

如果觉得这棵树空荡荡地不好看,那么可以在树枝的末端添加一些点缀

segs = fractal(10, 1.5, 0.75, 15, 90, rL=0.5, rTh=0.5)
pts = np.array([s.ed for s in segs[-1]])
segs = list(chain(*segs))
for seg in segs:xs, ys = seg.getAxis()plt.plot(xs, ys, color='g', zorder=1)xs, ys = pts.T
N = len(xs)
colors = np.random.rand(N)
areas = (np.random.rand(N)*30)**2
plt.scatter(xs, ys, s=areas, c=colors, marker='*', alpha=0.8, zorder=2)plt.axis("off")
plt.show()

效果为

用Python画一棵分形树相关推荐

  1. Python画一棵茂盛的分形树

    文章目录 前情回顾 添加分岔 茂盛的分形树 前情回顾 上次画了一棵分形树:用Python画一棵分形树,得到的图如下 发现看的人还是挺多的,但没什么人点赞,这说明我能给大家画分形树,大家很高兴,但这棵树 ...

  2. 用python画动态樱花_利用python画一棵漂亮的樱花树,turtle画图代码大全,此处感谢知乎大佬小白...

    利用python画一棵漂亮的樱花树,turtle画图代码大全,此处感谢知乎大佬小白 此处感谢知乎大佬 小白练手 练习一下比较流行的turtle(海龟库) 画一棵漂亮的樱花树,效果如下: ps: 是动态 ...

  3. python樱花制作教程视频_大型Python视频资料,阿里巴巴推荐,用Python画一棵漂亮的樱花树...

    原标题:大型Python视频资料,阿里巴巴推荐,用Python画一棵漂亮的樱花树 对于初学者想更轻松的学好Python开发,爬虫技术,Python数据分析,人工智能等技术,这里也给大家准备了一套系统教 ...

  4. Python——画一棵漂亮的樱花树(不同种樱花+玫瑰+圣诞树喔

    原创 Python--画一棵漂亮的樱花树(不同种樱花+玫瑰+圣诞树喔) 2019-10-22 21:36:48 Soul fragments 阅读数 24878 文章标签: 樱花 python jav ...

  5. 用python画皇冠_【推荐】手把手教你如何用Python画一棵漂亮樱花树含源码

    最近给大家整理了一下,挑了一些我觉得不错的代码分享给大家手把手教你如何用Python画一棵漂亮樱花树含源码. 动态生成樱花 效果图(这个是动态的): import turtle as T import ...

  6. python画雪景_来自程序员的圣诞节浪漫-用Python画一棵带音乐的雪夜圣诞树

    本文我们用 Python 来画一棵带音乐效果的雪夜圣诞树,基本思路如下: 用 Python 画一棵圣诞树作为背景图 在圣诞树背景图中添加雪落效果及音乐 下面来看一下具体实现. 首先,我们来画一棵圣诞树 ...

  7. python画雪_用Python画一棵带音乐的雪夜圣诞树

    本文我们用 Python 来画一棵带音乐效果的雪夜圣诞树,基本思路如下:用 Python 画一棵圣诞树作为背景图 在圣诞树背景图中添加雪落效果及音乐 下面来看一下具体实现. 首先,我们来画一棵圣诞树, ...

  8. 来自程序员的圣诞节浪漫-用Python画一棵带音乐的雪夜圣诞树

    本文我们用 Python 来画一棵带音乐效果的雪夜圣诞树,基本思路如下: 用 Python 画一棵圣诞树作为背景图 在圣诞树背景图中添加雪落效果及音乐 下面来看一下具体实现. 首先,我们来画一棵圣诞树 ...

  9. 实践 - 使用Python画一棵递归分形树

    本实践中,作者要介绍用Python在Tkinter上画一棵树的方法.通过本实践,读者可以:练习面向对象的程序设计方法:了解生成器的使用方法:运用递归函数:了解Tkinter画图的基本方法:以及学习&q ...

最新文章

  1. 另一个.java文件调用_java - 如何调用另一个类“写文件”的方法? - SO中文参考 - www.soinside.com...
  2. mysql更新后返回主键,我需要在MYSQL中更新表后返回的受影响行的主键。
  3. RocketMQ源码解析:Filtersrv
  4. dotnet-httpie 0.2.0 Released
  5. jdk db版本_企业视频会议系统音视频通话EasyRTC-SFU版本研发中更合适的配置文件格式-TOML配置介绍 - TSINGSEE...
  6. IOS8模拟器设置中文输入
  7. 腾讯:干掉头条,先拿抖音开刀!
  8. 幼儿-综合素质【1】
  9. android web sevice,Web Service在Android开发中的应用研究
  10. 富士施乐m115b怎么连接电脑_富士施乐 Fuji Xerox DocuPrint M118w/M118z打印机无线连接设置详解...
  11. LeetCode刷题笔记一:(两数之和)
  12. U盘只读文件系统修复详解
  13. 【转】征集华人操作系统项目列表
  14. 因设计或者设施缺陷导致道路交通事故赔偿问题的法律依据
  15. 镜播无人直播带货教程,手把手教你如何搭建直播间
  16. android 拦截鼠标按键
  17. Taro使用Vue3踏坑日记:Module not found: Can‘t resolve ‘@vue/server-renderer‘ in ‘/Users/...‘
  18. python进行随机数据生成——Faker的使用
  19. 转一篇Decorator模式的讲解文章
  20. 以太网使用的CSMA/CD协议是以争用方式接入到共享信道的。这与传统的时分复用TDM相比优缺点如何?网络适配器的作用是什么?网络适配器工作在哪一层?假定1km长的CSMA/CD网络的数据率为1Gb/s

热门文章

  1. 用Scrapy爬取笔趣阁小说
  2. Android系统启动流程完整分析(一)
  3. Java高并发之魂:synchronized深度解析
  4. 关于汽油必须知道的11件事 可能是最全的油品全解
  5. 前端网页打印插件print.js
  6. 朋也社区 v5.2.0 更新,新增手机号,微信登录外加主题一套
  7. springboot后端数据校验以及异常处理
  8. 傻白入门芯片设计,wafer/die/chip/cell(一)
  9. 21河海大学计算机838复习经验
  10. 辉芒微IO单片机FT60F010A-URT