Javascript如何实现摸拟自由落体与上抛运动的原理与方法
本篇内容主要讲解“Javascript如何实现摸拟自由落体与上抛运动的原理与方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Javascript如何实现摸拟自由落体与上抛运动的原理与方法”吧!
创新互联"三网合一"的企业建站思路。企业可建设拥有电脑版、微信版、手机版的企业网站。实现跨屏营销,产品发布一步更新,电脑网络+移动网络一网打尽,满足企业的营销需求!创新互联具备承接各种类型的网站建设、成都网站建设项目的能力。经过10余年的努力的开拓,为不同行业的企事业单位提供了优质的服务,并获得了客户的一致好评。
Java的特点有哪些
Java的特点有哪些 1.Java语言作为静态面向对象编程语言的代表,实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。 2.Java具有简单性、面向对象、分布式、安全性、平台独立与可移植性、动态性等特点。 3.使用Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。
JavaScript 代码
//**************************************** //名称:Javascript摸拟自由落体与上抛运动! //作者:Gloot //邮箱:glootz@gmail.com // QQ:345268267 //网站:http://www.cnblogs.com/editor/ //操作:在页面不同地方点几下 //*************************************** var $ = function(el) { return document.getElementById(el); }; function LuoRun() { 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) { var self = 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; var crtDiv = 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 = ' '; var C = new LuoRun(); C.left = e.clientX; C.id = crtDiv; document.onmouseup = function() { document.onmousemove = null; window.setTimeout(function() { C.Go(crtDiv); },1000); } }
Css 样式
Body Html代码
代码说明
function JsFunc() { this.a = ""; this.b = ""; } JsFunc.prototype.method = function() { var me = this; me.a = "method"; } function init() { var func = new JsFunc(); func.method(); }
JsFunc 类当于一个(C#中的)类;
var func = new JsFunc();
相当于初始化了一个类,创建了一个对象;
this.a, this.b 相当于 类中的成员;
JsFunc.prototype.method
相当于创建这个类下的一个方法函数;
如果这个JsFunc 多次 new 操作的话,其下 this成员,将各自的运行操作,互不影响;
所以当 对 JsFunc new 后创建一个新对象时,对这对象的成员或方法进行 setTimeout, setInterval 操作话,就会产生类似于并行操作的效果;
function LuoRun() { 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) { var self = 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; var crtDiv = 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 = ' '; var C = new LuoRun(); C.left = e.clientX; C.id = crtDiv; document.onmouseup = function() { document.onmousemove = null; window.setTimeout(function() { C.Go(crtDiv); },1000); } }
当鼠标点击页面时,就创建一个灰黑底,宽高 22 像素的方块;
并初始化 (创建新对象) LuoRun 类;
当鼠标松开后,过一秒钟执行 LuoRun的 Go 定时器,开始表现物体的落体与上抛过程;
到此,相信大家对“Javascript如何实现摸拟自由落体与上抛运动的原理与方法”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
分享标题:Javascript如何实现摸拟自由落体与上抛运动的原理与方法
URL地址:http://ybzwz.com/article/pdphog.html