1 任务描述
用Python作图,将n排小等边三角形叠加形成一个大的等边三角形。任意两个小等边三角形不重叠,相邻两个小等边三角形有且只有一个顶点重合。所有等边三角形的底边与横轴平行。第1排有n个小等边三角形,第2排有n-1个小等边三角形,以此类推,第n排有1个小等边三角形。例如,第1排有7个小等边三角形,第2排有6个小等边三角形,以此类推,第7排有1个等边三角形。要求每一排的三角形颜色不同,并记录每一排第一个小等边三角形起点的坐标。
2 数学知识点
(1)等边三角形边长和顶点位置关系
等边三角形△ABC的边长为a,A点坐标为(0,0),AB边在横轴上,那么,B点坐标为(a,0),C点坐标为(acos60°,asin60°)。假若等边三角形△ABC的边长为30,那么各顶点的坐标如图1所示。
图1 等边三角形边长和顶点的位置关系
(2)等边三角形的重心
三角形重心是三角形三条中线的交点。等边三角形每条边上的中线、高线和角平分线重合(三线合一)。如图2所示,AE、BF、CD是等边三角形△ABC的三条中线,它们的交点O是等边三角形△ABC的重心。∠AOD=60°,∠OAD=30°,OA和横轴正向的夹角为-150°(顺时针旋转150°)。
图2 等边三角形的重心
4.3 编程知识点
(1)函数position()和pos()
可以通过调用函数position()或者pos()获取turtle画笔的当前坐标。打印移动画笔坐标的程序代码如图3所示,画笔每移动到一个新的位置,就在屏幕上打印一次坐标。画笔初始位置在原点,水平向右移动50像素,再逆时针旋转115°后,前移100像素。程序运行结果是打印三个点的坐标,如图4所示,最终画笔移动形成的图形如图5所示。
图3 打印移动画笔坐标的程序代码
图4 程序运行结果:打印三个点的坐标
图5 程序运行结果:画笔移动形成的图形
(2)函数fillcolor()、color()
turtle库里的函数pencolor()用来设置画笔颜色,函数fillcolor()用来设置画笔轨迹所形成图形的填充颜色。如fillcolor(“red”)表示所画图形的填充颜色设置为红色。color()函数可以用来同时设置画笔颜色和填充颜色。如果color()里只设置一个颜色字符串,则画笔颜色和填充颜色均为该颜色;如果color()里有两个颜色字符串,则第一个是设置画笔颜色,第二个是设置填充颜色。
举例来说:
color(“blue”)表示画笔颜色和填充颜色均为蓝色。
color(“blue”,“brown”)表示画笔颜色为蓝色,填充颜色均为棕色。
(3)函数begin_fill()和end_fill()
这两个函数是turtle库中用来表示需要填充颜色的形状范围的。在绘制要填充颜色的形状之前,调用begin_fill(),绘制填充颜色的形状完成之后调用end_fill()。
举例来说:如图6所示,画一个红色的三角形,程序在画三角形代码之前设置填充颜色,同时指定开始填充颜色和结束填充颜色的范围。
图6 画一个红色三角形的程序代码
这段程序运行的结果如图7所示。从这里可以看出,由于红色三角形的画笔使用的是默认颜色,所以三角形的边框还是黑色的。
图7 程序运行结果:红色三角形
4.4 任务分析
多个小等边三角形叠加形成一个大的等边三角形。以7排为例,大等边三角形的每条边有7个小等边三角形(这要用到循环,关键是用几层嵌套循环)。即大等边三角形共有7排小等边三角形需要一层循环;每排小等边三角形的个数分别为7、6、5、4、3、2、1,这也需要一层循环;画小三角形也需要一层循环。所以叠加等边三角形的程序设计共需三层循环,包括画一个小等边三角形;控制每排等边三角形的个数,数量递减;控制排数。
因每一排的小三角形颜色不同,所以颜色列表中需要7种颜色。记录每一排第一个小三角形起点的坐标,调用turtle的pos()或position()函数获取画笔移动到这些点的坐标。
程序设计的思路:
4.5 程序设计
新建一个Python程序文件multitriangle.py,叠加等边三角形的程序代码如图8所示。在画图之前的动作包括导入turtle库,设置颜色列表colors,初始化位置变量point。
第一层循环控制排数,本程序循环7次。在循环体内首先完成初始化工作,包括:用print()函数记录当前是第几排,用setheading()函数设置当前排画笔的起始方向,用color()函数设置当前排画笔颜色和填充颜色,抬笔,将画笔用goto()函数挪到当前排的起点位置上。这样这一层循环的初始化工作就完成了。
第二层循环,画7-i个等边三角形。当画完一个小等边三角形后,需要在第二层循环中,将画笔朝向和画笔位置放在当前排下一个小等边三角形的起点处。
开始颜色填充begin_fill()和结束颜色填充end_fill()之间是第三层循环,用来画小等边三角形的三条边。
图8 叠加等边三角形的程序代码
4.6 运行结果
运行程序multitriangle.py的结果如图9所示。显示每一排小等边三角形起点的坐标如图10所示。
图9 程序运行结果:叠加等边三角形图形
图10 程序运行结果:每一排等边三角形起点位置
4.7 发散思考
(a)如果更改每一排的起点画笔的朝向,效果会怎样?
在图8所示的程序中,把两处setheading()都设置为15°,程序运行结果如图11所示,每一排小等边三角形起点的坐标如图12所示。
图11 程序运行结果:每一排小三角形起点画笔朝向更改为15°
图12 程序运行结果:每一排画笔朝向更改为15°的起点坐标
(b)如果更改第一层和第二层的循环次数,效果会怎样?
在图8的程序中,把第一层for循环的range(7)改为range(4),第一层for循环的range(7-i)改为range(5-i),程序运行的结果如图13所示,每一排小等边三角形起点的坐标如图14所示。
图13 程序运行结果:循环次数更改后的图形
图14 程序运行结果:循环次数更改后的每一排起点坐标
4.8 挑战自我
画几个颜色不同的等边三角形,它们的重心重合在原点(0,0)上。每个三角形总有一条边平行于横轴。记录每个等边三角形顶点的坐标。
参考程序
参考程序文件:trianglerainbow.py,画重心重合的等边三角形的程序代码如图15所示。
图15 画重心重合的等边三角形的程序代码
程序运行结果如图16所示。
图16 程序运行结果:画重心重合的等边三角形
程序运行结果为显示等边三角形顶点坐标,如图17所示。
图17 程序运行结果:等边三角形顶点坐标
本章小结
·数学知识:等边三角形边长和顶点的位置关系,等边三角形重心。
·编程知识:获取画笔当前位置的坐标;
设置画笔颜色和填充颜色;
设置开始填充和结束填充颜色的范围。