Python 再说勾股树,这次整一棵五彩的任意“生长”的分形树!

简介: Python 再说勾股树,这次整一棵五彩的任意“生长”的分形树!

上一篇《Turtle库画一棵对称勾股树,美丽惊艳的分形世界!》中描绘了一棵对称的双色勾股树,详情见:


Python Turtle库画一棵对称勾股树,美丽惊艳的分形世界!_汉阳Hann's Home-CSDN博客  分形,具有以非整数维形式充填空间的形态特征。通常被定义为“一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”,即具有自相似的性质。分形(Fractal)一词,是芒德勃罗创造出来的,其原意具有不规则、支离破碎等意义。


1973年,芒德勃罗(B.B.Mandelbrot)在法兰西学院讲课时,首次提出了分维和分形的设想。  分形是一个数学术语,也是一套以分形特征为研究主题的数学理论。分形理论既是非线性科学的前沿和重要分支,又是一门新兴的横断学科,是研究一类现象特征的

新.https://blog.csdn.net/boysoft2002/article/details/120466255



修改一


简单的,加上一随机取色的函数,就能画出彩色树来。颜色取值方法有很多,常用的如下:

方法一:随机产生一个6位十六进制数

>>> from random import choice
>>> def rndColor():
    color,strColor = '#','0123456789ABCDEF'
    for _ in range(6):
        color += choice(strColor)
    return color
>>> print([rndColor() for _ in range(7)])
['#47922E', '#540621', '#AEA706', '#263CAC', '#2F346E', '#067BAC', '#4D295B']
>>> 


方法二:在给定预定义颜色单词中取值,颜色数相对少但也够用

>>> def rndColor():
    from random import choice
  colors = ('black', 'navy', 'darkblue', 'mediumblue', 'blue', 'darkgreen', 'green', 
'teal', 'darkcyan', 'deepskyblue', 'darkturquoise', 'mediumspringgreen', 'lime', 
'springgreen', 'aqua', 'cyan', 'midnightblue', 'dodgerblue', 'lightseagreen', 
'forestgreen', 'seagreen', 'darkslategray', 'limegreen', 'mediumseagreen', 'turquoise', 
'royalblue', 'steelblue', 'darkslateblue', 'mediumturquoise', 'indigo', 'darkolivegreen', 
'cadetblue', 'cornflowerblue', 'mediumaquamarine', 'dimgray', 'slateblue', 'olivedrab', 
'slategray', 'lightslategray', 'mediumslateblue', 'lawngreen', 'chartreuse', 
'aquamarine', 'maroon', 'purple', 'olive', 'gray', 'skyblue', 'lightskyblue', 
'blueviolet', 'darkred', 'darkmagenta', 'saddlebrown', 'darkseagreen', 'lightgreen', 
'mediumpurple', 'darkviolet', 'palegreen', 'darkorchid', 'yellowgreen', 'sienna', 
'brown', 'darkgray', 'lightblue', 'greenyellow', 'paleturquoise', 'lightsteelblue', 
'powderblue', 'firebrick', 'darkgoldenrod', 'mediumorchid', 'rosybrown', 'darkkhaki', 
'silver', 'mediumvioletred', 'indianred', 'peru', 'chocolate', 'tan', 'lightgray', 
'thistle', 'orchid', 'goldenrod', 'palevioletred', 'crimson', 'gainsboro', 'plum', 
'burlywood', 'lightcyan', 'lavender', 'darksalmon', 'violet', 'palegoldenrod', 
'lightcoral', 'khaki', 'aliceblue', 'honeydew', 'azure', 'wheat', 'beige', 'whitesmoke', 
'mintcream', 'ghostwhite', 'salmon', 'sandybrown', 'antiquewhite', 'linen', 
'lightgoldenrodyellow', 'oldlace', 'red', 'fuchsia', 'magenta', 'deeppink', 'orangered', 
'tomato', 'hotpink', 'coral', 'darkorange', 'lightsalmon', 'orange', 'lightpink', 
'pink', 'gold', 'peachpuff', 'navajowhite', 'moccasin', 'bisque', 'mistyrose', 
'blanchedalmond', 'papayawhip', 'lavenderblush', 'seashell', 'cornsilk', 'lemonchiffon', 
'floralwhite', 'snow', 'yellow', 'lightyellow', 'ivory', 'white')
  return choice(colors)
