1 任务描述
在画布上画出欧盟的旗帜和古巴的国旗。
2 数学知识点
(1)正五角星
五角星是以五条线段画成的星形图形,有五个顶角。正五角星的每条线段的长度相同,顶角的角度相同,均为36°,每个顶角的外角为144°,如图1所示。
图1 正五角星
(2)正五角星的边角关系
正五角星的外接圆的圆心O在五个角的角平分线的交点上。如果外接圆的半径是r,那么,正五角星的边长为2×r×cos18°。如图2所示,正五角星的AB边平行于横轴,假若圆心O点的坐标在原点(0,0),那么A点的坐标是(-r×cos18°,r×sin18°)。
图2 正五角星的边角关系
3 编程知识点
(1)正五角星的画法
正五角星具有相同的边长和外角,在画正五角星的时候,只需要在循环中让画笔前移一个相同的长度,然后逆时针旋转或顺时针旋转144°即可。画正五角星的程序代码如图3所示,程序运行结果如图4所示。
图3 画正五角星的程序代码
图4 程序运行结果:画正五角星
(2)自定义函数
前面使用了turtle库、math库和random库里的很多函数。如果经常用到特定功能的程序代码,可以把这些代码做成自定义函数,以便在主程序中调用。自定义函数可以增加程序的模块化、可读性和可复用性。
Python自定义函数代码以def关键词开头,格式如下:
自定义一个画正五角星的函数,程序代码如图5所示,函数的名称为pentagram(),需要输入的参数有横坐标x、纵坐标y、正五角星的边长l、正五角星的填充颜色fcolor。函数功能是在指定的位置(x,y)画边长为l、颜色为fcolor的正五角星。
图5 自定义画正五角星函数的程序代码
主程序可以调用自定义函数pentagram(),主程序代码如图6所示。运行主程序可完成画6行10列的五角星。在调用函数时,指定五角星的当前位置为(x,y),边长为40,填充颜色从颜色列表中选取。主程序运行结果如图7所示。
图6 调用自定义函数的主程序代码
图7 主程序运行结果:调用自定义函数
(3)颜色三元组
人的眼睛是根据可见光的波长来识别颜色的。可见光谱中的颜色可以由三种基本色按不同的比例混合形成。这三种基本色是红(Red)、绿(Green)、蓝(Blue),也称三原色。RGB三元组就是把这三种颜色按不同比例混合,得出各种颜色的方法。
前面所述turtle画图中使用的颜色,如红色、绿色、蓝色,用“red”,“green”,“blue”来表示。现在可以试着用RGB三元组(r,g,b)的方式来表示,分别指定r、g、b的值,就可以得到一个颜色。
三元组(r,g,b)的取值,有两种方式:(1)r、g、b分别取[0,255]之间的整数,(2)是r、g、b取[0,1]之间的小数。
在turtle画图中的颜色三元组支持r、g、b值取[0,1]范围的小数。对于[0,255]的数值,可以通过除以255,来得到相应[0,1]范围的值。
下面设计一个程序,先用RGB三元组生成各种颜色,再画出各种颜色的小方框,程序代码如图8所示。程序用i、j、k三层循环来生成r、g、b的值。如果i、j、k分别从[0,255]范围取值,共有2553=16581375种颜色。为了便于在画布上区分颜色,程序中i、j、k在[0,255]范围内每间隔50取一个值,这样就只有63=216种颜色了。x控制小方框的横坐标位置,y控制小方框的纵坐标位置;y取值又分y1和y2,在纵轴方向上将各种颜色的小方框分为两大组。
程序运行结果如图9所示。
图8 生成各种颜色方框的程序代码
图9 程序运行结果:调色板
4 任务分析
画出欧盟的旗帜和古巴的国旗,首先需要知道它们的尺寸、形状、颜色以及相应形状的位置关系等方面的设计规范,可以上网查到信息。
欧盟旗帜的长宽比例约为1.5∶1,由12颗圆形排列的正五角星组成,背景颜色值为(0,51,153),正五角星的颜色值为(255,204,0);古巴国旗的长宽比为2∶1,有红、白、蓝三种颜色,旗面左侧为红色等边三角形,内有一颗白色五角星;旗面右侧由三道蓝色宽条和两道白色宽条平行相间构成。
可以发现,这两种旗帜都包括长方形和五角星的形状,因此采用自定义函数来设计,使得这部分代码可以复用。我们可以自定义一个画长方形的函数和一个画五角星的函数。
画长方形的函数的逻辑结构如下:
画正五角星函数的逻辑结构如下:
定义完画长方形和五角星这两个基本形状以后,我们可以着手分别设计画欧盟旗帜函数和画古巴国旗函数。
画欧盟旗帜函数的逻辑结构如下:
画古巴国旗函数的逻辑结构如下:
设计主程序,在一定位置,画一定大小的欧盟旗帜和古巴国旗,由于定义了函数,主程序的逻辑结构就比较简单了,如下所示。
5 程序设计
新建一个Python程序文件eucubaflags.py,这个画欧盟旗帜和古巴国旗的程序可分为四个自定义函数部分和一个主程序部分。自定义函数rect(),用来画长方形,程序代码如图10所示;自定义函数star(),用来画正五角星,程序代码如图11所示;自定义函数EUflag(),用来画欧盟旗帜,程序代码如图12所示;自定义函数cubaflag(),用来画古巴国旗,程序代码如图13所示。
图10 画长方形自定义函数的程序代码
图11 画正五角星自定义函数的程序代码
图12 画欧盟旗帜自定义函数的程序代码
图13 画古巴国旗自定义函数的程序代码
在主程序中调用函数EUflag()和cubaflag(),主程序代码如图14所示。
图14 调用函数的主程序代码
6 运行结果
运行eucubaflags.py,结果如图15所示。
图15 程序运行结果画欧盟旗帜和古巴国旗
7 发散思考
(a)如何在画布上同时画三组欧盟旗帜和古巴国旗。
主程序使用循环调用函数EUflag()和cubaflag(),使用y值控制纵向画笔起始位置,设置好合适的尺寸,主程序如图16所示,自定义函数不变。程序运行结果如图17所示。
图16 画三组欧盟旗帜和古巴国旗的程序代码
(b)如何画从小逐渐增大的古巴国旗。
主程序使用循环调用函数cubaflag(),使用x值控制横向画笔起始位置,y值控制纵向画笔起始位置。边长l从10开始增加,每次循环加10,主程序如图18所示,自定义函数不变。运行结果如图19所示。
图17 程序运行结果:画三组欧盟旗帜和古巴国旗
图18 逐渐增大的古巴国旗程序代码
图19 程序运行结果:逐渐增大的古巴国旗
8 挑战自我
从网上查找美国国旗的设计规范,用Python作图,设计一个画美国国旗的程序。
参考程序
参考程序文件:USAflag.py,画美国国旗的程序可分为多个函数和主程序,如图20和图21所示。
程序运行结果如图22所示。
图20 画美国国旗程序代码一:函数
图21 画美国国旗程序代码二:主程序
图22 程序运行结果:画美国国旗
小结
·数学知识:正五角星及其边角关系。
·编程知识:正五角星画法;
自定义函数;
颜色三元组的使用;
旗帜、国旗等的组合图形的绘制。