2017-01-23 113 views
0

我正在尝试使颜色为绿色的小三角形的谢尔宾斯基三角形。 但我得到错误的输出,如图所示。Python Sierpinski三角形

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

谢尔宾斯基三角形(黑色)如下所示。我的屏幕截图位于代码下方。

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

Serpinski的三角形使用递归往往更容易绘制。 – chepner

回答

1

有几个问题,您发布的代码,除了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() 

输出

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)begin_fill()位于错误的位置2)for循环后,“some_turtle.end_fill()”的缩进没有正确完成。一旦我解决了这两个问题,非常感谢你,感谢你的帮助。 – user7377353

1

begin_fill S和end_fill s为不正确的地方。开始填充你的外部循环的顶部,并在底部填充结束。

换句话说,使此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

+0

- 我试过你的解决方案,但输出如图4所示.. – user7377353

+0

请注意end_fill的缩进。它从原来的移动。 –