【问题标题】:Python Sierpinski Triangle蟒蛇谢尔宾斯基三角
【发布时间】:2017-01-23 21:21:35
【问题描述】:

我正在尝试用绿色的小三角形制作谢尔宾斯基三角形。 但是我得到了错误的输出,如图所示。

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

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

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

【问题讨论】:

  • 您需要缩小您的问题范围。修复代码不是一件好事。
  • 我添加了另一个图像,输出应该看起来像那个图像
  • Serpinski 的三角形使用递归往往更容易绘制。
  • 是的..我知道,但我想用递归方法来做,唯一的问题是如何在循环中使用颜色函数..
  • 我添加了图片 3,它表明代码正在运行,我得到了三角形,但无法为它们着色

标签: python turtle-graphics


【解决方案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()

输出

如果您仍然没有得到上面的图像,这里有一些事情需要考虑:当涉及到填充已经填充的区域时,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()

【讨论】:

  • 非常感谢您的解决方案。
  • 我的代码中有两个错误:1) begin_fill() 位置错误 2) for 循环后“some_turtle.end_fill()”的缩进没有正确完成。一旦我修复了这些两个问题成功了...再次感谢您。感谢您的帮助。
【解决方案2】:

您的begin_fills 和end_fills 不在正确的位置。从外部 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_fill和end_fill的位置差异

【讨论】:

  • 仔细注意 end_fill 的缩进。它从你原来的移动。
【解决方案3】:
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)

【讨论】:

  • 您好,欢迎来到 Stack Overflow!请编辑您的答案以添加一些文字来解释这是如何解决问题的。
猜你喜欢
  • 1970-01-01
  • 2015-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多