【每天学点Python】案例二:分形树绘制
分形树绘制
V1.0 五角星绘制:
案例描述:
使用turtle库在Python中绘制简单图形
案例分析:
- import turtle:引入绘制图形的turtle库
- 利用turtle库中的函数进行编程——模型编程
上机实验:
1 """ 2 作者:王鑫正 3 功能:五角星的绘制 4 版本:1.0 5 日期:2018年9月17日 6 """ 7 import turtle 8 9 10 def main(): 11 """ 12 主函数 13 """ 14 # 计数器 15 count = 1 16 17 while count <= 5: 18 turtle.forward(100) 19 turtle.right(144) 20 count = count + 1 21 22 turtle.exitonclick() 23 24 25 if __name__ == '__main__': 26 main()
补充说明:
1. turtle库:
- 没有显示的input()与output()
- 没有赋值语句
- 大部分语句为<a>.<b>()的形式
- 表示使用<a>中的方法<b>()
- 调用函数库<a>中的函数<b>()
2. 形状绘制函数
- turtle.forward(distance):画笔向前移动distance距离
- turtle.backward(distance):画笔向后移动distance距离
- turtle.right(degree):绘制方向向右旋转degree度
- turtle.exitonclick():点击关闭图形窗口
3. 绘图坐标体系
V2.0 重复不同大小五角星的绘制:
案例分析:
加入循环操作绘制重复不同大小的五角星
上机实验:
1 """ 2 作者:王鑫正 3 功能:五角星的绘制 4 版本:2.0 5 日期:2018年9月17日 6 新增功能:加入循环操作绘制重复不同大小的五角星 7 """ 8 import turtle 9 10 11 def drwa_pentagram(size): 12 """ 13 绘制五角星 14 """ 15 count = 1 16 while count <= 5: 17 turtle.forward(size) 18 turtle.right(144) 19 count += 1 20 21 22 def main(): 23 """ 24 主函数 25 """ 26 27 turtle.penup() 28 turtle.backward(200) 29 turtle.pendown() 30 31 size = 50 32 33 while size <= 500: 34 35 # 调用绘制五角星函数 36 drwa_pentagram(size) 37 # size = size + 10 38 size += 10 39 40 turtle.exitonclick() 41 42 43 if __name__ == '__main__': 44 main()
补充说明:
1. "size = size + 1" 等同于 “size += 1”
2. 画笔控制函数:
- turtle.penup() 抬起画家,之后移动画笔不绘制形状
- turtle.pendown() 落下画笔,之后移动画笔绘制形状
- turtle.pensize() 设置画笔宽度
- turtle.pencolor() 设置画笔颜色
- 常用的颜色: white,black,grey,darkgreen,gold,violet,purple
- 详细API请参考: http://docs.python.org/3.0/library/turtle.html
V3.0 使用迭代函数重复不同大小五角星的绘制:
案例描述:
将函数与循环结合(递归函数)绘制2.0的图形
案例分析:
自己调用自己
上机实验:
1 """ 2 作者:王鑫正 3 功能:五角星的绘制 4 版本:3.0 5 日期:2018年9月17日 6 新增功能:加入循环操作绘制重复不同大小的五角星 7 新增功能:使用迭代函数绘制重复不同大小的五角星 8 """ 9 import turtle 10 11 12 def draw_pentagram(size): 13 """ 14 绘制五角星 15 """ 16 count = 1 17 while count <= 5: 18 turtle.forward(size) 19 turtle.right(144) 20 count += 1 21 22 23 def draw_recursive_pentagram(size): 24 """ 25 迭代绘制五角星 26 """ 27 # 计数器 28 count = 1 29 while count <= 5: 30 turtle.forward(size) 31 turtle.right(144) 32 count += 1 33 34 # 五角星绘制完成,更新参数 35 size += 10 36 if size <= 100: 37 draw_recursive_pentagram(size) 38 39 40 def main(): 41 """ 42 主函数 43 """ 44 45 turtle.penup() 46 turtle.backward(200) 47 turtle.pendown() 48 turtle.pensize(2) 49 turtle.pencolor('red') 50 51 size = 50 52 draw_recursive_pentagram(size) 53 54 turtle.exitonclick() 55 56 57 if __name__ == '__main__': 58 main()
补充说明:
1. 递归函数:
- 函数定义中调用函数自身的方式称为递归
- 能够非常简洁地解决重要问题
- 每次函数调用是,函数参数会临时存储,相互没有影响
- 达到终止条件时,各函数逐层结束运算,返回计算结果
- 要注意终止条件的构建,否则递归无法正常返回结果
V4.0 分形树的绘制
案例描述:
- 利用递归函数绘制分形树(fractal tree)
- 分形几何学的基本思想:客观事物具有自相似的层次结构,局部与整体在形态、功能、信息、时间、空间等方面具有统计意义上的相似性,成为自相似性。自相似性是指局部是整体成比例缩小的性质。
案例分析:
- 绘制右侧树枝
- 返回树枝节点
- 绘制左侧树枝
- 返回树枝节点
上机实验:
1 """ 2 作者:王鑫正 3 功能:利用递归函数绘制分形树 4 版本:1.0 5 日期:2018年9月17日 6 """ 7 import turtle 8 9 10 def draw_branch(branch_length): 11 """ 12 绘制分形树 13 """ 14 if branch_length > 5: 15 # 绘制右侧树枝 16 turtle.forward(branch_length) 17 print('向前', branch_length) 18 turtle.right(20) 19 print('右转', 20) 20 draw_branch(branch_length - 15) 21 22 # 绘制左侧树枝 23 turtle.left(40) 24 print('左转', 20) 25 draw_branch(branch_length - 15) 26 27 # 返回之前的树枝 28 turtle.right(20) 29 print('右转', 20) 30 turtle.backward(branch_length) 31 print('向后', branch_length) 32 33 34 def main(): 35 """ 36 主函数 37 """ 38 turtle.penup() 39 turtle.setpos(0,-100) 40 turtle.pendown() 41 turtle.color('brown') 42 turtle.left(90) 43 draw_branch(100) 44 turtle.exitonclick() 45 46 47 if __name__ == '__main__': 48 main()