
2.3 编程知识点
(1)函数setheading()和forward()
我们知道,线段是两个点之间的连线。知道两个点的坐标,自然可以画出这条线段来。从前面的介绍可以得知,如果画笔在起点位置,用函数goto()可以画出这条线段。
假若,现在我们只知道起点的位置、线段的长度,以及与横轴正向的夹角,能否画出这条线段来呢?从相关几何知识可知,这样的线段也是可以画出来的。
在Python的turtle库里,设置画笔朝向的函数是setheading(),括弧里的参数为画笔的角度。角度是以横轴正向为0°,逆时针旋转为正,顺时针旋转为负。前移画笔一定长度的函数是forward(),括弧里参数是画笔前移的像素值。
如图2-4所示,画AB线段,可以让在A点的画笔通过使用goto(20,20)移动到B点,也可以在A点设置画笔的朝向为45°,然后前移AB线段的长度。根据勾股定理,从点(0,0)到点(20,20)的AB线段长约为28像素。

图2-4 AB线段的画法
turtle画笔的初始位置在原点(0,0),线段的两种画法的程序代码如图2-5所示,左图是已知线段另外一点的坐标是(20,20)的画法;右图是已知线段与横轴的夹角是45°,长度为28像素的画法。两种方法画出来的线段是一样的。

图2-5 线段的两种画法的程序代码
(2)函数pensize()和pencolor()
在几何知识中,线段是有长度和方向的,且由两个端点的位置决定,没有宽度和颜色的概念。但在turtle画图中,线段还有宽度和颜色的属性。可以用函数pensize()指定画笔的宽度,单位是像素,用函数pencolor()指定画笔的颜色。画不同宽度和不同颜色的4条线段的程序代码如图2-6所示。程序运行结果如图2-7所示。

图2-6 画不同宽度和不同颜色的4条线段的程序代码

图2-7 程序运行结果:画四条线段
(3)函数hideturtle()和showturtle()
在前面用turtle画图的例子中,程序运行完成后,总有一个黑色箭头留在画面上,这是画笔最后的位置和朝向的指示。在设计不需要显示画笔的图形时,可以使用函数hideturtle()来隐藏。如果需要显示已经隐藏的画笔,可以使用函数showturtle()完成。
如图2-8所示的程序代码,开始隐藏画笔,也就是在画前两条线段时是看不到画笔形状的,画完两条线段后,显示画笔;在画最后两条线段的过程中,可以看到画笔的形状;在整个图画完后,再隐藏画笔。程序运行结果如图2-9所示。

图2-8 隐藏和显示画笔的程序代码

图2-9 程序运行结果:隐藏画笔
(4)颜色列表
列表是Python中一种特殊的数据序列。列表中的每个元素可以是Python的各种数据类型。元素放在方括号内,用逗号分隔。列表中的第一个索引(元素)是0,第二个索引是1,依此类推。
为了生成五颜六色的图形,我们选用6种颜色,组成颜色列表colors,如图2-10所示。

图2-10 颜色列表的程序代码
举例来说,如图2-11所示,从原点(0,0)出发,画36条各种颜色的线。线的宽度为5像素,线条之间的夹角为360°/36=10°,即第i条线与横轴正向的夹角为(10×i)°,画笔的方向设置为setheading(10×i)。

图2-11 画从原点出发的36条各种颜色线条的程序代码

线的颜色从下面颜色列表中取得。
假设颜色列表中有6种颜色,每画6条线,颜色重复一次。循环画36条线,我们用i%6(循环变量i对6取余)来做颜色索引。
每画完一条线,都要抬笔,用函数goto(0,0)使画笔回到原点,然后落笔,再用函数forward()画下一条线。
程序运行结果如图2-12所示。

图2-12 程序运行结果:各种颜色的线条
(5)嵌套循环
在一个循环语句中包含另一个循环语句,叫做嵌套循环。嵌套循环是编程语言中常见的逻辑结构。那么嵌套循环在画图的过程中有什么用呢?前面我们用一层for循环画了36条线。如果想在每条线的末端再画三个点,就需要使用嵌套循环来解决了。嵌套循环在画图中完成的是两个不同维度的循环要求。程序代码如图2-13所示。程序运行结果如图2-14所示。

图2-13 使用嵌套循环画图的程序代码

图2-14 程序运行结果:线加点图形
(6)条件判断
如果在特定的位置上,在不同的条件下需要用画笔画不同的图形,这需要进行条件判断,不同的条件下运行不同的画图程序代码。在计算机编程语言中,条件判断是一种常用的逻辑结构,是依据给定的逻辑运算结果(True或False),执行相应代码的程序结构。


两个分支的条件判断结构如下:
三个以上分支的条件判断结构,需要在两个分支的条件判断结构中,使用elif来增加新的条件分支,结构如下:
如图2-15所示,这段代码显示了条件判断语句的作用。首先,从Python的Shell上获取用户的选择。如果用户选择1,即if(choice==1),画一个100像素的红点;如果用户选择其他,即else,画一个100像素的蓝点。

图2-15 条件判断示例程序代码
