科赫曲线和谢尔宾斯基三角形是常见的分形图形(详细介绍见参考文献1),本文使用turtle库绘制这两类图形。

科赫曲线

  科赫曲线的详细介绍见参考文献2,其中的绘图思路是“画正三角形,并把每一边三等分,取三等分后的一边中间一段为边向外作正三角形,并把这“中间一段”擦掉,重复上述两步,画出更小的三角形。”考虑到绘制完三角形再处理每条边的话,使用turtle的绘制函数不便于计算坐标,于是调整为绘制每条边时都将其三等分,只处理要显示的前后两个子边,重复该过程至指定的迭代次数(看下面录制的绘图动画比较直观)。最终的绘图代码及绘图效果如下所示。

from turtle import *def Kohn(length, n):if n==0:forward(length)else:thirdLen=length/3Kohn(thirdLen, n-1)right(60)Kohn(thirdLen, n-1)        left(120)Kohn(thirdLen, n-1)  right(60)Kohn(thirdLen, n-1)  screensize(600,400)
tracer(0, 0)
penup()
goto(-180,-90)
pendown()
Kohn(360,8)
left(120)
Kohn(360,8)
left(120)
Kohn(360,8)
left(120)
hideturtle()exitonclick()

谢尔宾斯基三角形

  参考文献3中介绍的谢尔宾斯基三角形的画法有去掉中心法、Chaos Game法和L系统,本文中采用Chaos Game法绘制。最初采用参考文献3中的构造方法绘图,绘图代码及绘出的图形如下所示(判断点是否在三角形内的代码来自参考文献4)。:

def Sierpinski_1(x1,y1,x2,y2,x3,y3):maxX=max((x1,x2,x3))minX=min((x1,x2,x3))maxY=max((y1,y2,y3))minY=min((y1,y2,y3))        rx=random.randint(minX+1,maxX-1)ry=random.randint(minY+1,maxY-1)while(not IsInside(x1,y1,x2,y2,x3,y3,rx,ry)):rx=random.randint(minX+1,maxX-1)ry=random.randint(minY+1,maxY-1)tmp=((x1,y1),(x2,y2),(x3,y3))[random.randint(0,2)]mx=(tmp[0]+rx)/2my=(tmp[1]+ry)/2penup() goto(mx-1,my)pendown()right(90)circle(1)left(90)screensize(600,400)
tracer(0, 0)
x1=-250
y1=-150
x2=150
y2=-150
x3=0
y3=100for i in range(0,5000):    Sierpinski_1(x1,y1,x2,y2,x3,y3)hideturtle()


  估计应该是绘图思路不对,百度谢尔宾斯基三角形的混沌游戏画法,发现步骤都大致相同,但重复的步骤不一致,最终基于参考文献5-6中的介绍,调整绘图思路为:
  1、随机生成三个点A,B,C,组成三角形;
  2、随机生成三角形的一点P;
  3、绘制点P,同时计算P与A,B,C中任意一点的中点,并将中点坐标赋予P;
  4、重复步骤3。
基于上述步骤,重新调整代码,绘图代码及绘图效果如下:

def Sierpinski_2(x1,y1,x2,y2,x3,y3,n):maxX=max((x1,x2,x3))minX=min((x1,x2,x3))maxY=max((y1,y2,y3))minY=min((y1,y2,y3))        px=random.randint(minX+1,maxX-1)py=random.randint(minY+1,maxY-1)while(not IsInside(x1,y1,x2,y2,x3,y3,px,py)):px=random.randint(minX+1,maxX-1)py=random.randint(minY+1,maxY-1)penup()goto(px-1,py)pendown()right(90)circle(1)left(90)points=((x1,y1),(x2,y2),(x3,y3))for index in range(0,n):tmp=points[random.randint(0,2)]px=(tmp[0]+px)/2py=(tmp[1]+py)/2penup() goto(px-1,py)pendown()right(90)circle(1)left(90)screensize(600,400)
tracer(0, 0)
x1=-250
y1=-150
x2=150
y2=-150
x3=0
y3=100Sierpinski_2(x1,y1,x2,y2,x3,y3,5000)hideturtle()


  最后是一个完成的随机版谢尔宾斯基三角形绘制代码

