turtle递归作图绘制谢尔宾斯基地毯【详解】

article/2025/8/29 14:26:08

了解谢尔宾斯基地毯

我们先从谢尔宾斯基三角形讲起:
谢尔宾斯基三角形(英语:Sierpinski triangle)是一种分形,由波兰数学家谢尔宾斯基在1915年提出。它是自相似集的例子。
以下是0到3阶的谢尔宾斯基三角形:
在这里插入图片描述

它的构造方法是:
1.取一个实心的等边三角形
2.沿三边中点的连线,将它分成四个小三角形。
3.去掉中间的那一个小三角形。
4.对其余三个小三角形重复(1,2,3)过程。

谢尔宾斯基三角形特点:
容易看出,假设0阶谢尔宾斯基三角形面积为a,周长为b,
那么n阶谢尔宾斯基三角形面积为:a*[(3/4)^n]
周长为:b*[(3/2)^n]
也就是说,当区域无穷大时,我们得到了一个面积为0,但周长却为无穷大的图形。

我们再来看谢尔宾斯基地毯,它的基本图形为一个正方形,然后每次挖去中心的一个小正方形,
直接上图:
在这里插入图片描述

海龟作图turtle

python2.6版本中后引入的一个简单的绘图工具,叫做海龟绘图(Turtle Graphics),出现在1966年的Logo计算机语言。
海龟绘图(turtle库)是python的内部模块,使用前导入即可 import turtle
详细用法这里不具体介绍,可以参考下面这篇文章:
python之turtle海龟绘图篇

代码思路:

我们从最简单的情况想起:一阶地毯
我们将大正方形(先假设边长为3a)放在一个直角坐标系中,左下顶点定为(0,0),右上顶点定为
(3a,3a)
那么容易得到:要挖去那一个小三角形,它的左下顶点坐标为(a,a),边长为a
也即:要挖去的区域为{(x,y)|a<=x<=2a,a<=y<=2a}

那么对于n阶的地毯,我们需要考虑的就是不断减小问题规模,使之回到最简单的情况。

使用代码实现时,我们可以考虑:
对于n阶的谢尔宾斯基地毯,我们先将最大的正方形固定在坐标轴上,
然后考虑每一个最小的正方形是否应该挖去,
例如三阶地毯,设最大正方形面积为9*9=81,那么我们只需要考虑每个面积为1的小正方形应该留下或挖去。
下面上代码:

代码

