一,啥是黄金螺旋
斐波那契螺旋线,也称“黄金螺旋”,是斐波那契数列画出来螺旋曲线,自然界中存在许多斐波那契螺旋线的图案,是自然界最完美的经典黄金比例。作图规则是在以斐波那契数为边的正方形拼成的长方形中画一个90度的扇形,连起来的弧线就是斐波那契螺旋线。它来源于斐波那契数列(FibonacciSequence),又称黄金螺旋分割。
注意斐波那契数列是【1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987】
二,解析
科普完了,得看看长啥样,不看咋做?

哎呦,如此复杂!
别着急,慢慢分析。黄金螺旋是斐波那契螺旋的另一个名字,那肯定得跟斐波那契数列有关系,这是三岁小孩都知道的,何况是神马呢?
看,他先是一个边长为1的正方形,再是一个边长为1的正方形,接着是一个边长为2的正方形,最后来一个边长为3的正方形……以此类推。
发现了吗?正方形边长为1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987……
哦,正方形边长为斐波那契数列。
再在正方形中画一个弧线,最后填充颜色,不就……
三,代码
def draw_fibonacci(x):
f_list = []
for i in range(x):
if i == 0:
f_list.append(1)
elif i == 1:
f_list.append(1)
else:
f_list.append(f_list[i-1]+f_list[i-2])
啊,就这么简单?是的,就这么简单,首先我定义一个函数,x就是画几个,第几项。
然后我设一个空列表,就像,学校里有一个班级,在你入学前也就是暑假里,你这个班级里有0人,就是个空的东西,开学了,同学们一个个走进去,进去一个就有一个。所以下面的append是追加的意思,就相当于一同学走进去了。下面那一长串代码,我前面我已经介绍过了,就是在求那个第Fn项。
接下来我们要用离散的思维了,他是一个正方形,一段圆弧是吧,那我先画正方形,然后画圆弧吧。
f0 = 50
turtle.pensize(5)
turtle.color("black")
turtle.penup()
turtle.home()
turtle.pendown()
这一段不是画画的,这是基础设置,有人问,你第一行是什么意思,f0就是个变量,别管他,就是下面不用想,这……我那边长多少来着?依次意思为:(第二行开始)设置大小;设置颜色;把笔抬起来;到0,0的位置;落笔
or i in range(0, len(f_list)):
turtle.speed(1)
turtle.pendown()
if i == 0:
fill_color = "black"
else:
fill_color = (random.random(), random.random(), random.random())
turtle.fillcolor(fill_color)
turtle.begin_fill()
turtle.forward(f_list[i]*f0)
turtle.left(90)
turtle.forward(f_list[i]*f0)
turtle.left(90)
turtle.forward(f_list[i]*f0)
turtle.left(90)
turtle.forward(f_list[i]*f0)
turtle.left(90)
turtle.end_fill()
好,接下来就是画圆弧了:
fill_color = (random.random(), random.random(), random.random())
turtle.fillcolor(fill_color)
if i == 0:
turtle.forward(f_list[i] * f0 / 2)
turtle.begin_fill()
turtle.circle(f_list[i] * f0 / 2, 360)
turtle.end_fill()
turtle.forward(f_list[i] * f0 / 2)
continue
else:
turtle.begin_fill()
turtle.circle(f_list[i] * f0, 90)
turtle.left(90)
turtle.forward(f_list[i] * f0)
turtle.left(90)
turtle.forward(f_list[i] * f0)
turtle.end_fill()
第一,二行,老套路,随机产生一个颜色,并使用这个颜色作为填充颜色。然后还是分为i等于零,和i不等于零两种情况(continue是到此为止,从循环的头开始的意思)其他就不需要我解释了吧,if下边就是画一个三百六十度的圆形,else就是一段圆弧,因为填充需要画一个扇形。
接下来就是是移动到下一点的程序:
turtle.speed(0)
turtle.penup()
turtle.left(90)
turtle.forward(f_list[i] * f0)
turtle.left(90)
turtle.forward(f_list[i] * f0)
加上函数的应用:
turtle.done()
draw_fibonacci(6)
所有代码就是这样子:
# Python3.6
# 使用turtle绘制彩色Fibonacci螺旋 平方和
import turtle
import random
def draw_fibonacci(x):
# F0=1
# F1=1
# Fn=F(n-1)+F(n-2)
# 产生斐波那契数列,用于查表
# 像这种计算复杂性指数增长的计算,不要写个函数去每次求一个数
# 最好的办法是,按照规律写出查找表,用查找的方法来得到数据
f_list = []
for i in range(x):
if i == 0:
f_list.append(1)
elif i == 1:
f_list.append(1)
else:
f_list.append(f_list[i-1]+f_list[i-2])
# 像素比例
f0 = 50
# 设置画笔属性
turtle.pensize(5)
turtle.color("black")
turtle.penup()
turtle.home()
turtle.pendown()
for i in range(0, len(f_list)):
# 绘制速度,1~10个不同速度等级,小于1或者大于10立即绘制
turtle.speed(1)
turtle.pendown()
# 绘制矩形
if i == 0:
fill_color = "black"
else:
fill_color = (random.random(), random.random(), random.random())
print(fill_color)
turtle.fillcolor(fill_color)
turtle.begin_fill()
for j in range(4):
turtle.forward(f_list[i]*f0)
turtle.left(90)
"""
turtle.forward(f_list[i]*f0)
turtle.left(90)
turtle.forward(f_list[i]*f0)
turtle.left(90)
turtle.forward(f_list[i]*f0)
turtle.left(90)
"""
turtle.end_fill()
# 绘制圆弧
fill_color = (random.random(), random.random(), random.random())
#fill_color = (random.randint(0,255), random.randint(0,255), random.randint(0,255))
print(fill_color)
turtle.fillcolor(fill_color)
if i == 0:
turtle.forward(f_list[i] * f0 / 2)
turtle.begin_fill()
turtle.circle(f_list[i] * f0 / 2, 360)
turtle.end_fill()
# 移动到一下起点
turtle.forward(f_list[i] * f0 / 2)
continue
else:
turtle.begin_fill()
turtle.circle(f_list[i] * f0, 90)
turtle.left(90)
turtle.forward(f_list[i] * f0)
turtle.left(90)
turtle.forward(f_list[i] * f0)
turtle.end_fill()
# 移动到一下起点
turtle.speed(0)
turtle.penup()
turtle.left(90)
turtle.forward(f_list[i] * f0)
turtle.left(90)
turtle.forward(f_list[i] * f0)
turtle.done()
#if __name__ == "__main__":
draw_fibonacci(6)
本文介绍了如何使用Python的turtle模块,根据斐波那契数列绘制出美丽的彩色螺旋线。斐波那契数列与黄金螺旋的关系被简单解释,并通过代码实现动态展示。
1473

被折叠的 条评论
为什么被折叠?



