python之turtle模块实现递归可视化

《Python数据结构与算法分析》第二版

  1. turtle模块介绍
    顾名思义,可以用turtle模块创建一只小乌龟(turtle)并让它向前或向后移动,或者左转或右转。把小乌龟当作一支画笔,画笔可以抬起或放下,当放下时,画笔会沿着移动轨迹画出线条。还可改变画笔粗细或颜色。
    爬行: forward(n) backward(n)
    转向:right(a) left(a)
    抬笔放笔:penup() pendown()
    笔属性:pensize(s) pencolor(c)
  2. 绘制分形树:即一根小嫩枝也有和一整棵树一样的形状和特征,具有自相似的特性。
import turtle

def tree(branchLen, t):# (树干长度,turtle对象)
    if branchLen > 5:# 递归结束条件是树干长度小于5
        t.forward(branchLen)# 绘制树干
        t.right(20)# 右倾斜20度
        tree(branchLen-15, t)# 递归调用,绘制右边的小树,树干长度-15
        t.left(40)# 向左回40度,即左倾斜20度
        tree(branchLen-10, t)# 递归调用,绘制左边的小树,树干长度-10
        t.right(20)# 向右回20度,即回正
        t.backward(branchLen)# 沿树干退回原位置

t = turtle.Turtle()
myWin = t.getscreen()#用来作图的窗口
t.speed(20)# 小乌龟前行速度
t.left(90)# 小乌龟默认朝向为朝东,左回90度,朝向朝北
t.up()# 画笔抬起
t.backward(300)# 向后退300个长度
t.down()# 画笔落下
t.color('green')
tree(100, t)
t.hideturtle()# 隐藏小乌龟
myWin.exitonclick()# 使小乌龟进入等待模式,直到用户在窗口内再次点击之后,程序清理并退出

分形树:
python之turtle模块实现递归可视化_第1张图片

  1. 绘制谢尔平斯基三角形: 从一个大的三角形开始,通过连接每条边的中点将它分割成四个新的三角形;忽略中间的三角形,利用同样的方法分割其余三个三角形。每一次创建一个新的三角形集合,都递归地分割三个三角形。
import turtle

def drawTriangle(points, color, myTurtle):
    myTurtle.fillcolor(color)# 设置三角形内要填充的颜色
    myTurtle.up()# 画笔抬起
    myTurtle.goto(points[0])# 移动到三角形左顶点
    myTurtle.down()# 画笔落下
    myTurtle.begin_fill()# 开始填充颜色
    myTurtle.goto(points[1])
    myTurtle.goto(points[2])
    myTurtle.goto(points[0])
    myTurtle.end_fill()# 填充结束

def getMid(p1, p2):# 计算并返回中点坐标
    return ((p1[0]+p2[0])/2, (p1[1]+p2[1])/2)

def sierpinski(points, degree, myTurtle):
    #points是一个字典,里面元素用元组表示,存放三角形的三个顶点坐标
    #degree代表要分割的度,即分割三角形的次数
    colormap = ['blue', 'red', 'green', 'white', 'yellow',
                'violet', 'orange']
    drawTriangle(points, colormap[degree], myTurtle)
    if degree > 0:
        sierpinski([points[0], # 对左下角三角形进行递归调用
                        getMid(points[0], points[1]), 
                        getMid(points[0], points[2])], 
                    degree-1, myTurtle)
        sierpinski([points[1], # 对顶部三角形进行递归调用
                        getMid(points[0], points[1]), 
                        getMid(points[1], points[2])], 
                    degree-1, myTurtle)
        sierpinski([points[2], # 对右下角三角形进行递归调用
                       getMid(points[0], points[2]), 
                       getMid(points[1], points[2])], 
                   degree-1, myTurtle)

myTurtle = turtle.Turtle()# 创建一个海龟对象
myWin = myTurtle.getscreen()
myPoints = [(-200, -100), (0, 100), (200, -100)]# 等边三角形各顶点坐标 (left, top, right)
sierpinski(myPoints, 5, myTurtle)
myTurtle.hideturtle()
myWin.exitonclick()
                    
    

谢尔平斯基三角形:
python之turtle模块实现递归可视化_第2张图片

你可能感兴趣的:(笔记)