python 递归-递归可视化

python 递归-递归可视化

文章目录

  • python 递归-递归可视化
    • 1、实现
      • a. 螺旋线
      • b. 分形树
      • c. 谢尔平斯基三角
    • 2、递归可视化-Coding

1、实现

a. 螺旋线

指定原始单边长度,每画完一条线时,线长-5,右转90度; 以此循环直至线长<5 & >0
python 递归-递归可视化_第1张图片

b. 分形树

指定主干的原始长度,每次分支长度-15,直至 0< 长度 < 15
画枝干时先右转20°画分支, 然后左转40°画分支,最后再右转20°,回到原始位置
递归调用绘制分形树
python 递归-递归可视化_第2张图片

c. 谢尔平斯基三角

使用三路递归算法绘制谢尔平斯基三角

线绘制一个大三角形,连接三角形的中点,将原三角形分割成4个小三角形,忽略中间的三角形,将剩下的三角形填充同一颜色
设置绘制层级,每次分割一阶, 层级减1, 直至0
递归调用绘制图形

python 递归-递归可视化_第3张图片

2、递归可视化-Coding

# -*- coding: utf-8 -*-

from turtle import *


class HexlixLine:
    myTurtle = Turtle()
    myWin = myTurtle.getscreen()

    def draw(self, lineLen):
        """
        递归绘制螺旋线
        """
        # 调整绘图的起点
        self.myTurtle.up()
        self.myTurtle.backward(int(lineLen/2))
        self.myTurtle.left(90)
        self.myTurtle.forward(int(lineLen/2))
        self.myTurtle.right(90)
        self.myTurtle.down()

        # 绘制螺旋线
        self.drwaSpiral(self.myTurtle, lineLen)
        # 点击屏幕退出
        self.myWin.exitonclick()

    def drwaSpiral(self, myTurtle, lineLen):
        """
        绘制螺旋线
        """
        if lineLen > 0:
            myTurtle.forward(lineLen)
            myTurtle.right(90)
            self.drwaSpiral(myTurtle, lineLen - 5)

    def tree(self, branchLen):
        """
        递归绘制分形树
        """
        t = self.myTurtle
        # 调整树的起点
        t.left(90)
        t.up()
        t.backward(360)
        t.down()
        t.color("green")
        # 绘制分形树
        self.drawTree(branchLen, t)
        # 点击退出
        self.myWin.exitonclick()

    def drawTree(self, branchLen, t):
        """
        绘制分形树
        """
        if branchLen > 15:
            t.forward(branchLen)
            t.right(20)
            self.drawTree(branchLen-15, t)
            t.left(40)
            self.drawTree(branchLen-15, t)
            t.right(20)
            t.backward(branchLen)


    def drawTriangle(self, degree):
        """
        递归绘制谢尔平斯基三角形
        """
        t = self.myTurtle
        # 三角形的3顶点坐标
        point = [(-500, -350), (0, 400), (500, -350)]
        # 绘制谢尔平斯基三角形
        self.sierpinski(point, degree, t)
        # 点击时退出
        self.myWin.exitonclick()


    def triangle(self, point, color, t):
        """
        绘制三角形并填充
        """
        t.fillcolor(color)
        t.up()
        t.goto(point[0])
        t.down()
        t.begin_fill()
        t.goto(point[1])
        t.goto(point[2])
        t.goto(point[0])
        t.end_fill()
    
    def getMid(self, p1, p2):
        """
        获取两点的中点
        """
        return ((p1[0]+p2[0])/2, (p1[1] + p2[1])/2)

    def sierpinski(self, points, degree, t):
        """
        绘制谢尔平斯基三角形
        """
        # 谢尔平斯基三角形 色阶
        colorMap = ['blue', 'red', 'green', 'white', 'yellow', 'violet', 'orange', 'black', 'pink']

        self.triangle(points, colorMap[degree], t)
        if degree > 0:
            self.sierpinski([points[0], self.getMid(points[0], points[1]), self.getMid(points[0], points[2])], degree - 1, t)
            self.sierpinski([points[1], self.getMid(points[0], points[1]), self.getMid(points[1], points[2])], degree - 1, t)
            self.sierpinski([points[2], self.getMid(points[0], points[2]), self.getMid(points[1], points[2])], degree - 1, t)


if __name__ == "__main__":
    hexlixLine = HexlixLine()
    hexlixLine.draw(320)
    hexlixLine.tree(120)
    hexlixLine.drawTriangle(6)


你可能感兴趣的:(算法,python,可视化,递归,算法)