Pages

筆記 - 模擬自由落體與反彈


點選上面這張圖片就可以看到效果~

這是使用 javascript 對自由落體做的一個模擬
原本想使用運動定律的寫法 s=v0t+1/2gt 平方
但是測試出來的效果不如預期來得好
所以就改用 sin 和 cos 的做法來進行加速減速
也產生了滿不錯的效果~
在利用程式產生圓週運動中
如果讓 x 軸每隔一段時間移動固定距離
在 y 軸就會產生如同加速減速的效果
當然如果要產生等速的運動
就要從角度著手(每隔一段時間改變固定角度來產生 x,y)

而在衰減的寫法
比較好的寫法應該要使用Math.exp的函數來進行
而最佳的寫法更是應該要使用到傅立葉來計算
這個問題就留給我那些物理系的同學去煩惱吧
我已經脫離物理系好久了~XD
至於我的寫法有兩種
一種是每次移動的時候都會有一定數值的衰減(很像空氣摩擦力)
一種是在碰撞的時候會損失一定程度的數值
例如第一次碰撞總能量變成1*0.9
第二次碰撞總能量會是0.9*0.9的這種等比數列的做法

完整的 javascript 程式如下
$(function(){
var s,dx1,speedx1,x1,y1,r0,r1,e1,dx2,speedx2,dx2,x2,y2,r2,e2,t,q;
q=1;
s=0;
dx1=3;//加速度
speedx1 = dx1;
x1=0; 
y1=-250;
r0=250;
r1=r0-(r0%dx1);//起始點高度
e1=s;//彈性係數,數字越大彈力越好
t=1;

dx2=dx1;//加速度
speedx2 = dx2;
x2=0; 
y2=-250;
r2=r0-(r0%dx2);//起始點高度
e2=1-s;//彈性係數,數字越大彈力越好


$("#e_select").change(function(){
 s = $("#e_select").find(":selected").val();
 q=1;

 dx1=3;//加速度
 speedx1 = dx1;
 x1=0; 
 y1=-250;
 r0=250;
 r1=r0-(r0%dx1);//起始點高度
 e1=s;//彈性係數,數字越大彈力越好
 t=1;

 dx2=dx1;//加速度
 speedx2 = dx2;
 x2=0; 
 y2=-250;
 r2=r0-(r0%dx2);//起始點高度
 e2=1-s;//彈性係數,數字越大彈力越好

 $("#fall2").css({"top":y1+"px"});
 $("#fall4").css({"top":y2+"px"});
});

$("#e_button").click(function(){
 q=0;
 fn1();
 fn2();
});

function fn1(){ 
 if(q==0){
 if(x1>=r1){speedx1=-dx1; r1=r1*e1-(r1*e1)%dx1; x1=r1;}//計算當y值為0的時候,反彈高度衰減數值,若要每次碰撞置底貼其,則要湊整數,r1要多-(r1*e1)%dx1
 else if(x1<=-r1){speedx1=dx1; r1=r1*e1-(r1*e1)%dx1; x1=r1;}

 x1=x1+speedx1;//利用x數值,用繞圓周的方式計算y值,即可達到重力加速度的效果
 y1=-Math.sqrt(Math.pow(r1,2)-Math.pow(x1,2));

 $("#fall2").css({"top":y1+"px"});

 timer1=setTimeout(function(){
   clearTimeout("timer1");
   fn1();
  },t);
 }
 else{
  clearTimeout("timer1");
  return true;
 }
}


function fn2(){ 
 if(q==0){ 
 if(r2>0){r2=r2-e2;}//計算當y值為0的時候,反彈高度衰減數值
 else{r2=0; x2=0;}

 if(x2>=r2){speedx2=-dx2;}
 else if(x2<=-r2){speedx2=dx2;} 

 x2=x2+speedx2; //利用x數值,用繞圓周的方式計算y值,即可達到重力加速度的效果
 y2=-Math.sqrt(Math.pow(r2,2)-Math.pow(x2,2));

 $("#fall4").css({"top":y2+"px"});

 timer2=setTimeout(function(){
   clearTimeout("timer2");
   fn2();
  },t);
 }
 else{
  clearTimeout("timer2");
  return true;
 }
}
});

oxxo

Phasellus facilisis convallis metus, ut imperdiet augue auctor nec. Duis at velit id augue lobortis porta. Sed varius, enim accumsan aliquam tincidunt, tortor urna vulputate quam, eget finibus urna est in augue.

沒有留言:

張貼留言