>>> print([rndColor() for _ in range(7)])
['whitesmoke', 'dodgerblue', 'sandybrown', 'wheat', 'mediumorchid', 'goldenrod', 'tan']
>>> print([rndColor() for _ in range(7)])
['darkblue', 'slateblue', 'aliceblue', 'salmon', 'seashell', 'darkgray', 'bisque']
>>> 


就用方法一来取色,上一篇中的对称勾股树经填色后,效果如下:



image.png


源代码如下,填色语句已用#号注释掉了(效果上图左上):

from turtle import *
from random import choice
def rndColor():
    color,strColor = '#','0123456789ABCDEF'
    for _ in range(6):
        color += choice(strColor)
    return color
def Square(self,length):
    self.color(rndColor())
    #self.begin_fill()
    for _ in range(5):
        self.forward(length)
        self.right(90)
    #self.end_fill()
def Triangle(self,length):
    self.color(rndColor())
    #self.begin_fill()
    self.left(45)
    self.forward(length/2**0.5)
    self.right(90)
    self.forward(length/2**0.5)
    self.right(135)
    self.forward(length)
    #self.end_fill()
def Move2Right(self,length):
    self.back(length)
    self.right(45)
    self.forward(length/2**0.5)
    self.right(90)
def Recursive(n, tracer, length):
    if n<1: return
    tracers = []
    for left in tracer:
        left.pencolor(rndColor())
        Square(left, length)
        Triangle(left, length)
        right = left.clone()
        left.right(45)
        Move2Right(right, length)
        tracers.append(left)
        tracers.append(right)
    Recursive(n-1, tracers, length/2**0.5)
def Setup(self, length, speed):
    self.hideturtle()
    self.speed(speed)
    self.penup()
    self.goto(-length*0.5, -length*1.8)
    self.seth(90)
    self.pensize(2)
    self.pendown()
def main(level, length, speed=-1):
    setup(800,600)
    title('Fractal Tree')
    if speed==-1: tracer(0)
    else: tracer(1)
    t = Turtle()
    Setup(t, length, speed)
    from time import sleep
    sleep(2)
    Recursive(level, list([t]), length)
    done()
    bye()
if __name__ == '__main__':
    main(9,135,-1)



修改二



左右偏向角都是45度勾股树就是对称的,那么角度指定从列表[i for i in range(5,86)]中抽取,勾股树的“树枝”就能任意角度生长了。参考网上的代码,增加了 onclick 事件,这样就可以反复观察效果。类似于 tkinter 库中用 .bind(<事件>,方法) 绑定函数来增加对象的事件动作,当然turtle窗口中也能使用bind方法(之后再作研究讨论)。经过修改后效果如下:



image.png



源代码如下:

