turtle画图实例之 画双喜字
2022-06-20 本文已影响0人
小鱼儿_yzh
双喜字效果图:
分析:
原理其实是画空心字,和剪纸差不多。
方法是从最初的坐标开始,前进和转向结合来完成。
最初的想法是先画最外圈的线条,然后再抠出四角的四个小口字,和中间的两个长条形和中间的工字形。
后来发现,最后抠这些图形的时候,定位坐标比较困难,需要计算坐标,这样就没有通用性了。想要换一个位置画图要改动的东西太多,不容易完成。
又想到一个方法是顺着外圈画的时候,画到相应需要抠图的位置就抬笔过去画,画完后返回到原来的位置继续画。
开始前进的距离都是用固定的数字,后来改成变量 a ,整个喜字的笔画是 a ,喜字第一笔的横画竖左边是 2 * a,喜字的四个口是 5 * a ,抠出来的小口是3 * a ,两个喜字之间是 5 * a。
整个程序可能通过设置 x , y 的值来决定双喜字在画布上的位置,通过改变 a 的值来改变双喜字的大小。这样其实就可以把画双喜字变成一个自定义函数。通过调用函数太到快速的在画布上画多个不同位置不同大小双喜字的效果。
每一步前进长度的计算
用到的命令:
width() 笔的尺寸
speed() 速度
color() 颜色
up() 抬笔
goto() 移动到坐标
down() 落笔
fd() 前进
lt() 左转
rt() 右转
begin_fill() 开始填充
end_fill() 结束填充
双喜字动画效果动画效果:
代码:
from turtle import *
width(2)
color('yellow','red')
speed(0)
x=-200
y = 200
a= 15
up()
goto ( x ,y ) #起始坐标
down()
begin_fill()
fd(2*a)
lt(90)
fd(2*a)
rt(90)
fd(a)
rt(90)
fd(2*a)
lt(90)
fd(5*a)
lt(90)
fd(2*a)
rt(90)
fd(a)
rt(90)
fd(2*a)
lt(90)
fd(2*a)
rt(90)
fd(a)
rt(90)
fd(2*a)
lt(90)
fd(a)
lt(90)
fd(2*a)
rt(90)
fd(a)
rt(90)
fd(2*a)
lt(90)
fd(a)
lt(90)
fd(2*a)
rt(90)
fd(3*a)
rt(90)
fd(2*a)
#画右上小口
up()
rt(90)
fd(a)
rt(90)
down()
fd(a)
lt(90)
fd(a)
lt(90)
fd(a*3)
lt(90)
fd(a)
lt(90)
fd(2*a)
#返回
up()
rt(90)
fd(a)
down()
#继续
fd(a)
lt(90)
fd(2*a)
rt(90)
fd(a)
rt(90)
fd(2*a)
lt(90)
fd(a)
lt(90)
fd(2*a)
rt(90)
fd(3*a)
rt(90)
fd(5*a)
rt(90)
fd(3*a)
rt(90)
fd(2*a)
#画右下小口
rt(90)
up()
fd(a)
down()
rt(90)
fd(a)
lt(90)
fd(a)
lt(90)
fd(3*a)
lt(90)
fd(a)
lt(90)
fd(2*a)
#返回
up()
rt(90)
fd(a)
down()
#继续
fd(a)
lt(90)
fd(5*a)
lt(90)
fd(a)
lt(90)
fd(2*a)
rt(90)
fd(3*a)
rt(90)
fd(5*a)
rt(90)
fd(3*a)
rt(90)
fd(2*a)
#画左下小口
rt(90)
up()
fd(a)
down()
rt(90)
fd(a)
lt(90)
fd(a)
lt(90)
fd(3*a)
lt(90)
fd(a)
lt(90)
fd(2*a)
#返回
up()
rt(90)
fd(a)
down()
#继续
fd(a)
lt(90)
fd(2*a)
rt(90)
fd(a)
rt(90)
fd(2*a)
#画中间留白工字
up()
fd(a)
down()
fd(5*a)
lt(90)
fd(a)
lt(90)
fd(2*a)
rt(90)
fd(3*a)
rt(90)
fd(2*a)
lt(90)
fd(a)
lt(90)
fd(5*a)
lt(90)
fd(a)
lt(90)
fd(2*a)
rt(90)
fd(3*a)
rt(90)
fd(2*a)
lt(90)
fd(a)
#返回
up()
rt(90)
fd(a)
rt(90)
down()
#继续
fd(a)
lt(90)
fd(2*a)
rt(90)
fd(3*a)
rt(90)
fd(2*a)
#画左上小口
up()
rt(90)
fd(a)
rt(90)
down()
fd(a)
lt(90)
fd(a)
lt(90)
fd(3*a)
lt(90)
fd(a)
lt(90)
fd(2*a)
#返回
up()
rt(90)
fd(a)
down()
#继续
fd(a)
lt(90)
fd(2*a)
rt(90)
fd(a)
rt(90)
fd(2*a)
lt(90)
up()
rt(90)
fd(a)
down()
fd(5*a)
lt(90)
fd(a)
lt(90)
fd(5*a)
lt(90)
fd(a)
up()
rt(90)
fd(a)
down()
rt(90)
fd(a)
lt(90)
fd(2*a)
rt(90)
fd(a)
ht()
end_fill()