Python学习Turtle库画对称勾股树体会分形惊艳

分形,具有以非整数维形式充填空间的形态特征。通常被定义为“一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”,即具有自相似的性质。分形(Fractal)一词,是芒德勃罗创造出来的,其原意具有不规则、支离破碎等意义。1973年,芒德勃罗(B.B.Mandelbrot)在法兰西学院讲课时,首次提出了分维和分形的设想。
分形是一个数学术语,也是一套以分形特征为研究主题的数学理论。分形理论既是非线性科学的前沿和重要分支,又是一门新兴的横断学科,是研究一类现象特征的新的数学分科,相对于其几何形态,它与微分方程与动力系统理论的联系更为显著。分形的自相似特征可以是统计自相似,构成分形也不限于几何形式,时间过程也可以,故而与鞅论关系密切。
分形几何是一门以不规则几何形态为研究对象的几何学。由于不规则现象在自然界普遍存在,因此分形几何学又被称为描述大自然的几何学。分形几何学建立以后,很快就引起了各个学科领域的关注。不仅在理论上,而且在实用上分形几何都具有重要价值。

——摘自百度百科

自然界中的分形几何

人为的分形图案

分形树是分形几何中的一小种类型,一棵分形树相当于一棵“满二叉树”。通常都用递归来实现,递归条件通常分两派,一派是用长度递减,直到长度不满足某个条件时退出;另一派则是按层数来递归,相当于“满二叉树”的层序遍历。前一派的长度递归相当于“满二叉树”的先序遍历,从根出发先左子树后右子树,每一棵子树都按这种“先根后左右”的顺序遍历。

举个例子:

源代码:

import turtle
def bintree(size):
    angle = 60    # 分叉的角度
    if size > 5:    # 长度退出条件
        turtle.forward(size)
        turtle.left(angle)
        bintree(size / 1.6)
        turtle.right(angle*2)
        bintree(size / 1.6)
        turtle.left(angle)
        turtle.backward(size)
def main():
    turtle.speed(0)
    turtle.hideturtle()
    turtle.penup()
    turtle.left(90)
    turtle.backward(100)
    turtle.showturtle()
    turtle.pendown()
    turtle.pensize(2)
    turtle.color('green')
    bintree(150)
    turtle.done()
if __name__ == '__main__':

    main()

以上代码中长度以等比数列递减,公比1/1.6;当然也可以改成等差数列形式。此方式缺点树的层数不能直接控制,需要用初始长度、递减公式和退出条件来计算得出。

勾股树,其实就是分形树的一种,只是不像上例一样简单地画2个分叉,而是画直角三角形加上各边上的正方形,就像平面几何中勾股定理证明时画的示意图。

以下是我用Turtle库画的一棵12层的对称勾股树,使用“层序遍历”方式:

根据二叉树的性质可知:12层的树会有 2^12 - 1 个正方形以及同样数量的三角形。时间复杂度为指数级,在关掉画笔踪迹开关的情况下画完此时耗时43秒。

简单点,就用一个6层的来示意一下其“层序”的过程:

源代码:

from turtle import *
 def Square(self,length):
    for _ in range(5):
        self.forward(length)
        self.right(90)
def Triangle(self,length):
    self.left(45)
    self.forward(length/2**0.5)
    self.right(90)
    self.forward(length/2**0.5)
    self.right(135)
    self.forward(length)
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:
        if n<3: left.pencolor('green')
        else: left.pencolor('brown')
        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(6,150,10)
 

主函数: main(level, length, speed=-1)

参数:
level: 树的层数
length: 最底层正方形的边长
speed: 1~10,画笔速度递增;=0时速度最快;=-1时关闭画笔踪迹。

本篇完,其他分形图待继......

更多关于Turtle库实现对称勾股树的资料请关注我们其它相关文章!

(0)

