【发布时间】:2019-07-21 13:45:56
【问题描述】:
本题基于python递归。这应该在 degree = 4 的情况下完成,因此有 4 个不同级别的框。我的问题是,对于我已经拥有的代码,它对于其他学位的绘制效果不佳。请让我知道我做错了什么,下面是我用来让我的所有价值观都起作用的代码。
import turtle
def drawboxes(points, color, myTurtle):
myTurtle.fillcolor(color)
myTurtle.up() # Pen up
myTurtle.goto(points[0][0], points[0][1])
myTurtle.down() # Pen down
myTurtle.begin_fill()
myTurtle.goto(points[1][0], points[1][1])
myTurtle.goto(points[2][0], points[2][1])
myTurtle.goto(points[3][0], points[3][1])
myTurtle.goto(points[0][0], points[0][1])
myTurtle.end_fill()
def getMid1(p1, p2):
return ((p1[0] + p2[0]) / 3, (p1[1] + p2[1]) / 3)
def getMid2(p1, p2):
return ((p1[0] + p2[0]) / 3 * 2, (p1[1] + p2[1]) / 3 * 2)
def getMid3(p1, p2):
return ((p1[0] + p2[0]) / 3 * 2, (p1[1] + p2[1]) / 3)
def getMid4(p1, p2):
return ((p1[0] + p2[0]) / 3, (p1[1] + p2[1]) / 3 * 2)
def getMid5(p1, p2):
return ((p1[0] + p2[0]) / 3, p1[1] + p2[1])
def getMid6(p1, p2):
return ((p1[0] + p2[0]) / 3 * 2, (p1[1] + p2[1]))
def getMid7(p1, p2):
return ((p1[0] + p2[0]), (p1[1] + p2[1]) / 3 * 2)
def getMid8(p1, p2):
return ((p1[0] + p2[0]), (p1[1] + p2[1]) / 3)
def sierpinski(points, degree, myTurtle):
colormap = ['blue', 'red', 'green', 'cyan', 'yellow',
'violet', 'orange']
drawboxes(points,colormap[degree], myTurtle)
if degree > 0:
sierpinski([points[0],
getMid1(points[0], points[1]),
getMid1(points[0], points[2]),
getMid1(points[0], points[3])],
degree-1, myTurtle)
sierpinski([getMid1(points[0], points[1]),
getMid2(points[0], points[1]),
getMid4(points[0], points[2]),
getMid1(points[0], points[2])],
degree-1, myTurtle)
sierpinski([points[1],
getMid2(points[0], points[1]),
getMid4(points[1], points[3]),
getMid5(points[1], points[3])],
degree - 1, myTurtle)
sierpinski([getMid5(points[1], points[3]),
getMid4(points[0], points[2]),
getMid2(points[1], points[3]),
getMid6(points[1], points[3])],
degree - 1, myTurtle)
sierpinski([getMid2(points[1], points[3]),
getMid6(points[1], points[3]),
points[2],
getMid7(points[1], points[3])],
degree - 1, myTurtle)
sierpinski([getMid3(points[1], points[3]),
getMid2(points[1], points[3]),
getMid7(points[1], points[3]),
getMid8(points[1], points[3])],
degree - 1, myTurtle)
sierpinski([getMid2(points[0], points[3]),
getMid3(points[1], points[3]),
getMid8(points[1], points[3]),
points[3]],
degree - 1, myTurtle)
sierpinski([getMid1(points[0], points[3]),
getMid1(points[0], points[2]),
getMid3(points[1], points[3]),
getMid2(points[0], points[3])],
degree - 1, myTurtle)
def main():
myTurtle = turtle.Turtle()
myTurtle.speed(10) # adjust the drawing speed here
myWin = turtle.Screen()
# 3 points of the first triangle based on [x,y] coordinates
myPoints = [[0, 0], [0, 300], [300, 300], [300, 0]]
degree = 1 # Vary the degree of complexity here
# first call of the recursive function
sierpinski(myPoints, degree, myTurtle)
myTurtle.hideturtle() # hide the turtle cursor after drawing is
# completed
myWin.exitonclick() # Exit program when user click on window
main()
【问题讨论】:
-
我放慢了速度,看看它是如何工作的,并了解哪里可能出现问题,但我不知道。很久以前我制作了自己的版本,但我发现它的工作方式不同,而且要小得多:furas/python-examples/turtle/sierpinski-carpet 我不计算点来绘制矩形,而是计算与
forward()和left()/right()一起使用的长度@ -
所以唯一的方法就是以某种方式对其进行调试。您可以在某个时刻放慢速度并在变量中显示值。也许它有助于看到问题。也许某些值被四舍五入太多或
-
版主注意:请不要破坏您的帖子。一旦您发布问题,它们就属于该网站及其用户。即使它不再对您有用,它也可能对将来的某人有所帮助。回答者也会努力写下他们的答案,如果您从帖子中删除了内容,这将不再有用。另外,请注意,通过在 Stack Exchange 网络上发布,您已授予 SE 分发该内容的不可撤销的权利(根据 CC BY-SA 3.0 许可)。根据 SE 政策,任何破坏行为都将被撤销。
标签: python recursion turtle-graphics fractals