自由落體追撞
-
兩自由落體球間的彈性碰撞
- 程式碼
Web VPython 3.2 # 匯入視覺化套件 from vpython import * # 1. 參數設定 # 重力加速度 g = -9.8 # 時間間隔 dt = 0.0001 # 經過時間 t=0 # 2. 畫面設定 # 畫布 scene = canvas(width=600, height=600, background=vector(0.5,0.6,0.5), center=vector(0,2,0)) # 地板 floor = box(pos=vector(0,-0.2,0), length=5, height=0.1, width=5, texture=textures.wood) # 兩球高度時間圖 gd = graph(title='y vs t', xtitle='t', ytitle='y', ymax=13, xmax=10, background=vector(0.3,0.3,0.3)) yt1 = gcurve(graph=gd, color=color.cyan) yt2 = gcurve(graph=gd, color=color.red) # 3. 球的設定 ball1 = sphere(radius=0.05, color=color.white, v=0, m=0.2) ball2 = sphere(radius=0.1, color=color.white, v=0, m=0.6) ball2.pos = vector(0,2,0) ball1.pos=vector(0,2+ball1.radius+ball2.radius+0.05,0) # 4. 函數定義 def collide(v1,v2,m1,m2): v1f = v1*(m1-m2)/(m1+m2) + v2*2*m2/(m1+m2) v2f = v1*2*m1/(m2+m1) + v2*(m2-m1)/(m2+m1) return v1f, v2f # 5. 運動部分 while t<=10: rate(2000) t = t + dt ball1.v = ball1.v + g * dt ball1.pos.y = ball1.pos.y + ball1.v * dt if ball1.pos.y <= 0: ball1.v = -ball1.v yt1.plot( pos = (t, ball1.pos.y)) ball2.v = ball2.v + g * dt ball2.pos.y = ball2.pos.y + ball2.v * dt if ball2.pos.y <= 0: ball2.v = -ball2.v yt2.plot( pos = (t, ball2.pos.y)) # 兩球碰撞 if mag(ball1.pos-ball2.pos) <= ball1.radius + ball2.radius : ball1.v, ball2.v = collide(m1=ball1.m, v1=ball1.v, v2=ball2.v, m2=ball2.m)
【作業】
三顆球從高空自由落下互相追撞。
【參考影片】