Python递归实现分形图形的生成算法

2023-04-16 00:00:00 算法 生成 递归

分形图形是指一个图形的一部分可以通过类似于原图形的方式无限迭代生成,并且每次迭代都可以得到一个新的图形。其中递归是分形图形生成的常用算法之一。

本文将介绍用Python递归实现分形图形的生成算法,并通过代码演示生成“pidancode.com”和“皮蛋编程”两个字符串分形图形的过程。

  1. 定义递归函数

递归函数指的是一个函数在其内部调用自身的过程。在生成分形图形时,我们也可以利用递归函数的特性来迭代生成图形。

下面是一个生成分形图形的递归函数:

import turtle

def fractal(length, depth):
    if depth == 1:
        turtle.forward(length)
    else:
        new_length = length / 3
        fractal(new_length, depth-1)
        turtle.left(60)
        fractal(new_length, depth-1)
        turtle.right(120)
        fractal(new_length, depth-1)
        turtle.left(60)
        fractal(new_length, depth-1)

这个函数采用了海龟绘图库turtle来进行绘制。函数参数中包含长度和深度两个参数,其中长度表示图形的大小,深度表示图形的复杂程度。

在递归过程中,如果当前深度为1,那么就直接向前画线,否则就将长度缩小三分之一,然后往左转60度画子图形、右转120度画子图形、再往左转60度画子图形。

  1. 调用递归函数生成分形图形

接下来,我们以“pidancode.com”和“皮蛋编程”两个字符串为例,演示如何使用递归函数生成分形图形。

首先,我们需要将这两个字符串转换为对应的图形。我们可以通过利用不同的符号表示字符串中不同的字符,进而构造出对应的图形。

例如,我们可以使用“/”表示“p”,“=”表示“i”,“-”表示“d”,“.”表示“a”等等。

下面是“pidancode.com”和“皮蛋编程”的对应图形:

“pidancode.com”图形:

 ====== ===  / /==   /==/ / / / ====  ===/   / / /==== ===/
/====/ / /=/  //==  /==/ /  // //====  / /==/ / / //==/ /
//==/ / //=   //==/ / / / / / ====== / / / /==/ / /==/=
 /==/ / /     /==/=/ / / / / //====/ / / /=/ / / / /====
 ===/ /==/==/ ===//==/ / / / / ====  ===/==/ / /==/====

“皮蛋编程”图形:

====  ==== === /==/====   ===/ / /  ===/ /==/   /====  ===/  / / /====/ 
/====  / /==  //====/==/ /==/   // /==/ / /=/  / /==== / /=/  / /=/     
 / /== /=/==/== / /==/==/ / / / / /======//=/ / / / /==/ //=/  / /=/=====
/ / / =/= / /=/ /=/ / / / / / / / /======/==//=/   //=/ /==/ / / /===== 
/ / / / / / / / /=/ / / / /=/ / / /=/========/==/==/ / / / / / /      
/ / / /=/ /=/ /=/= / / / / /===/ // /========/==/==/=/ / /==/ / /=====
/ / / / / /  /=/= / / / / /===/==/  /===/====/==== / / /====/====/==== 
 ====  ===/==/=== / / / /   =====/       ====        =========         

这样,我们就可以利用递归函数来生成对应的分形图形了。

  1. 调用递归函数绘制分形图形

最后,我们需要调用递归函数来生成和绘制对应的分形图形。下面是生成和绘制两个字符串分形图形的完整代码:

import turtle

def fractal(length, depth):
    if depth == 1:
        turtle.forward(length)
    else:
        new_length = length / 3
        fractal(new_length, depth-1)
        turtle.left(60)
        fractal(new_length, depth-1)
        turtle.right(120)
        fractal(new_length, depth-1)
        turtle.left(60)
        fractal(new_length, depth-1)

def draw_fractal(string, size, depth):
    turtle.speed(0)
    turtle.penup()

    x, y = turtle.position()

    for c in string:
        if c == " ":
            turtle.forward(2*size)
        elif c == "/":
            turtle.left(60)
        elif c == "\\":
            turtle.right(60)
        elif c == "=":
            turtle.right(120)
        elif c == "-":
            turtle.left(120)
        elif c == ".":
            turtle.penup()
            turtle.forward(size)
            turtle.pendown()
        elif c == "_":
            turtle.penup()
            turtle.forward(2*size)
            turtle.pendown()
        elif c == "\n":
            x, y = turtle.position()
            turtle.penup()
            turtle.goto(x, y-(2*size))
            turtle.pendown()
        else:
            fractal(size, depth)

    turtle.hideturtle()
    turtle.done()

# 生成并绘制“pidancode.com”的分形图形
pidan = " ====== ===  / /==   /==/ / / / ====  ===/   / / /==== ===/\n/====/ / /=/  //==  /==/ /  // //====  / /==/ / / //==/ /\n//==/ / //=   //==/ / / / / ====== / / / /==/ / /==/=\n /==/ / /     /==/=/ / / / / //====/ / / /=/ / / / /====\n ===/ /==/==/ ===//==/ / / / / ====  ===/==/ / /==/===="
draw_fractal(pidan, 2, 4)

# 生成并绘制“皮蛋编程”的分形图形
pida = "====  ==== === /==/====   ===/ / /  ===/ /==/   /====  ===/  / / /====/ \n/====  / /==  //====/==/ /==/   // /==/ / /=/  / /==== / /=/  / /=/     \n / /== /=/==/== / /==/==/ / / / / /======//=/ / / / /==/ //=/  / /=/=====\n/ / / =/= / /=/ /=/ / / / / / / / /======/==//=/   //=/ /==/ / / /===== \n/ / / / / / / / /=/ / / / /=/ / / /=/========/==/==/ / / / / / /      \n/ / / /=/ /=/ /=/= / / / / /===/ // /========/==/==/=/ / /==/ / /===== \n/ / / / / /  /=/= / / / / /===/==/  /===/====/==== / / /====/====/==== \n ====  ===/==/=== / / / /   =====/       ====        ==========     "
draw_fractal(pida, 2, 4)

运行上述代码后,我们可以在turtle窗口中看到“pidancode.com”和“皮蛋编程”的分形图形了。

参考:https://zhuanlan.zhihu.com/p/108219379

相关文章