點選上面這張圖片就可以看到效果~
這是使用 javascript 對自由落體做的一個模擬
原本想使用運動定律的寫法 s=v0t+1/2gt 平方
但是測試出來的效果不如預期來得好
所以就改用 sin 和 cos 的做法來進行加速減速
也產生了滿不錯的效果~
在利用程式產生圓週運動中
如果讓 x 軸每隔一段時間移動固定距離
在 y 軸就會產生如同加速減速的效果
當然如果要產生等速的運動
就要從角度著手(每隔一段時間改變固定角度來產生 x,y)
而在衰減的寫法
比較好的寫法應該要使用Math.exp的函數來進行
而最佳的寫法更是應該要使用到傅立葉來計算
這個問題就留給我那些物理系的同學去煩惱吧
我已經脫離物理系好久了~XD
至於我的寫法有兩種
一種是每次移動的時候都會有一定數值的衰減(很像空氣摩擦力)
一種是在碰撞的時候會損失一定程度的數值
例如第一次碰撞總能量變成1*0.9
第二次碰撞總能量會是0.9*0.9的這種等比數列的做法
完整的 javascript 程式如下
如果讓 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; } } });
沒有留言:
張貼留言