这是一道很有趣的题目。我感觉这一题的代码我写得还不够优雅。
Exercise 5.6. 科赫曲线 (Koch Curve) 是一个看起来类似不规则碎片的几何体 (fractal)。要画一个长度为 x 的科赫曲线,你只需要:
- 画一个长度为 x/3 的科赫曲线。
- 左转 60 度。
- 画一个长度为 x/3 的科赫曲线。
- 右转 60 度。
- 画一个长度为 x/3 的科赫曲线。
- 左转 60 度。
- 画一个长度为 x/3 的科赫曲线。
例外情况是 x 小于 3 的情形:此时,你只需要画一道长度为 x 的直线。
- 写一个名为 koch 的函数,接受一个海龟和一个长度作为形参,然后使用海龟画一条给定长度的科赫曲线。
- 写一个名为 snowflake 的函数,画出三条科赫曲线,构成雪花的轮廓。
- 科赫曲线能够以多种方式泛化。 点击此处查看例子,并实现你最喜欢的那种方式。
我的答案:
第一小题,
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
def koch(t, l):
"""
画出来一条科赫曲线
:param t: 一个turtle实例
:param l: 曲线长度
:return: None
"""
if l < 3:
t.fd(l)
else:
l = l / 3
koch(t,l)
t.lt(60) # 左转60度
koch(t,l)
t.rt(120) # 右转120度
koch(t, l)
t.lt(60) # 左转60度
koch(t, l)
bob = turtle.Turtle()
koch(bob, 1000)
turtle.mainloop()
|
这一题的代码是完全按书上的要求来写的。有可能是我的屏幕分辨率比较高,画出来的曲线看起来比较小。
第二小题,
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
| import turtle
def koch(t, l):
"""
画出来一条科赫曲线
:param t: 一个turtle实例
:param l: 曲线长度
:return: None
"""
if l < 10:
t.fd(l)
else:
l = l / 3
koch(t,l)
t.lt(60) # 左转60度
koch(t,l)
t.rt(120) # 右转120度
koch(t, l)
t.lt(60) # 左转60度
koch(t, l)
def snowflake(t,l,n):
"""
画出n条科赫曲线,构成雪花的形状。
:param t: 一个turtle实例
:param l: 单条科赫曲线的长度
:param n: 科赫曲线的条数。
:return: None
"""
# 先将turtle移到屏幕左边缘处
t.pu() # 抬笔
t.lt(180)
t.fd(600)
t.lt(180)
t.pd() # 落笔
# 让bob加速
bob.speed(0)
for i in range(n):
koch(bob, l)
# 画完一条后,左转360/n度后再接着画下一条
bob.lt(360/n)
bob = turtle.Turtle()
snowflake(bob,500,6)
turtle.mainloop()
|
为了让画出的几条科赫曲线能闭合,每画完一条,就让turtle左转(360/n)
度。
turtle画画的速度太慢,所以修改了它的速度。
三条科赫曲线构成的封闭“雪花”看起来比较怪异,所以在上面的代码里我让turtle画出6条科赫曲线。
画出来的图是这样的:
挺好看的,对吧。
第三题这里就先不画了。