海龟绘制斐波那契螺线
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()
效果: