北京冬奥会开幕式上除了“中国结”雪花外,还有一个浪漫元素就是蒲公英。
受此启发,我在网上搜索到蒲公英的简笔画,选了几个python绘图容易实现的简笔画作为参考,绘制出了以下三种蒲公英。
图1的蒲公英绒毛顶端是圆点,图2绒毛顶端是圆形光束,图3绒毛顶端是扇形光束。从左到右,蒲公英的绘制难度逐级增大。
案例1:蒲公英(顶端是圆点)
难度:★★☆☆☆☆
【效果预览】
蒲公英的绒毛顶端是圆点[简单]
【重难点突破】
1. 蒲公英绘制思路:先绘制出三束长短不一的绒毛,然后再进入循环让海龟重复绘制其他的绒毛。
2. 画蒲公英的歪茎:用超大半径,较小角度画圆弧,来实现歪茎效果。
如 turtle.circle(-600,40)
circle(半径,角度) 半径为负时,画在海龟头部方向的右边。即向下绘制,向左弯曲。
【代码参考】
我分享的代码虽然不是最简化的代码,但一定是最方便初学者理解的代码。
# 案例1:蒲公英(绒毛顶端是圆点)【简单】
import turtle # 导入turtle库(模块)
turtle.speed(0) # 设置海龟的绘图速度,参数为0时最快
turtle.delay(0) # 设置海龟的延迟速度,参数为0时表示没有延迟时间。
turtle.bgcolor("#1e67c5") # 设置背景颜色为#1e67c5,一种蓝色
turtle.pencolor("#e0f4f5") # 设置画笔颜色为#e0f4f5,一种白色。纯白色为#ffffff,即white.会比较刺眼。
# 变量初始化设置
a=100 # 定义变量a,表示长绒毛的长度
b=80 # 定义变量b,表示中绒毛的长度
c=60 # 定义变量c,表示短绒毛的长度
a1=8 # 定义变量a1,表示长绒毛顶端圆点的直径
b1=7 # 定义变量b1,表示中绒毛顶端圆点的直径
c1=6 # 定义变量c1,表示短绒毛顶端圆点的直径
# 画球状绒毛
for i in range(15): # 循环15次。因为(8+8+8)*15=360
# 画长绒毛
turtle.forward(a) # 海龟前进a像素
turtle.dot(a1) # 画直径为a1的圆点
turtle.backward(a) # 海龟再后退a像素,回到起点位置
turtle.left(8) # 海龟向左旋转8度,准备画中绒毛
# 画中绒毛
turtle.forward(b)
turtle.dot(b1) # 画直径为b1的圆点
turtle.backward(b)
turtle.left(8) # 海龟再向左旋转8度,准备画短绒毛
# 画短绒毛
turtle.forward(c)
turtle.dot(c1) # 画直径为c1的圆点
turtle.backward(c)
turtle.left(8) # 画完短绒毛后,海龟再向左旋转8度,进入循环画其他绒毛
# 画茎(略歪)(用超大半径,较小角度画圆弧,来实现歪茎效果)
turtle.pensize(3) # 设置画笔的粗细为3,即茎的粗线为3。默认画笔粗线为1
turtle.right(80) # 画完球状绒毛后,海龟朝向右,所以要让海龟向右旋转80度后再画茎
turtle.circle(-600,40) # 半径为负,画在海龟头部方向的右边
# 海龟绘图结束,隐藏海龟
turtle.hideturtle()
下面的代码将各个变量进行了关联,只要改动一个变量a,就会影响其他变量的值,即可以实现蒲公英的等比例缩放。
为了方便初学者理解,在后面的两个案例中,变量不再做关联,只用固定的数值。
# 案例1:蒲公英(绒毛顶端是圆点)【简单】 变量有关联
import turtle # 导入turtle库(模块)
turtle.speed(0) # 设置海龟的绘图速度,参数为0时最快
turtle.delay(0) # 设置海龟的延迟速度,参数为0时表示没有延迟时间。
turtle.bgcolor("#1e67c5") # 设置背景颜色为#1e67c5,一种蓝色
turtle.pencolor("#e0f4f5") # 设置画笔颜色为#e0f4f5,一种白色。纯白色为#ffffff,即white.会比较刺眼。
# 变量初始化设置(只要改动变量a的值,其他变量都会跟着变化)
# 变量之间的关系表达式,没有简化,是为了更方便理解
a=100 # 定义变量a,表示长绒毛的长度
b=80/100*a # 定义变量b,表示中绒毛的长度
c=60/100*a # 定义变量c,表示短绒毛的长度
a1=8/100*a # 定义变量a1,表示长绒毛顶端圆点的直径
b1=7/100*a # 定义变量b1,表示中绒毛顶端圆点的直径
c1=6/100*a # 定义变量c1,表示短绒毛顶端圆点的直径
# 画球状绒毛
for i in range(15): # 循环15次。因为(8+8+8)*15=360
# 画长绒毛
turtle.forward(a) # 海龟前进a像素
turtle.dot(a1) # 画直径为a1的圆点
turtle.backward(a) # 海龟再后退a像素,回到起点位置
turtle.left(8) # 海龟向左旋转8度,准备画中绒毛
# 画中绒毛
turtle.forward(b)
turtle.dot(b1) # 画直径为b1的圆点
turtle.backward(b)
turtle.left(8) # 海龟再向左旋转8度,准备画短绒毛
# 画短绒毛
turtle.forward(c)
turtle.dot(c1) # 画直径为c1的圆点
turtle.backward(c)
turtle.left(8) # 画完短绒毛后,海龟再向左旋转8度,进入循环画其他绒毛
# 画茎(略歪)(用超大半径,较小角度画圆弧,来实现歪茎效果)
turtle.pensize(3) # 设置画笔的粗细为3,即茎的粗线为3。默认画笔粗线为1
turtle.right(80) # 画完球状绒毛后,海龟朝向右,所以要让海龟向右旋转80度后再画茎
turtle.circle(-600,40) # 半径为负,画在海龟头部方向的右边
# 海龟绘图结束,隐藏海龟
turtle.hideturtle()
案例2:蒲公英(顶端是圆形光束)
难度:★★☆☆☆☆
【效果预览】
蒲公英的绒毛顶端是圆形光束[较难]
【重难点突破】
案例2使用了for循环嵌套。右图中框内的for循环代码块代替了左图中的一行代码turtle.dot(a1),因此可以将绒毛顶端的圆点变换为圆形光束。
【代码参考】
# 案例2:蒲公英(绒毛顶端是圆形光束)【较难】
import turtle # 导入turtle库(模块)
turtle.speed(0) # 设置海龟的绘图速度,参数为0时最快
turtle.delay(0) # 设置海龟的延迟速度,参数为0时表示没有延迟时间。
turtle.bgcolor("#1e67c5") # 设置背景颜色为#1e67c5,一种蓝色
turtle.pencolor("#e0f4f5") # 设置画笔颜色为#e0f4f5,一种白色。纯白色为#ffffff,即white.会比较刺眼。
# 变量初始化设置
a=100 # 定义变量a,表示长绒毛的长度
b=80 # 定义变量b,表示中绒毛的长度
c=60 # 定义变量c,表示短绒毛的长度
a1=8 # 定义变量a1,表示长绒毛顶端圆形光束的长度
b1=5 # 定义变量b1,表示中绒毛顶端圆形光束的长度
c1=3 # 定义变量c1,表示短绒毛顶端圆形光束的长度
# 画球状绒毛
for i in range(15): # 循环15次。因为(8+8+8)*15=360
# 画长绒毛
turtle.forward(a) # 海龟前进a像素
for i in range(12): # 海龟循环12次,画绒毛顶端的圆形光束
turtle.forward(a1) # 海龟前进a1像素
turtle.backward(a1) # 海龟再后退a1像素,回到起点位置
turtle.left(30) # 海龟向左旋转30度,准备画下一条光束
turtle.backward(a) # 海龟再后退a像素,回到起点位置
turtle.left(8) # 海龟向左旋转8度,准备画中绒毛
# 画中绒毛
turtle.forward(b) # 海龟前进b像素
for i in range(12):
turtle.forward(b1)
turtle.backward(b1)
turtle.left(30)
turtle.backward(b) # 海龟再后退b像素,回到起点位置
turtle.left(8) # 海龟再向左旋转8度,准备画短绒毛
# 画短绒毛
turtle.forward(c) # 海龟前进c像素
for i in range(12):
turtle.forward(c1)
turtle.backward(c1)
turtle.left(30)
turtle.backward(c) # 海龟再后退c像素,回到起点位置
turtle.left(8) # 画完短绒毛后,海龟再向左旋转8度,进入循环画其他绒毛
# 画茎(略歪)(用超大半径,较小角度画圆弧,来实现歪茎效果)
turtle.pensize(3) # 设置画笔的粗细为3,即茎的粗线为3。默认画笔粗线为1
turtle.right(80) # 画完球状绒毛后,海龟朝向右,所以要让海龟向右旋转80度后再画茎
turtle.circle(-600,40) # 半径为负,画在海龟头部方向的右边
# 海龟绘图结束,隐藏海龟
turtle.hideturtle()
案例3:蒲公英(顶端是扇形光束)
难度:★★☆☆☆☆
【效果预览】
蒲公英的绒毛顶端是扇形光束[最难]
【重难点突破】
案例3也使用了for循环嵌套。图3框内的for循环代码块代替了图1中的一行代码turtle.dot(a1),因此可以将绒毛顶端的圆点变换为扇形光束。
敲重点:画扇形光束比圆形光束要复杂一点,一定要注意左右旋转的角度。不管是圆形还是扇形都要确保海龟最终刚好旋转360度,刚好能够回到起始位置。
如案例3中,因为6个30度和260度都是向左旋转left,80度是向右旋转right,所以海龟绘制完扇形光束后一定要再旋转260度,使得海龟刚好旋转了360度回到起始位置。
30度*6-80度+260度=360度
【代码参考】
# 案例3:蒲公英(绒毛顶端是扇形光束)【最难】
import turtle # 导入turtle库(模块)
turtle.speed(0) # 设置海龟的绘图速度,参数为0时最快
turtle.delay(0) # 设置海龟的延迟速度,参数为0时表示没有延迟时间。
turtle.bgcolor("#1e67c5") # 设置背景颜色为#1e67c5,一种蓝色
turtle.pencolor("#e0f4f5") # 设置画笔颜色为#e0f4f5,一种白色。纯白色为#ffffff,即white.会比较刺眼。
# 变量初始化设置
a=100 # 定义变量a,表示长绒毛的长度
b=80 # 定义变量b,表示中绒毛的长度
c=60 # 定义变量c,表示短绒毛的长度
a1=8 # 定义变量a1,表示长绒毛顶端扇形光束的长度
b1=5 # 定义变量b1,表示中绒毛顶端扇形光束的长度
c1=3 # 定义变量c1,表示短绒毛顶端扇形光束的长度
# 画球状绒毛
for i in range(15): # 循环15次。因为(8+8+8)*15=360
# 画长绒毛
turtle.forward(a) # 海龟前进a像素
turtle.right(80) # 海龟向右旋转80度。(准备开始向左边光束)
for i in range(6): # 循环6次,即画6条光束
turtle.forward(a1)
turtle.backward(a1)
turtle.left(30) # 每条光束画完后,旋转30度。30*6-80=100
turtle.left(260) # 画完扇形光束后,海龟并未回到初始方向。需要再继续向左旋转360-100度
turtle.backward(a) # 海龟后退a像素
turtle.left(8) # 海龟向左旋转8度,准备画中绒毛
# 画中绒毛
turtle.forward(b) # 海龟前进b像素
turtle.right(80)
for i in range(6):
turtle.forward(a1)
turtle.backward(a1)
turtle.left(30)
turtle.left(260)
turtle.backward(b) # 海龟再后退b像素,回到起点位置
turtle.left(8) # 海龟再向左旋转8度,准备画短绒毛
# 画短绒毛
turtle.forward(c) # 海龟前进c像素
turtle.right(80)
for i in range(6):
turtle.forward(a1)
turtle.backward(a1)
turtle.left(30)
turtle.left(260)
turtle.backward(c) # 海龟再后退c像素,回到起点位置
turtle.left(8) # 画完短绒毛后,海龟再向左旋转8度,进入循环画其他绒毛
# 画茎(略歪)(用超大半径,较小角度画圆弧,来实现歪茎效果)
turtle.pensize(3) # 设置画笔的粗细为3,即茎的粗线为3。默认画笔粗线为1
turtle.right(80) # 画完球状绒毛后,海龟朝向右,所以要让海龟向右旋转80度后再画茎
turtle.circle(-600,40) # 半径为负,画在海龟头部方向的右边
# 海龟绘图结束,隐藏海龟
turtle.hideturtle()
-----end -----