Python画一棵茂盛的分形树

news2024/9/23 9:31:03

文章目录

    • 前情回顾
    • 添加分岔
    • 茂盛的分形树

前情回顾

上次画了一棵分形树:用Python画一棵分形树,得到的图如下

在这里插入图片描述

发现看的人还是挺多的,但没什么人点赞,这说明我能给大家画分形树,大家很高兴,但这棵树太秃了,大家不喜欢。

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

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

添加分岔

如想让分形树变得茂盛,第一步就是让树枝多一些分岔点,如果仍旧以线段为骨架,那么树枝将不在端点分岔,而在某个位置分岔。

不过无论如何变化,作为骨架的线段类是不会变的,变的是分岔方法,即getChild

import numpy as np
rand = lambda r : 1 + r*(np.random.rand()-0.5)

class segment:
    def __init__(self, st, th, L):
        self.st = np.array(st)
        self.th = th
        self.L = L
        self.setEd()
    def setEd(self):
        x, y = self.st
        th = np.deg2rad(self.th)
        dx = self.L*np.cos(th)
        dy = self.L*np.sin(th)
        self.ed = np.array([x+dx, y+dy])
    def getAxis(self):
        xs = (self.st[0], self.ed[0])
        ys = (self.st[1], self.ed[1])
        return (xs, ys)
    # dL表示树枝生长的位置
    def getChild(self, dTh, L, dL):
        st = (1-dL)*self.st + dL*self.ed
        return segment(st, self.th+dTh, L)

接下来更改分形逻辑,由于这次的getChild一次只产生一个子线段,所以在分形逻辑中,需要将生成子线段的个数也考虑进去。

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

然后写测试和绘图代码

from itertools import chain
import matplotlib.pyplot as plt
segs = fractal(10, 1, 0.7, 0.7, 15, 90, rL=1, rTh=1)

def drawSegs(segs):
    segs = list(chain(*segs))
    pts = np.array([s.ed for s in segs])
    for seg in segs:
        xs, ys = seg.getAxis()
        test = 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()

得到如图所示,发现,从观感上来说,貌似比之前更秃了

在这里插入图片描述

茂盛的分形树

为了摆脱这种尴尬的局面,第一步就是在树干的正前方添加一根树枝,即在fractal中的for循环里,添加一个

segs[-1].append(seg.getChild(0, L*rand(rL), 0.7))

然后再生成,绘图

segs = fractal(10, 1, 0.7, 0.7, 15, 90, rL=1, rTh=1)
drawSegs(segs)

最后得到的树如下图所示,枝繁叶茂了许多

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/98652.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]Python计算机毕业设计调查问卷及调查数据统计系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

在Ubuntu上搭建Nexus服务

介绍 Nexus:Nexus 是一个强大的 Maven 仓库管理器,它极大地简化了自己内部仓库的维护和外部仓库的访问。如Android远程仓库依赖,Java服务端应用程序依赖等,都很方便。 Docker方式 准备 ubuntu上已经安装docker,docker安…

20221218解决在Ubuntu18.04下编译Firefly的Core-3588J出现lz4的问题

20221218解决在Ubuntu18.04下编译Firefly的Core-3588J出现lz4的问题 2022/12/18 15:37 解决方法:编译最新的lz4的dev分支! https://wiki.t-firefly.com/zh_CN/Core-3588J/android_compile_android12.0_firmware.html Core-3588J产品规格书 3. 编译 Andro…

Bootstrap5 小工具

Bootstrap 5 提供了很多有用的类来帮组我们快速实现效果&#xff0c;不需要重复写一些 CSS 代码。 背景颜色 设置不同元素的背景颜色时&#xff0c;需要通过 .text-* 类来设置匹配的文本颜色&#xff1a; 实例 <div class"p-3 mb-2 bg-primary text-white">.…

跟老韩学JAVA——IDEA基本使用和快捷键

1. IDEA介绍 2.IDEA下载和安装 这个博主的下载安装介绍的很详细了&#xff0c;我就不过多介绍了 3.IDEA的基本使用 1&#xff09;修改字体大小 File -> Settings -> Editor -> Font -> Size 2)修改字体变粗 3)修改背景颜色 4) 修改菜单栏字体大小 5&#xff…

滑动窗口思想练习题

文章目录1. 找到字符串中所有字母异位词做法一&#xff1a;采用两个数组分别记录字符出现频次做法二&#xff1a;采用diff记录s和p字符串中字符的频次差2. 串联所有单词的子串个人理解&#xff0c;如有异议&#xff0c;欢迎指正&#xff01;1. 找到字符串中所有字母异位词 题目…

XiaoMi手机MIX 2S线刷固件和刷入Recovery

mix 2s 固件下载地址 https://web.vip.miui.com/page/info/mio/mio/detail?postId4865868&app_versiondev.20051 miflash线刷工具下载地址 https://miuiver.com/miflash/ 安装miflash线刷工具 点击安装驱动 打开miflash 手机关机按音量下加开机键进入bootloader&#xf…

Spring boot整合rocketmq(windows)

