海龟绘制斐波那契螺线

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

效果:

posted @ 2020-09-18 00:40  模糊计算士  阅读(811)  评论(0编辑  收藏  举报