user7377353
user7377353

Reputation: 63

Python Sierpinski Triangle

I am trying to make a Sierpinski triangle with small triangles of color Green. But I am getting wrong output as shown in the pic.

Can someone help me in correcting my code?

A Sierpinski triangle (in black) looks like the following. My screenshot is below the code.

Sierpinski triangle

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()

Screenshot

unfilled S. triangle

enter image description here

Upvotes: 0

Views: 3973

Answers (3)

HPL
HPL

Reputation: 1

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)

Upvotes: 0

cdlane
cdlane

Reputation: 41872

There are several problems with the code you posted, besides the begin_fill() and end_fill() being in the wrong places: you call exitonclick() before draw_art() so your program shouldn't run at all; you reference window from a scope in which it's not defined; the argument to speed() doesn't make much sense based on the documentation.

The following rework addresses the above issues and some style tweaks:

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()

OUTPUT

enter image description here

If you still don't get the above image, here's something to consider: the turtle/tkinter fill logic varies between Unix and Windows systems when it comes to filling areas that are already filled. Your basic algorithm redraws, and refills, many of the triangles. So, if you're still having problems, look into changing the code to only draw, and fill, each triangle only once. Something like the following rework which doesn't duplicate the drawing of the corners like your original:

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()

Upvotes: 1

Scott Mermelstein
Scott Mermelstein

Reputation: 15397

Your begin_fills and end_fills are not at the right place. Begin filling at the top of your outer for loop, and end filling at the bottom of it.

In other words, make this your draw_triangle function:

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()

Note the difference in the placement of the begin_fill and end_fill

Upvotes: 1

Related Questions