Python几何图形编程之正方形组合图形

1 任务描述

用Python作图,画出如图1所示的正方形组合图形,并设计填充颜色。

自动草稿

图1 正方形组合图形

2 数学知识点

(1)正方形

四条边都相等、四个角都是直角的四边形是正方形。即正方形四个角都是90°,内角和为360°。

在如图2所示的正方形中,AB=BC=CD=DA,∠A=∠B=∠C=∠D=90°。

自动草稿

图2 正方形

(2)正方形的对角线

正方形的对角线互相垂直、平分且相等,每条对角线都平分一组对角。如图3所示,ACDB是正方形的对角线,它们和正方形边的夹角为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 正方形组合图形程序代码(画内框正方形部分)

本章小结

·数学知识:正方形及其边角关系。

·编程知识:设置画布的大小和颜色;

各种正方形的画法;

正方形组合图形的画法。

发表评论