了解谢尔宾斯基地毯

我们先从谢尔宾斯基三角形讲起:
谢尔宾斯基三角形(英语: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陈斌

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

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

    1.递归:在方法中调用本方法. 2.递归调用会无限循环下去,因此方法体中必须有结束方法的条件.返回值为void时通常写为: if (条件) {return; } 下面使用递归绘制"谢尔宾斯基 ...

  2. 画完三角形再画谢尔宾斯基地毯

    照样废话不说,看代码看注释 import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import jav ...

  3. 小练手:用Canvas绘制谢尔宾斯基三角形

    转载<小练手:用Canvas绘制谢尔宾斯基三角形> 补充 作者第二种画法的完整程序: PS:修改function SierpinskiTriangle(p,len,depth = 9)中d ...

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

    谢尔宾斯基地毯,和谢尔宾斯基三角形相似,下图就是谢尔宾斯基地毯 一,起始代码 p.width(3) p.speed(10) import turtle n=int(input()) base=int( ...

  5. python数据结构与算法40题_Python数据结构与算法40:递归编程练习题3:ASCII谢尔宾斯基地毯...

    注:本文如涉及到代码,均经过Python 3.7实际运行检验,保证其严谨性. 本文阅读时间约为7分钟. 递归编程练习题3:ASCII谢尔宾斯基地毯 谢尔宾斯基地毯 谢尔宾斯基地毯是形如上图的正方形分形 ...

  6. 关于谢尔宾斯基地毯的讲解

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

  7. OpenGL进阶(七)-康托尔集 谢尔宾斯基地毯 Koch雪花

    这一篇关于分形图像,当然只是入门. 分形通常被定义为"一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状",即具有自相似的性质.分形有几种类型 ...

  8. Java学习日记:UI篇(6)--谢尔宾斯基地毯图

    Java学习日记:UI篇(6)–谢尔宾斯基地毯图 引言:谢尔宾斯基地毯是数学家谢尔宾斯基提出的一个分形图形,谢尔宾斯基地毯和谢尔宾斯基三角形基本类似,不同之处在于谢尔宾斯基地毯采用的是正方形进行分形构 ...

  9. python与分形0009 - 谢尔宾斯基地毯

    分形介绍 分形是一个悖论. 它惊人的简单,却又无限的复杂. 它很新,却又比尘埃更古老. 分形是什么?它们是从哪里来的?我们为什么要在乎? 20世纪非传统的数学家Benoit Mandelbrot在19 ...

  10. 按钮动作监听器和鼠标监听器的同时实现,在画图板上画出三角形,射线,曲笔,谢尔宾斯基三角形,谢尔宾斯基地毯Random类的实现,数组的实现,Thread.sleep的实现

    按钮动作监听器和鼠标监听器的实现 实例化 实现 监听器的类 DrawListener dl = new DrawListener();// 在界面上添加鼠标监听器对象(鼠标监听器的对象可以是界面和按钮 ...

最新文章

  1. SQLServer------插入数据时出现IDENTITY_INSERT错误
  2. 六个最佳的软件工程实践(持续的质量验证、变更管理)
  3. IIR+全通滤波器级联实现系统零相位相移_matlab仿真
  4. js accordian效果
  5. 前端学习(3328):闭包的形式3
  6. 再谈SQL Server中日志的的作用
  7. 一般的模式匹配算法(求子串位置)
  8. .Net Core 学习笔记1——包、元包、框架
  9. 19岁少女辍学就业,却遭身价2.5亿创业公司解雇
  10. max-height、min-height、height优先级的问题
  11. 华为魔术2手机拆机图解_荣耀Magic2手机内部做工如何?荣耀Magic2手机拆机
  12. Ubuntu学习 history
  13. 【学习】013 Servlet、Cookie、Session的简述
  14. 451.根据字符出现频率排序(力扣leetcode) 博主可答疑该问题
  15. 一文讲清楚机械硬盘和固态硬盘的工作原理
  16. 【JMedia】诺贝尔奖得主:东亚教育浪费了太多生命
  17. mysql 查询去掉多余零
  18. 人机融合的科幻与现实
  19. 广东python编程比赛
  20. VMR论文visualization实验总结

热门文章

  1. java自动装箱|拆箱解密
  2. kernel - regulator
  3. windows常用系统命令
  4. HHUOJ 1001 汽水瓶 (水题)
  5. 进阶-第18__深度探秘搜索技术_基于slop参数实现近似匹配以及原理剖析和相关实验
  6. Markdown语法手册
  7. 代码随想录第二十天 LeetCode513、112、113、106、105
  8. 悼念王选:伟大发明家和失意企业家间的孤独者
  9. React 之 Expected an assignment or function call and instead saw an expression 解决办法
  10. 电子元件知识汇总3-厂商