# 基礎力學:二維彈性碰撞
## 簡介
模擬二維彈性碰撞比一維彈性碰撞更為複雜,因為撞擊的角度需要加入考量,不過跟上一篇計算一樣,二維彈性碰撞仍然符合動量守恆與動能守恆,因此還是可以透過解聯立的方式得出答案。另外我們只要將二個質點的速度向量個別分解成平行向量和垂直向量,就能夠進一步簡化計算。
如下圖:

計算步驟大致為:
1. 分解出垂直向量和平行向量。
2. 使用一維彈性碰撞公式分別計算碰撞後的垂直速度與平行速度。
3. 根據角度將上面求得的速度向量合併得出最終的速度向量。
<br>
最後可以求得以下關係式:


<br>
1. 現在有了兩個質點在碰撞後的速度,我們就可以來透過Matlab來模擬兩顆球經過二維彈性碰撞的運動情形。
先輸入以下參數:
* 紅球質量=1
紅球半徑=1
紅球位置=(3,3)
紅球初速度=(0.3,0)
* 藍球質量=2
藍球半徑=1
藍球位置=(10,4)
藍球初速度=(-0.05,0)
```
% 第一顆球參數:質量、半徑、位置、初速度。
m1=1;
r1=1;
X1=[3,3];
V1=[0.3,0.0];
% 第二顆球參數:質量、半徑、位置、初速度。
m2=2;
r2=1;
X2=[10,4];
V2=[-0.05,0];
```
<br>
2. 接著我們使用**patch**函數來設定邊界條件,調整函數裡面各個參數可以改變形狀、顏色等等。接下來**grid on**加上網格,並調整軸的比例。
```
% 背景設定
patch([0,0,14,14],[0,10,10,0],'w','FaceAlpha',0.5);
grid on;
axis square equal;
hold on;
```
<br>
3. 接下來我們設定**a**為一個0到2pi的一維向量,這樣才能用**sin**函數跟**cos**函數來畫出完整的圓形。最後一樣用**patch**函數來完成圖形。
```
% 將球畫出來
a=[0:0.1:2*pi];
Xcircle=cos(a);
Ycircle=sin(a);
B1=patch (X1(1)+r1*Xcircle, X1(2)+r1*Ycircle,'r','FaceAlpha',1);
B2=patch (X2(1)+r2*Xcircle, X2(2)+r2*Ycircle,'b','FaceAlpha',1);
```
<br>
4. 然後我們設定一個**for**迴圈,並在裡面加入碰撞的條件以及速度改變的關係式就可以模擬兩顆球每一次的運動情形,這邊要注意各個角度的關係才不會搞混,最後要清楚分解向量、計算、合併向量的順序,並用**set**函數來進行物件性質的存取。記得在迴圈裡面使用**getframe**函數才能記錄下來以方便做圖。
```
%跑for迴圈
for i=1:5000
% 更新位置
X1=X1+V1;
X2=X2+V2;
% 第一顆球跟邊界碰撞
if (X1(1)<=r1) X1(1)=r1; V1(1)=-V1(1); end
if (X1(1)>=14-r1) X1(1)=14-r1; V1(1)=-V1(1); end
if (X1(2)<=r1) X1(2)=r1; V1(2)=-V1(2); end
if (X1(2)>=10-r1) X1(2)=10-r1; V1(2)=-V1(2); end
% 第二顆球跟邊界碰撞
if (X2(1)<=r2) X2(1)=r2; V2(1)=-V2(1); end
if (X2(1)>=14-r2) X2(1)=14-r2; V2(1)=-V2(1); end
if (X2(2)<=r2) X2(2)=r2; V2(2)=-V2(2); end
if (X2(2)>=10-r2) X2(2)=10-r2; V2(2)=-V2(2); end
% 兩顆球碰撞條件
if (norm (X1-X2)<=r1+r2)
%拷貝速度向量
u1=V1;
u2=V2;
% 1.計算角度
Alpha1=atan2(X2(2)-X1(2) , X2(1)-X1(1) );
Beta1=atan2(u1(2),u1(1));
Gamma1=Beta1-Alpha1;
% 2.計算分解後的速度向量
u12=norm(u1)*cos(Gamma1);
u11=norm(u1)*sin(Gamma1);
% 3 - 第二顆球的計算(跟1、2一樣)
Alpha2=atan2(X1(2)-X2(2) , X1(1)-X2(1) );
Beta2=atan2(u2(2),u2(1));
Gamma2=Beta2-Alpha2;
u21=norm(u2)*cos(Gamma2);
u22=norm(u2)*sin(Gamma2);
% 4.計算碰撞後的速度
v12 = ( (m1-m2)*u12 - 2*m2*u21 ) / (m1+m2);
v21 = ( (m1-m2)*u21 + 2*m1*u12 ) / (m1+m2);
% 5.合併分解計算後的速度向量
V1=u11*[-sin(Alpha1),cos(Alpha1)] + v12*[cos(Alpha1),sin(Alpha1)];
V2=u22*[-sin(Alpha2),cos(Alpha2)] - v21*[cos(Alpha2),sin(Alpha2)];
end
% 更新畫面
set(B1,'XData',X1(1)+r1*Xcircle, 'YData', X1(2)+r1*Ycircle);
set(B2,'XData',X2(1)+r2*Xcircle, 'YData', X2(2)+r2*Ycircle);
drawnow;
F(i) = getframe(gcf);
end
```
<br>
5. 最後使用**VideoWriter**來完成動圖,可以自行調整影格率和畫質。
```
%作圖
writerObj = VideoWriter('elasticCollision.avi');
writerObj.FrameRate = 60;
writerObj.Quality = 100;
for i=1:length(F)
% 將圖片轉至成影格
writeVideo(writerObj, frame);
end
```
<br>
6. 最後的圖片會長這樣,完整的動圖請點選下方的網址觀看。

https://www.youtube.com/watch?v=6M8HG8W0uMs&feature=youtu.be
## 習題
請下載附件的程式碼並加以修改來模擬不同速度、質量、撞擊角度的運動情形並詳細比較。