Python 谢尔宾斯基三角

Python Sierpinski Triangle

我正在尝试制作一个带有绿色小三角形的 Sierpinski 三角形。 但是如图所示,我得到了错误的输出。

有人可以帮我更正我的代码吗?

Sierpinski 三角形(黑色)如下所示。我的截图在代码下面。

import turtle

    def draw_triangle(some_turtle):
        #This for loop will create - Outer Triangle
        some_turtle.color("green")
        some_turtle.begin_fill()
        for i in range(1,4):
            some_turtle.forward(50)
            some_turtle.left(120)
            #This for loop will create - Inner Triangle
            for j in range(1,4):    
                some_turtle.forward(25)
                some_turtle.left(120)
                some_turtle.end_fill()

    def draw_art():     
        window = turtle.Screen()
        window.bgcolor("white")
        #Create the turtle Brad - Draws a Triangle
        brad = turtle.Turtle()
        brad.shape("arrow")
        brad.color("green")
        brad.speed(50)
        #This for loop will create - Inner & Outer Triangle At 120 deg
        for d in range(1,4):
            brad.left(120)
            #This for loop will create - Inner & Outer Triangle At distance 50 
            for c in range(1,5):
                draw_triangle(brad)
                brad.forward(50)
    window.exitonclick()
    draw_art()

enter image description here

您的 begin_fillend_fill 不在正确的位置。从外部 for 循环的顶部开始填充,并在其底部结束填充。

换句话说,将其作为您的 draw_triangle 函数:

def draw_triangle(some_turtle):
    #This for loop will create - Outer Triangle
    some_turtle.color("green")
    for i in range(1,4):
        some_turtle.begin_fill()
        some_turtle.forward(50)
        some_turtle.left(120)
        #This for loop will create - Inner Triangle
        for j in range(1,4):    
            some_turtle.forward(25)
            some_turtle.left(120)
        some_turtle.end_fill()

注意 begin_fillend_fill

位置的不同

除了 begin_fill()end_fill() 位置错误之外,您发布的代码还有几个问题:您在 draw_art() 之前调用了 exitonclick(),所以您的程序根本不应该 运行;您从未定义的范围内引用 window;根据文档,speed() 的论点没有多大意义。

以下返工解决了上述问题和一些样式调整:

import turtle

def draw_triangle(some_turtle):
    # This for loop will create - Outer Triangle
    for i in range(3):
        some_turtle.forward(50)
        some_turtle.left(120)
        # This for loop will create - Inner Triangle
        some_turtle.begin_fill()
        for j in range(3):
            some_turtle.forward(25)
            some_turtle.left(120)
        some_turtle.end_fill()

def draw_art():
    # Create the turtle Brad - Draws a Triangle
    brad = turtle.Turtle(shape="arrow")
    brad.color("green")
    brad.speed("fastest")

    # This for loop will create - Inner & Outer Triangle At 120 deg
    for d in range(3):
        brad.left(120)
        # This for loop will create - Inner & Outer Triangle At distance 50
        for c in range(4):
            draw_triangle(brad)
            brad.forward(50)

    brad.hideturtle()

window = turtle.Screen()
window.bgcolor("white")

draw_art()

window.exitonclick()

输出

如果您仍然没有得到上面的图像,请考虑以下事项:turtle/tkinter 填充逻辑在 Unix 和 Windows 系统之间在填充已经填充的区域时有所不同。您的基本算法会重绘和重新填充许多三角形。因此,如果您仍有问题,请考虑将代码更改为仅绘制和填充每个三角形一次。类似于以下返工,它不会像您原来的那样复制角落的绘图:

def draw_triangle(some_turtle):
    # This for loop will create - Outer Triangle
    for i in range(3):
        # This for loop will create - Inner Triangle
        some_turtle.begin_fill()
        for j in range(3):
            some_turtle.forward(25)
            some_turtle.left(120)
        some_turtle.end_fill()
        some_turtle.forward(50)
        some_turtle.left(120)

def draw_art():
    # Create the turtle Brad - Draws a Triangle
    brad = turtle.Turtle(shape="arrow")
    brad.color("green")
    brad.speed("fastest")

    # This for loop will create - Inner & Outer Triangle At 120 deg
    for d in range(3):
        brad.left(120)
        brad.forward(50)
        # This for loop will create - Inner & Outer Triangle At distance 50
        for c in range(3):
            draw_triangle(brad)
            brad.forward(50)

    brad.hideturtle()
import turtle
    t=turtle.Turtle()
    def f(a,b):
        #a=the distance that need to go, b how many triangle in side the large triangle
        if b==0:
            return 

        else:
            for i in range(3):
                t.forward(a)
                t.left(120)
                f(a/2,b-1)