话不多说先上最终效果图:
这个程序需要用到 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)
运行效果:
step2:画出了一段科勒曲线后,这还不是一个封闭图形,需要将三个科勒曲线连起来就是一个科勒曲线了,相当于是一个正三角形。
koch(400, 3)#调用koch函数
turtle.right(120)#旋转120度
#再调用依次类推,一共调用三次
koch(400, 3)
turtle.right(120)
koch(400, 3)
这样我们的小雪花就初见成效了:
看效果:
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()
如果把这三个点连起来看看是什么形状》》》
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()
运行效果:
果然是一个等边三角形,所以这个等边三角形的中心就是雪花图案的中心,怎么计算等边三角形中心是数学问题,就不专门介绍了》》》
我获取到的三个点坐标为:
所以可以得到中心点坐标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)
运行结果:
**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()
=====================================================================
如果觉得我的文章对你有帮助的,麻烦动动你的小手,关注支持一波!谢谢啦
########################################################################