我正在为分形广场编写代码。我有绘制正方形的功能,这就是我得到的:click here 但这正是我想要实现的目标:click here。 我认为我的问题不是正确放置我的坐标,但我可能完全错了。这是我的代码:
#setting up stuff Code by Angel M. Gonzalez
import turtle
window = turtle.Screen()
square = turtle.Pen()
square.speed(0)
square.penup()
square.goto(0,0)
square.pendown()
square.color("black", "red")
#defining my function to make what i want
def pattern(length, depth, x, y):
square.goto(0,0)
if depth > 1:
square.begin_fill()
square.forward(length)
square.left(90)
square.forward(length)
square.left(90)
square.forward(length)
square.left(90)
square.forward(length)
square.end_fill()
pattern(length/2.2, depth -1, 1,1)
pattern(length/4.4, depth -1, 1.5,1.5)
#run my function
pattern(300, 4, 0,0)
#exit
turtle.exitonclick()
就像我之前说的那样,我不知道坐标是否在这里放错了,或者我是否完全遗漏了某些东西。我会说我对原广场的功能很好。
答案 0 :(得分:1)
你的递归方法都是错误的。您不能在递归中使用绝对定位:
square.goto(0,0)
...
pattern(length/4.4, depth -1, 1.5,1.5)
一切都必须与你所处的相关。另外,为了像这个工作一样进行递归绘制,你的递归函数应该让乌龟处于与你进入递归函数时相同的状态(位置和标题),这样调用者就知道它的位置。
对于这种设计,你不能简单地绘制一个正方形然后递归,你需要在绘图时在正方形的每个角落进行递归。
作为一个更简单的初始练习,让我们只绘制这个形状的线条并忽略填充。这可能不会直接导致解决方案,但会证明以上原则:
from turtle import Turtle, Screen
def pattern(length, depth):
if depth < 1:
return
# assume we're at the center of square, move to corner
turtle.penup()
turtle.backward(length / 2)
turtle.left(90)
turtle.backward(length / 2)
turtle.right(90)
turtle.pendown()
for _ in range(4):
pattern(length / 2.2, depth - 1) # recurse at each corner
turtle.forward(length)
turtle.left(90)
# return to center of square for the benefit of caller
turtle.penup()
turtle.forward(length / 2)
turtle.left(90)
turtle.forward(length / 2)
turtle.right(90)
turtle.pendown()
screen = Screen()
turtle = Turtle()
turtle.speed('fastest')
pattern(100, 4)
turtle.hideturtle()
screen.exitonclick()
<强>输出强>
现在出现的问题是填充这些正方形并确保图案中的右上方总是“隐藏在”下面。