📅  最后修改于: 2023-12-03 14:49:53.997000             🧑  作者: Mango
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_turtle
的 turtle
对象,该对象被用于在屏幕上绘制三角形。
在 main
函数中,我们首先生成了一个名为 my_turtle
的 Turtle 实例,并调用 my_turtle.screen()
方法来创建一个名为 my_win
的屏幕对象。接下来,我们定义了一个 my_points
变量,该变量包含三个顶点的坐标。最后,我们将 my_points
、"green"
和 my_turtle
作为参数传递给 draw_triangle
函数。在函数的最后,我们调用 my_win.exitonclick()
来使屏幕在点击时退出。
如果运行这个程序,我们应该会看到一个绿色的三角形,在屏幕的正中央。
现在,我们需要进行递归,以在这个基本图案的基础上生成 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 三角形。该函数接受 points
,degree
和 my_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 三角形,如下所示:
现在,你已经学会了如何用 turtle
库来生成 Sierpinski 三角形,你可以继续尝试用其他方法生成更多的分形图案。