from turtle import *
import randomdef IsTrangleOrArea(x1,y1,x2,y2,x3,y3):return abs((x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2)) / 2.0)def IsInside(x1,y1,x2,y2,x3,y3,x,y): ABC = IsTrangleOrArea(x1,y1,x2,y2,x3,y3)PBC = IsTrangleOrArea(x,y,x2,y2,x3,y3)PAC = IsTrangleOrArea(x1,y1,x,y,x3,y3)PAB = IsTrangleOrArea(x1,y1,x2,y2,x,y) return (ABC == PBC + PAC + PAB)maxX=max((x1,x2,x3))minX=min((x1,x2,x3))maxY=max((y1,y2,y3))minY=min((y1,y2,y3))        px=random.randint(minX+1,maxX-1)py=random.randint(minY+1,maxY-1)while(not IsInside(x1,y1,x2,y2,x3,y3,px,py)):px=random.randint(minX+1,maxX-1)py=random.randint(minY+1,maxY-1)penup()goto(px-1,py)pendown()right(90)circle(1)left(90)points=((x1,y1),(x2,y2),(x3,y3))for index in range(0,n):tmp=points[random.randint(0,2)]px=(tmp[0]+px)/2py=(tmp[1]+py)/2penup() goto(px-1,py)pendown()right(90)circle(1)left(90)width=600
height=400screensize(width,400)
tracer(0, 0)x1=random.randint(1-width/2,width/2-1)
y1=random.randint(1-height/2,height/2-1)
x2=random.randint(1-width/2,width/2-1)
y2=random.randint(1-height/2,height/2-1)
x3=random.randint(1-width/2,width/2-1)
y3=random.randint(1-height/2,height/2-1)
Sierpinski_2(x1,y1,x2,y2,x3,y3,5000)
hideturtle()
exitonclick()

