IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Python递归绘制谢尔宾斯基三角形 -> 正文阅读

[Python知识库]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()

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

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-11-19 17:35:18  更:2021-11-19 17:36:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 0:32:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码