1.案例描述
树干为80,分叉角度为20,树枝长度小于5则停止。树枝长小于30,可以当作树叶了,树叶部分为绿色,其余为树干部分设为棕色。
2.案例分析
由于分形树具有对称性,自相似性,所以我们可以用递归来完成绘制。只要确定开始树枝长、每层树枝的减短长度和树枝分叉的角度,我们就可以把分形树画出来啦!!
递归基本逻辑(原路返回):右侧树枝绘制递出处理+左侧树枝绘制递出处理+归来时处理(递出和归来两个模型结合)。最大优点是逻辑容易理解,最大缺点是重复操作较多易有性能问题。
3.分形几何学
客观事物具有自相似的层次结构,局部与整体在形态、功能、信息、时间、空间等方面具有统计意义上的相似性,称为自相似性。自相似性是指局部是整体成比例缩小的性质。
4.上机实验一(普通分形树)
"""
作者:梁斌
功能:利用递归函数绘制分形树
版本:1.0
日期:03/08/2017
"""
import turtle
def draw_branch(branch_length):
"""
绘制分形树
"""
if branch_length > 5:
# 绘制右侧树枝
turtle.forward(branch_length)
print('向前 ', branch_length)
turtle.right(20)
print('右转 20')
draw_branch(branch_length - 15)
# 绘制左侧树枝
turtle.left(40)
print('左转 40')
draw_branch(branch_length - 15)
# 返回之前的树枝
turtle.right(20)
print('右转 20')
turtle.backward(branch_length)
print('向后 ', branch_length)
def main():
"""
主函数
"""
turtle.left(90)
turtle.penup()
turtle.backward(150)
turtle.pendown()
turtle.color('brown')
draw_branch(80)
turtle.exitonclick()
if __name__ == '__main__':
main()
5.上机实验二(树枝带颜色分形树)
# -*- coding: utf-8 -*-
'''
绘制分形树
'''
import turtle as tl
def draw_smalltree(tree_length,tree_angle,tree_wide):
'''
绘制分形树函数
'''
if tree_length >= 5:
tl.pensize(tree_wide)
tl.forward(tree_length) #往前画
tl.right(tree_angle) #往右转
draw_smalltree(tree_length - 10,tree_angle,tree_wide*2/3)#画下一枝,直到画到树枝长小于3
tl.left(2 * tree_angle) #转向画左
draw_smalltree(tree_length -10,tree_angle,tree_wide*2/3) #直到画到树枝长小于3
tl.rt(tree_angle) #转到正向上的方向,然后回溯到上一层
if tree_length <= 30: #树枝长小于30,可以当作树叶了,树叶部分为绿色
tl.pencolor('green')
if tree_length > 30:
tl.pencolor('brown') #树干部分为棕色
tl.pensize(tree_wide)
tl.backward(tree_length) #往回画,回溯到上一层
def main():
tl.screensize(100, 100, "black") #画布大小
tl.penup()
tl.left(90) #因为树是往上的,所以先把方向转左
tl.backward(250) #把起点放到底部
tl.pendown()
tl.pencolor('brown')
tl.speed(10)
tree_length = 80 #我设置的最长树干为80
tree_angle = 20 #树枝分叉角度,我设为20
tree_wide = 5 #树枝粗度
draw_smalltree(tree_length,tree_angle,tree_wide)
tl.exitonclick() #点击才关闭画画窗口
if __name__ == '__main__':
main()
参考文档:
来源:oschina
链接:https://my.oschina.net/u/4292207/blog/3601042