turtle画图实例之 画圆形双喜字
2022-06-21 本文已影响0人
小鱼儿_yzh
圆形双喜字效果图:
动画效果图:
圆形双喜字动画效果
位置分析图分析:
用的还是剪纸的效果,先画一个红色的圆形,然后抠出白色的部分。
白色的部分有两种情况,一种是规则的矩形,用一个画矩形函数 draw_jx ( x , y , h , w)来完成。画矩形函数有四个函数,x 和 y 是矩形的左上角的坐标,至于为什么是左上角,是因为函数的画线过程一直右转,所以是从左上角开始画的。参数 h 画的矩形的高度,参数 w 是画的矩形的宽度。 每次调用函数时的 x , y , h , w 的值用下面的“位置分析图”计算出来。
下面的两个带圆弧形状的小口比较复杂,因为要与外圈的圆弧平行所以往左画一个44度的弧,再往右画一个44度的弧,然后画一条横线,构成一个白色区域,然后在中间画一个纵向的白色矩形,在两边分别补一个红色的矩形。
至于为什么是 44 度的弧,很不好意思,没有啥依据,就是试出来的,用44度和横线的长度去试,构成一个闭合形状形成填充效果。
代码:
from turtle import *
def draw_jx(x,y,h,w):
up()
goto(x,y)
down()
begin_fill()
seth(0)
fd(w)
rt(90)
fd(h)
rt(90)
fd(w)
rt(90)
fd(h)
seth(0)
end_fill()
#变量
a=20 #笔画的最小数据
b=2 #画笔的大小
x = 0 # 初始 x 坐标值
y = -7.5*a # 初始 y 坐标值
pensize(b)
color('red')
speed(10)
#画底色
up()
goto(x,y)
down()
begin_fill()
circle(7.5*a)
end_fill()
color('white')
#画 左侧 1
draw_jx(x-7.5*a,y+13*a,a,3*a)
#画 左侧 2
draw_jx(x-7.5*a,y+11*a,a,3*a)
#画 左侧 3 口
draw_jx(x-5.5*a,y+9*a,a,4*a)
#画 左侧 4
draw_jx(x-7.5*a,y+7*a,a,3*a)
#画 左侧 5
draw_jx(x-7.5*a,y+5*a,a,3*a)
# 右侧横向 1
draw_jx(x+4.5*a,y+13*a,a,3*a)
# 右侧横向 2
draw_jx(x+4.5*a,y+11*a,a,3*a)
# 右侧 横向 3 口
draw_jx(x+1.5*a,y+9*a,a,4*a)
# 右侧横向 4
draw_jx(x+4.5*a,y+7*a,a,3*a)
# 右侧横向 5
draw_jx(x+4.5*a,y+5*a,a,3*a)
# 中间横向 1
draw_jx(x-2.5*a,y+15*a,a,5*a)
# 中间横向 2
draw_jx(x-2.5*a,y+13*a,a,5*a)
# 中间横向 3
draw_jx(x-2.5*a,y+11*a,a,5*a)
# 中间纵向 上
draw_jx(x-0.5*a,y+10*a,3*a,a)
# 中间横向4
draw_jx(x-2.5*a,y+7*a,a,5*a)
# 中间横向5
draw_jx(x-2.5*a,y+5*a,a,5*a)
#下面的口
up()
goto(x,y+a)
down()
begin_fill()
circle(6.5*a,-44)
up()
goto(x,y+a)
seth(0)
down()
circle(6.5*a,44)
seth(-180)
fd(9*a)
end_fill()
# 中间纵向 下
draw_jx(x-0.5*a,y+4*a,4*a,a)
# 补色
color('red')
draw_jx(x-1.5*a,y+3*a,2*a,a-b)
draw_jx(x+0.5*a+b,y+3*a,2*a,a-b)
ht()
exitonclick()