2022年北京冬奥会开幕式上“一朵雪花”贯穿始终,给大家印象深刻。今天我们也让海龟来绘制一朵雪花。先绘制一朵普通雪花,在下一期分享中再让海龟来绘制一朵“中国结雪花”~
案例1:雪花(基础代码)
难度:★★☆☆☆☆
【效果预览】
【重难点突破】
雪花绘制思路:上图中的雪花共有6个主干构成,主干之间的夹角是60度。每个主干上又有内外两层分支,外层和内层都各有两个分支构成,每个分支与主干的夹角也是60度。所以我们可以先画出一个主干,然后再使用循环进行绘制。
【代码参考】
# 绘制雪花(都使用固定值)import turtle # 导入turtle库(模块)turtle.speed(0) # 设置海龟的绘图速度,参数为0时最快turtle.pensize(16) # 设置画笔粗细,即雪花线条的粗细为16像素turtle.left(30) # 海龟向左旋转30度后,再开始画雪花的第1个主干for i in range(6): # 循环6次,即雪花由6个主干构成 turtle.forward(100) # 海龟向前移动100像素,可以理解为雪花的最大半径为100 # ① 画外面的两个分支 turtle.backward(25) # 后退25像素,准备画外面的分支 turtle.left(60) # 分支与主干的夹角为60度 turtle.forward(30) # 左分支的长度为30像素 turtle.backward(30) turtle.right(120) turtle.forward(30) # 右分支的长度为30像素 turtle.backward(30) turtle.left(60) # 画完右分支后,海龟向左旋转60度,回到主干方向 # ② 画里面的两个分支 turtle.backward(30) # 再后退30像素,准备画里面的分支 turtle.left(60) # 分支与主干的夹角为60度 turtle.forward(25) # 左分支的长度为25像素 turtle.backward(25) turtle.right(120) turtle.forward(25) # 右分支的长度为25像素 turtle.backward(25) turtle.left(60) # 画完右分支后,海龟向左旋转60度,回到主干方向 # ③ 海龟回到初始位置 100-25-30=45 turtle.backward(45) # 最后再退45像素 # 海龟向左旋转60度,准备进入循环,画其他的主干 turtle.left(60) turtle.hideturtle() # 海龟绘图结束,隐藏海龟
案例2:雪花(加变量优化)
难度:★★☆☆☆☆
【效果预览】
加入多个有关联的变量后,只要更改一个变量的数值,就能实现雪花的等比例缩放。
【重难点突破】
多个变量之间的关系如下图。只要改动一个变量s,就会影响其他变量的值,所以只要任意输入变量s的值,雪花就会实现等比例缩放。
雪花实现等比例缩放的好处:可以使用自定义函数,分别设置雪花的大小,当在同一个画布绘制多个雪花时,雪花大小有变化,画面会更随意灵动。具体应用请参看下面的案例3。
【代码参考】
# 绘制雪花(加变量优化)import turtle # 导入turtle库(模块)turtle.speed(0) # 设置海龟的绘图速度,参数为0时最快turtle.left(30) # 海龟向左旋转30度后,再开始画雪花的第1个主干### 变量初始化设置# 只需要改变s的值,雪花就会等比例缩放s=200 # 定义变量s,s表示雪花的最大半径s1=s/4 # 定义变量s1,s1表示海龟画外面分支前需要后退的距离s2=3/10*s # 定义变量s2,s2表示海龟画里面分支前需要后退的距离s3=45/100*s # 定义变量s3,s3表示海龟返回初始位置需要后退的距离a=s2 # 定义变量a, a表示外面分支的长度b=s1 # 定义变量b, b表示里面分支的长度pensize=16/100*s # 定义变量pensize,pensize表示画笔的粗细,即雪花分支的粗细### 画雪花的6个主干turtle.pensize(pensize) # 设置画笔粗细 for i in range(6): # 循环6次,即雪花由6个主干构成 turtle.forward(s) # 海龟向前移动s像素,可以理解为雪花的最大半径为s # ① 画外面的两个分支 turtle.backward(s1) # 后退s1像素,准备画外面的分支 turtle.left(60) # 分支与主干的夹角为60度 turtle.forward(a) # 左分支的长度为a像素 turtle.backward(a) turtle.right(120) turtle.forward(a) # 右分支的长度为a像素 turtle.backward(a) turtle.left(60) # 画完右分支后,海龟向左旋转60度,回到主干方向 # ② 画里面的两个分支 turtle.backward(s2) # 再后退s2像素,准备画里面的分支 turtle.left(60) # 分支与主干的夹角为60度 turtle.forward(b) # 左分支的长度为b像素 turtle.backward(b) turtle.right(120) turtle.forward(b) # 右分支的长度为b像素 turtle.backward(b) turtle.left(60) # 画完右分支后,海龟向左旋转60度,回到主干方向 # ③ 海龟回到初始位置 turtle.backward(s3) # 最后再退s3像素,回到初始位置 # 海龟向左旋转60度,准备进入循环,画其他的主干 turtle.left(60) ### 海龟绘图结束,隐藏海龟 turtle.hideturtle()
案例3:雪花(加自定义函数优化)
难度:★★★☆☆☆
【效果预览】
如果要同时绘制多个雪花,雪花的颜色尽量要有深浅变化,这样画面更有层次感,更真实。可依据“近大远小,近浅远深”的原则进行配色。
【配色参考】
“从喜欢的图片中找寻配色灵感”
[图片来源于花瓣网]
吸取左图得到的颜色值:
背景颜色为:#0d93b8
雪花颜色为:#e0f4f5最白 #fafafa较白 #b1dce5偏蓝 #82c5cd较蓝
如何吸取图片中的颜色?
请参考以下文章:
Python Turtle绘图:横切的橙子(配色优化——邻近色/反差色)http://mp.weixin.qq.com/s?__biz=MzIwMjE1MTI4MA==&mid=2247501240&idx=1&sn=d4b76a741bc7cbd12abb3abba5af2730&chksm=96e181a7a19608b1d6d4b52106b1361ee8d95e0d2c7c930dca9976660935b4ad566d8d63e731&scene=21#wechat_redirect【代码参考】
# 绘制雪花(加自定义函数优化)import turtle # 导入turtle库(模块)turtle.speed(0) # 设置海龟的绘图速度,参数为0时最快# turtle.delay(0) # 设置海龟绘图的延迟速度,参数为0时表示延迟时间为0turtle.left(30)turtle.bgcolor("#0d93b8") # 设置背景颜色为#0d93b8,一种蓝色### 自定义函数 xuehua(x,y,s,color)def xuehua(x,y,s,color): # 自定义绘制雪花的函数xuehua(),定义了4个变量参数 turtle.pencolor(color) # 设置画笔颜色为变量color turtle.penup() # 海龟抬笔,没有移动(绘画)痕迹 turtle.goto(x,y) # 海龟移动至坐标(x,y),x和y需要由用户输入 turtle.pendown() # 海龟抬笔,移动(绘画)有痕迹 s1=s/4 # 定义变量s1,s1表示海龟画外面分支前需要后退的距离 s2=3/10*s # 定义变量s2,s2表示海龟画里面分支前需要后退的距离 s3=45/100*s # 定义变量s3,s3表示海龟返回初始位置需要后退的距离 a=s2 # 定义变量a, a表示外面分支的长度 b=s1 # 定义变量b, b表示里面分支的长度 pensize=16/100*s # 定义变量pensize,pensize表示画笔的粗细,即雪花分支的粗细 turtle.pensize(pensize) # 设置画笔粗细为pensize for i in range(6): # 循环6次,即雪花由6个主干构成 turtle.forward(s) # 海龟向前移动s像素,可以理解为雪花的最大半径为s # ① 画外面的两个分支 turtle.backward(s1) # 后退s1像素,准备画外面的分支 turtle.left(60) # 分支与主干的夹角为60度 turtle.forward(a) # 左分支的长度为a像素 turtle.backward(a) turtle.right(120) turtle.forward(a) # 右分支的长度为a像素 turtle.backward(a) turtle.left(60) # 画完右分支后,海龟向左旋转60度,回到主干方向 # ② 画里面的两个分支 turtle.backward(s2) # 再后退s2像素,准备画里面的分支 turtle.left(60) # 分支与主干的夹角为60度 turtle.forward(b) # 左分支的长度为b像素 turtle.backward(b) turtle.right(120) turtle.forward(b) # 右分支的长度为b像素 turtle.backward(b) turtle.left(60) # 画完右分支后,海龟向左旋转60度,回到主干方向 # ③ 海龟回到初始位置 turtle.backward(s3) # 最后再退s3像素,回到初始位置 # 海龟向左旋转60度,准备进入循环,画其他的主干 turtle.left(60) # 海龟向左旋转,准备画其他的主干 ### 调用自定义函数 xuehua(x,y,s,color)# 四种雪花颜色参考:最白#e0f4f5 较白#fafafa 偏蓝#b1dce5 较蓝#82c5cd xuehua(-130,100,60,"#fafafa") # 调用自定义函数xuehua(x,y,s,color),分别给4个参数赋值xuehua(20,200,40,"#82c5cd")xuehua(20,-100,50,"#b1dce5")xuehua(-200,-150,40,"#82c5cd")xuehua(240,-250,80,"#e0f4f5")xuehua(-180,250,20,"#82c5cd")xuehua(230,60,25,"#b1dce5")### 海龟绘图结束,隐藏海龟 turtle.hideturtle()
如果觉得喜欢,希望你能花0.1秒点个赞呦~ 你小小的点赞永远是我持续创作的动力,谢谢你~