點選上面這張圖片就可以看到效果~
這是使用 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;
}
}
});
沒有留言:
張貼留言