1 任务描述
用Python作图,画出如图1所示的正方形组合图形,并设计填充颜色。
图1 正方形组合图形
2 数学知识点
(1)正方形
四条边都相等、四个角都是直角的四边形是正方形。即正方形四个角都是90°,内角和为360°。
在如图2所示的正方形中,AB=BC=CD=DA,∠A=∠B=∠C=∠D=90°。
图2 正方形
(2)正方形的对角线
正方形的对角线互相垂直、平分且相等,每条对角线都平分一组对角。如图3所示,AC、DB是正方形的对角线,它们和正方形边的夹角为45°,BC=ACsin45°。正方形对角线的长度是边长的倍。
图3 正方形的对角线
3 编程知识点
(1)设置显示区域的大小和颜色
在turtle库中,画笔画图的区域称为画布(canvas)。如果不进行设置,这个画布的可显示区域的默认大小可以使用函数screensize()获取,如图4所示,默认大小为(400,300)。
图4 获取画布大小的代码
也可以使用函数screensize()来设置可显示区域的大小,代码如图5所示,显示区域的大小可设置为(800,600)。
图5 设置画布大小的代码
使用函数bgcolor()或函数screensize()均可设置画布的颜色,二者设置颜色值的格式分别为:
将画布的颜色分别设置成蓝色和黄色的代码,如图6所示。
(2)正方形的画法
用Python画正方形,由于四个边长度相同,四个角都是90°,画笔需要前移的长度和需要逆时针旋转的角度值都是一样的,规律性很明显,可以用循环来处理。程序代码如图7所示。
图6 设置画布颜色的代码
图7 画正方形的程序代码
现在,用Python画一个对角线和横轴方向垂直的正方形。画笔宽度设置为3,即pensize(3);画笔颜色设置为“yellow”,即pencolor(“yellow”)。画笔的起始朝向很重要,对角线和横轴方向垂直,那么画笔起始的角度是45°,使用setheading(45)来实现。程序代码如图8所示,程序运行结果如图9所示。
图8 起始笔45°的正方形的程序代码
图9 程序运行结果:起始笔45°的正方形
(3)函数backward()
在turtle库中,画笔后退函数backward()用于实现沿着当前画笔朝向后退一定长度,画笔的朝向不变的情况。经常用于画笔前行一段距离后还要回到原处的场景,也可以用于需要后退一定距离但画笔朝向不变的场景。
使用画笔后退函数的程序代码如图10所示。从原点出发,每隔30°画一条线,线长50像素。由于画笔前移50像素后,还得沿原来方向后退回去,所以用到backward()函数。运行程序,观察画笔的运动轨迹和画笔朝向的变化,程序运行结果如图11所示。
图10 使用画笔后退函数的程序代码
图11 程序运行结果:画笔前进后退运行轨迹
如果把图10中的程序backward(50)改为backward(60),画笔颜色更改为红色,程序代码如图12所示。程序运行结果如图13所示,可借此加深对控制画笔前移和后退的理解。
图12 更改设置形成新图形的程序代码
图13 程序运行结果:旋转线段
4 任务分析
整个图案是由三种不同颜色、两种不同大小的正方形组成的。假设画布的底色为棕色,问题就转换成画多横排多纵列的起笔朝向为-45°的黄色大正方形,再加上画多横排多纵列的起笔朝向为0°的绿色小正方形。
在横向或纵向上,两个相邻大正方形或小正方形起笔的距离都等于其对角线长度,即边长的(约等于1.414)倍。
假设正方形的边长为50像素,图案中重要的长度和角度关系如图14所示。
图14 图案中重要的长度和角度关系
多排多列画图程序至少需要两层循环,画正方形又需要一层循环,因此需要三层循环。
为了体现两种正方形的组合效果,我们先画大正方形,再画小正方形。二者的逻辑结构是相似的,画法思路也是一样的,只是画笔朝向和正方形边长不一样。下面以画黄色的大正方形为例说明。
任务的基本逻辑如下:
5 程序设计
新建一个Python程序文件squarecombined.py。程序分为两部分,画黄色大正方形的程序代码如图15所示,画绿色小正方形的程序代码如图16所示。程序中在画图之前应包括导入turtle库、设置画布背景颜色bgcolor()、设置可显示区域大小screensize()。
图15 画黄色大正方形的程序代码
第一排第一个正方形的画笔起始位置为(-400,300)。第一层循环控制排数,循环10次,循环体内首先把这一排的初始化工作完成,包括:移动画笔到这一排的起始位置,用setheading()函数设置这一排画笔的起始方向为-45°。
第二层循环控制每排正方形的个数,在开始颜色填充函数begin_fill()和结束颜色填充函数end_fill()之间是第三层循环,用来画正方形的四个边。画完一个正方形,需要在第二层循环中将画笔位置放在当前排下一个正方形的起点处。
图16 画绿色小正方形的程序代码
6 运行结果
运行程序squarecombined.py,结果如图17所示。
图17 运行结果
7 发散思考
(a)如果将可显示区域大小设置为(400,300)和(1200,900),程序运行的结果有何不同。
将图15的程序中screensize(800,600)分别改为screensize(400,300)和screensize(1200,900),然后运行程序。画的图形是一样的,但可显示区域的初始大小有所不同,在(400,300)的画布中,没有滑动杆;在(1200,900)的画布中,画布框的下面和右侧有滑动杆,可以拖动滑动杆来查看图形没有呈现出来的部分。程序更改后运行结果如图18所示。
(b)如果更改黄色的大正方形和绿色的小正方形的起笔角度,程序运行的结果有何不同。
图18 程序运行结果:screensize()设置的影响
在图15的程序中,将黄色的大正方形和绿色的小正方形起笔角度都改为-15°,即setheading(-15),运行结果如图19所示。
图19 程序运行结果:起笔角度更改后的图形
8 挑战自我
用Python画如图20所示的正方形组合图形。
图20 正方形组合图形
参考程序
参考答案文件:squaretested.py,该正方形组合图形的程序可分为两部分,画外框正方形的程序代码如图21所示,画内框正方形的程序代码如图22所示。
图21 正方形组合图形程序代码(画外框正方形部分)
图22 正方形组合图形程序代码(画内框正方形部分)
本章小结
·数学知识:正方形及其边角关系。
·编程知识:设置画布的大小和颜色;
各种正方形的画法;
正方形组合图形的画法。