Think Python Exercise 5.6 科赫曲线

这是一道很有趣的题目。我感觉这一题的代码我写得还不够优雅。

Exercise 5.6. 科赫曲线 (Koch Curve) 是一个看起来类似不规则碎片的几何体 (fractal)。要画一个长度为 x 的科赫曲线,你只需要:

  1. 画一个长度为 x/3 的科赫曲线。
  2. 左转 60 度。
  3. 画一个长度为 x/3 的科赫曲线。
  4. 右转 60 度。
  5. 画一个长度为 x/3 的科赫曲线。
  6. 左转 60 度。
  7. 画一个长度为 x/3 的科赫曲线。

例外情况是 x 小于 3 的情形:此时,你只需要画一道长度为 x 的直线。

  1. 写一个名为 koch 的函数,接受一个海龟和一个长度作为形参,然后使用海龟画一条给定长度的科赫曲线。
  2. 写一个名为 snowflake 的函数,画出三条科赫曲线,构成雪花的轮廓。
  3. 科赫曲线能够以多种方式泛化。 点击此处查看例子,并实现你最喜欢的那种方式。

我的答案:

第一小题,

 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条科赫曲线。

画出来的图是这样的:

挺好看的,对吧。

第三题这里就先不画了。