用turtle斐波那契数列彩色螺旋线

本文介绍了如何使用Python的turtle模块,根据斐波那契数列绘制出美丽的彩色螺旋线。斐波那契数列与黄金螺旋的关系被简单解释,并通过代码实现动态展示。
部署运行你感兴趣的模型镜像

一,啥是黄金螺旋

斐波那契螺旋线,也称“黄金螺旋”,是斐波那契数列画出来螺旋曲线,自然界中存在许多斐波那契螺旋线的图案,是自然界最完美的经典黄金比例。作图规则是在以斐波那契数为边的正方形拼成的长方形中画一个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)

 

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值