海龟图画谢尔宾斯基地毯
思路:令最小的一个正方形边长为base,则n阶地毯的边长为base*(3**n)
由于turtle画布的长度为600左右,第一象限长度为300左右,我们令base=int(300/(3^n)
判断每一个边长为base的小正方形是否应该挖去

绘制最外围的正方形:

import turtle# 画好最外围的正方形,背景设为蓝色
n = int(input())
t = turtle.Turtle()
base = int(300 / (3 ** n))  # 设置每个小正方形长度base
length = base * (3 ** n)  # 最外围的正方形长度
t.pensize(0.1)
turtle.tracer(False)  # 画图过程太长我们跳过不看
t.pencolor('blue')
t.fillcolor('blue')
t.begin_fill()  # 填充蓝色
for i in range(1, 5):t.forward(length)t.left(90)
t.end_fill()
turtle.done()

运行结果是这样的:
在这里插入图片描述

对于每个边长为base的小正方形,是否应该挖去,需要用到递归:

    def check(n, x, y):  # 判断对于坐标(x,y),判断该处的小正方形是否需要被挖掉,需要则返回Falseif n <= base:  # 结束条件return Truen2 = n // 3if n2 <= x < n2 * 2 and n2 <= y < n2 * 2:  # 小正方形处于大正方形中央应该满足的条件return Falsereturn check(n2, x % n2, y % n2)  # 不处于中央的点,递归至下一层的小正方形# 取余的操作可以理解为将零点移至小正方形的左下角顶点

最后我们将所有判断为False的小正方形挖去:

    for y in range(0, N, base):for x in range(0, N, base):if check(N, x, y):continueelse:            # 将(x,y)处小正方形填为空白t.penup()t.setx(x)t.sety(y)t.pendown()t.pensize(0.1)t.pencolor('white')t.fillcolor('white')t.begin_fill()for i in range(1, 5):t.forward(base)t.left(90)t.end_fill()t.penup()

不要忘了输入和输出:

n = int(input())
carpet(length)

最后完整代码是这样的:

import turtle
n = int(input())
# 画好最外围的正方形,背景设为蓝色
t = turtle.Turtle()
base = int(300 / (3 ** n))  # 设置每个小正方形长度base
length = base * (3 ** n)  # 最外围的正方形长度
t.pensize(0.1)
turtle.tracer(False)  # 画图过程太长我们跳过不看
t.pencolor('blue')
t.fillcolor('blue')
t.begin_fill()  # 填充蓝色
for i in range(1, 5):t.forward(length)t.left(90)
t.end_fill()def carpet(N):  # 对于点a(x,y),我们令a点位小正方形的左下角顶点def check(n, x, y):  # 判断对于坐标(x,y),判断该处的小正方形是否需要被挖掉,需要则返回Falseif n <= base:  # 结束条件return Truen2 = n // 3if n2 <= x < n2 * 2 and n2 <= y < n2 * 2:  # 小正方形处于大正方形中央应该满足的条件return Falsereturn check(n2, x % n2, y % n2)  # 不处于中央的点,递归至下一层的小正方形# 取余的操作可以理解为将零点移至小正方形的左下角顶点for y in range(0, N, base):for x in range(0, N, base):if check(N, x, y):continueelse:            # 将(x,y)处小正方形填为空白t.penup()t.setx(x)t.sety(y)t.pendown()t.pensize(0.1)t.pencolor('white')t.fillcolor('white')t.begin_fill()for i in range(1, 5):t.forward(base)t.left(90)t.end_fill()t.penup()carpet(length)
turtle.done()

运行结果:
以下依次为n=1~5的n阶谢尔宾斯基地毯:
绘制5阶地毯需要很长时间,因此不继续绘制6阶了
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

参考资料

python数据结构与算法课程 pku陈斌


http://chatgpt.dhexx.cn/article/4Qh5EkGM.shtml

相关文章

Python实验舱谢尔宾斯基地毯绘制教程

谢尔宾斯基地毯&#xff0c;和谢尔宾斯基三角形相似&#xff0c;下图就是谢尔宾斯基地毯 一&#xff0c;起始代码 p.width(3) p.speed(10) import turtle nint(input()) baseint(200/(3 ** n)) lengthbase * (3 ** n) p.pensize(0.1) turtle.tracer(False) p.pencolor(blue) p…

Matlab 谢尔宾斯基三角形

本文主要介绍了一种谢尔宾斯基三角形生产方法。谢尔宾斯基三角形是混沌与分形学里面的一个经典案例&#xff0c;能生成谢尔宾斯基三角形的方法很多&#xff0c;我采用的方法是取中点的方式&#xff0c;具体流程如下&#xff1a; 1.在任意三角形△ABC内或外任取一点P&#xff1…

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

谢尔宾斯基三角&#xff08;Sierpinski&#xff09;是一种分形&#xff0c;由波兰数学家谢尔宾斯基在1915年提出。它是自相似集的例子。它的豪斯多夫维是log(3)/log(2) ≈ 1.585。 * 图一&#xff1a;完成后的 谢尔宾斯基三角

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

首先&#xff0c;回顾递归的概念&#xff1a; 一个函数不停地调用它本身&#xff0c;我们就认为这个函数使用了递归。 先来看一个谢尔宾斯基三角形的示例&#xff1a; 所以首先&#xff0c;我们需要一个方法&#xff0c;它能帮我们画三角形&#xff0c;在这里画一个三角形&am…

谢尔宾斯基地毯的讲解

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

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

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

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

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

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

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

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

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

谢尔宾斯基三角新

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

谢尔宾斯基三角形的讲解

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

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

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

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

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

谢尔宾斯基三角形

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

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

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

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

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

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

一、 问题描述 类似于分形树&#xff0c;分形三角形——谢尔宾斯基三角形同样是一种分形&#xff0c;由波兰数学家谢尔宾斯基在1915年提出。它是自相似集的例子。它的豪斯多夫维是log(3)/log(2) ≈ 1.585。对于谢尔宾斯基三角形的构造&#xff0c;可以先作一个正三角形&#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储存在内存中的数据库状态保存到磁盘里面防止丢失&#xff0c;Redis提供了RDB持久化功能&#xff0c;将Redis内…

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

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