1 任务描述
用Python作图,在正方形里画一个内切圆,然后画这个圆的内接正方形,接着在内接正方形里再画内切圆,依此类推。每个图形可以选择不同的颜色。
2 数学知识点
(1)圆的定义
在一个平面内,一个动点以一个定点为中心,以一定长度为距离,旋转一周所形成的封闭曲线叫做圆。这个定点叫做圆的圆心。连接圆心和圆上的任意一点的线段叫做半径,字母表示为r。
(2)正方形的内切圆和外接圆
与正方形各边都相切的圆叫做正方形的内切圆;与正方形各顶点都相交的圆叫做正方形的外接圆。如图1所示,假若正方形的重心在原点O(0,0),正方形的边长是l,那么它的对角线的长度就是,约为1.414l。这个正方形内切圆的半径为l/2,正方形外接圆的半径约为1.414×l/2,正方形A点的坐标为(-l/2,-l/2),AO与横轴正向的夹角为-135°。
图1 正方形的外接圆和内切圆
(3)圆的外切正方形和内接正方形
每条边都与圆相切的正方形,是圆的外切正方形;每个顶点都在圆上的正方形是圆的内接正方形。如图2所示,假若圆心在原点O(0,0),圆的半径为r,那么它的外切正方形的边长是2r,对角线长约为2r×1.414;内接正方形的边长约为2r/1.414,对角线的长度就是2r。一个圆的外切正方形和内接正方形会有很多。以有一条边与横轴平行的正方形为例,外切正方形E点的坐标为(-r,-r),内接正方形A点的坐标为(-r/1.414,-r/1.414)。AO与横轴正向的角度为-135°。
图2 圆的外切正方形和内接正方形
3 编程知识点
(1)画圆函数circle()
在turtle库中,画圆的函数是circle(),它的作用是用给定的半径画圆。比如说,circle(100)就是画一个半径为100像素的圆,画笔方向默认是横轴正向,圆心在垂直于画笔方向的左侧,距离画笔100像素的地方,起点在画笔当前位置。
用不同颜色的画笔,以原点为起点,画一系列不同半径的圆,程序代码如图3所示。使用for循环,每次循环取一种颜色,画一个半径为100*(1/2)**i的圆。i从0开始,取值分别为0,1,2,3,4,5,6,7,则(1/2)**i的取值依次为(1/2)0,(1/2)1,(1/2)2,(1/2)3,(1/2)4,(1/2)5,(1/2)6,(1/2)7。于是,第1个圆的半径为100像素,第2个圆的半径就是50像素,第3个圆的半径就是25像素,依此类推。这段代码运行的结果如图4所示。
图3 画不同半径圆的程序代码
图4 程序运行结果:相同起点不同半径的圆
用Python的turtle库画圆时,如果把半径设置为负数,会怎么样?我们把图3所示程序代码中的pic.circle(100*(1/2)**i),改为pic.circle(-100*(1/2)**i),运行结果如图5所示。原来,半径为负的时候,表示圆心在画笔运行方向的右边。
图5 程序运行结果:相同起点半径均为负的圆
(2)设置turtle模式:mode()
在使用turtle库画图时,画笔的默认朝向以横轴正向为0°,逆时针旋转为正向,顺时针旋转为负向。这是turtle库的标准工作模式。在Python中,使用mode()函数可以返回“standard”值,获取turtle的工作模式如图6所示。
图6 获取turtle的工作模式
如果将turtle的标准工作模式设为“logo”,则turtle画笔的初始朝向以纵轴正向为0°,顺时针旋转为正向,逆时针旋转为负向。
turtle的两种工作模式说明如图7所示。
我们在图3所示的程序代码中,在导入turtle库后,增加pic.mode(”logo”)的程序代码,如图8所示,运行结果如图9所示。
图7 turtle的两种工作模式说明
图8 turtle工作模式设为logo后画圆的程序代码
图9 程序运行结果:turtle工作模式设为logo后画圆
为了理解logo工作模式对画笔运行角度的影响,先看一段程序代码,如图10所示,运行结果如图11所示。0°方向是正北方向(纵轴正向),45°方向是由0°方向顺时针旋转45°的方向。-90°是由0°方向逆时针旋转90°的方向,215°是由0°方向顺时针旋转215°的方向。
图10 观察logo工作模式对角度影响的程序代码
图11 程序运行结果:logo工作模式的角度变化
(3)在turtle中写文字的函数:write()
在用turtle库画图时,有时需要使用函数write()在画布上写字。函数write()的格式为:
其中,s为文本内容,font是字体的参数,包括字体名称、大小和类型。
举例来说,用turtle库的函数write()书写文字的程序代码如图12所示,运行结果如图13所示。
图12 使用turtle库函数write()书写文字的程序代码
图13 程序运行结果:画布上书写文字结果
(4)列表
使用turtle库的函数画组合图形,经常需要把画笔移动到不同的位置处。这些位置如果没有什么数学规律,很难在循环的过程中通过计算产生。我们可以把没有数学规律的位置放在一个列表里。在循环中使用索引可以获取这些位置。
例如,画一个奥运五环,首先把五个圆的画笔起始坐标放在如下的位置列表里。
然后使用for循环,画5个圆需要循环5次。每次循环要完成获取当前圆的颜色、抬笔、把画笔移动到当前圆的起始位置、落笔、画圆等几个动作,程序代码如图6-14所示。
图14 画奥运五环的程序代码
程序运行结果如图15所示。
图15 程序运行结果:奥运五环
4 任务分析
在正方形里画一个内切圆,内切圆里又画个内接正方形,依此类推。由于要画多个正方形和圆,所以要用到循环。每次循环需要画一个正方形及其内切圆,关键是要找准各个正方形和圆的起笔位置。
从前面可知,正方形内切圆的半径r是正方形边长l的一半,正方形起点的位置在(-r,-r),它的内接圆的起点位置在(0,-r)。下次循环中,正方形的起点位置则变成了(-r/1.414,-r/1.414),内接圆的起点位置在(0,-r/1.414)。每个图形选择不同的颜色,需要定义颜色列表。
基本逻辑结构如下:
5 程序设计
新建一个Python程序文件,叫squarecircle.py。画正方形与圆的程序代码如图16所示。程序先定义colors颜色列表,给正方形边长l和内切圆半径r赋初始值,然后使用setheading()函数将画笔朝向变为-135°,接着使用forward(1.414*l/2)把画笔移到正方形的起笔位置上。一共执行12次循环,每次循环都画一个正方形和它的内切圆,画完以后,使用l=2*r/1.414和r=l/2算出下一次循环中正方形的边长和内切圆的半径。
完成循环后,最后在(-100,200)的位置上,写“正方形与圆”几个字。
图16 画正方形与圆的程序代码
6 运行结果
运行squarecircle.py,结果如图17所示。
图17 程序运行结果:正方形和圆的组合图形
7 发散思考
(a)在导入turtle库后,如果将运行模式设置为logo,程序运行的结果会有何不同?为什么?如何让程序运行正常?
在图16所示程序的“import turtle as pic”后,加上pic.mode(”logo”),改变turtle的工作模式为logo。现在纵轴正向为0°,顺时针旋转为正向,逆时针旋转为负向。程序运行结果如图6-18所示。这是由于setheading(0)把画笔的朝向改为了纵轴的正向。于是,在新工作模式下,正方形第一笔的方向位置和内切圆的起点位置都发生了变化,从而图形发生了变化。standard工作模式下的0°,在logo模式下是90°。因此把setheading(0)改为setheading(90),程序运行结果就是图17所示的样子了。
(b)如果把第一层for循环里的画笔起始朝向的绝对角度变化一下,程序运行的结果会有什么样的变化?
图18 程序运行结果:模式为logo的正方形和圆组合图形
在图16程序中,把第一层for循环里setheading(0)变为setheading(45),运行结果如图19所示。循环里正方形的起笔方向变化后,圆的内接正方形的起点位置不再是(-l/2,-l/2),而需要另外计算。如果不重新调整,后续画出的正方形就不再是前一个圆的内接正方形了。
图19 程序运行结果:更改循环里正方形的起笔方向后的图形
8 挑战自我
用Python作图,画出如图20所示的方圆组合图形。
图20 方圆组合
参考程序
参考答案文件:squarecirclecbd.py,该正方形和圆的组合图形的程序设计如图21所示。
图21方圆组合的程序代码
小结
·数学知识:圆的定义;
圆的外切正方形和内接正方形,正方形的外接圆和内切圆。
·编程知识:画圆;
turtle的工作模式设置函数mode();
在画布上写字函数write();
位置列表的使用;
正方形、圆的位置和角度关系的程序设计。