Python递归绘制谢尔宾斯基三角形

首先,回顾递归的概念:

一个函数不停地调用它本身,我们就认为这个函数使用了递归。

先来看一个谢尔宾斯基三角形的示例:

 所以首先,我们需要一个方法,它能帮我们画三角形,在这里画一个三角形,需要引入Turtle模块,画三角形需要三个点的坐标,不做过多的叙述。注;规定左下角顶点为p[0],上方顶点和右顶点分别为p[1]p[2]

from turtle import *
def drawTriangle(points, color, myTurtle):
       myTurtle.fillcolor(color)
       myTurtle.up()
       myTurtle.goto(points[0])
       myTurtle.down()
       myTurtle.begin_fill()
       myTurtle.goto(points[1])
       myTurtle.goto(points[2])
       myTurtle.goto(points[0])
       myTurtle.end_fill()

其次,要绘制一个谢尔宾斯基三角形,我们需要从一个大三角形开始,找到每个边的中点,连接起来形成一个三角形(粉色部分)

在把中点连接起来之前,我们要找到中点,找到中点的方法大家高中都学过:

其中p1,p2是坐标,在这里我们用元组的形式表达。

def getMid(p1, p2):
      return ( (p1[0]+p2[0]) /2, (p1[1] + p2[1]) / 2)

然后我们要开始绘制谢尔宾斯基三角形了,下面考虑它的具体画法:如果我们只简单地分一层,则:

 不难注意到,层数为0,就是一个三角形。

画一层,最主要的是找到它的三个中点,然后去绘制一个如上图所示的三角形。

如果层数为2,我们需要将周围的三个三角形再分别进行一次如上的处理,即,找到三个蓝色三角形的中点,然后把这三个中点连上线,忽略中间的三角形。我们不妨把上图看作一个单位,然后进一步地发现,高层数的谢尔宾斯基三角形就是用很多个这个单位构成的:如degree == 2:

所以考虑到它在不断地画相同的三角形,我们在这里当然要使用递归的方法来进行处理。 

首先,我们要先画外轮廓的大三角形,代码如下:

def sierpinski(points, degree, myTurtle):
      colormap = ['blue', 'red', 'green', 'white', 'yellow',
                  'violet', 'orange']
      drawTriangle(points, colormap[degree], myTurtle)

解释一下,colormap是颜色的一个列表,不同的层次用不同的颜色,points接受一个由元组构成的列表,是整个外轮廓大三角形的坐标,然后调用上面的绘制三角形的函数进行绘制外轮廓。

前面提到,如果层数为0,就是一个三角形,此时我们当然没有进行绘制的必要,因此我们需要一个判断语句,再进入到递归的部分:

    if degree>0:

接下来进入到了绘制谢尔宾斯基三角形的环节,我们可以先让Python绘制左下角的三角形,像分形树先走右子树一样,我们先去画左下角的三角形直到degree==0,则对左下角三角的递归完成,绘制左下角的三角形,需要的是大三角形左顶点的坐标和两个中点的坐标,这里可以使用getMid()完成

        sierpinski([points[0],getMid(points[0], points[1]),getMid(points[0], points[2])],degree - 1, myTurtle)

像分形树一样,我们已经绘制出了左下角的三角

 然后去绘制p[1]处的三角,我们需要其和p[0]p[2]的中点

        sierpinski([points[1],getMid(points[0], points[1]),getMid(points[1], points[2])],degree - 1, myTurtle)

 最后:

         sierpinski([points[2],getMid(points[2], points[1]),getMid(points[0], points[2])],degree - 1, myTurtle)

绘制完成:

from turtle import *

def drawTriangle(points, color, myTurtle):
       myTurtle.fillcolor(color)
       myTurtle.up()
       myTurtle.goto(points[0])
       myTurtle.down()
       myTurtle.begin_fill()
       myTurtle.goto(points[1])
       myTurtle.goto(points[2])
       myTurtle.goto(points[0])
       myTurtle.end_fill()

def getMid(p1, p2):
      return ( (p1[0]+p2[0]) /2, (p1[1] + p2[1]) / 2)

def sierpinski(points, degree, myTurtle):
      colormap = ['blue', 'red', 'green', 'white', 'yellow',
                  'violet', 'orange']
      drawTriangle(points, colormap[degree], myTurtle)
      if degree > 0:
            sierpinski([points[0],getMid(points[0], points[1]),getMid(points[0], points[2])],degree - 1, myTurtle)
            sierpinski([points[1],getMid(points[0], points[1]),getMid(points[1], points[2])],degree - 1, myTurtle)
            sierpinski([points[2],getMid(points[2], points[1]),getMid(points[0], points[2])],degree - 1, myTurtle)


myTurtle = Turtle()
myWin = myTurtle.getscreen()
myTurtle.speed(1)
myPoints = [(-200, -100), (0, 200), (200, -100)]
sierpinski(myPoints, 3, myTurtle)
myWin.exitonclick()

 整体代码如上面所示,可以考虑把递归中只留下一行 代码,看看小乌龟 的行动轨迹,比如为什么单独运行第一个递归,代码就一直在画左下角的三角形,而剩下的两个不行呢?(考虑绘制三角形函数的定义)

