Reputation: 63
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.
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()
Upvotes: 0
Views: 3973
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
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
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
Reputation: 15397
Your begin_fill
s and end_fill
s 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