import turtle
from random import choice
from math import sin,cos,radians
def rndColor(flag=True):
    colorTuple=(
        ('navy',                 '#000080'),
        ('darkblue',             '#00008B'),
        ('mediumblue',           '#0000CD'),
        ('blue',                 '#0000FF'),
        ('darkgreen',            '#006400'),
        ('green',                '#008000'),
        ('teal',                 '#008080'),
        ('darkcyan',             '#008B8B'),
        ('deepskyblue',          '#00BFFF'),
        ('darkturquoise',        '#00CED1'),
        ('mediumspringgreen',    '#00FA9A'),
        ('lime',                 '#00FF00'),
        ('springgreen',          '#00FF7F'),
        ('aqua',                 '#00FFFF'),
        ('cyan',                 '#00FFFF'),
        ('midnightblue',         '#191970'),
        ('dodgerblue',           '#1E90FF'),
        ('lightseagreen',        '#20B2AA'),
        ('forestgreen',          '#228B22'),
        ('seagreen',             '#2E8B57'),
        ('darkslategray',        '#2F4F4F'),
        ('limegreen',            '#32CD32'),
        ('mediumseagreen',       '#3CB371'),
        ('turquoise',            '#40E0D0'),
        ('royalblue',            '#4169E1'),
        ('steelblue',            '#4682B4'),
        ('darkslateblue',        '#483D8B'),
        ('mediumturquoise',      '#48D1CC'),
        ('indigo',               '#4B0082'),
        ('darkolivegreen',       '#556B2F'),
        ('cadetblue',            '#5F9EA0'),
        ('cornflowerblue',       '#6495ED'),
        ('mediumaquamarine',     '#66CDAA'),
        ('dimgray',              '#696969'),
        ('slateblue',            '#6A5ACD'),
        ('olivedrab',            '#6B8E23'),
        ('slategray',            '#708090'),
        ('lightslategray',       '#778899'),
        ('mediumslateblue',      '#7B68EE'),
        ('lawngreen',            '#7CFC00'),
        ('chartreuse',           '#7FFF00'),
        ('aquamarine',           '#7FFFD4'),
        ('maroon',               '#800000'),
        ('purple',               '#800080'),
        ('olive',                '#808000'),
        ('gray',                 '#808080'),
        ('skyblue',              '#87CEEB'),
        ('lightskyblue',         '#87CEFA'),
        ('blueviolet',           '#8A2BE2'),
        ('darkred',              '#8B0000'),
        ('darkmagenta',          '#8B008B'),
        ('saddlebrown',          '#8B4513'),
        ('darkseagreen',         '#8FBC8F'),
        ('lightgreen',           '#90EE90'),
        ('mediumpurple',         '#9370DB'),
        ('darkviolet',           '#9400D3'),
        ('palegreen',            '#98FB98'),
        ('darkorchid',           '#9932CC'),
        ('yellowgreen',          '#9ACD32'),
        ('sienna',               '#A0522D'),
        ('brown',                '#A52A2A'),
        ('darkgray',             '#A9A9A9'),
        ('lightblue',            '#ADD8E6'),
        ('greenyellow',          '#ADFF2F'),
        ('paleturquoise',        '#AFEEEE'),
        ('lightsteelblue',       '#B0C4DE'),
        ('powderblue',           '#B0E0E6'),
        ('firebrick',            '#B22222'),
        ('darkgoldenrod',        '#B8860B'),
        ('mediumorchid',         '#BA55D3'),
        ('rosybrown',            '#BC8F8F'),
        ('darkkhaki',            '#BDB76B'),
        ('silver',               '#C0C0C0'),
        ('mediumvioletred',      '#C71585'),
        ('indianred',            '#CD5C5C'),
        ('peru',                 '#CD853F'),
        ('chocolate',            '#D2691E'),
        ('tan',                  '#D2B48C'),
        ('lightgray',            '#D3D3D3'),
        ('thistle',              '#D8BFD8'),
        ('orchid',               '#DA70D6'),
        ('goldenrod',            '#DAA520'),
        ('palevioletred',        '#DB7093'),
        ('crimson',              '#DC143C'),
        ('gainsboro',            '#DCDCDC'),
        ('plum',                 '#DDA0DD'),
        ('burlywood',            '#DEB887'),
        ('lightcyan',            '#E0FFFF'),
        ('lavender',             '#E6E6FA'),
        ('darksalmon',           '#E9967A'),
        ('violet',               '#EE82EE'),
        ('palegoldenrod',        '#EEE8AA'),
        ('lightcoral',           '#F08080'),
        ('khaki',                '#F0E68C'),
        ('aliceblue',            '#F0F8FF'),
        ('honeydew',             '#F0FFF0'),
        ('azure',                '#F0FFFF'),
        ('wheat',                '#F5DEB3'),
        ('beige',                '#F5F5DC'),
        ('whitesmoke',           '#F5F5F5'),
        ('mintcream',            '#F5FFFA'),
        ('ghostwhite',           '#F8F8FF'),
        ('salmon',               '#FA8072'),
        ('sandybrown',           '#FAA460'),
        ('antiquewhite',         '#FAEBD7'),
        ('linen',                '#FAF0E6'),
        ('lightgoldenrodyellow', '#FAFAD2'),
        ('oldlace',              '#FDF5E6'),
        ('red',                  '#FF0000'),
        ('fuchsia',              '#FF00FF'),
        ('magenta',              '#FF00FF'),
        ('deeppink',             '#FF1493'),
        ('orangered',            '#FF4500'),
        ('tomato',               '#FF6347'),
        ('hotpink',              '#FF69B4'),
        ('coral',                '#FF7F50'),
        ('darkorange',           '#FF8C00'),
        ('lightsalmon',          '#FFA07A'),
        ('orange',               '#FFA500'),
        ('lightpink',            '#FFB6C1'),
        ('pink',                 '#FFC0CB'),
        ('gold',                 '#FFD700'),
        ('peachpuff',            '#FFDAB9'),
        ('navajowhite',          '#FFDEAD'),
        ('moccasin',             '#FFE4B5'),
        ('bisque',               '#FFE4C4'),
        ('mistyrose',            '#FFE4E1'),
        ('blanchedalmond',       '#FFEBCD'),
        ('papayawhip',           '#FFEFD5'),
        ('lavenderblush',        '#FFF0F5'),
        ('seashell',             '#FFF5EE'),
        ('cornsilk',             '#FFF8DC'),
        ('lemonchiffon',         '#FFFACD'),
        ('floralwhite',          '#FFFAF0'),
        ('snow',                 '#FFFAFA'),
        ('yellow',               '#FFFF00'),
        ('lightyellow',          '#FFFFE0'),
        ('ivory',                '#FFFFF0'),
        ) # 已去掉black和white
    color,strColor = '#','0123456789ABCD'  #去掉EF调节颜色
    for _ in range(6): color += choice(strColor)
    if flag: return color
    return choice(colorTuple)[1]