相关推荐

  • python使用turtle绘制分形树

    由于分形树具有对称性,自相似性,所以我们可以用递归来完成绘制.只要确定开始树枝长.每层树枝的减短长度和树枝分叉的角度,我们就可以把分形树画出来啦!! 代码如下: # -*- coding: utf-8 -*- ''' 绘制分形树 ''' import turtle as tl def draw_smalltree(tree_length,tree_angle): ''' 绘制分形树函数 ''' if tree_length >= 3: tl.forward(tree_length) #往前画 t

  • Python+Turtle动态绘制一棵树实例分享

    本文实例主要是对turtle的使用,实现Python+turtle动态绘制一棵树的实例,具体代码: # drawtree.py from turtle import Turtle, mainloop def tree(plist, l, a, f): """ plist is list of pens l is length of branch a is half of the angle between 2 branches f is factor by which bra

  • python3实现用turtle模块画一棵随机樱花树

    废话不多说了,直接上代码吧! #!/usr/bin/env python # coding=utf-8 # 画一棵樱花 import turtle import random from turtle import * from time import sleep # 画樱花的躯干(60,t) def tree(branchLen,t): sleep(0.0005) if branchLen >3: if 8<= branchLen <=12: if random.randint(0,2)

  • 使用Python的Turtle库绘制森林的实例

    这是由一个小作业引发的对Python的Turtle库的学习 下面是官方手册: Turtle官方手册 1.配置编程环境 由于现在的笔记本是临时借的,编程环境不是熟悉的环境,又由于种种原因没有安装成功Anaconda,就尝试了下其他的IDE: 最早接触的Enthought Canopy跑示例程序时各种报错无法解决(Python Kernal Crashed): 最著名的Python IDE是JetBeans的Pycharm,装好以后啥都没跑就占了1G内存(虽然舍友电脑上的没问题): 好在之前装了No

  • Python学习Turtle库画对称勾股树体会分形惊艳

    分形,具有以非整数维形式充填空间的形态特征.通常被定义为"一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状",即具有自相似的性质.分形(Fractal)一词,是芒德勃罗创造出来的,其原意具有不规则.支离破碎等意义.1973年,芒德勃罗(B.B.Mandelbrot)在法兰西学院讲课时,首次提出了分维和分形的设想. 分形是一个数学术语,也是一套以分形特征为研究主题的数学理论.分形理论既是非线性科学的前沿和重要分支,又是一门新兴的横断学科,是研究一类

  • 使用python的turtle库画一个冰墩墩效果

    目录 设置一个画布 画左手和手内 画轮廓和其他部分 画细节(眼睛.鼻子.嘴巴等) 画头部彩虹 画五环标志 使用python画一个冰墩墩先看效果图 设置一个画布 import turtle turtle.setup(800,600) turtle.speed(10) 画左手和手内 turtle.penup() turtle.goto(177,112) turtle.pencolor('lightgray') turtle.pensize(3) turtle.fillcolor('white') t

  • 关于Python使用turtle库画任意图的问题

    目录 环境配置 Turtle扫盲 1.绘图窗体的设置 2.画笔控制函数 3.形状绘制函数 Turtle画任意图 1.经典案例 2.画任意图片 环境配置 系统:Windows10 版本:python 3.8 Turtle扫盲 1.绘图窗体的设置 turtle.setup(width, height, startx, starty) startx , starty 缺省在屏幕中心. 2.画笔控制函数 turtle.penup() #别名 turtle.pu(),抬起画笔 turtle.pendown

  • python turtle库画一个方格和圆实例

    使用python的turtle库画一个方格和圆 打开python编译器,导入turtle库 from turtle import * 首先画一个距离为100的横线 forward(100) 顺时针旋转90度,前进100 在通过两次的旋转和平移得到方格,使用for循环重复两次 抬起笔,直接到方格的中间,也就是(50,0)坐标 penup() goto(50,0) 开始画半径为50的圆,放下笔 pendown() circle(50) 在圆的中心画个圆心点 goto(50,50) dot() 最后隐

  • 详解python使用turtle库来画一朵花

    看了群主最后成像的图片,应该是循环了36次画方框,每次有10度的偏移. 当然不能提前看答案,自己试着写代码. 之前有用过海龟画图来画过五角星.奥运五环.围棋盘等,所以感觉不难. # !/usr/bin/env python # -*- coding:utf-8 -*- # Author:wxh def run(): ''' 主方法 :return: None ''' import turtle length = 150 # 线段长度 angle = 45 # 角度 offset_angle =

  • python turtle库画圣诞树详细代码教程

    目录 1. 圣诞树的本体 2. 蝴蝶结 3. 星星 4. 圣诞帽 5. 圣诞袜 6. 最后奉上完整代码 首先我们的目标是这样子的: 那么他有什么成分呢?有圣诞树的本体.大小蝴蝶结.星星.圣诞帽和袜子. 首先我们来画圣诞树的本体. 1. 圣诞树的本体 圣诞树本体是这样子的: 代码: class TreeBackBone(): def __init__(self): pencolor("pink") pensize(10) self.layer1() self.layer2() self.

  • Python使用Turtle库绘制一棵西兰花

    Turtle库是Python中一个强大的绘制图像的函数库,灵活使用Turtle库可以绘制各种好看的图像. 下面介绍使用Turtle库绘制一棵西兰花. 绘制一棵西兰花,从主干出发以一定的角度向左向右生成对称的枝干,再从每个枝干出发向左向右生成对称的枝干,循环此动作,并最终绘制出一棵漂亮的西兰花. 首先导入Turtle库,并设置画笔大小.画笔速度及颜色,并隐藏画笔 from turtle import Turtle p=Turtle() p.pensize(5) p.color(clr) p.hid

  • python用turtle库绘画圣诞树

    目录 前言 一.Turtle是什么? 二.使用步骤 1.引入库 2.turtle绘图的基础知识 三.圣诞树代码 总结 前言 圣诞节快到了,是不是想用python画一个可爱的圣诞树,我在各大网站都查了一下,都不太美观,然后我就学习了一下别人的代码改写了一下,自己加了一些东西,弄的好看一些了,给大家开源出来,欢迎大家指正学习,也欢迎转载,请注明出处哦~ 画出来的图形如图: 一.Turtle是什么? Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x.纵轴为

  • python使用turtle库绘制树

    本文实例为大家分享了python使用turtle库绘制树的具体代码,供大家参考,具体内容如下 # -*- coding: utf-8 -*- """ Spyder Editor This is a temporary script file. """ import turtle, datetime def drawGap(): #绘制数码管间隔 turtle.penup() turtle.fd(5) def drawLine(draw): #绘制

随机推荐