目录
前言
终于等到放假了,先把之前用turtle库整的小活写了,之后进入快乐复习竞赛+学习Python阶段[doge]。
简介
Turtle库是Python提供的入门级别的绘图库,通过此库可以进行一些简单的图形绘制(真的要很简单才行……),以下为博主的拙作:
Turtle的语法逻辑很简单:在对话框内,有一只海龟,在海龟的爬行过程中,会留下痕迹,通过改变海龟留下痕迹的粗细、颜色,同时操控海龟的爬行轨迹,就可以绘制出任意图形(理论上)。
函数使用
一般情况下,当我们引用库函数时,首先要在程序开始引入库,再在之后的程序中通过”库名.函数名“的方式使用函数。但是当库的名字较长时,会造成些许程序编写上的麻烦。为了解决这个问题,我们可以使用import as
语句,在引用的同时为该库取一个更简短的“小名”,从而方便后续程序的编写。
所以,以下的所有代码都默认程序开头添加了如下语句:
import turtle as t
这样,所有turtle库函数的调用都可以以更加简洁的方式完成,由turtle.函数名(参数)
变为了t.函数名(参数)
。
对于Python中库函数的引用,还可以使用from 库名 import 函数名
语句单独引用一个函数或者from 库名 import*
语句引用一整个库。通过这种方式引用的函数不需要再在语句前加上库名.
,比博主使用的方式更加简短。不过,因为没有了库名的区别,同名函数容易混淆,对程序编写造成困难。所以博主使用的为介绍的第一种引用方式,读者可以根据自己的需求自行选择。
另外,如无特殊说明,函数中传入的表示长度的整数参数均以像素为单位。
设置窗口函数
使用t.setup(width,height,startx,starty)
函数可以控制绘图使用的窗口的大小和位置,其中width
控制窗口宽度,height
控制窗口高度,
(
s
t
a
r
t
x
,
s
t
a
r
t
y
)
(startx,starty)
(startx,starty)控制窗口左上角在整个屏幕的坐标,若不传入这两个参数,则默认将整个窗口置于屏幕中央。
设置RGB参数格式
众所周知,计算机常常使用RGB系统来储存、表示颜色,当我们用tutle库绘制图形的时候,也需要通过RGB参数来控制线条颜色。RGB参数有两种表示方法,一是用 0 ∼ 255 0\sim 255 0∼255之间的整数;二是用 0 ∼ 1 0\sim 1 0∼1之间的小数。在turtle库中,默认使用第二种表示方法,如果我们想要使用第一种表示方法,就需要使用以下语句:
t.colormode(255)
当然,如果你想再次改回默认方式,可以使用以下语句:
t.colormode(1)
改变线条的颜色和粗细
设置颜色
使用t.pencolor()
即可设置颜色,参数可以传入字符串,如'black'
、'red'
,也可以传入RGB三元组(参数样式参考上一条)。
设置粗细
使用t.pensize(width)
即可将线条粗细设置为width
个像素。
控制海龟的抬起和放下
与现实中的绘画类似,画笔通常不会一直放在画布上(一笔画另算),在使用tutle绘制图形的时候,同样不能让海龟一直留下痕迹,所以就有了“抬起”和“放下”两个函数。
抬起海龟
t.penup()
或t.pu()
这两个函数功能完全相同,是编写者为了方便程序编写提供的冗余函数。
放下海龟
t.pendown()
或t.pd()
,功能也完全相同。
控制海龟的行动
完成了之间所述的各种设置,接下来就可以让海龟动起来绘制图案了。
设置海龟速度
用t.speed(v)
讲海龟的移动速度设定为
v
v
v,
v
v
v越大则移动速度越快。如果不设置移动速度,则默认为
6
6
6。
让海龟移动到指定位置
画布以画布正中为原点
(
0
,
0
)
(0,0)
(0,0)建立了直角坐标体系,正右方为
x
x
x轴正方向,正上方为
y
y
y轴正方向,海龟的初始位置为
(
0
,
0
)
(0,0)
(0,0)。如果我们想让海龟直接移动到指定位置,可以使用t.goto(x,y)
函数让海龟移动到坐标为
(
x
,
y
)
(x,y)
(x,y)的点,且海龟的朝向不会改变。
设置海龟的朝向
窗口初始化之后,海龟的默认朝向是正右方(即 x x x轴正方向),我们可以通过两个函数来改变海龟的朝向。
绝对角度体系
绝对角度指海龟的朝向与正右方(即
x
x
x轴正方向)的夹角,这个参数可正可负,并遵循角度制:t.setheading(theta)
或t.seth(theta)
,这两个函数功能也是完全相同的。
海龟角度体系
顾名思义,海归角度体系就是与海龟当前的朝向的相对角度,通过t.left(theta)
和t.right(theta)
就可以让海龟左转或者右转θ°。
让海龟走直线
通过t.forward(lenth)
或t.fd(lenth)
可以让海龟沿着当前朝向直走
l
e
n
t
h
lenth
lenth个像素,如果参数
l
e
n
t
h
lenth
lenth是负数,海龟就会倒退相应距离。
让海龟走圆弧
通过t.circle(r,theta)
可以让海龟以自己正左方距离为
r
r
r的点为圆心绘制一个圆心角为
θ
\theta
θ的圆弧。如果不传入参数
θ
\theta
θ,就会默认绘制一个完整的圆。如果参数
r
r
r为负数,则圆心在海龟正右方。
色彩填充
除了使用线条之外,要绘制图形还可能会使用色块,这就需要图形填充操作。
我们使用t.begin_fill()
和t.end_fill()
来开始/结束图形填充,使用t.fillcolor()
来设置填充颜色(参数格式与前文介绍设置画笔颜色函数类似)。进行图形填充时,海龟的运动轨迹形成的封闭图形会被填充上设定的颜色。如果海龟的行进轨迹没有构成封闭图形,会默认讲填充过程的起点和终点连在一起构成封闭图形。
具体使用如下:
t.begin_fill()
t.fillcolor(颜色参数)
...
海龟运动
...
t.end_fill()
保留画布
正常情况下,当绘图脚本执行完了所有语句,就会自动关闭画布窗口。如果我们想要使窗口长久停留,就需要在代码末尾加上t.done()
语句。
绘制Doge完整代码
所有参数都是博主在 G e o g e b r a Geogebra Geogebra上手动测量的,其中前面的代码还因为不知名因素诱发的脑瘫把坐标一个一个手动算出来了……虽然后面通过设置画面转换比例 b a s e base base和坐标轴转换参数 o x ox ox省了 o y oy oy不少麻烦,但绘制过程也称不上轻松。不得不感慨,用turtle画图,最难的不在于语法,而是怎样将想要绘制的图案解构成直线与圆弧的组合……
import turtle as t
t.setup(600,600)
t.colormode(255)
t.speed(100)
base=62.98536
ox=2.1782*base
oy=2.1566*base
def moveto(x,y):
t.pu()
t.goto(x,y)
t.pd()
return
t.pencolor(231,165,58)#doge外框颜色
t.pensize(5)
moveto(-125,0)
t.seth(-90)
#勾画轮廓并填色
t.begin_fill()
t.fillcolor(255,231,135)#doge主体黄
t.circle(125,205)
t.seth(70.95)
t.circle(88.28,65.815)
t.circle(11.42,90)
t.fd(43.30)
t.seth(158.553)
t.circle(125,48.982)
t.seth(130.2076)
t.circle(78.133,47.345)
t.circle(12.956,56.814)
t.seth(-80.074)
t.fd(77.976)
moveto(33.1895-125,84.778)
t.seth(-132.633)
t.circle(125,42.736)
moveto(113.374,52.278)
t.end_fill()
#右耳
t.begin_fill()
t.seth(-245.159)
t.circle(125,29.226)
t.fillcolor(231,165,58)
t.seth(48)
t.circle(0.666*base,42.6)
t.seth(305.312)
t.circle(-1.32*base,38.375)
t.goto(113.374,52.278)
t.end_fill()
#狗嘴白
moveto(1.985*base,-0.37*base)
t.begin_fill()
t.fillcolor('white')
t.seth(135.435)
t.pu()
t.circle(1.233*base,95.64)
t.circle(-0.95*base,97.578)
t.circle(0.363*base,114.183)
t.seth(105.092-180)
t.circle(125,165.011)
t.end_fill()
#重新勾线
moveto(-125,0)
t.seth(-90)
t.circle(125,180)
#双下巴
moveto(-0.557*base,-1.685*base)
t.seth(331.213)
t.circle(0.845*base,79.264)
t.pencolor(127,50,4)#深棕色
#鼻子+嘴
moveto(-1.18*base,-1.154*base)
t.begin_fill()
t.fillcolor(127,50,4)
t.seth(-224.734+180)
t.circle(0.337*base,224.734-180)
t.fd(0.820*base)
t.circle(0.419*base,84.75)
t.seth(58.22-180)
t.circle(-0.7*base,80.022)
t.seth(142.125)
t.circle(-0.269*base,53.398)
t.seth(22.884)
t.circle(0.583*base,45.723)
t.circle(0.137*base,90)
t.circle(0.662*base,52.107)
t.circle(0.157*base,90)
t.circle(0.497*base,55.629)
t.seth(-90)
t.circle(-0.223*base,76.343)
t.circle(-0.46*base,55)
t.end_fill()
t.goto(-1.18*base,-1.154*base)
t.pencolor('white')
t.width(5)
moveto(1.228*base-ox,1.665*base-oy)
t.circle(1)
#右眼
t.pencolor(127,50,4)
moveto(0,0)
t.pu()
t.begin_fill()
t.fillcolor('white')
t.seth(-31.518)
t.circle(0.9*base,63.243)
t.circle(0.3*base,116.85)
t.fd(0.702*base)
t.circle(0.42*base,180)
t.goto(0,0)
t.end_fill()
t.pd()
t.seth(-31.518)
t.circle(0.9*base,63.243)
t.circle(0.3*base,148.555)
t.seth(180)
t.fd(0.651*base)
t.seth(-169.45)
t.circle(0.312*base,131.756)
t.goto(0,0)
t.seth(-31.518)
t.circle(0.9*base,63.243)
t.begin_fill()
t.fillcolor(127,50,4)
t.circle(0.3*base,148.555)
t.seth(180)
t.circle(0.345*base,159.038)
t.end_fill()
moveto(2.807*base-ox,2.58*base-oy)
t.pencolor('white')
t.circle(1)
#左眼
t.pencolor(127,50,4)
moveto(0.676*base-ox,2.022*base-oy)
t.pu()
t.seth(0)
t.begin_fill()
t.fillcolor('white')
t.fd(0.451*base)
t.circle(0.296*base,73.2)
t.fd(0.5*base)
t.circle(0.252*base,136.159)
t.fd(0.728*base)
t.circle(0.309*base,140.48)
t.goto(0.676*base-ox,2.022*base-oy)
t.end_fill()
t.pd()
t.seth(0)
t.fd(0.451*base)
t.begin_fill()
t.fillcolor(127,50,4)
t.circle(0.296*base)
t.end_fill()
t.circle(0.296*base,180)
t.fd(0.451*base)
t.circle(0.296*base,180)
moveto(1*base-ox,2.5*base-oy)
t.pencolor('white')
t.circle(1)
#签名
moveto(190,-200)
t.pencolor('black')
t.seth(0)
t.fd(74)
moveto(216,-200)
t.seth(-90)
t.fd(40)
t.circle(-10,90)
t.fd(5)
t.circle(-10,90)
moveto(230,-200)
t.seth(-90)
t.fd(25)
t.circle(25,90)
t.fd(15)
t.circle(10,90)
moveto(600,600)
t.done()