所以我试图用正方形制作一个Sierpinski。我想以递归方式制作这样的东西
我想改变我的乌龟的位置,以便在正方形的侧面制作更多正方形
我似乎无法改变乌龟的位置,以便形成这种形状。乌龟刚开始在我制作的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)
答案 0 :(得分:0)
当我运行你的代码时,正确选项卡,我得到了更接近Sierpinski模式的东西而不是"正方形在我刚刚制作的4个方格中。"输出如下所示:
尝试重新定义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_square
或squareX
或其他东西,那么您就不会被误入歧途。
我认为你应该可以从这里拿走它,但如果我需要为你澄清任何事情,请告诉我。