话不多说先上最终效果图:

雪花id python 雪花怎么画_递归

这个程序需要用到 turtle 库绘制图案, random 库获取随机颜色,以及 递归 的算法

具体的详细turtle库使用说明,推荐这个链接,非常详细》》》:turtle库官方文档简体中文

那这个程序怎么绘制呢?

首先用递归绘制一个3阶科勒曲线,代码有注释就不细说了,直接看代码》》》

step1: 定义一个函数koch有两个参数一个是长度,一个是次数

def koch(size, n):
    if n == 0:#当n为0时,画一条直线
        turtle.fd(size)
    else:
        for angle in [0, 60, -120, 60]:#n不为0时
            turtle.left(angle)#将一条直线分三段,每次旋转相同角度
            koch(size/3, n-1)#递归调用
#调用函数:
koch(400,3)

运行效果:

雪花id python 雪花怎么画_递归_02

step2:画出了一段科勒曲线后,这还不是一个封闭图形,需要将三个科勒曲线连起来就是一个科勒曲线了,相当于是一个正三角形。

koch(400, 3)#调用koch函数
turtle.right(120)#旋转120度
#再调用依次类推,一共调用三次
koch(400, 3)
turtle.right(120)
koch(400, 3)

这样我们的小雪花就初见成效了:

看效果:

雪花id python 雪花怎么画_随机数_03

step3: 那么立体感是怎么实现的呢

只需要在每画完一条直线后就连接一条直线到整个图案的中心点,然后再返回出发点继续画下一条直线。

那么如何获取这个图案的中心点呢?
这里需要用到turtle库的一个方法: turtle.pos()获取当前海龟坐标,仔细观察step2里的雪花图案我们会发现,这其中有三个重要的点:(我用红色把这三个点标注出来看)》》》

turtle.color('red')
turtle.dot(20)# 绘制红点
turtle.color('black')
koch(400, 3)
turtle.color('red')
turtle.dot(20)
turtle.color('black')
turtle.right(120)
koch(400, 3)
turtle.color('red')
turtle.dot(20)
turtle.color('black')
turtle.right(120)
koch(400, 3)
turtle.done()

雪花id python 雪花怎么画_使用说明_04

如果把这三个点连起来看看是什么形状》》》

turtle.dot(20)# 绘制红点
pos1 = turtle.pos()#获取点1坐标
turtle.color('black')
koch(400, 3)
turtle.color('red')
turtle.dot(20)
pos2 = turtle.pos()#获取点2坐标
turtle.color('black')
turtle.right(120)
koch(400, 3)
turtle.color('red')
turtle.dot(20)
pos3 = turtle.pos()#获取点3坐标

然后我们把这三个点连起来》》》

turtle.reset()#重置
turtle.pu()
turtle.goto(pos1)
turtle.pd()
turtle.goto(pos2)
turtle.goto(pos3)
turtle.goto(pos1)
turtle.done()

运行效果:

雪花id python 雪花怎么画_随机数_05


果然是一个等边三角形,所以这个等边三角形的中心就是雪花图案的中心,怎么计算等边三角形中心是数学问题,就不专门介绍了》》》我获取到的三个点坐标为:

雪花id python 雪花怎么画_递归_06


所以可以得到中心点坐标pos = (100,-(300/pow(3,0.5)-200))

step4: 在原有的雪花图案上加上这条往返于中心点的线

def koch(size, n):
    if n == 0:
        turtle.fd(size)
        pos = turtle.pos()# 获取当前坐标作为出发点
        turtle.goto(100,-(300/pow(3,0.5)-200))# 从出发点到中心点
        turtle.goto(pos)# 从中心点回到出发点
    else:
        for angle in [0, 60, -120, 60]:
            turtle.left(angle)
            koch(size/3, n-1)

运行结果:

雪花id python 雪花怎么画_递归_07

**step5:**添加颜色

step4已经画出了一个黑白的立体雪花,那如何添加彩色呢?

这里使用random 库里的random()方法,可以获取(0.0-1.0)之间的随机数。

r, g, b = random.random(), random.random(), random.random()# 给r, g, b赋值随机数
        turtle.color(r, g, b)# 随机改变海龟颜色
        turtle.fd(size)

最后附上完整代码(复制直接可运行)》》》》》

import turtle, random
def koch(size, n):
    if n == 0:
        # r, g, b = random.random(), random.random(), random.random()
        # turtle.color(r, g, b)
        turtle.fd(size)
        pos = turtle.pos()
        turtle.goto(100,-(300/pow(3,0.5)-200))
        turtle.goto(pos)
    else:
        for angle in [0, 60, -120, 60]:
            turtle.left(angle)
            koch(size/3, n-1)
def main():
    turtle.penup()
    turtle.goto(-200, 200)
    turtle.pendown()
    turtle.pensize(1)
    pos1 = turtle.pos()
    koch(600, 3)
    turtle.right(120)
    pos2 = turtle.pos()
    koch(600, 3)
    pos3 = turtle.pos()
    turtle.right(120)
    koch(600, 3)
    turtle.hideturtle()
    print(pos1, pos2, pos3)
    turtle.done()
if __name__ == '__main__':
    main()

=====================================================================