前言
你好! 科赫雪花和花千树是经典的绘图案例,很适合初学者对turtle库的了解与运用。其中包含函数递归的方法,通过递归的调用,能大大提高代码的利用率,减少其复杂度。
设计
科赫雪花
科克曲线定义:
我们可以设想一个边长为1的等边三角形,取每边中间的三分之一,接上去一个形状完全相似的但边长为其三分之一的三角形,结果是一个六角形。现在取六角形的每个边做同样的变换,即在中间三分之一接上更小的三角形,以此重复,直至无穷。外界的变得原来越细微曲折,形状接近理想化的雪花。它的名字叫科克曲线。
----我们可以定义一个递归函数来重复这个过程。递归函数会接受两个参数:一个是边长size,另一个是迭代次数n。如果迭代次数n为0,函数就简单地绘制一条直线;如果n大于0,则将当前线段分成三等分,并在中间部分绘制两个新的等边三角形。
以下是1,2,3,4阶科克曲线
- 具体代码如下:
import turtle as t
#order为科克曲线的阶数
def snow(length, order):
if order == 0:
t.forward(length) # 向前画画线
else:
for angle in [60, -120, 60, 0]:
snow(length/3, order-1) # 递归
t.left(angle) # 向左转一个角度
t.speed(0.005) # 提高画笔速度,0~10速度逐渐降低
snow(400, 3) # 画第一部分
t.right(120) # 转向120度
snow(400, 3) # 画第二部分
t.right(120)
snow(400, 3) # 画第三部分
t.done()
运行效果:
花千树
花千树通常是用来描绘一个非常繁华、热闹或者绚丽的景象,如同千树万树的话同时盛开,非常壮观和美丽!
----花千树是一种具有自相似性的图形,即它的整体形状与它的局部形状相似。这种自相似性使得递归成为绘制花千树的理想选择
- 设计思路
-
1.设计一个递归函数来绘制花千树。这个函数应该接受一些参数,如当前绘制的树枝长度、角度等。在函数内部,首先判断当前树枝的长度是否满足停止条件(例如,长度小于某个阈值),如果满足则停止递归;否则,继续执行以下步骤。
-
2.根据当前树枝的长度和角度,绘制出树枝的形状。这可以通过绘制一条线段或者使用其他图形表示。
-
3.根据当前树枝的长度和角度,计算出左右子树枝的位置和角度。然后分别调用递归函数,传入左右子树枝的长度和角度,以绘制左右子树枝。
具体代码如下:
def draw_tree(len1):
t.speed(0.005) # 提高画笔速度
t.pencolor("green") # 设置画笔颜色
angle = random.randint(22, 30) # 旋转角度
sf = random.uniform(0.6, 0.8) # 随机生成缩放因子,范围为0.6到0.8
if len1 < 3:
return
else:
t.forward(len1) # 向前移动指定长度
t.left(angle) # 左转指定角度
draw_tree(len1*sf) # 递归绘制左子树
t.right(angle*2) # 右转两倍的角度
draw_tree(len1*sf) # 递归绘制右子树
t.left(angle) # 左转回原来的角度
t.backward(len1) # 向后移动指定长度
运行效果: