Python几何图形编程之正方形和内切圆

1 任务描述

用Python作图,在正方形里画一个内切圆,然后画这个圆的内接正方形,接着在内接正方形里再画内切圆,依此类推。每个图形可以选择不同的颜色。

2 数学知识点

(1)圆的定义

在一个平面内,一个动点以一个定点为中心,以一定长度为距离,旋转一周所形成的封闭曲线叫做圆。这个定点叫做圆的圆心。连接圆心和圆上的任意一点的线段叫做半径,字母表示为r

(2)正方形的内切圆和外接圆

与正方形各边都相切的圆叫做正方形的内切圆;与正方形各顶点都相交的圆叫做正方形的外接圆。如图1所示,假若正方形的重心在原点O(0,0),正方形的边长是l,那么它的对角线的长度就是Python几何图形编程之正方形和内切圆,约为1.414l。这个正方形内切圆的半径为l/2,正方形外接圆的半径约为1.414×l/2,正方形A点的坐标为(-l/2,-l/2),AO与横轴正向的夹角为-135°。

Python几何图形编程之正方形和内切圆

图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°。

Python几何图形编程之正方形和内切圆

图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所示。

Python几何图形编程之正方形和内切圆

图3 画不同半径圆的程序代码

Python几何图形编程之正方形和内切圆

图4 程序运行结果:相同起点不同半径的圆

用Python的turtle库画圆时,如果把半径设置为负数,会怎么样?我们把图3所示程序代码中的pic.circle(100*(1/2)**i),改为pic.circle(-100*(1/2)**i),运行结果如图5所示。原来,半径为负的时候,表示圆心在画笔运行方向的右边。

Python几何图形编程之正方形和内切圆

图5 程序运行结果:相同起点半径均为负的圆

(2)设置turtle模式:mode()

在使用turtle库画图时,画笔的默认朝向以横轴正向为0°,逆时针旋转为正向,顺时针旋转为负向。这是turtle库的标准工作模式。在Python中,使用mode()函数可以返回“standard”值,获取turtle的工作模式如图6所示。

Python几何图形编程之正方形和内切圆

图6 获取turtle的工作模式

如果将turtle的标准工作模式设为“logo”,则turtle画笔的初始朝向以纵轴正向为0°,顺时针旋转为正向,逆时针旋转为负向。

turtle的两种工作模式说明如图7所示。

我们在图3所示的程序代码中,在导入turtle库后,增加pic.mode(”logo”)的程序代码,如图8所示,运行结果如图9所示。

Python几何图形编程之正方形和内切圆

图7 turtle的两种工作模式说明

Python几何图形编程之正方形和内切圆

图8 turtle工作模式设为logo后画圆的程序代码

Python几何图形编程之正方形和内切圆

图9 程序运行结果:turtle工作模式设为logo后画圆

为了理解logo工作模式对画笔运行角度的影响,先看一段程序代码,如图10所示,运行结果如图11所示。0°方向是正北方向(纵轴正向),45°方向是由0°方向顺时针旋转45°的方向。-90°是由0°方向逆时针旋转90°的方向,215°是由0°方向顺时针旋转215°的方向。

Python几何图形编程之正方形和内切圆

图10 观察logo工作模式对角度影响的程序代码

Python几何图形编程之正方形和内切圆

图11 程序运行结果:logo工作模式的角度变化

(3)在turtle中写文字的函数:write()

在用turtle库画图时,有时需要使用函数write()在画布上写字。函数write()的格式为:

Python几何图形编程之正方形和内切圆

其中,s为文本内容,font是字体的参数,包括字体名称、大小和类型。

举例来说,用turtle库的函数write()书写文字的程序代码如图12所示,运行结果如图13所示。

Python几何图形编程之正方形和内切圆

图12 使用turtle库函数write()书写文字的程序代码

Python几何图形编程之正方形和内切圆

图13 程序运行结果:画布上书写文字结果

(4)列表

使用turtle库的函数画组合图形,经常需要把画笔移动到不同的位置处。这些位置如果没有什么数学规律,很难在循环的过程中通过计算产生。我们可以把没有数学规律的位置放在一个列表里。在循环中使用索引可以获取这些位置。

例如,画一个奥运五环,首先把五个圆的画笔起始坐标放在如下的位置列表里。

Python几何图形编程之正方形和内切圆

然后使用for循环,画5个圆需要循环5次。每次循环要完成获取当前圆的颜色、抬笔、把画笔移动到当前圆的起始位置、落笔、画圆等几个动作,程序代码如图6-14所示。

Python几何图形编程之正方形和内切圆

图14 画奥运五环的程序代码

程序运行结果如图15所示。

Python几何图形编程之正方形和内切圆

图15 程序运行结果:奥运五环

4 任务分析

在正方形里画一个内切圆,内切圆里又画个内接正方形,依此类推。由于要画多个正方形和圆,所以要用到循环。每次循环需要画一个正方形及其内切圆,关键是要找准各个正方形和圆的起笔位置。

从前面可知,正方形内切圆的半径r是正方形边长l的一半,正方形起点的位置在(-r,-r),它的内接圆的起点位置在(0,-r)。下次循环中,正方形的起点位置则变成了(-r/1.414,-r/1.414),内接圆的起点位置在(0,-r/1.414)。每个图形选择不同的颜色,需要定义颜色列表。

基本逻辑结构如下:

Python几何图形编程之正方形和内切圆

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)的位置上,写“正方形与圆”几个字。

Python几何图形编程之正方形和内切圆

图16 画正方形与圆的程序代码

6 运行结果

运行squarecircle.py,结果如图17所示。

Python几何图形编程之正方形和内切圆

图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循环里的画笔起始朝向的绝对角度变化一下,程序运行的结果会有什么样的变化?

Python几何图形编程之正方形和内切圆

图18 程序运行结果:模式为logo的正方形和圆组合图形

在图16程序中,把第一层for循环里setheading(0)变为setheading(45),运行结果如图19所示。循环里正方形的起笔方向变化后,圆的内接正方形的起点位置不再是(-l/2,-l/2),而需要另外计算。如果不重新调整,后续画出的正方形就不再是前一个圆的内接正方形了。

Python几何图形编程之正方形和内切圆

图19 程序运行结果:更改循环里正方形的起笔方向后的图形

8 挑战自我

用Python作图,画出如图20所示的方圆组合图形。

Python几何图形编程之正方形和内切圆

图20 方圆组合

参考程序

参考答案文件:squarecirclecbd.py,该正方形和圆的组合图形的程序设计如图21所示。

Python几何图形编程之正方形和内切圆

图21方圆组合的程序代码

小结

·数学知识:圆的定义;

圆的外切正方形和内接正方形,正方形的外接圆和内切圆。

·编程知识:画圆;

turtle的工作模式设置函数mode();

在画布上写字函数write();

位置列表的使用;

正方形、圆的位置和角度关系的程序设计。

发表评论