模運動規律對運動進行拆解,實現物體的直線、變速、圓周、橢圓、平拋、自由落體、落地彈起等常規運動。
注意點
- 運動模擬物理運動規律
- 使用javascript方式操作Dom方式實現運動,與canvas原理相同
- 實時修改dom的tansform值實現運動
- 採用定時器setInterval方式,模擬時間的增長
- Vo為初速度,Vx水平速度,Vy垂直速度,S為物體位移,g為重力加速度,a為加速度,t為時間,timer為儲存定時器的變數
- createDom方法為通過實時更新的點座標x,y繪製小球的運動軌跡
HTML
<div id="container" class="container">
<div id="ball"></div>
</div>
<script src="index.js"></script>
複製程式碼
css
* {
margin: 0;
padding: 0;
}
#ball {
width: 10px;
height: 10px;
background-color: red;
border-radius: 50%;
/*margin: 200px auto;*/
display: inline-block;
position: absolute;
top: 0;
}
.container {
text-align: center;
height: 300px;
border: 1px solid #000;
position: relative;
width: 80%;
margin: auto;
margin-top: 100px;
}
.points {
width: 5px;
height: 5px;
border-radius: 50%;
background-color: blue;
display: inline-block;
position: absolute;
top: 0;
}
複製程式碼
運動軌跡繪製
function createDom(x,y){
var span = document.createElement("span");
span.className = 'points';
span.style.transform = 'translate('+ x+'px,'+y+'px)';
container.appendChild(span);
}
複製程式碼
勻速直線運動
- 根據公式 s=Vo*t;
- 勻速直線運動為一種線性運動,Vo為初速度是一個常量,只需要定時的增加t即可
- 運動距離s>300運動結束,清除定時器clearInterval(timer)
var Vo = 10,
t = 0,
s = 0,
timer = null;
uniformSpeed();
function uniformSpeed(){
timer = setInterval(function(){
t+=0.1;
s = Vo*t;
ball.style.transform = 'translate('+ s+'px,0px)';
createDom(s,0);
if(s>300){
clearInterval(timer);
}
})
}
複製程式碼
勻變速玉棟
- 根據公式 s=Vot + (at)t
- 公式分解為初速度為Vo的勻速運動和一個初速度為0的勻變速運動
- a,Vo為常量,s為只與t有關的2次函式
- 運動距離s>300運動結束,清除定時器clearInterval(timer)
- 原理與勻速運動類似
var Vo = 10,
a = 1,
t = 0,
s = 0,
timer = null;
uniformAcceleration();
function uniformAcceleration(){
timer = setInterval(function(){
t+=0.05;
s = Vo*t + (a*t)*t;
ball.style.transform = 'translate('+ s+'px,0px)';
createDom(s,0);
if(s>300){
clearInterval(timer);
}
})
}
複製程式碼
變速曲線運動
與勻速運動方法相似,只需要將運動分解為水平和豎直兩個方向分別結算Sx和Sy即可
圓周運動
- 根據公式 x²+y²=r²
- 假定座標原點為0點
- 分解為x,y兩個方向,其中某一點x,y分成水平方向為sin&和cos&
- 運動距離 angle>2PI 運動結束,清除定時器clearInterval(timer)*
- 初始位置不為原點的給x,y加上一個偏移量即可,在此不做展開
var angle = 0,
r = 100,
timer = null,
x,y;
circleSport();
function circleSport(){
timer = setInterval(function(){
angle+=0.01;
x = r*Math.sin(angle);
y = r*Math.cos(angle);
ball.style.transform = 'translate('+x+'px,'+y+'px)';
createDom(x,y)
if(angle > Math.PI*2) clearInterval(timer);
});
}
複製程式碼
橢圓運動
- 根據公式 x²/a²+y²/b²=r²
- 假定座標原點為0點
- 分解為x,y兩個方向,為半徑為a和半徑為b的圓上的座標,a=b為圓,其他為橢圓
- 運動距離 angle>2PI 運動結束,清除定時器clearInterval(timer)*
- 初始位置不為原點的給x,y加上一個偏移量即可,在此不做展開
var deg = 0,
Rx = 50,
Ry = 100,
x,y,
timer = null;
ellipse();
function ellipse(){
timer = setInterval(function(){
deg+=0.01;
x = Rx*Math.sin(deg);
y = Ry*Math.cos(deg);
if(deg>Math.PI*2) return;
ball.style.transform = 'translate('+ x+'px,'+y+'px)';
createDom(x,y);
})
}
複製程式碼
總結
以上實現均為根據運動學規律對運動拆解,分解成x,y兩個方向進行處理;較複雜的運動拆分成多個簡單的運動,對結果進行組合;t為運動唯一外部變數,所有可變變數都與t有關,注意t的使用;本文程式碼都進行過測試;下一遍會介紹平拋、自由落體、正弦、貝塞爾運動的實現。