网站/小程序/APP个性化定制开发,二开,改版等服务,加扣:8582-36016

    毕达哥拉斯树,也叫“勾股树”,是由毕达哥拉斯根据勾股定理所画出来的一个可以无限重复的树形图形。本文将利用Python中的Turtle库实现勾股树的绘制,感兴趣的可以了解一下

    这次,我们用Turtle模块结合三角函数,绘制出这样的勾股树:

    首先,导入模块

    from turtle import *
    from math import sin,cos,radians

    定义勾股数每次旋转的度数

    angle1=70
    angle2=90-angle1

    定义tree函数,绘制正方形并记录要生成的新的正方形的坐标,计算出新的正方形的度数和边长并绘制,这里采用递归的方式

    ln表示边长,mode表示当前正方形是在前一个正方形的左边或右边,h表示朝向,p表示坐标

    def tree(ln,mode="left",h=90,p=(0,0)):
        pu()
        seth(h)
        goto(p)
        if ln>1:
            pd()
            for i in range(4):
                if i==1 and mode=="left":
                    pos1=pos()
                if i==2 and mode=="left":
                    pos2=pos()
                if i==2 and mode=="right":
                    pos1=pos()
                if i==3 and mode=="right":
                    pos2=pos()
                fd(ln)
                right(90)
            h=heading()
            tree(ln*cos(radians(angle1)),"left",h+angle1 if mode=="left" else h-angle1,pos1)
            tree(ln*cos(radians(angle2)),"right",h+90-angle2 if mode=="left" else h-angle2,pos2)

    在主程序中设置速度,因为递归很占内存,所以绘制速度会卡顿减缓,所以这里加速1000倍,设置无延迟,笔触颜色为绿色,笔触大小2,抬笔,设置方向,并开始递归,最后隐藏画布并保持窗口显示

    speed(0)
    tracer(1000)
    delay(0)
    color("green")
    pensize(2)
    pu()
    seth(90)
    tree(70,p=(-100,-300))
      ht()
    done()

    最终代码:

    from turtle import *
    from math import sin,cos,radians
      angle1=45 # 自行修改
    angle2=90-angle1
      def tree(ln,mode="left",h=90,p=(0,0)):
        pu()
        seth(h)
        goto(p)
        if ln>1:
            pd()
            for i in range(4):
                if i==1 and mode=="left":
                    pos1=pos()
                if i==2 and mode=="left":
                    pos2=pos()
                if i==2 and mode=="right":
                    pos1=pos()
                if i==3 and mode=="right":
                    pos2=pos()
                fd(ln)
                right(90)
            h=heading()
            tree(ln*cos(radians(angle1)),"left",h+angle1 if mode=="left" else h-angle1,pos1)
            tree(ln*cos(radians(angle2)),"right",h+90-angle2 if mode=="left" else h-angle2,pos2)
      speed(0)
    tracer(1000)
    delay(0)
    color("green")
    pensize(2)
    pu()
    seth(90)
    tree(70,p=(-100,-300))
      ht()
    done()


    评论 0

    暂无评论
    0
    0
    0
    立即
    投稿
    发表
    评论
    返回
    顶部