参考文献
[1]https://baike.baidu.com/item/%E5%88%86%E5%BD%A2/85449?fr=aladdin
[2]https://baike.baidu.com/item/%E7%A7%91%E8%B5%AB%E6%9B%B2%E7%BA%BF/7090673?fromModule=lemma_inlink
[3]https://baike.baidu.com/item/%E8%B0%A2%E5%B0%94%E5%AE%BE%E6%96%AF%E5%9F%BA%E4%B8%89%E8%A7%92%E5%BD%A2?fromModule=lemma_inlink
[4]https://blog.csdn.net/mxw322/article/details/56026607
[5]https://zhuanlan.zhihu.com/p/103610498?utm_source=wechat_session&ivk_sa=1024320u
[6]https://wiki.swarma.org/index.php?title=%E8%B0%A2%E5%B0%94%E5%AE%BE%E6%96%AF%E5%9F%BA%E4%B8%89%E8%A7%92%E5%BD%A2

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

  1. turtle库使用教程 及 绘制 浪漫樱花 五角星 彩虹玫瑰 谢尔宾斯基三角形 实例

    目录 一.turtle简介 二.绘图坐标体系 三.笔画控制函数 四.形状绘制函数 五.颜色填充 六.浪漫樱花代码实例 七.五角星代码实例 八.彩虹玫瑰代码实例 九.谢尔宾斯基三角形代码实例 一.tur ...

  2. Python数据结构15:turtle模块制图,画直线,正方形,星星,递归可视化:分形树,谢尔宾斯基三角形

    1. Python中的turtle模块制图 前面已经讲了递归的原理,这里用递归作图来直观的理解递归. 首先了解以下Python中用于作图的内置海龟作图系统turtle module. Python内置 ...

  3. python螺旋圆的绘制_python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)...

    插图工具使用Python内置的turtle模块,为什么叫这个turtle乌龟这个名字呢,可以这样理解,创建一个乌龟,乌龟能前进.后退.左转.右转,乌龟的尾巴朝下,它移动时就会画一条线.并且为了增加乌龟 ...

  4. 数据结构与算法(Python版)二十二:递归可视化(谢尔宾斯基三角形)

    谢尔宾斯基Sierpinski三角形 分形构造, 平面称谢尔宾斯基三角形, 立体称谢尔宾斯基金字塔 谢尔宾斯基三角形:作图思路 根据自相似特性, 谢尔宾斯基三角形是由3个尺寸减半的谢尔宾斯基三角形按照 ...

  5. python递归三角形_python 谢尔宾斯基三角形的递归实现

    import turtle def draw(points): # 根据三个坐标,画一个三角形 t.penup() t.goto(points['left']) t.pendown() t.goto( ...

  6. 学习Python中turtle模块的基本用法(3:学习绘图示例源码)

      基于前面学习的turtle模块基本函数,在GitHub及其它网站中找到部分turtle绘制图形的示例,本文选取部分案例,学习案例源码,分析绘图思路,以巩固turtle基本函数的用法. 绘制爱心   ...

  7. 学习Python中turtle模块的基本用法(6:其它函数)

      除了之前文章中介绍的turtle模块的绘图函数,本文从turtle帮助文档中梳理了其它绘图或状态函数,编写复杂的绘图函数时也用得到,函数清单如下表所示: 序号 函数名称 说明 1 turtle.h ...

  8. 学习Python中turtle模块的基本用法(5:绘制简笔画羊)

      人已阳,准备画个喜羊羊纪念一下,但是喜羊羊头上的卷太多了,不太好画,于是找了参考文献1的普通的简笔画羊,使用Python中的turtle模块绘制(采用参考文献3中绘制云朵的代码绘制羊身体).    ...

  9. java中画三角形的方法_java画谢尔宾斯基三角形

    欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入 //6.定义重绘方法,拖动窗口,改变窗口大小后,绘制的图片仍然留在窗体上 public void paint(Graphic ...

最新文章

  1. Christopher Manning​:Uber 出售自动驾驶部门是一个标志性事件​ | AI日报
  2. zabbix之微信告警(python版):微信个人报警,微信企业号告警脚本
  3. Redis 的各项功能解决了哪些问题?
  4. php数据结构课程---2、链表(php中 是如何实现单链表的(也就是php中如何实现对象引用的))...
  5. Python__面向对象思想
  6. nvm-windows的安装配置
  7. 迁移.net framework 工程到.net core
  8. 关于PaddleNLP如何加载训练好的模型进行NER
  9. HDOJ2035 人见人爱A^B
  10. 收藏 | 详解PyTorch中的ModuleList和Sequential
  11. My Seventy-first Page - 目标和 - By Nicolas
  12. 你的数据库到底应该如何存储密码?
  13. 深度学习方法(二十一):常用权重初始化方法Xavier,He initialization的推导
  14. Windows和UNIX系统调用的一些区别
  15. css盒子模型有几种?以及盒模型设置?
  16. 遍历指定目录下指定类型文件的函数(fatkun Fix版)
  17. 计算机组成原理存储系统一章中的那些英语缩写
  18. 等级保护----1、网络安全等级保护一级安全测评要求
  19. android录音实现
  20. 关于stm32单片机低功耗的实现和唤醒

热门文章

  1. 去哪儿网怎么沦为骗子的平台了,一步步揭开去哪儿网欺骗消费者的把戏
  2. 青猴浏览器下载后会自动导入其他浏览器的书签?
  3. layDate显示默认时间
  4. Vcenter Server 7 分配许可证
  5. 养活一团春意思,撑起两根穷骨头
  6. 记一次Qt5.12.2 Android 开发环境配置
  7. 金蝶EAS,凭证接口,生成凭证,删除凭证,WebService接口
  8. python加密方式-AES加密ECB模式
  9. C#阿里云OSS——存储
  10. 详解状态压缩动态规划算法