def Square(length):
    t.color(rndColor())  # 参数改为Flase换colorTuple中的颜色
    t.begin_fill()
    for i in range(4):
        t.fd(length)
        t.right(90)
    t.end_fill()
def biTree(length):
    if length<0.08*Length: return
    xy = t.position()
    if abs(xy[0])>Width/2-2*length: return
    if xy[1]>Half_H-length*3: return
    if xy[1]<-Half_H+length*0.5: return
    # 以上四行尽可能约束树枝不超出可视范围
    Square(length)
    Angle = choice([i for i in range(5,86)])  #左右偏向角度,不宜过大或过小
    t.forward(length)
    t.left(Angle)
    biTree(length * cos(radians(Angle)))
    Square(length * cos(radians(Angle)))
    t.right(90)
    t.forward(length * cos(radians(Angle)))
    biTree(length * sin(radians(Angle)))
    Square(length * sin(radians(Angle)))
    t.right(90)
    t.forward(length * sin(radians(Angle)))
    t.right(Angle)
    t.forward(length)
    t.right(90)
    t.forward(length)
    t.right(90)
def main(x=None,y=None):
    x,y = -Half_L, Half_L-Half_H
    t.clear()
    t.up()
    t.goto(x,y)
    t.down()
    #t.pensize(2)
    t.setheading(90)
    biTree(Length)
    t.penup()
    t.goto(Length*0.8,-Half_H+Half_L)
    t.pencolor('red')
    t.write("Click to refresh......")
    t.hideturtle()
if __name__ ==  '__main__':
    Width,Height = 1200,800  #屏幕宽高
    Length = 100   #第一层正方形的边长
    Half_L,Half_H = Length/2,Height/2
    turtle.setup(Width,Height)
    turtle.title('随机勾股树')
    turtle.tracer(0)
    t = turtle.Turtle()
    #t.speed(0)
    main()
    ts = turtle.Screen()
    ts.onclick(main)
    turtle.mainloop()


代码执行后,不停点击屏幕的动态效果如下:

image.gif


本篇完!



