📜  使用图形的Sierpinski三角形(1)

📅  最后修改于: 2023-12-03 14:49:53.997000             🧑  作者: Mango

使用图形的Sierpinski三角形

Sierpinski三角形是一种用递归方法生成的分形图形,以波兰数学家弗拉迪斯拉夫·谢尔宾斯基(Wacław Sierpiński)的名字命名。 它是一个三角形,由等边三角形组成,每个等边三角形都被分成三个较小的等边三角形。递归重复这个过程,直到不能再将三角形分割为止,形成了一个细节越来越丰富的、有自相似性的图案。

我们可以使用在Python中比较流行的图形库 turtle 来绘制 Sierpinski 三角形。在这里我们将介绍如何实现这个图案,并通过逐步解释代码的方式,使程序员更好地理解这个过程。

建立基础表达式

首先,我们需要定义一个基础表达式。一个 Sierpinski 三角形最基本的图案是一个等边三角形,我们可以用以下语句来建立这个三角形(下文中我们使用Python 3):

import turtle

def draw_triangle(points, color, my_turtle):
    my_turtle.fillcolor(color)
    my_turtle.up()
    my_turtle.goto(points[0][0], points[0][1])
    my_turtle.down()
    my_turtle.begin_fill()
    my_turtle.goto(points[1][0], points[1][1])
    my_turtle.goto(points[2][0], points[2][1])
    my_turtle.goto(points[0][0], points[0][1])
    my_turtle.end_fill()

def main():
    my_turtle = turtle.Turtle()
    my_win = turtle.Screen()
    my_points = [[-100, -50], [0, 100], [100, -50]]
    draw_triangle(my_points, "green", my_turtle)
    my_win.exitonclick()

main()

上面的代码定义了一个名为 draw_triangle 的函数,在屏幕上绘制一个等边三角形,以 points 参数确定三角形的三个顶点坐标。这个函数还接受一个 color 参数,该参数用于填充三角形的颜色。最后,该函数还接受一个名为 my_turtleturtle 对象,该对象被用于在屏幕上绘制三角形。

main 函数中,我们首先生成了一个名为 my_turtle 的 Turtle 实例,并调用 my_turtle.screen() 方法来创建一个名为 my_win 的屏幕对象。接下来,我们定义了一个 my_points 变量,该变量包含三个顶点的坐标。最后,我们将 my_points"green"my_turtle 作为参数传递给 draw_triangle 函数。在函数的最后,我们调用 my_win.exitonclick() 来使屏幕在点击时退出。

如果运行这个程序,我们应该会看到一个绿色的三角形,在屏幕的正中央。

递归地绘制 Sierpinski 三角形

现在,我们需要进行递归,以在这个基本图案的基础上生成 Sierpinski 三角形的更多级别。我们可以通过调用 draw_triangle 函数,在三角形的每个角落处绘制第二级别的三角形,如下所示:

def sierpinski(points, degree, my_turtle):
    colormap = ['blue', 'red', 'green', 'white', 'yellow',
        'violet', 'orange']
    draw_triangle(points, colormap[degree], my_turtle)
    if degree > 0:
        sierpinski([points[0],
                    get_mid(points[0], points[1]),
                    get_mid(points[0], points[2])],
                   degree-1, my_turtle)
        sierpinski([points[1],
                    get_mid(points[0], points[1]),
                    get_mid(points[1], points[2])],
                   degree-1, my_turtle)
        sierpinski([points[2],
                    get_mid(points[2], points[1]),
                    get_mid(points[0], points[2])],
                   degree-1, my_turtle)

def get_mid(p1, p2):
    return [(p1[0]+p2[0])/2, (p1[1]+p2[1])/2]

def main():
    my_turtle = turtle.Turtle()
    my_win = turtle.Screen()
    my_points = [[-100, -50], [0, 100], [100, -50]]
    sierpinski(my_points, 3, my_turtle)
    my_win.exitonclick()

main()

在这个例子中,我们定义了一个名为 sierpinski 的函数,该函数用于在一个三角形中生成 Sierpinski 三角形。该函数接受 pointsdegreemy_turtle 三个参数。其中,points 参数是一个包含三个顶点坐标的列表;degree 参数表示要生成的 Sierpinski 三角形的级别;my_turtle 则是用于在屏幕上绘制 Sierpinski 三角形的 Turtle 对象。

在该函数的主体中,我们首先定义了一个颜色映射表 colormap。接下来,我们通过调用 draw_triangle 函数,在给定的 points 上绘制当前级别的 Sierpinski 三角形并确定填充颜色。然后,如果当前级别仍然大于 0,我们调用 sierpinski 函数,以在每个角落上绘制下一级别的 Sierpinski 三角形,并将 degree 的值减 1 以表示递归结束的条件。

在这段代码中,get_mid 函数用于找到两个端点的中点,并返回一个包含中点坐标的列表。这将用于确定 Sierpinski 三角形的中点。

在主函数中,我们调用 sierpinski 函数,并为其提供一个名为 my_points 的列表,包含三个顶点的坐标,并将级别设置为 3。当然,您可以更改级别来生成不同级别的 Sierpinski 三角形,从而获得不同层次的细节。

如果运行代码,您将会看到一个细节度越来越丰富的 Sierpinski 三角形,如下所示:

Sierpinski Triangle

现在,你已经学会了如何用 turtle 库来生成 Sierpinski 三角形,你可以继续尝试用其他方法生成更多的分形图案。