[英]python3 recursion animation in QuickDraw
我有一個有行星及其相應衛星的文本文件/他們的軌道半徑和時段,以及我沿着衛星想用這個來創建一個動畫quickdraw
類似下面的一個:
文本文件如下:
RootObject: Sun
Object: Sun
Satellites: Mercury,Venus,Earth,Mars,Jupiter,Saturn,Uranus,Neptune,Ceres,Pluto,Haumea,Makemake,Eris
Radius: 20890260
Orbital Radius: 0
Object: Miranda
Orbital Radius: 5822550
Radius: 23500
Period: 1.413
Object: Ariel
Orbital Radius: 8595000
Radius: 60000
Period: 2.520379
Object: Umbriel
Orbital Radius: 11983500
Radius: 60000
Period: 4.144177
Object: Titania
Orbital Radius: 19575000
Radius: 75000
Period: 8.7058
Object: Oberon
Orbital Radius: 26235000
Radius: 75000
Period: 13.463
Object: Uranus
Orbital Radius: 453572956
Radius: 2555900
Period: 30799
Satellites: Puck,Miranda,Ariel,Umbriel,Titania,Oberon
Object: Neptune
Orbital Radius: 550000000
Radius: 2476400
Period: 60190
Satellites: Triton
Object: Triton
Orbital Radius: 40000000
Radius: 135300
Period: -5.8
Object: Mercury
Orbital Radius: 38001200
Period: 87.9691
Radius: 243900.7
Object: Venus
Orbital Radius: 57477000
Period: 224.698
Radius: 605100.8
Object: Earth
Orbital Radius: 77098290
Period: 365.256363004
Radius: 637100.0
Satellites: Moon
Object: Moon
Orbital Radius: 18128500
Radius: 173700.10
Period: 27.321582
Object: Mars
Orbital Radius: 106669000
Period: 686.971
Radius: 339600.2
Satellites: Phobos,Deimos
Object: Phobos
Orbital Radius: 3623500.6
Radius: 200000
Period: 0.31891023
Object: Deimos
Orbital Radius: 8346000
Period: 1.26244
Radius: 200000.2
Object: Jupiter
Orbital Radius: 210573600
Period: 4332.59
Radius: 7149200
Satellites: Io,Europa,Ganymede,Callisto
Object: Ceres
Orbital Radius: 130995855
Period: 1679.67
Radius: 48700
Object: Io
Orbital Radius: 22000000
Period: 1.7691377186
Radius: 182100.3
Object: Europa
Orbital Radius: 36486200
Period: 3.551181
Radius: 156000.8
Object: Ganymede
Orbital Radius: 47160000
Period: 7.15455296
Radius: 263400
Object: Callisto
Orbital Radius: 69700000
Period: 16.6890184
Radius: 241000
Object: Saturn
Orbital Radius: 353572956
Period: 10759.22
Radius: 6026800
Satellites: Mimas,Enceladus,Tethys,Dione,Rhea,Titan,Iapetus
Object: Mimas
Orbital Radius: 8433396
Radius: 20600
Period: 0.9
Object: Enceladus
Orbital Radius: 10706000
Radius: 25000
Period: 1.4
Object: Tethys
Orbital Radius: 13706000
Radius: 50000
Period: 1.9
Object: Dione
Orbital Radius: 17106000
Radius: 56000
Period: 2.7
Object: Rhea
Orbital Radius: 24000000
Radius: 75000
Period: 4.5
Object: Titan
Orbital Radius: 50706000
Radius: 257600
Period: 15.945
Object: Iapetus
Radius: 75000
Orbital Radius: 72285891
Period: 79
我把原來的代碼(這個時間長得太長了)改成了這個較短的代碼:(感謝sudo_O提供了所有他非常棒的幫助 )
file = open("data1.txt","r")
def data(file):
d = {}
for line in file:
if line.strip() != '':
key,value = line.split(":")
if key == 'RootObject':
continue
if key == 'Object':
obj = value.strip()
d[obj]={}
else:
d[obj][key] = value.strip()
return d
planets = data(file)
print(planets)
我最大的問題是我不知道如何編寫從文件導入數據的代碼,並通過recursion
利用它來創建類似於所示的動畫。 我不斷被告知解決方案非常簡單,而且代碼實際上非常簡短,但我不知道如何做到這一點,實際上非常令人沮喪。
這是我圍繞圓圈運行的圓圈的代碼,但它似乎太復雜了......
import math
print("circle",400,300,50)
print("flush false")
centreX=400
centreY=300
radius=100
angle=math.pi/2
while True:
print("color 0 0 0")
print("clear")
print("color 255 0 255")
print("circle",centreX,centreY,radius)
childX=math.sin(angle)*radius*1.5+centreX
childY=math.cos(angle)*radius*1.5+centreY
print("circle",childX,childY,radius/2)
print("refresh")
angle+=0.01
規模代碼:
scale=250/max([dict[planets]["Orbital Radius"] for x in dict if "Orbital Radius" in dict[planets]])
軌道行星代碼:
print("flush false")
scale=250/max([dict[planets]["Orbital Radius"] for x in dict if "Orbital Radius" in dict[planets]])
t=0
x=400
y=300
while True:
print("refresh")
print("colour 0 0 0")
print("clear")
print("colour 255 255 255")
print("fillcircle",x,y,dict['Sun']['Radius']*scale)
print("text ", "\"Sun\"",x+dict['Sun']['Radius']*scale,y)
r_earth=dict['Earth']['Orbital Radius']*scale;
print("circle",x,y,r_earth)
r_X=x+math.sin(t*2*math.pi/dict['Earth']['Period'])*r_earth
r_Y=y+math.cos(t*2*math.pi/dict['Earth']['Period'])*r_earth
print("fillcircle",r_X,r_Y,dict['Earth']['Radius']*scale)
print("text ", "\"Earth\"",r_X+dict['Earth']['Radius']*scale,r_Y)
t+=0.02
這段代碼不能很好地工作,但作為一個初學者,我對這個問題的極限......
最后的努力!! 這會起作用嗎?
print("flush false")
scale = 250/max([dict[planets]["Orbital Radius"] for x in dict if "Orbital Radius" in dict[planets]])
t = 0
x = 400
y = 300
print("fillcircle",400,300,dict['Sun']['Radius']*scale)
print("text ", "\"Sun\"",x+dict['Sun']['Radius']*scale,y)
while True:
r_new = dict['Object']['Orbital Radius']*scale
print("circle",x,y,r_new)
r_X = x + math.sin(t*2*math.pi/dict['Object']['Period'])*r_new
r_Y = y + math.cos(t*2*math.pi/dict['Object']['Period'])*r_new
print("fillcircle",r_X,r_Y,dict['Object']['Radius']*scale)
print("text ",Object,r_X+dict['Object']['Radius']*scale,r_Y)
t += 0.02
if planets['Object']['Satellites'] = 0
return
else:
r_sat = dict['Object']['Satellites']['Orbital Radius']*scale
print("circle",x,y,r_sat)
r_satX = x + math.sin(t*2*math.pi/dict['Object']['Satellites']['Period'])*r_sat
r_satY = y + math.cos(t*2*math.pi/dict['Object']['Satellites']['Period'])*r_sat
print("fillcircle",r_satX,r_satY,dict['Object']['Satellites']['Radius']*scale)
print("text ",['Object']['Satellites'],r_satX+dict['Object']['Satellites']['Radius']*scale,r_satY)
t += 0.02
第一個問題遞歸 - 遞歸函數是一個自我調用的函數! 一個簡單的例子是倒計時功能,例如:
def countdown(n):
# counting down the recursive way!
if n > 0:
print n
countdown(n-1)
else:
return
調用countdown(10)
將打印10, 9, 8,.., 2, 1
。
您可以看到countdown
傳遞了一個數字n
,它所做的就是打印該數字,然后自己調用,但這次傳遞n-1
。 只有在n=0
才會傳遞它沒有任何事情要做,所以返回每個遞歸調用。 對於你的字典詞典案例(讓我們稱之為詞典庫以避免混淆) , recursive
打印方法將是:
像這樣的東西:
def recursive_print(dic):
if len(dic) > 0: # If dictionaries in library > 0
print dic.keys()[0] # Print the key i.e Earth
print dic[dic.keys()[0]] # Print the dictionary value for i.e Earth
dic.popitem() # Remove the Earth dictionary from library
recursive_print(dic) # Recursive call
else:
return # Printed all, return up the stack.
planets = data(file)
recursive_print(planets)
下一步是不是以當前格式打印字典,而是進行一些計算/轉換,因此輸出是有效的quickdraw
輸入,就像你已經使用quickdraw
打印圓圈的代碼quickdraw
。
您將需要擔心比例,以確保所有對象適合繪圖表面找到具有最大Orbital Radius
的天體並使用它來計算比例。
使用類似於您的代碼的列表理解,我們可以找到最大的值:
max([planet[key]['Orbital Radius'] for key in planet])
>>> 8595000
scale = gridsize/max([planet[key]['Orbital Radius'] for key in planet])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.