1 任务描述
用Python编程,在屏幕上随机地画出很多点来。
2 数学知识点
(1)点
点是最简单的图形,是几何图形最基本的组成元素。在欧氏几何中,点是只有位置没有大小的图形,平面中不同位置的点如图1所示。点在空间中是1个0维度的对象。
图1 平面中不同位置的点
(2)直角坐标系
在平面内画两条互相垂直,且有公共原点的数轴。其中横轴为x轴,纵轴为y轴。这两个相互垂直的轴把平面分为四个部分,从右上角开始数起,按照逆时针方向,分别为第1象限,第2象限,第3象限,第4象限。这样在平面上建立了直角坐标系,如图2所示。
这样,我们可以用一个有序数对表示平面上某个点的位置,这个有序数对叫坐标。表示方法为(a,b),a是该点在横轴上对应的数值,b是该点在纵轴上对应的数值。点(2,-2)所在的位置就是第4象限中横坐标是2,纵坐标是-2的位置。
图2 直角坐标系
3 编程知识点
(1)turtle库
turtle库是Python入门级的图形绘制函数库,是Python自带的标准库之一。使用turtle库绘图,可以想象有一只海龟在画布上移动,默认初始位置在画布的正中心,海龟走过的轨迹就形成了绘制的图形。移动的海龟由程序控制,可以变换颜色、宽度、大小、位置、方向等。
用import调用turtle库可以有三种形式:
第一种直接用“import turtle”导入turtle库,如图3所示。后续使用turtle库时,需要使用turtle库名。如果回车以后没有错误提示,则表示导入库成功。
图3 导入turtle库
第二种用“import turtle as 别名”导入turtle库,如图4所示,在后续使用turtle库时,可以直接用别名代替。如果回车以后没有错误提示,则表示导入库成功。
图4 导入turtle库,别名为pic
第三种用“from 库名 import*”导入turtle库,from import方式导入turtle库如图5所示,后续使用这个库里的函数或方法时,不需要再说明库名称。如果回车以后没有错误提示,表示导入库成功。
图5 from import方式导入turtle库
(2)画布的坐标系
turtle库画图的平面被称为画布(canvas),原点(0,0)在画布的正中央,即1/2画布高、1/2画布宽的位置。以画布中央的点为原点(0,0),建立一个横轴为x轴、纵轴为y轴的坐标系,小海龟画笔在画布上移动的位置,就可以在这个直角坐标系中确定下来,如图6所示。
图6 turtle画布中的坐标系
在画布中,坐标(x,y)的单位是像素。这个单位与液晶显示屏的尺寸及分辨率有关。屏幕越大,分辨率越小,像素代表的实际尺寸越大。
在画布中,点(20,-30)的位置在画布的右下角,即第4象限,距离y轴20像素,距离x轴30像素。
(3)移动画笔函数goto()
画笔的默认位置在画布中央。在turtle画布中,使用函数goto()可以移动画笔到指定位置。
移动画笔位置的程序代码如图7所示,导入turtle库,别名为pic,分别按顺序调用了4次turtle库中的函数goto()。最初,画笔在原点(0,0)的位置上,使用函数goto(100,100)将画笔从原点移动到了第1象限的(100,100)位置上;然后使用函数goto(-100,50)将画笔移动到了第2象限的(-100,50)位置上,再使用函数goto(-50,-50)将画笔移动到了第3象限的(-50,-50)位置,最后使用函数goto(50,-100)将画笔移动到了第4象限的(50,-100)位置。程序运行结果为如图8所示的画笔运行轨迹(黑色部分)。
图7 移动画笔位置的程序代码
图8 程序运行结果:移动画笔的轨迹
(4)画点函数dot()
在turtle库中,用来画点的函数为dot()。点最重要的属性就是位置,这和几何里点的属性一样。在几何里,点没有大小和颜色;但使用turtle库的画点函数时,点是可以指定大小和颜色的。格式为:
如dot(5,“green”)就是画一个直径为5的绿点。直接用dot(),不指定任何参数时,点的直径的默认大小是max(画笔宽度 4,2×画笔宽度),颜色是黑色。
画4个点的程序代码如图9所示。导入turtle库,别名为pic,分别按顺序调用4次turtle库中的函数dot()。这里没有使用函数goto()移动画笔的位置,所以画笔一直在原点(0,0)处。
图9 画4个点的程序代码
dot(100,“orange”)以原点为中心,画一个直径为100像素的橙色的点;dot(50,“red”)以原点为中心,画一个直径为50像素的红色的点;dot(10,“purple”)以原点为中心,画一个直径为10像素的紫色的点;pic.dot()以原点为中心,画一个默认大小的黑点。运行这段程序,得到的图形如图10所示。
图10 程序运行结果:位置在原点的不同大小的点
(5)抬笔函数penup()和落笔函数pendown()
在(0,0)、(50,0)、(100,0)处分别画三个点,代码如图11所示。画笔的初始位置在(0,0)处,调用函数dot()画一个默认大小的黑点;然后使用函数goto(50,0)将画笔挪到第二个点的位置,画同样的点;最后使用函数goto(100,0)将画笔挪到第三个点的位置,画一个同样的点。
图11 不同位置画三个点的程序代码
程序运行结果如图12所示。
图12 程序运行结果:画三个点(有画笔移动轨迹)
如果我们只想画三个点,不想呈现画笔移动的轨迹,该怎么办呢?画点的时候,使用落笔函数pendown(),移动画笔的时候使用抬笔函数penup(),程序代码如图13所示。在原点画一个点后,使用函数penup()抬笔,将画笔移动到(50,0)位置上,此时由于画笔处于“抬起”的状态,画笔并不留下移动痕迹。在位置(50,0)画第2个点之前,使用函数pendown()落笔。画第3个点也如此操作。程序运行结果如图14所示。
图13 不同位置画点(有抬笔、落笔)的程序代码
图14 程序运行结果:画三个点(没有画笔移动轨迹)
(6)for循环
在上面画3个点的示例中,调用函数dot()三次,调用函数goto()、落笔函数pendown()、抬笔函数penup()各两次。如果画很多点,就要重复很多次上面的代码,非常烦琐。对于这种有规律可循的动作,用循环语句实现可以大大简化编程复杂度。
比如,在画三个点的程序中,使用for循环来简化代码,如图15所示。需要画的点数越多,代码的简化量越大。
图15 使用for循环简化画三个点的程序代码
在for循环中,执行的动作包括抬笔penup()、移动画笔goto()、落笔pendown()、画点dot()4个动作。虽然在图15的左图中,由于在原点处画第1个点,没有抬笔、移动画笔、落笔的动作,但为了实现循环,在画笔初始位置画点时同样加上抬笔、移动到原点、落笔的动作。
在函数range(3)中确定了for循环的次数。range(3)相当于0,1,2三个数,i依次从这三个数中取值。变量x是为了依次生成3个点的坐标位置。这3个点在x轴上,间距是50像素。
(7)随机数
在Python中产生随机数需要调用random库。randint()函数用于随机生成一个指定范围内的整数。如randint(a,b)生成[a,b]之间包括a和b的整数,其中a≤b。
默认画布的长为400像素,高为300像素。为了在画布上生成一个点的随机位置,可以使用函数randint()生成坐标和直径。x可以在[-200,200]中随机选取,y可以在[-150,150]中随机选取。点的直径d可以在[1,50]中随机选取。
randint(-200,200)、randint(-150,150)、randint(1,50)生成的数如图16所示。每次运行这些函数时,生成的整数是不一样的。
图16 随机生成一个整数的程序代码
4 任务分析
若要在屏幕上随机画出很多点,需要导入两个库:一个是画图的turtle库,另一个是生成随机数的random库。由于要生成很多点,需要用到循环语句。在循环体里,需要完成的事情有生成点的随机位置、生成点的随机大小、抬笔、把画笔挪到相应位置、落笔、画点。整个过程如下:
5 程序设计
在Python的文件编辑器里,新建一个dotsrandom.py文件,完成随机生成点的程序设计,程序代码如图17所示。在导入turtle库的时候,给该库对象起一个别名pic;在导入random库的时候,给该库对象起一个别名r。使用for循环,循环100次,生成100个点。在每次循环中,使用随机函数randint()随机生成点的坐标(x,y)和点的直径d。然后抬笔penup(),移动画笔goto(x,y),落笔pendown(),画点dot()。
图17 随机生成点的程序代码
6 运行结果
运行dotsrandom.py程序,输出随机生成点如图18所示。
图18 程序运行结果:随机生成点
7 发散思考
(a)如果把程序中的函数penup()和pendown()都去掉,效果会怎样?
去掉图17所示程序中的函数penup()和pendown()后,运行结果如图19所示。
图19 程序运行结果:没有抬笔落笔动作的随机点图
(b)如果把点的纵轴范围限制在[-100,100]之间,效果会怎样?
如果把图17所示程序中的y=r.randint(-150,150)改为y=r.randint(-100,100),运行结果如图20所示。
图20 程序运行结果:纵轴方向压扁的随机点图
8 挑战自我
编写一个Python程序,从屏幕中随机生成很多黑脸图标,如图21所示。
图21 黑脸图标
参考程序
参考程序文件dotsblackface.py,随机生成黑脸图标的程序代码如图22所示,程序运行结果如图23所示。
图22 随机生成黑脸图标的程序代码
图23 程序运行结果:随机生成黑脸图标