### 回答1: 谢尔宾斯基三角形是一种自相似的几何图形,可以使用递归算法绘制。下面是使用Python绘制谢尔宾斯基三角形的代码示例: ```python import turtle def draw_triangle(points, color, my_turtle): my_turtle.fillcolor(color) my_turtle.up() my_turtle.goto(points[0][0], points[0][1]) my_turtle.down() my_turtle.begin_fill() my_turtle.goto(points[1][0], points[1][1]) my_turtle.goto(points[2][0], points[2][1]) my_turtle.goto(points[0][0], points[0][1]) my_turtle.end_fill() def get_mid(p1, p2): return ((p1[0]+p2[0])/2, (p1[1]+p2[1])/2) def sierpinski(points, degree, my_turtle): colormap = ['blue','red','green','white','yellow', 'violet','orange'] draw_triangle(points, colormap[degree], my_turtle) if degree > 0: sierpinski([points[0], get_mid(points[0], points[1]), get_mid(points[0], points[2])], degree-1, my_turtle) sierpinski([points[1], get_mid(points[0], points[1]), get_mid(points[1], points[2])], degree-1, my_turtle) sierpinski([points[2], get_mid(points[2], points[1]), get_mid(points[0], points[2])], degree-1, my_turtle) def main(): my_turtle = turtle.Turtle() my_win = turtle.Screen() my_points = [[-100,0],[0,100],[100,0]] sierpinski(my_points, 3, my_turtle) my_win.exitonclick() main() ``` 运行程序后,将会弹出一个窗口显示绘制谢尔宾斯基三角形。可以尝试修改程序中的参数来探究谢尔宾斯基三角形的性质。 ### 回答2: 谢尔宾斯基三角形是一种数学图形,由波兰数学家谢尔宾斯基于1915年提出。这个图形是通过将一个边长为a的等边三角形划分成4个边长为a/2的等边三角形,并移除中间的三角形,再对每个小三角形重复相同的操作,直到不能再分割为止形成的。 在Python中,可以通过递归的方法实现谢尔宾斯基三角形绘制。首先,需要确定画布的大小和初始三角形的位置。然后,编写一个递归函数,通过计算新三角形的顶点坐标,将其绘制在画布上。 以下是一个简单的示例代码: ``` import turtle # 设置画布大小和初始三角形位置 turtle.setup(800, 600) # 设置画布大小 turtle.penup() # 提起笔 turtle.goto(-300, -200) # 移动到初始位置 turtle.pendown() # 放下笔 # 定义递归函数绘制谢尔宾斯基三角形 def draw_sierpinski(length, level): if level == 0: for _ in range(3): turtle.forward(length) turtle.left(120) else: draw_sierpinski(length / 2, level - 1) turtle.forward(length / 2) draw_sierpinski(length / 2, level - 1) turtle.backward(length / 2) turtle.left(60) turtle.forward(length / 2) turtle.right(60) draw_sierpinski(length / 2, level - 1) turtle.left(60) turtle.backward(length / 2) turtle.right(60) # 调用递归函数绘制谢尔宾斯基三角形 draw_sierpinski(500, 4) # 显示绘制结果 turtle.done() ``` 在以上代码中,使用Python的turtle库实现了绘制。首先通过`turtle.setup()`函数设置了画布的大小,然后通过`turtle.penup()`和`turtle.pendown()`函数控制画笔的落下和提起,使用`turtle.goto()`函数移动到初始位置。接下来,定义了一个递归函数`draw_sierpinski()`来实现谢尔宾斯基三角形绘制。最后,调用`draw_sierpinski(500, 4)`函数绘制了一个边长为500的谢尔宾斯基三角形,其中参数4表示递归的层数。最后,使用`turtle.done()`函数显示绘制结果。 这段代码仅仅是实现了谢尔宾斯基三角形的基本绘制,你可以根据需要进一步完善和优化代码。 ### 回答3: 谢尔宾斯基三角形是一个由等边三角形不断递归分割而成的几何图形。Python语言可以使用递归函数来生成谢尔宾斯基三角形。 首先,我们需要使用turtle库来绘制图形。导入turtle库后,通过设置画笔的速度和形状等属性,可以调整绘图效果。 接下来,可以定义一个递归函数来生成谢尔宾斯基三角形递归函数需要有三个参数:边长、递归深度和绘制的角度。 在递归函数内部,首先需要检查递归深度是否为0。如果为0,则绘制一个等边三角形。如果不为0,则将边长缩小一半,递归调用函数绘制三个内嵌的谢尔宾斯基三角形绘制三个三角形时,需要将绘图方向调整为逆时针或顺时针,并旋转角度。 最后,在主程序中调用递归函数并传入初始参数,即可生成谢尔宾斯基三角形。 以下是一个示例的Python代码实现: ```python import turtle def draw_sierpinski(length, depth, angle): if depth == 0: for _ in range(3): turtle.forward(length) turtle.left(120) else: draw_sierpinski(length / 2, depth - 1, angle) turtle.forward(length / 2) draw_sierpinski(length / 2, depth - 1, -angle) turtle.backward(length / 2) turtle.left(angle) turtle.forward(length / 2) turtle.right(angle) draw_sierpinski(length / 2, depth - 1, angle) turtle.left(angle) turtle.backward(length / 2) turtle.right(angle) turtle.speed(0) turtle.shape("turtle") turtle.penup() turtle.goto(-200, -200) turtle.pendown() draw_sierpinski(400, 4, 120) turtle.done() ``` 当运行以上代码时,将在窗口中绘制一个由谢尔宾斯基三角形组成的图形。调整绘图参数可以生成不同深度和形状的谢尔宾斯基三角形
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值