- 写一个名为
square
的函数,接受一个名为 t
的形参,t
是一个海龟。这个函数应用这只海龟画一个正方形。
写一个函数调用,将 bob
作为实参传给 square
,然后再重新运行程序。
1
2
3
4
5
6
7
8
9
10
11
12
| import turtle
def square(t):
for i in range(4):
t.fd(100)
t.lt(90)
bob = turtle.Turtle()
square(bob)
turtle.mainloop()
|
- 给
square
增加另一个名为 length
的形参。修改函数体,使得正方形边的长度是 length
,然后修改函数调用,提供第二个实参。 重新运行程序。用一系列 length
值测试你的程序。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| import turtle
def square(t,length):
for i in range(4):
t.fd(length)
t.lt(90)
bob = turtle.Turtle()
square(bob,100)
square(bob,120)
square(bob,150)
square(bob,200)
turtle.mainloop()
|
- 复制
square
,并将函数改名为 polygon
。增加另外一个名为 n
的形参并修改函数体,让它画一个正n边形(n-sided regular polygon)。提示:正n边形的外角是$360/n$度。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| import turtle
def polygon(t,length,n):
for i in range(n):
t.fd(length)
t.lt(360/n)
bob = turtle.Turtle()
polygon(bob,100,6)
polygon(bob,100,8)
polygon(bob,100,15)
turtle.mainloop()
|
看了答案后,觉得把360/n
放到循环外面比较好,这样的话只需要计算一次。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| import turtle
def polygon(t,length,n):
angle = 360 / n
for i in range(n):
t.fd(length)
t.lt(angle)
bob = turtle.Turtle()
polygon(bob,100,6)
polygon(bob,100,8)
polygon(bob,100,15)
turtle.mainloop()
|
- 编写一个名为
circle
的函数,它接受一个海龟t和半径r作为形参, 然后以合适的边长和边数调用 polygon
,画一个近似圆形。 用一系列r值测试你的函数。
提示:算出圆的周长,并确保 length
*
n
=
circumference
。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| import turtle
import math
def polygon(t,length,n):
for i in range(n):
t.fd(length)
t.lt(360/n)
def circle(t,r):
"""t是一只乌龟。r是所要画的圆的半径。
根据公式$2 \pi r / n$确定用于近似圆的多边形的边长,n是多边形的边数。
"""
circumference = 2 * math.pi * r #周长
n = 200 #多边形边数,我想不到选多少边数合适,直接设200,画一个200边形
length = circumference / n
polygon(t,length,n)
bob = turtle.Turtle()
circle(bob,150) #半径r设为150
turtle.mainloop()
|
答案是这样来确定n的值(多边形的边数)的:周长除以3,取整后加1,即n = int(circumference/3)+1
,也就是近似为周长的三分之一,圆的半径的两倍。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| import turtle
import math
def polygon(t,length,n):
angle = 360 / n
for i in range(n):
t.fd(length)
t.lt(angle)
def circle(t,r):
"""t是一只乌龟。r是所要画的圆的半径。
根据公式$2 \pi r / n$确定用于近似圆的多边形的边长,n是多边形的边数。
"""
circumference = 2 * math.pi * r #周长
n = int(circumference/3)+1 #改的是这句
length = circumference / n
polygon(t,length,n)
bob = turtle.Turtle()
circle(bob,150) #半径r设为150
turtle.mainloop()
|
- 完成一个更泛化(general)的
circle
函数,称其为 arc
,接受一个额外的参数 angle
,确定画多完整的圆。angle
的单位是度,因此当 angle=360
时, arc
应该画一个完整的圆。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| import turtle
import math
def polyline(t,length,n,m):
"""n是多边形的边数,m是指画出多边形的前多少条边
n和m必须为整数。
"""
for i in range(m):
t.fd(length)
t.lt(360/n)
def arc(t,r,angle):
"""angle取值范围是1~360,度数。
画出圆的一部分。
"""
circumference = 2 * math.pi * r #周长
n = 200 #多边形边数,我想不到选多少边数合适,直接设200
length = circumference / n #多边形边长
m = int(n * angle / 360) # 画出多边形的前m条边
polyline(t,length,n,m)
bob = turtle.Turtle()
arc(bob,150,30)
arc(bob,100,150)
arc(bob,150,270)
turtle.mainloop()
|
我是先算出来圆的周长,然后算出用于近似这个圆的多边形的边数,然后再算出近似圆的一部分需要的多边形的边数;
答案是先算圆的一部分对应的长度,根据这个长度得到用边数为n的多边形去近似圆,然后得到一边的长度,以及多边形的外角的角度。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| import turtle
import math
def polyline(t,length,n,angle):
for i in range(n):
t.fd(length)
t.lt(angle)
def arc(t,r,angle):
"""angle取值范围是1~360,度数。
画出圆的一部分。
"""
arc_length = 2 * math.pi * r * angle / 360
n = int(arc_length / 3) + 1
step_length = arc_length / n
step_angle = angle / n
polyline(t,step_length,n,step_angle)
bob = turtle.Turtle()
arc(bob,150,30)
arc(bob,100,150)
arc(bob,150,270)
turtle.mainloop()
|
根据这一题的代码,可以重写第四题的circle函数。circle函数可以看作是arc函数的一个特例。
1
2
| def circle(t,r):
arc(t,r,360)
|