# 應用力學:彈跳球
## 簡介

當我們在描述一個物體做彈跳運動時(如上圖),可以將整個碰撞期間分為四個時期:
#### 1. 碰撞前期
兩個物體朝著對方移動,但尚未發生碰撞。

#### 2. 壓縮期
兩個物體開始接觸,然後互相壓縮、施加壓縮力於對方,兩個物體各自質心之間的距離越來越近,直到無法再繼續壓縮為止。

#### 3. 恢復期
兩個物體開始恢復先前的形狀,且質心之間的距離越來越遠,直到不再接觸對方為止

#### 4. 碰撞後期
兩個物體完全分離,朝著不同方向越移動越遠。

<br>
<br>
其中碰撞過程中的壓縮能力和恢復能力可由恢復係數(coefficient of restitution)來表示,跟材料有關。而運動方程式則可以繼續延伸,但由於難度限制,這一次的計算會有部份簡化以便模擬。
## 例題
我們假設有一顆由左向右彈跳的球,其跟地板碰撞時跟之前彈性碰撞的運動方程式很像,只是了考慮壓縮和恢復,我們加入一個動量轉換率在方程式裡來模擬前述的碰撞(2)、(3)時期。因此只要給定初始條件和邊界,就可以模擬彈跳運動了
1. 初始條件和參數
```
%初始條件(位置、半徑、顏色、速度、動量轉換率......)
ix=0;
iy=10;
r=1;
color=(1);
Yv=70/2000;
Xv=500/2000;
Yvc=0.7;
Xvc=0.5;
a=9.81/2000;
step=0;
dt=1;
t=linspace(0,2*pi,100);
```
<br>
<br>
2. 首先設定視窗的規格和軸的距離。接著依序使用**set函數**設定球、軸、地板和頂端,這邊可以自調參數以模擬不同的邊界條件。最後設定球的軌跡。
```
%設定視窗、邊界
figure('units','normalized','position',[.2 .2 .5 .5],'menubar','none','numbertitle','off','color','w','name','Bouncing Ball')
axes('position',[.05 .05 .85 .75])
hold on
%球
h1=fill((ix)+r*cos(t),(iy)+r*sin(t),color);
set(h1,'linewidth',2)
%軸
axis([0 10 -1 10+r+1])
axis equal
hx=axis;
%地板
hL=line(1000.*[hx(1),hx(2)],[0 0]);
set(hL,'color','k','linestyle','-','linewidth',3)
%頂端
hL=line(1000.*[hx(1),hx(2)],[10 10]);
axis(hx)
set(hL,'color','c','linestyle','--')
%軌跡
h2=plot(ix,iy,'k+');
hb=[h1,h2];
```
<br>
<br>
3. 最後我們利用while迴圈進行運動方程式計算和動畫製成。記得裡面要加入碰撞的條件、速度改變的關係式和**動量轉換率**,並用**set**函數來進行物件性質的存取。最後一個part則是要讓球彈出視窗外時,仍能模擬畫面(基本上就是每一次更新**xlim**和**ylim**)。最後不要忘記**drawnow()**,縮排請打好。
```
%運動方程式迴圈
while step<100000
step=step+dt;
%畫軌跡
yc=get(h2,'ydata');
plot(get(h2,'xdata'),yc,'k.')
%運動方程式(注意動量轉換率和半徑條件)
Yv=Yv+a*dt;
if yc-(Yv+a*dt)*dt<=r
Yv=Yv+a*dt/(Yv+a*dt)*(yc-r);
Yv=-Yv*Yvc;
set(h2,'ydata',r)
set(h1,'ydata',r+(r)*sin(t))
Xv=Xv*Xvc;
else
for k=1:2
set(hb(k),'ydata',get(hb(k),'ydata')-Yv*dt)
end
end
set(hb(1),'xdata',get(hb(1),'xdata')+Xv*dt)
set(hb(2),'xdata',get(hb(2),'xdata')+Xv*dt)
%當球跑出視窗外時跟著移動
l=axis;
if get(h2,'xdata')>l(2)-r && Xv>0
xlim([hx(1),hx(2)]+l(2))
end
if get(h2,'ydata')>l(4)-r && Yv<0
ylim([hx(3),hx(4)]+l(4))
end
if get(h2,'xdata')<l(1)+r && Xv<0
xlim([l(1),l(2)]-(hx(2)-hx(1)))
end
if get(h2,'ydata')<l(3)+r && Yv>0
ylim([l(3),l(4)]-(hx(4)-hx(3)))
end
% 更新圖形
drawnow()
end
```
<br>
<br>
4. 最後的圖片會長這樣,完整的動圖請點選下方的網址觀看。

<br>
https://www.youtube.com/watch?v=mAM-oH5mfV8&feature=youtu.be
## 練習
請下載附件的程式碼並加以修改來模擬不同速度、動量轉換率的運動情形並詳細比較。