實驗11 動能守恒不守恒你說了算
簡介
“碰撞”在物理學中表現為兩粒子或物體間極短的相互作用。碰撞后,參與物發生了速度、動量或能量的改變。碰撞按能量轉移的方式區分為彈性碰撞和非彈性碰撞。彈性碰撞是碰撞前后整個系統的動能不變的碰撞。彈性碰撞的必要條件是動能沒有轉成其他形式的能量(熱能、轉動能量),例如,原子的碰撞。非彈性碰撞是碰撞后整個系統的部分動能轉換成至少其中一個碰撞物的內能,使整個系統的動能無法守恒。在物理引擎當中,一般采用動量來解決碰撞反應。
完全彈性碰撞
完全彈性碰撞(Perfect Elastic Collision)在理想情況下的物理過程滿足動量守恒和能量守恒。
動量守恒:

動能定理:

碰撞后:


如果兩個碰撞小球的質量相等(即:m1=m2),聯立動量守恒和能量守恒方程時可解得:

即,兩個小球碰撞后交換速度。如果被碰撞的小球原來靜止,則碰撞后該小球具有了與碰撞小球一樣大小的速度,而碰撞小球則停止。代碼模擬:
var canvas=document.getElementById("myCanvas"); var cxt=canvas.getContext("2d"); var r=15; var ball1={ x: 20, y: 285, r: r, vx: 120, vy: 0 }; var ball2={ \注:假設兩個小球處于同一水平面上,即 y 相同,并且一個沿 x 正方向運動,一個沿x負方向運動。 \ x: 400, y: 285, r: r, vx: -30, vy: 0 }; var balls=[]; balls.push(ball1); balls.push(ball2); cxt.fillStyle="#030303"; cxt.fillRect(0, 0, canvas.width, canvas.height); function init() { cxt.fillStyle="#fff"; for (i in balls) { cxt.beginPath(); cxt.arc(balls[i].x, balls[i].y, balls[i].r, 0, Math.PI * 2, true); cxt.closePath(); cxt.fill(); } } init(); var cyc=20; var moveAsync=eval(Jscex.compile("async", function () { while (true) { cxt.fillStyle="rgba(0, 0, 0, .3)"; cxt.fillRect(0, 0, canvas.width, canvas.height); cxt.fillStyle="#fff"; if (Math.abs(ball1.x-ball2.x) <=2 * r) { \注:碰撞檢測,當兩球的距離小球2*r時發生碰撞。\ var temp=ball1.vx; ball1.vx=ball2.vx; ball2.vx=temp; } for (i in balls) { balls[i].x +=balls[i].vx * cyc / 1000; cxt.beginPath(); cxt.arc(balls[i].x, balls[i].y, balls[i].r, 0, Math.PI * 2, true); cxt.closePath(); cxt.fill(); } $await(Jscex.Async.sleep(cyc)); } }))
運行代碼,可以看到碰撞前兩小球的運動狀態如圖2-9所示。

圖2-9 碰撞前兩小球的運動狀態
碰撞后兩小球的運動狀態如圖2-10所示。

圖2-10 碰撞后兩小球的運動狀態
由圖2-9和圖2-10可知,兩個小球的速度進行了交換。
這里的代碼是在已知的結果下進行編寫的,在真實的物理引擎當中,需要給每個物體設定一個彈性系數和質量,然后根據彈性系統和質量計算碰撞之后的速度變化。
非彈性碰撞
碰撞過程中物體往往會發生形變,還會發熱、發聲。因此在一般情況下,碰撞過程中會有動能損失,即動能、機械能都不守恒,這類碰撞稱為非彈性碰撞(Inelastic Collision)。
代碼模擬:
var moveAsync=eval(Jscex.compile("async", function () { while (true) { cxt.fillStyle="rgba(0, 0, 0, .3)"; cxt.fillRect(0, 0, canvas.width, canvas.height); cxt.fillStyle="#fff"; if (Math.abs(ball1.x-ball2.x) <=2 * r) { var momentumSummation=ball1.vx+ball2.vx; \注:動量總和,假設質量都為1。\ var temp=ball2.vx; ball2.vx=ball1.vx * 0.65; \注:假設損失了65%速度。\ ball1.vx=momentumSummation-ball2.vx; \注:\ } for (i in balls) { balls[i].x +=balls[i].vx * cyc / 1000; cxt.beginPath(); cxt.arc(balls[i].x, balls[i].y, balls[i].r, 0, Math.PI * 2, true); cxt.closePath(); cxt.fill(); } $await(Jscex.Async.sleep(cyc)); } }))
運行代碼,可以看到碰撞前兩小球的運動狀態如圖2-11所示。

圖2-11 碰撞前兩小球的運動狀態
碰撞后兩小球的運動狀態如圖2-12所示。

圖2-12 碰撞后兩小球的運動狀態
完全非彈性碰撞
碰撞后兩物體結合在一起,動能損失最大,這種碰撞叫做完全非彈性碰撞。
由于碰撞后兩物體速度方向都一致,根據動量守恒定理,可以計算出:
v′=(v1+v2)/2
代碼模擬:
var moveAsync=eval(Jscex.compile("async", function () { while (true) { cxt.fillStyle="rgba(0, 0, 0, .3)"; cxt.fillRect(0, 0, canvas.width, canvas.height); cxt.fillStyle="#fff"; if (Math.abs(ball1.x-ball2.x) <=2 * r) { v=(ball1.vx+ball2.vx) / 2; ball1.vx=v; ball2.vx=v; } for (i in balls) { balls[i].x +=balls[i].vx * cyc / 1000; cxt.beginPath(); cxt.arc(balls[i].x, balls[i].y, balls[i].r, 0, Math.PI * 2, true); cxt.closePath(); cxt.fill(); } $await(Jscex.Async.sleep(cyc)); } }))
運行代碼,可以看到碰撞前兩小球的運動狀態如圖2-13所示。

圖2-13 碰撞前兩小球的運動狀態
碰撞后兩小球黏在一起向右運動,如圖2-14所示。

圖2-14 碰撞后兩小球黏在一起向右運動
- Photoshop電商網頁廣告設計實戰從入門到精通(超值版)
- 柳工出海:中國制造的全球化探索
- Dreamweaver CS5+ASP動態網站設計實用手冊
- 中文版Dreamweaver CS6/Flash CS6/Photoshop CS6網頁設計基礎培訓
- 中文版Flash CC完全自學教程
- Vue.js從入門到項目實踐(超值版)
- Dreamweaver CC中文版網頁設計與制作從新手到高手
- HTML+CSS+JavaScript網頁設計與布局:從新手到高手
- 寬帶接入技術
- Web綜合實戰教程
- Dreamweaver CS3網頁制作
- Dreamweaver CS3網站制作炫例精講
- After Effects UI交互動畫設計
- Dreamweaver CS4網頁制作入門、進階與提高
- 精通HTML5+CSS3+JavaScript網頁設計(視頻教學版)(第2版)