《Python数据结构与算法分析》第二版
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()# 使小乌龟进入等待模式,直到用户在窗口内再次点击之后,程序清理并退出
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()