2017-01-23 10 views
0

Я пытаюсь сделать треугольник Серпинского с маленькими треугольниками цвета Green. Но я получаю неправильный вывод, как показано на рис.Python Sierpinski Triangle

Может ли кто-нибудь помочь мне в исправлении кода?

Треугольник Серпинского (в черном) выглядит следующим образом. Мой снимок экрана ниже кода.

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

+0

Вам необходимо сузить область поиска. Фиксация кода не очень хорошая. – kenorb

+0

Я добавил еще одно изображение, и результат должен выглядеть так: – user7377353

+2

Треугольник Серпински, как правило, намного проще рисовать, используя рекурсию. – chepner

ответ

1

Есть несколько проблем с кодом вас в курсе, помимо begin_fill() и end_fill() находится в неправильном месте: вы вызываете exitonclick() до draw_art(), поэтому ваша программа не должна запускаться вообще; вы ссылаетесь на 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() 

ВЫХОДА

enter image description here

Если вы все еще не получить над изображением, вот что-то, чтобы рассмотреть : логика заполнения черепахи/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() 
+0

Большое спасибо за решение. – user7377353

+0

В моем коде было две ошибки: 1) start_fill() был в неправильном месте 2) Отступ «some_turtle.end_fill()» не был выполнен должным образом после цикла. После этого я исправил эти две проблемы, с которыми он работал ... Большое вам спасибо снова. Оцените свою помощь. – user7377353

1

Ваши begin_fill s и s end_fill не в нужном месте. Начните заполнять верхнюю часть вашей внешней петли и завершите ее заполнение внизу.

Другими словами, сделать это ваша 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_fill и end_fill

+0

- Я попробовал ваше решение, но вывод идет, как показано на рис. 4 .. – user7377353

+0

внимательно обратите внимание на отступ для end_fill. Он перешел с вашего оригинала. –