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

article/2025/8/29 14:34:49

首先,回顾递归的概念:

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

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

 所以首先,我们需要一个方法,它能帮我们画三角形,在这里画一个三角形,需要引入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()

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


http://chatgpt.dhexx.cn/article/Qnj8B9fe.shtml

相关文章

谢尔宾斯基地毯的讲解

谢尔宾斯基地毯是数学家谢尔宾斯基提出的一个分形图形,谢尔宾斯基地毯和谢尔宾斯基三角形基本类似,不同之处在于谢尔宾斯基地毯采用的是正方形进行分形构造,而谢尔宾斯基三角形采用的等边三角形进行分形构造。谢尔宾斯基地毯和它本身的一部分…

Java面向对象编程:利用递归思想绘制“谢尔宾斯基地毯”和“谢尔宾斯基三角形”

1、递归:在方法中调用本方法。 2、递归调用会无限循环下去,因此方法体中必须有结束方法的条件。返回值为void时通常写为: if (条件) {return; } 下面使用递归绘制“谢尔宾斯基地毯”和“谢尔宾斯基三角形”。 谢尔宾斯基地毯。 1&#xff…

谢尔宾斯基三角形:Python+turtle

本来觉得谢尔宾斯基三角形挺难的。分析以后,其实还是挺简单的。 挺好理解,供大家一起学习 """功能:绘制谢尔宾斯基三角形环境:python3.7日期:2019/1/14 21:49作者:指尖魔法师版本&#xf…

用PYTHON画谢尔宾斯基三角形(代码可复制)

今天我们来画一个谢尔宾斯基三角形。 好我们先看原图: 这是一个等边三角形,把每一条边平均分成两份,再把这三个焦点连起来,形成四个等边三角形,中间的一个不看,紧接着再继续按着刚刚的步骤走,就可以画出来…

Python实验舱谢尔宾斯基三角形绘制教程

三角形,大家应该再熟悉不过了。 上图是一个由四个小三角形拼成的大三角形,也叫谢尔宾斯基三角形。 谢尔宾斯基三角形还能继续画下去: 2阶(上图是1阶): 3阶: 5阶: 8阶: …

谢尔宾斯基三角新

谢尔宾斯基三角形(英语:Sierpinski triangle)是一种分形,由波兰数学家谢尔宾斯基在1915年提出。它是自相似集的例子。它的豪斯多夫维 1.取一个实心的三角形。(多数使用等边三角形) 2.沿三边中点的连线&am…

谢尔宾斯基三角形的讲解

谢尔宾斯基三角形是数学家谢尔宾斯基提出的⼀个分形图形,谢尔宾斯基三⻆形和谢尔宾斯基地毯基本类似,不同之处在于谢尔宾斯基三⻆形采⽤的是等边三⻆形进⾏分形构造,⽽谢尔宾斯地毯基采⽤的是正⽅形进⾏分形构造。 下面是我的代码展示&#x

谢尔宾斯基三角用Python做,你知道吗?

大家好,我叫王若冲。因为我妈叫我冲姐,所以你们也可以这么叫我。今天是我的第一篇文章,就给大家讲谢尔宾斯基三角的代码吧。如果你既想要试一试,又懒得自己写代码,那么原代码就在下面。*注意,这次我用的软件…

学习Python中turtle模块的基本用法(4:绘制科赫曲线和谢尔宾斯基三角形)

科赫曲线和谢尔宾斯基三角形是常见的分形图形(详细介绍见参考文献1),本文使用turtle库绘制这两类图形。 科赫曲线 科赫曲线的详细介绍见参考文献2,其中的绘图思路是“画正三角形,并把每一边三等分,取三等分后的一边中…

谢尔宾斯基三角形

谢尔宾斯基三角形(英语:Sierpinski triangle)是一种分形,由波兰数学家谢尔宾斯基在1915年提出 取一个实心的三角形。(多数使用等边三角形)沿三边中点的连线,将它分成四个小三角形。去掉中间的那…

混沌分形之谢尔宾斯基(Sierpinski)

本文以使用混沌方法生成若干种谢尔宾斯基相关的分形图形。 (1)谢尔宾斯基三角形 给三角形的3个顶点,和一个当前点,然后以以下的方式进行迭代处理: a.随机选择三角形的某一个顶点,计算出它与当前点的中点位置…

关于谢尔宾斯基三角形(Sierpinski triangle)的讲解

谢尔宾斯基三角形(Sierpinski triangle)是一种分形,由波兰数学家谢尔宾斯基在1915年提出。它是自相似集的例子。它的豪斯多夫维是log(3)/log(2) ≈ 1.585。 谢尔宾斯基(Sierpinski)三角形 1.画一个(正&…

谢尔宾斯基三角形——python递归

一、 问题描述 类似于分形树,分形三角形——谢尔宾斯基三角形同样是一种分形,由波兰数学家谢尔宾斯基在1915年提出。它是自相似集的例子。它的豪斯多夫维是log(3)/log(2) ≈ 1.585。对于谢尔宾斯基三角形的构造,可以先作一个正三角形&#x…

Redis的RDB和AOP总结

目录 1.RDB和AOF是什么 2.RBD 2.1 配置参数 2.1.1 配置文件位置 2.1.2 save 2.1.3 stop-writes-on-bgsave-error 2.1.4 rdbcompression 2.1.5 rdbchecksum 2.1.6 dbfilename 2.1.7 dir 2.2 fork 2.3 如何触发RDB快照 2.3.1 配置文件中默认的快照配置 2.3.2 客户端使用命令sav…

redis RDB设计与实现

redis RDB设计与实现 文章目录 redis RDB设计与实现RDB功能RDB文件的创建和保存SAVE 和 BGSAVERDB保存冲突RDB文件的载入自动保存 RDB 文件结构 RDB功能 为了使Redis储存在内存中的数据库状态保存到磁盘里面防止丢失,Redis提供了RDB持久化功能,将Redis内…

比redis-rdb-tools快10倍的rdb分析工具

背景 为了满足快速分析rdb的情况,对rdr进行测试调研。 测试环境 测试机器:本机macbook pro 工具:rdr,redis-rdb-toolsrdb 文件:dump_7709.rdb,Redis实例大小3G,rdb文件大小1G git地址&…

Redis持久化之RDB原理

Redis持久化之RDB 一.RDB文件作用二. 触发条件三、执行流程1、总体流程2、fork实现复制原理 四、RDB文件五、 启动时加载六、 RDB常用配置总结七、优缺点1、优点2、缺点 个人复习笔记一.RDB文件作用 RDB持久化是将当前进程中的数据生成快照保存到硬盘(因此也称作快照持久化)&a…

Redis RDB持久化

文章目录 一、持久化简介二、数据快照RDB1. save指令2. RDB文件相关配置验证save后数据保存在了rdb文件验证重启服务后,程序会从rdb文件中恢复数据到内存 3. bgsave指令4. 配置自动持久化5. RDB三种启动方式对比6. rdb特殊启动形式7. RDB优缺点 一、持久化简介 什么…

Redis 持久化与故障恢复之rdb

一、摘要 老生常谈一下吧,redis持久化分为rdb和aof两种模式,本篇先说一说rdb模式吧,共分为三部分:1:如何触发rdb持久化, 2:rdb持久化源码, 3:rdb文件解析。 ps:本文基于r…

【Redis】Redis持久化之RDB详解(Redis专栏启动)

📫作者简介:小明java问道之路,2022年度博客之星全国TOP3,专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化。文章内容兼具广度深度、大厂技术方案,对待技术喜欢推理加验证,就职于知名金融公司…