目录 1.环境搭建 2.命名服务器和业务服务器的启动 3.名词说明 4.执行步骤 5.示例 1.导入依赖 2.配置(至少指定下面两个) 3.代码 6.常见问题 1.环境搭建 下载地址&#xff1a;https://rocketmq.apache.org/解压缩进行安装&#xff0c;默认服务端口&#xff1a;9876 环…

执行 select ... for update 语句,如果查询条件没有索引字段的话,是加行锁还是加表锁?

大家好&#xff0c;我是小林。 昨天在群里看到大家在讨论一个 MySQL 锁的问题&#xff0c;就是执行 select … for update 语句&#xff0c;如果查询条件没有索引字段的话&#xff0c;是加「行锁」还是加「表锁」&#xff1f; 如果你做过这个实验的话&#xff0c;你会发现执行…

数据结构刷题训练营1

开启蓝桥杯备战计划&#xff0c;每日练习算法一题&#xff01;&#xff01;坚持下去&#xff0c;想必下一年的蓝桥杯将会有你&#xff01;&#xff01; 笔者是在力扣上面进行的刷题&#xff01;&#xff01;由于是第一次刷题&#xff01;找到的题目也不咋样&#xff01;所以&a…

SPRING-了解3-注解

IOC容器操作Bean 注解格式&#xff1a;注解名称(属性名称属性值,属性名称属性值) 放在类&#xff0c;方法&#xff0c;属性都可以 目的&#xff1a;简化XML配置 对象创建四大注解 1&#xff09;用的位置不是强制的 Component 最普通 Service 用在service层 Controlle…

接口测试(十)—— telnet和python代码测试dubbo接口

目录 一、传智健康项目介绍 1、项目描述 2、目标用户群体 3、项目模块 4、系统框架 二、Dubbo接口测试 1、RPC 2、Dubbo 3、查阅API文档 三、Telnet工具远程调用 1、启用telnet 2、telnet远程连接服务 3、telnet调用服务接口 四、python借助dubbo远程调用 1、安…

MySQL~JDBC

10、JDBC&#xff08;重点&#xff09; 10.1、数据库驱动 驱动&#xff1a;声卡、显卡、数据库 我们的程序会通过 数据库 驱动&#xff0c;和数据库打交道&#xff01; 10.2、JDBC SUN公司为了简化 开发人员的&#xff08;对数据库的统一&#xff09;操作&#xff0c;提供了…

剑指offer常见题 - 链表问题(一)

二叉树相关算法 链表相关知识点&#xff1a; 链表是一种物理存储单元上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 知识点一&#xff1a;链表由一系列结点&#xff08;链表中每一个元素称为结点&#xff09;组成&#xff0c;…

IDEA中如何使用Vim?看完本教程,让你用IDEA用到爽~(建议收藏)

目录 前言 Vim有什么特点&#xff1f; 为什么我要安利你在 IEAD 中使用Vim? Vim 一、环境配置 二、Vim的使用 2.1、方向键 hjkl 2.2、​编辑复制&粘贴 2.3、选择代码块并删除 2.4、块级删除 2.5、各种插入模式 2.5.1、以下是gif演示 2.6、jump&#xff08;解放鼠…

毕业设计 stm32智能电子秤系统 - 物联网 嵌入式 单片机

文章目录0 前言1 简介2 主要器件3 实现效果4 设计原理4.1 STM32F103C8T64.2 HX711压力传感器5 部分核心代码6 最后0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&…

【OpenCV】Ubuntu配置OpenCV环境

1.从官网下载opencv包拷贝到虚拟机Ubuntu中&#xff0c; 虚拟机与主机传输文件可以采用 vmware tool、共享文件夹或者远程连接工具 2.解压得到对应版本号文件夹&#xff0c;我的是opencv-3.4.2 3.修改文件权限chmod -R 777 opencv-3.4.2 从win10进入Ubuntu中的文件压缩包解…

2022年云南省—信息安全管理与评估赛项竞赛规程

2022年云南省职业院校技能大赛 信息安全管理与评估赛项竞赛规程 一、赛项名称 赛项编号&#xff1a;No.11 赛项名称&#xff1a;信息安全管理与评估 英语翻译&#xff1a;Information Security Management and Evaluation 赛项组别&#xff1a;高职组 赛项归属产业&a…

本周大新闻|John Carmack从Meta离职,OPPO发布双目AR一体机仅38g

本周大新闻&#xff0c;AR方面&#xff0c;微软已向客户承诺新款HoloLens&#xff1b;NASA成立Joint AR项目&#xff0c;计划在宇航服头盔中加入AR功能&#xff1b;OPPO Air Glass 2发布&#xff0c;双目光波导仅38g&#xff1b;Rokid开设全球首家品牌旗舰店&#xff1b;谷歌为…

【数据结构】二叉树的节点总个数、叶子节点个数、第K层节点个数、二叉树的深度

目录 1.结点总个数 1.1 局部静态变量法 思维 代码 不足之处 2.传指针法 程序代码 3.递归法 思想 程序代码 详细过程 2.叶子节点个数 思想 程序代码 3.第K层节点个数 思想 程序代码 4.二叉树深度 思想 程序代码 求二叉树节点总个数、叶子节点个数、第k层节点…