[英]Python Zelle Graphics - Recursive functions in drawing?
import graphics
def main():
window = graphics.GraphWin("x", 600, 400)
cntr = graphics.Point(300,200)
size = 200
wrapdiamond(size, window,cntr)
window.getMouse()
def wrapdiamond(size, window,cntr):
count = 0
if count == 4:
return
if count < 4:
diamond(size,window,"black", cntr)
x= cntr.getX()+-0.5*size
y = cntr.getY()+-0.5*size
cntr= graphics.Point(x,y)
size = size*0.33
count +=1
diamond(size,window,"black", cntr)
def diamond(size,window,color,cntr):
p1 = cntr.clone()
p1.move(0,-0.5*size)
x1 = p1.getY()
newcntr = graphics.Point(300,x1)
p2 = cntr.clone()
p2.move(-0.5*size,0)
p3 = cntr.clone()
p3.move(0,0.5*size)
p4 = cntr.clone()
p4.move(0.5*size,0)
diamond= graphics.Polygon(p1, p2, p3, p4)
diamond.setFill("black")
diamond.draw(window)
所以最重要的是我的目標。 我需要遞歸執行此操作(調用相同的函數),移動中心點,大小和顏色。 我覺得我目前的方法很有可能讓我對其中的大部分進行硬編碼。 我將如何遞歸實現呢?
已經有兩年了,所以我認為現在該解決方案了:
import graphics
def wrapdiamond(size, window, outline_color, fill_color, center, depth=1):
if depth <= 0:
return
diamond(size, window, outline_color, fill_color, center)
if depth <= 1: # avoid going through the motions...
return
new_size = size * 0.33
for x in (-1.0, 1.0):
for y in (-1.0, 1.0):
new_center = center.clone()
new_center.move(x * size/2, y * size/2)
# swap fill and outline colors on recursion
wrapdiamond(new_size, window, fill_color, outline_color, new_center, depth - 1)
def diamond(size, window, outline_color, fill_color, center):
p1 = center.clone()
p1.move(0, -0.5 * size)
p2 = center.clone()
p2.move(-0.5 * size, 0)
p3 = center.clone()
p3.move(0, 0.5 * size)
p4 = center.clone()
p4.move(0.5 * size, 0)
diamond = graphics.Polygon(p1, p2, p3, p4)
diamond.setOutline(outline_color)
diamond.setFill(fill_color)
diamond.draw(window)
my_window = graphics.GraphWin("Recursive Diamonds", 900, 600)
my_center = graphics.Point(450, 300)
wrapdiamond(250, my_window, "gold", "black", my_center, 4)
my_window.getMouse()
my_window.close()
wrapdiamond()
是遞歸函數,它以較小的大小和重新調整的中心在循環中調用自己。 它還交換輪廓和填充顏色以形成交替的圖案:
如果您遇到遞歸問題,這可能會讓您重新開始
def rdraw(x,y,level=1,max_level=5):
draw_diamond(level)
d = distance(level)
if (level+1)<=max_level:
rdraw(x+d,y+d,level+1)
rdraw(x+y,y-d,level+1)
rdraw(x-y,y+d,level+1)
rdraw(x-y,y-d,level+1)
rdraw(0,0)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.