zoukankan      html  css  js  c++  java
  • 海龟绘制斐波那契螺线

    1、利用黄金比例生成每一段螺线半径的版本:

    import turtle
    from random import random
    
    
    def draw_square(r):
        turtle.fillcolor(random(), random(), random()) # random()函数返回0到1之间的随机数字,rgb的三个参数在这里采用0到1的模式
        turtle.begin_fill() # 在绘制要填充的形状之前调用
        for _ in range(4):
            turtle.fd(r) # 海龟前进参数指定的距离
            turtle.left(90) # 海龟左转90°
            # 填充关键点,正方形填充一半就结束,然后立即开始圆形填充
            if _ == 1:
                turtle.end_fill() # 填充上次调用 begin_fill() 之后绘制的形状
                turtle.fillcolor(random(), random(), random())
                turtle.begin_fill() # 在绘制要填充的形状之前调用
        turtle.circle(r, 90) # 这里r是半径,90指夹角是90°
        turtle.end_fill()
        return
    
    
    if __name__ == '__main__':
    
        # turtle.speed(0) # 设置绘图速度为最快
        # turtle.delay(0) # 设置延迟为0
        # t = turtle.Turtle()
        # turtle.hideturtle() # 隐藏海龟
        turtle.up() # 画笔抬起
        turtle.goto(-130, 50) # 前往这个坐标
        turtle.down() # 画笔落下
        turtle.pensize(3) # 设置线条粗细
        # 黄金比例
        scale = 0.618
        # 初始半径
        r = 50
    
        for _ in range(5):
            draw_square(r)
            r /= scale
    
        turtle.hideturtle()
        # 貌似这两个都是开始事件循环
        turtle.done()
        # turtle.mainloop()
    

    效果:

    2、半径和斐波那契数列严格一致的版本:

    import turtle
    from random import random
    
    
    def draw_square(r):
        turtle.fillcolor(random(), random(), random()) # random()函数返回0到1之间的随机数字,rgb的三个参数在这里采用0到1的模式
        turtle.begin_fill() # 在绘制要填充的形状之前调用
        for _ in range(4):
            turtle.fd(r) # 海龟前进参数指定的距离
            turtle.left(90) # 海龟左转90°
            # 填充关键点,正方形填充一半就结束,然后立即开始圆形填充
            if _ == 1:
                turtle.end_fill() # 填充上次调用 begin_fill() 之后绘制的形状
                turtle.fillcolor(random(), random(), random())
                turtle.begin_fill() # 在绘制要填充的形状之前调用
        turtle.circle(r, 90) # 这里r是半径,90指夹角是90°
        turtle.end_fill()
        return
    
    # 返回一个Fibonacci列表[1, 1, 2, 3, 5...]
    def fibo(n):
        f_1 = 1
        f_2 = 1
        fibo_list = [1, 1]
        for i in range(n - 2):
            fibo_num = f_1 + f_2
            fibo_list.append(fibo_num)
            f_1, f_2 = f_2, fibo_num
        return fibo_list
    
    
    if __name__ == '__main__':
    
        # turtle.speed(0) # 设置绘图速度为最快
        # turtle.delay(0) # 设置延迟为0
        # t = turtle.Turtle()
        # turtle.hideturtle() # 隐藏海龟
        turtle.up() # 画笔抬起
        turtle.goto(-130, 50) # 前往这个坐标
        turtle.down() # 画笔落下
        turtle.pensize(3) # 设置线条粗细
        # 黄金比例
        scale = 0.618
        # 初始半径
        r = 50
    
        # 生成Fibonacci列表
        fibo_list = fibo(6) # 因为画图是从第二个数开始的,所以这里要比下面的循环多生成一个数
    
        for _ in range(5):
            draw_square(r * fibo_list[_ + 1])
    
        turtle.hideturtle()
        # 貌似这两个都是开始事件循环
        turtle.done()
        # turtle.mainloop()
    

    效果:

  • 相关阅读:
    如何用正确的方法写出高质量软件的75条体会(转)
    使用javascript动态添加onclick事件,
    签名和重载
    C#文件后缀名详解
    配置SQL Server 2005 Express的身份验证方式,以及如何启用sa登录名。
    CSS选择符及优先级计算
    关于软件版本的解释
    数据结构形象解释
    CSS属性选择符
    [转载]Repeater三层嵌套
  • 原文地址:https://www.cnblogs.com/fanlumaster/p/13688676.html
Copyright © 2011-2022 走看看