第1章 绘 制 图 像 同学们,大家知道用计算机中的绘图软件可以绘制图像,但你们知道绘图软件的工作原理是什么吗?其实,通过程序编制也可以实现绘图功能,还可以绘制出动画的效果,下面就来学习如何利用计算机编程绘制图像。 1.1?课文节选案例 老舍先生的《济南的冬天》是一篇充满诗情画意的散文,作者抓住济南冬天的特点,描绘出济南冬天的独特风景,给人留下了深刻的印象。例如,文中有一段景色描绘为:“山坡上,有的地方雪厚点,有的地方草色还露着;这样,一道儿白,一道儿暗黄,给山们穿上一件带水纹的花衣。”景色如图1-1所示。同学们在学习这篇课文时,一定很想感受一下济南冬天的景色,看看文中所描述的景色吧?如果可以通过计算机编程来绘制场景,将有助于加深对课文的理解。下面用计算机编程来绘制该场景。 图1-1?冬日雪景图 1.2?绘制课文中的雪景 1.2.1?编程前准备 在Python中可以使用turtle 库来进行图形的绘制。turtle库是Python中一个绘制图像的函数库,俗称海龟绘图,它提供了一些基本的绘图工具,可在标准的应用程序窗口中绘制各种图形。从屏幕上横轴为x、纵轴为y的坐标系原点(0,0)位置开始,有一个像小海龟似的绘图图标,它可以根据相关函数指令和程序的控制,在这个平面坐标系中移动,从而在它爬行的路径上绘制图形,还可以通过程序控制,实现改变线段的方向、颜色、宽度等功能。下面先学习一下turtle库的相关操作。 1. 设置画布大小 (1)turtle.screensize(canvwidth=None, canvheight=None, bg=None),参数分别为画布的宽(单位:px)、高、背景颜色。 例如: turtle.screensize(800,600, "blue") turtle.screensize() #返回默认大小(400, 300) (2)turtle.setup(width=0.5, height=0.75, startx=None, starty=None),参数如下。(width, height): 输入的宽和高为整数时, 表示像素; 为小数时, 表示占据计算机屏幕的比例。(startx, starty): 这一坐标表示矩形窗口左上角顶点的位置, 如果为空,则窗口位于屏幕中心。 例如: turtle.setup(width=0.6,height=0.6) turtle.setup(width=800,height=800, startx=100,starty=100) 2.画笔 1)画笔的状态 在画布上,默认有一个坐标原点为画布中心的坐标轴,坐标原点上有一个面朝x轴正方向的小三角形。描述小三角形时使用了两个词语:坐标原点(位置)、面朝x轴正方向(方向)。 turtle绘图中,就是使用位置方向描述小三角形(画笔)的状态。 2)画笔的属性 (1)turtle.pensize():设置画笔的宽度。 (2)turtle.pencolor():没有参数传入时,返回当前画笔颜色;传入参数时,设置画笔颜色,可以是字符串如“green” “red”,也可以是RGB 三元组。 (3) turtle.speed(speed):设置画笔移动速度,范围为[0,10]中的整数,数字越大速度越快。 3)绘图命令 运用turtle绘图有许多命令,这些命令可以划分为三种:画笔运动命令、画笔控制命令、全局控制命令。 (1)画笔运动命令。 turtle.forward(distance) #向当前画笔方向移动distance ? #像素长度 turtle.backward(distance) #向当前画笔相反方向移动 #distance像素长度 turtle.right(degree) #顺时针移动degree turtle.left(degree) #逆时针移动degree turtle.pendown() #移动时绘制图形,省略时也为绘制 turtle.goto(x,y) #将画笔移动到坐标为(x,y)的位置 turtle.penup() #提起笔移动,不绘制图形,用于另 #起一个地方绘制 turtle.circle() #画圆,半径为正(负),表示圆心在 #画笔的左边(右边)画圆 setx( ) #将当前x轴移动到指定位置 sety( ) #将当前y轴移动到指定位置 setheading(angle) #设置当前朝向为angle角度 home() #设置当前画笔位置为原点,朝向东 dot(r) #绘制一个指定直径的圆点 (2)画笔控制命令。 turtle.fillcolor(colorstring) #绘制图形的填充颜色 turtle.color(color1, color2) #同时设置pencolor=color1, # fillcolor=color2 turtle.filling() #返回当前是否在填充状态 turtle.begin_fill() #准备开始填充图形 turtle.end_fill() #填充完成 turtle.hideturtle() #隐藏画笔的turtle形状 turtle.showturtle() #显示画笔的turtle形状 (3)全局控制命令。 turtle.clear() #清空turtle窗口,但是turtle的位置和状态 #不会改变 turtle.reset() #清空窗口,重置turtle状态为起始状态 turtle.undo() #撤销上一个turtle动作 turtle.isvisible() #返回当前turtle是否可见 stamp() #复制当前图形 turtle.write(s [,font=("font-name",font_size,"font_type")]) #写文本,s为文本内容,font是字体的参数,分别为字体名称、 #大小和类型;font为可选项,font参数也是可选项 (4)其他命令。 turtle.mainloop()或turtle.done() #启动事件循环—调用 #Tkinter的mainloop()函数。必须是图形程序中的最后一个语句 turtle.mode(mode=None) #设置模式("standard" "logo"或 #"world")并执行重置。如果没有给出 #模式,则返回当前模式 turtle.delay(delay=None) #设置或返回以ms为单位的绘图延迟 turtle.begin_poly() #开始记录多边形的顶点。当前的位置是多边 #形的第一个顶点 turtle.end_poly() #停止记录多边形的顶点。当前的位置是多边形 ???#的最后一个顶点。将与第一个顶点相连 turtle.get_poly() #返回最后记录的多边形 3.命令详解 turtle.circle(radius, extent=None, steps=None) 描述:以给定半径画圆。 参数: radius(半径):半径为正(负),表示圆心在画笔的左边(右边)画圆。 extent:弧度,可选。 steps:作半径为radius的圆的内切正多边形,多边形边数为steps;可选。 举例: circle(50) #整圆 circle(50,steps=3) #三角形 circle(120, 180) #半圆 此外,除了使用turtle模块外,在学习图形编程时,也可使用图形库graphics.py来编写程序,完成简单的图形编程。可以在自己的Python安装目录中查找是否已有graphics.py,如果没有这个文件,可以通过网络搜索及下载graphic.py,将下载好的graphics.py文件复制到Python\Lib这个路径下,如图1-2所示。 图1-2?将graphics复制到Python的对应路径中 1.2.2?算法设计 用Python的turtle模块可以绘制很多精美的图形。turtle库是Python语言中一个很流行的绘制图像的函数库,绘图时有一个小三角,在一个横轴为x、纵轴为y的坐标系原点,从(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它移动的路径上绘制图形。 为了与前文中的雪景相对应,先设计一段绘制“小山”的程序,勾勒出小山的轮廓;然后定义随机变量,绘制不同大小的雪花;然后运用循环语句绘制雪花飘落的效果,天空中仿佛飘落不同大小的雪花;最后绘制一些地平面的效果,营造冬天的意境。 1.3?编写程序及运行 turtle库是Python语言中一个绘制图像的函数库。在使用之前首先导入turtle库,通过turtle库中的pen()方法,可以进行简单的绘制;使用pendown()方法表示落笔,可以开始绘制图形;使用penup()方法表示提笔;还可以用forword()方法使画笔前进形成一条直线;用pensize()方法定义笔头大小;用pencolor()方法定义笔刷颜色;用hideturtle()方法隐藏画笔标志;最后显示画布并运行画笔程序使用turtle.done()方法。 1.3.1?程序代码 import turtle as t import random as r #画小山 def drawmountain(): t.ht() #隐藏画笔,ht=hideturtle t.penup() #提笔 t.fd(-400) #fd=forward,向当前画笔方向移动-400px长度 t.pendown() #落笔 t.pensize(2)#定义笔头大小 t.pencolor("white")#定义笔刷颜色为白色 t.seth(-25) #设置当前朝向为-25° for i in range(10): #应用循环语句,画9个小山头 t.circle(40,80) #以给定的半径画小圆弧 t.circle(-40,80)#以给定的半径画小圆弧 t.fd(40) #定义画雪 def drawsnow(): t.ht() #隐藏笔头,ht=hideturtle t.pensize(2) #定义笔头大小 for i in range(80): #画79朵雪花 t.pencolor("white") #定义画笔颜色为白色 t.pu() #提笔,pu=penup t.setx(r.randint(-350, 350)) #定义x坐标,随机 #从-350到350选择 t.sety(r.randint(1, 350)) #定义y坐标,注意 #雪花一般在地上不会落下,所以定义是从1开始的 t.pd() #落笔,pd=pendown dens = 6 #雪花瓣数设为6 snowsize = r.randint(2, 12) #定义雪花大小 for j in range(dens): #画5次,也就是一个雪花五角星 #t.forward(int(snowsize)) #int()表示取整数 t.fd(int(snowsize)) t.backward(int(snowsize)) t.bd(int(snowsize)) #注意没有bd=backward, ?? #但有fd=forward t.right(int(360 / dens)) #转动角度 #画地面线 def drawgroud(): t.ht() #隐藏画笔,ht=hideturtle t.seth(10) #设置当前朝向为10° for i in range(r.randint(10, 15)): #随机画几条地面线, #但在10~15 # for i in range(20): #每次操作只画20条地面线 x = r.randint(-400, 350) y = r.randint(-280, -1) t.pencolor("white") t.pu() #提笔,pu=penup t.goto(x, y) #去这个坐标 t.pd() #落笔,pd=pendown t.fd(r.randint(40, 100)) #fd=forward,向前画大小, #随机从40~100选 t.setup(800, 600, 200, 200) #窗口大小和位置 t.tracer(True) #雪花和背景绘制的过程 t.bgcolor("lightblue") #lightblue=天蓝色 t.speed(0.3) #画笔的速度 drawmountain() #执行画小山 drawsnow() #执行画雪 drawgroud() #执行画地面线 t.done() #完成 1.3.2?运行程序 (1)通过单击计算机Windows界面上的“开始”按钮,找到计算机中安装好的Python程序,单击IDLE(Python)启动编程窗口,如图1-3所示。 ?? 图1-3?启动Python程序的编程窗口 (2)在Python的编程窗口中输入1.3.1节中的程序代码,认真检查并核对。 (3)单击菜单上的Run→Run Module命令,或直接按F5快捷键,在弹出的“保存文件”对话框中,完成保存文件操作后,调试运行该程序,如图1-4所示。 图1-4?调试运行程序 (4)得到绘制的雪景效果图,如图1-5所示。 图1-5?雪景效果图 1.4?拓展训练 在语文课本中,有很多描写景物的优美段落。例如,在一篇课文中有一段是这么写的:“山坡上卧着些小村庄,小村庄的房顶上卧着点雪,对,这是张小水墨画,也许是唐代的名手画的吧。”(选自老舍先生的散文《济南的冬天》)请同学们认真品味文中的意境,在1.3.1节程序代码的基础上,试着绘制几座小房子组成的小村庄。