zoukankan      html  css  js  c++  java
  • 【Python 16】分形树绘制4.0(利用递归函数绘制分形树fractal tree)

     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()

    参考文档:

    用python的turtle画分形树

    Turtle函数库

  • 相关阅读:
    HashMap和Hashtable及HashSet的区别
    Android获取系统的时间
    Android的布局属性
    ListView 在代码里设置margin
    如何用Vue自己实现一个message提示插件
    JS获取最近三个月日期范围
    css实现表单label文字两端对齐
    my utils
    Vue 路由&组件懒加载(按需加载)
    C# 通过window消息控制指定控件的scroll滚动
  • 原文地址:https://www.cnblogs.com/badboy200800/p/10586609.html
Copyright © 2011-2022 走看看