目录
相关文章
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 26. 树的子结构
这篇文章提供了解决LeetCode上"剑指Offer 26. 树的子结构"问题的Python代码实现和解析,判断一棵树B是否是另一棵树A的子结构。
57 4
|
3月前
|
存储 大数据 索引
解锁Python隐藏技能:构建高效后缀树Suffix Tree,处理大数据游刃有余!
通过构建高效的后缀树,Python程序在处理大规模字符串数据时能够游刃有余,显著提升性能和效率。无论是学术研究还是工业应用,Suffix Tree都是不可或缺的强大工具。
65 6
|
3月前
|
大数据 UED 开发者
实战演练:利用Python的Trie树优化搜索算法,性能飙升不是梦!
在数据密集型应用中,高效搜索算法至关重要。Trie树(前缀树/字典树)通过优化字符串处理和搜索效率成为理想选择。本文通过Python实战演示Trie树构建与应用,显著提升搜索性能。Trie树利用公共前缀减少查询时间,支持快速插入、删除和搜索。以下为简单示例代码,展示如何构建及使用Trie树进行搜索与前缀匹配,适用于自动补全、拼写检查等场景,助力提升应用性能与用户体验。
71 2
|
3月前
|
存储 算法 数据挖掘
高效文本处理新纪元:Python后缀树Suffix Tree,让数据分析更智能!
在大数据时代,高效处理和分析文本信息成为关键挑战。后缀树作为一种高性能的数据结构,通过压缩存储字符串的所有后缀,实现了高效的字符串搜索、最长公共前缀查询等功能,成为文本处理的强大工具。本文探讨Python中后缀树的应用,展示其在文本搜索、重复内容检测、最长公共子串查找、文本压缩及智能推荐系统的潜力,引领数据分析迈入新纪元。虽然Python标准库未直接提供后缀树,但通过第三方库或自定义实现,可轻松利用其强大功能。掌握后缀树,即掌握开启文本数据宝藏的钥匙。
60 5
|
3月前
|
存储 开发者 Python
从理论到实践:Python中Trie树与Suffix Tree的完美结合,开启编程新篇章!
在编程领域,高效的数据结构对于解决问题至关重要。本文通过一个案例分析,介绍如何在Python中结合使用Trie树(前缀树)和Suffix Tree(后缀树)。案例聚焦于开发具备高效拼写检查和文本相似度检测功能的文本编辑器。首先,通过构建Trie树快速检查单词是否存在;接着,利用Suffix Tree检测文本相似度。尽管Python标准库未直接提供Suffix Tree,但可通过第三方库或自定义实现。本文展示了高级数据结构在实际应用中的强大功能,并强调了理论与实践相结合的重要性。
51 1
|
3月前
|
存储 算法 Python
逆袭之路:掌握Python字典树Trie与后缀树,成为技术圈的耀眼新星!
在编程的征途上,每个人都渴望成为那个能够独当一面、解决复杂问题的技术高手。而掌握高级数据结构,如字典树(Trie)与后缀树(Suffix Tree),无疑是你逆袭路上的重要一步。这些数据结构不仅能够提升你的编码技能,还能让你在解决特定问题时游刃有余,从而在技术圈中脱颖而出,成为那颗耀眼的新星。
38 1
|
3月前
|
存储 算法 搜索推荐
Python进阶必备:字典树Trie与后缀树Suffix Array,效率提升的神器!
在Python编程中,掌握高效的数据结构对于提升程序性能至关重要。本文将深入探讨两种强大的字符串处理数据结构——字典树(Trie)与后缀数组(Suffix Array)。字典树,又称前缀树,适用于自动补全和拼写检查等功能。例如,在文本编辑器中实现自动补全时,字典树能够即时提供单词补全选项。后缀数组则用于存储字符串的所有后缀并按字典序排序,结合最长公共前缀(LCP)数组,可以高效解决许多字符串问题,如查找最长重复子串等。通过实际案例,我们将展示这两种数据结构的强大功能,帮助你在Python编程中更进一步。
74 2
|
3月前
|
存储 算法 索引
从菜鸟到大神:一文带你彻底搞懂Python中的后缀树Suffix Tree奥秘!
在Python编程中,后缀树是一种高效的数据结构,特别适用于处理复杂的字符串问题,如搜索、最长公共前缀查询及最长重复子串查找等。本文通过问答形式介绍后缀树的基本概念、重要性及其实现方法。后缀树能显著提高字符串处理效率,将传统方法的时间复杂度从O(nm)降至接近O(m)。尽管其构建过程较复杂,但通过手动编写代码或使用第三方库,我们可以在Python中实现这一强大工具。后缀树的应用广泛,涵盖字符串搜索、压缩、生物信息学等多个领域,学习它不仅能帮助解决实际问题,更能提升算法思维和数据结构设计能力。
92 1
|
4月前
|
Python
Python笔下那些神奇的树
Python笔下那些神奇的树
|
4月前
|
机器学习/深度学习 前端开发 数据挖掘
基于Python Django的房价数据分析平台,包括大屏和后台数据管理,有线性、向量机、梯度提升树、bp神经网络等模型
本文介绍了一个基于Python Django框架开发的房价数据分析平台,该平台集成了多种机器学习模型,包括线性回归、SVM、GBDT和BP神经网络,用于房价预测和市场分析,同时提供了前端大屏展示和后台数据管理功能。
124 9