使用正方形和递归使Sierpinski成为可能

时间:2015-10-22 15:25:44

标签: python recursion turtle-graphics

所以我试图用正方形制作一个Sierpinski。我想以递归方式制作这样的东西

Sierpinski

我想改变我的乌龟的位置,以便在正方形的侧面制作更多正方形

3 squares

我似乎无法改变乌龟的位置,以便形成这种形状。乌龟刚开始在我制作的4个方格之外制作正方形

我的代码是

from math import sqrt
import turtle
window=turtle.Screen
t=turtle.Turtle()
t.color("black")
s=100

def Draw_sirepinski_square(t,s):
    for i in range (1,5):
        t.forward(s)
        t.left(90)

    t.left(45)
    t.forward(sqrt((s**2)+(s**2)))
    t.right(45)
    t.backward(s)
    t.right(45)
    t.forward(sqrt((s**2)+(s**2)))
    t.left(45)
    t.backward(s)

def sierpinski(n):
    if n ==1:
        Draw_sirepinski_square(t,s)

    else:    
        sierpinski(n-1)

        curPos = t.pos()
        t.penup()
        t.setpos(curPos[0]-s/(2*(n-1)), curPos[1]+s)
        t.pendown()

        Draw_sirepinski_square(t, s/(2*(n-1)))

        t.penup()
        t.setpos(curPos)
        t.setpos(curPos[0]+s, curPos[1]+s)
        t.pendown()

        Draw_sirepinski_square(t, s/(2*(n-1)))

        t.penup()
        t.setpos(curPos)
        t.setpos(curPos[0]+s, curPos[1]-s/(2*(n-1)))
        t.pendown()
        print(curPos)

        Draw_sirepinski_square(t, s/(2*(n-1)))
        t.penup()
        t.setpos(curPos)
        t.setpos(curPos[0]+s, curPos[1]+s)
        t.pendown()
        print(curPos)

sierpinski(3)

2 个答案:

答案 0 :(得分:0)

当我运行你的代码时,正确选项卡,我得到了更接近Sierpinski模式的东西而不是"正方形在我刚刚制作的4个方格中。"输出如下所示:enter image description here

尝试重新定义s或为函数内部的距离设置新变量,而不是调用s的代数表达式。随着你越来越小,你的s(如所写)仍然是100 - 例如:t.setpos(curPos [0] + s

答案 1 :(得分:0)

首先从高级别描述问题。 Sierpinski垫圈由一个正方形,其中有一个X和一个Sierpinski垫圈,半个尺寸在正方形的三个角上。因此,我们需要的参数是边的长度和绘制正方形的位置。可能最简单的方法是使用方形中心的坐标来指定方形的位置。此外,正如您在代码中已经认识到的那样,有必要使用某种级别号来停止绘图,因为尝试绘制实际的数学Sierpinski垫片会产生无限循环。

除了清理参数外,还需要重新考虑递归调用。 sierpinski应调用本身三次。它应该只能直接调用Draw_Sierpinski_square一次。对Draw_Sierpinski_square的所有其他调用应通过递归调用间接进行。再看一下高级描述 - 一个带X和四个垫圈的正方形。

顺便说一句,我认为Draw_Sierpinski_square这个名字的选择很差,而且这会让你感到困惑。如果您刚刚调用它Draw_squaresquareX或其他东西,那么您就不会被误入歧途。

我认为你应该可以从这里拿走它,但如果我需要为你澄清任何事情,请告诉我。

我想到我应该张贴一张我的绘画照片,以防万一我误解了这些规格。以下是我认为您发布的代码应该绘制的内容:enter image description here