python三角形边长分别为_python递归-一、谢尔宾斯基三角形

由于专栏代码无法高亮,为了美观我就直接从csdn截图了,想复制代码可以去我的csdn,对应文章:https://blog.csdn.net/python1639er/article/details/104038495

1、谢尔宾斯基三角形

谢尔宾斯基三角形(Sierpinski triangle),

是一种如图所示的分形

这里分析一下其绘制过程

1、绘制一个三角形

2、取三角形的三边中点,

以每两个中点及其所在边共有的顶点,

三个一组,组合成三个小三角形,

对三个三角形进行绘制,

如下图所示,分别为ADF,DBE,FEC。

3、对2中的三个小三角形,重复步骤2。

理论上,步骤二可以无限重复下去,但是代码而言,要保证算法的有穷性,所以一般都是将步骤二运行有限次数之后结束。

2、结合递归三原则编写代码

首先,需要添加方法draw_sierpinski来绘制指定层数的谢尔宾斯基三角形

这里再解释下depth这个层数的具体意思,即上面的步骤二执行的次数

那么下图从左到右,层数分别为:0,1,2,3,4

然后我们再分细下draw_sierpinski方法应该怎么写绘制三角形triangle

如果层数depth为0则退出递归

取三角形中点,及对应形成的三个小三角形,

对这三个三角形,分别再次调用draw_sierpinski方法,绘制depth-1的谢尔宾斯基三角形

为了实现上面四步,我们需要添加两个辅助方法

get_midpoint(a,b): 返回a,b两点的中点坐标

draw_triangle(a,b,c) : 以a,b,c为顶点绘制三角形

最终代码如下

运行效果如图

然后我们结合代码回顾一下递归三原则

如图所示:

这里补充一点,递归三原则的2和三常常是一起进行的,

即在向1中的基础情况靠拢的的情况下调用递归方法本身

3、最后补充:

问题1:没有颜色的变化

本人在b站的关于这个谢尔宾斯基三角形视频教程最终代码如步骤二中所示,但是有个小小的细节问题,就是不同层数的三角形之间没有颜色的变化,与本文开头的图一不符。所以最后还是要添加一下颜色的处理

问题2:最终运行结束后中间有黑点

大家看步骤二重最后运行效果图,中间有个黑点, 这个黑点是turtle画笔对象,一般是箭头样式,放在中间破坏了整个画面,隐藏掉就好了

解决问题一二后代码如下

此时运行效果如图

问题3:线条重画导致粗细不一

如果有朋友观察细致的话,会发现一些边线有时有粗细不一的情况,如下图。

这是由于每次重复绘制过程的第二步时,边线也被重复绘制了,但是重复绘制有时候并不一定和原来的边线是绝对齐的,这种反复不齐导致整个线条实际上是有多个不完全一致的线段叠起来的,所以看上去会有粗有细。

实际上,步骤二为了让大家简单直接的理解递归,所以选择了重复绘制边线这种方便递归的方法来画谢尔宾斯基三角形,方便的缺点就是重画边线导致不齐的线段叠加,当然这个缺点对于初学者完全可以忽略。

如果我们要解决这个问题,实际上就需要调整我们的绘制过程,修改原来绘制过程中的步骤二,不过这会使递归略微麻烦一点点。

具体的可看我以前博客园写的文章,这篇文章里就用的是另外一种绘制过程,来避免了重复画线:https://www.cnblogs.com/BigShuang/p/10837020.html

我就不搬运过来了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Python绘制谢尔宾三角形可以通过归的方式实现。具体步骤如下: 1. 导入turtle库,创建一个画布和一个海龟对象。 2. 定义一个函数sierpinski(points, degree, myTurtle),其中points是三角形的三个顶点坐标,degree是归的深度,myTurtle是海龟对象。 3. 在函数中,如果degree等于0,则绘制三角形;否则,归调用sierpinski函数,将degree减1,并将三角形分成三个小三角形,分别归绘制。 4. 在主程序中,定义三角形的三个顶点坐标,调用sierpinski函数开始绘制。 下面是代码示例: ``` import turtle def drawTriangle(points, color, myTurtle): myTurtle.fillcolor(color) myTurtle.up() myTurtle.goto(points[0][0], points[0][1]) myTurtle.down() myTurtle.begin_fill() myTurtle.goto(points[1][0], points[1][1]) myTurtle.goto(points[2][0], points[2][1]) myTurtle.goto(points[0][0], points[0][1]) 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) def main(): myTurtle = turtle.Turtle() myWin = turtle.Screen() myPoints = [[-100,-50],[0,100],[100,-50]] sierpinski(myPoints, 3, myTurtle) myWin.exitonclick() main() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值