徒手画一个谢尔宾斯基三角形的步骤非常简单:从单个的大三角形开始,取它的各边中点作三条中位线, 这样就把它分成了四个新的三角形;剔除掉这四个新三角形中最中间的那个,对其余三个角上的三角形重复以上的操作。每当你画出这一系列的三角形之后,你就可以不停地将这些步骤应用于那三个角上的三角形。如果你的铅笔足够细,你就能无限的重复这些步骤。
# encoding:utf-8
import turtle
# 根据三个坐标点画三角形并填充颜色
def draw_triangle(point1, point2, point3, t, color):
t.up()
t.goto(point1)
t.down()
t.fillcolor(color)
t.begin_fill()
t.goto(point2)
t.goto(point3)
t.goto(point1)
t.end_fill()
# 根据两个坐标点,返回中点坐标(元组)
def getmid(point_a, point_b):
return (point_a[0] + point_b[0]) * 0.5, (point_a[1] + point_b[1]) * 0.5
def sierpinski(point1, point2, point3, t, n):
# 调用画三角形函数
draw_triangle(point1, point2, point3, t, colors[n])
# n为递归次数,每递进一层n-1,当n=0停止
if n:
# 递进一层,每通过一个顶点和另外两个中点得到一个小三角形,每层递进三次
sierpinski(point1, getmid(point1, point2), getmid(point1, point3), t, n - 1)
sierpinski(point2, getmid(point2, point1), getmid(point2, point3), t, n - 1)
sierpinski(point3, getmid(point3, point1), getmid(point3, point2), t, n - 1)
if __name__ == '__main__':
t = turtle.Turtle()
t.speed(10)
t.hideturtle()
# turtle.tracer(False) # 关闭动画,快速预览
# 提供三个点的坐标,与形状无关,只要能组成三角形即可
point1, point2, point3 = [-250, -200], [250, -200], [0, 200]
# 提供颜色库,由n→0逐个读取颜色,可确保每一层颜色统一
colors = ['blue', 'red', 'green', 'white', 'yellow', 'violet', 'orange', 'purple']
# 递进层数,n |