Javascript摸拟自由落体与上抛运动原理与实现方法详解
本文实例讲述了Javascript摸拟自由落体与上抛运动原理与实现方法。分享给大家供大家参考,具体如下:
JavaScript代码
//**************************************** //名称:Javascript摸拟自由落体与上抛运动! //作者:Gloot //邮箱:glootz@gmail.com //QQ:345268267 //网站:http://www.cnblogs.com/editor/ //操作:在页面不同地方点几下 //*************************************** var$=function(el){returndocument.getElementById(el);}; functionLuoRun() { this.h=0; this.s=0; this.g=9.8; this.isup=false; this.rh=0; this.t=0; this.timer=null; this.mt=0; this.top=0; this.left=0; this.id=null; } LuoRun.prototype.Po=function(obj){ this.left+=0.3; obj.style.left=(this.left)+'px'; if(!this.isup){ if(this.t==0) { this.top=obj.offsetTop; this.h=570-22-this.top; this.mt=Math.sqrt(2*this.h/(this.g*100)); //alert(mt+''+isup+''+t) } this.t+=0.01; if(this.t>=this.mt) { this.t=this.mt; this.rh=(1/2)*this.g*this.t*this.t*100; this.s=this.g*this.t*100; obj.style.top=(this.rh+this.top)+'px'; //t=0; this.s=this.s-50>0?this.s-50:0; this.isup=true; this.t=0; } else { this.rh=(1/2)*this.g*this.t*this.t*100; this.s=this.g*this.t*100; obj.style.top=(this.rh+this.top)+'px'; } }else{//up //return; if(this.s==0){ clearInterval(this.timer); this.id.parentNode.removeChild(this.id); return; } if(this.t==0){ this.h=this.s*this.s/(2*this.g*100); this.mt=this.s/(this.g*100); this.top=obj.offsetTop; //alert(mt+''+isup+''+t) } this.t+=0.01; if(this.t>=this.mt){ this.t=this.mt; this.rh=this.s*this.t-(1/2)*this.g*this.t*this.t*100; obj.style.top=(this.top-this.rh)+'px'; this.s=0; this.isup=false; this.t=0; }else{ this.rh=this.s*this.t-(1/2)*this.g*this.t*this.t*100; obj.style.top=(this.top-this.rh)+'px'; } } } LuoRun.prototype.Go=function(obj){ varself=this; if(obj==null) obj=$('box'); self.timer=setInterval(function(){ self.Po(obj); if(self.h<=0){ clearInterval(self.timer); self.id.parentNode.removeChild(self.id); } },10); } document.onmousedown=function(e){ e=e?e:window.event; varcrtDiv=document.createElement('div'); crtDiv.style.position='absolute'; crtDiv.style.left=e.clientX+'px'; crtDiv.style.top=e.clientY+'px'; crtDiv.style.background='#333'; crtDiv.style.width='22px'; crtDiv.style.height='22px'; document.body.appendChild(crtDiv); crtDiv.innerHTML=' '; varC=newLuoRun(); C.left=e.clientX; C.id=crtDiv; document.onmouseup=function(){ document.onmousemove=null; window.setTimeout(function(){C.Go(crtDiv);},1000); } }
Css样式
td,body{font-size:12px;} .css1{width:240px;display:table;position:absolute;left:20px;top:20px;border:1pxsolidgreen;background:#CAF4BD;line-height:18px;padding:3px;} .css2{width:900px;height:22px;border-top:1pxsolid#333;position:absolute;top:570px;left:60px;}
BodyHtml代码
名称:Javascript摸拟自由落体与上抛运动!
作者:Gloot
邮箱:glootz@gmail.com
QQ:345268267
网站:http://www.cnblogs.com/editor/
操作:在页面不同地方点几下
代码说明
functionJsFunc(){ this.a=""; this.b=""; } JsFunc.prototype.method=function(){ varme=this; me.a="method"; } functioninit(){ varfunc=newJsFunc(); func.method(); }
JsFunc类当于一个(C#中的)类;
varfunc=newJsFunc();
相当于初始化了一个类,创建了一个对象;
this.a,this.b相当于类中的成员;
JsFunc.prototype.method相当于创建这个类下的一个方法函数;
如果这个JsFunc多次new操作的话,其下this成员,将各自的运行操作,互不影响;
所以当对JsFuncnew后创建一个新对象时,对这对象的成员或方法进行setTimeout,setInterval操作话,就会产生类似于并行操作的效果;
functionLuoRun() { this.h=0; this.s=0; this.g=9.8; this.isup=false; this.rh=0; this.t=0; this.timer=null; this.mt=0; this.top=0; this.left=0; this.id=null; }
this.s表示速度;
this.h表示设定的高度,或物体上抛的最高高度;
this.isup表示正处于上升还是下降状态;
this.rn表示下降距当前顶的位移,或上抛距离初始速度位置的位移;
this.t 下降或上抛的时间;
this.mt表示从某一高度落体至某一低点所用的时间,或以某一初始速度上抛至零速度所用的时间;
this.timer表示定时器
this.top,this.left表示物体相对于容器顶部及左边的当前偏移;
this.id表示当前创建方块的对象id值;
LuoRun.prototype.Po=function(obj){ }
表示物休自由落体及上抛运动的方法;
this.left+=0.3;表示物体每落体或上抛向左跳动的偏移量(像素);
Po方法是在定时器setInterval下抛行的一个动作,每次执行时都会根据配置偏移量以及自由落体及上抛相关公式计算当前参数值变化,并设定当前物体的位置;
obj.style.left=(this.left)+'px';初始化当前步骤的左偏移;
落体状态
if(!this.isup){...}表示是否是落体状态;
if(this.t==0) { this.top=obj.offsetTop; this.h=570-22-this.top; this.mt=Math.sqrt(2*this.h/(this.g*100)); //alert(mt+''+isup+''+t) }
当时间为0时,表示当前处于落体的最顶点,记录当前距顶部的偏移值,设定落体的高度,以及计算此高度落体所用的时间;
if(this.t>=this.mt) { this.t=this.mt; this.rh=(1/2)*this.g*this.t*this.t*100; this.s=this.g*this.t*100; obj.style.top=(this.rh+this.top)+'px'; //t=0; this.s=this.s-50>0?this.s-50:0; this.isup=true; this.t=0; }
当落体所用时间,大于this.mt的最大时间时,将时间设置为this.mt的落体总时间;
this.rh根据公式1/2gt2得出的位移值,会等于this.h的值,或接近于this.h的高度值;
this.s根据速度在加速度随时间变化的公式计算出当前的速度,也即最大带度,这也是初始的上抛速度;
this.s=this.s-50>0?this.s-50:0;
这个50即为阻尼系数,即每次上抛所受阻力所减的速度值;
this.isup设置true;表示进入上抛状态;
obj.style.top=(this.rh+this.top)+'px';设置物体本步骤落体的当前位置;
上抛运行
if(this.t==0){ this.h=this.s*this.s/(2*this.g*100); this.mt=this.s/(this.g*100); this.top=obj.offsetTop; //alert(mt+''+isup+''+t) }
当时间为0时,表示处于上抛开始点,计算按落体后的速度及公式:v2/(2g)上升的最大高度this.h;最大上升时间this.mt;保存当前距顶部的偏移this.top;
if(this.t>=this.mt){ this.t=this.mt; this.rh=this.s*this.t-(1/2)*this.g*this.t*this.t*100; obj.style.top=(this.top-this.rh)+'px'; this.s=0; this.isup=false; this.t=0; }
当时间this.t大于this.mt这个最大上抛时间时,将时间设置为this.mt;
this.rh表示上抛的高度;公式:vt-(1/2)gt2;
重置this.t及this.s时间与速度,并将this.isup置为false,开始落体动作;
LuoRun.prototype.Go=function(obj){ varself=this; if(obj==null) obj=$('box'); self.timer=setInterval(function(){ self.Po(obj); if(self.h<=0){ clearInterval(self.timer); self.id.parentNode.removeChild(self.id); } },10); }
Go是个定时器,10毫秒执行一次物体偏移移动操作;
当this.h小于等于0时,清除物体,该对象方块一个落体与上抛过程结束;
document.onmousedown=function(e){ e=e?e:window.event; varcrtDiv=document.createElement('div'); crtDiv.style.position='absolute'; crtDiv.style.left=e.clientX+'px'; crtDiv.style.top=e.clientY+'px'; crtDiv.style.background='#333'; crtDiv.style.width='22px'; crtDiv.style.height='22px'; document.body.appendChild(crtDiv); crtDiv.innerHTML=' '; varC=newLuoRun(); C.left=e.clientX; C.id=crtDiv; document.onmouseup=function(){ document.onmousemove=null; window.setTimeout(function(){C.Go(crtDiv);},1000); } }
当鼠标点击页面时,就创建一个灰黑底,宽高22像素的方块;
并初始化(创建新对象)LuoRun类;
当鼠标松开后,过一秒钟执行LuoRun的Go定时器,开始表现物体的落体与上抛过程;
感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.jb51.net/code/HtmlJsRun测试上述代码运行效果。
更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript运动效果与技巧汇总》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript动画特效与技巧汇总》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》
希望本文所述对大家JavaScript程序设计有所帮助。