JavaScript模拟实现自由落体效果


Posted in Javascript onAugust 28, 2018

本文实例为大家分享了js实现自由落体效果的具体代码,供大家参考,具体内容如下

1.效果图

JavaScript模拟实现自由落体效果

2.实现分析

利用Canvas画圆球、地面;

1.下落过程

物理知识回顾,物体下落过程(不计损耗)由重力势能转换成动能

重力势能 Ep = mgh

动能  Ek = (1/2)mv^2

速度右0增加至gt

此间需要计算浏览器每次渲染的圆球y坐标

y = (1/2)gt^2

2.反弹过程

动能转化成重力势能

速度是逐渐减少直至为0

本打算设置 y = (1/2)g(t-t1)^2,t1为下落或者反弹消耗的时长

但是实际呈现的效果却不尽人意,应该是反弹位移计算有误,经反复思考无果(若哪位大拿有更好的实现方式欢迎评论告知)

所以决定将下落过程的位移保存在一个数组里,待反弹时再逐一取出赋值

3.代码实现

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
 <style>
  body {
   padding: 0;
   margin: 0;
   background-color: rgba(0, 0, 0, 1);
  }
  #canvas{
   display: block;
   margin: 10px auto;
  }
 </style>
</head>
<body>
<canvas id="canvas" width="600" height="600">your browser is not support canvas</canvas>
<script type="text/javascript">
 //自由落体 H=(gt^2)/2 动能 Ek=(mv^2)/2 重力势能:Ep = mgh
 let x=300,y=60,     //圆心坐标
  minHeight = 60,    //最小下落位移
  maxHeight = 446,   //最大下落位移
  dir = true;     //dir true下落,false为弹起
 (function(){
  let canvas= document.getElementById('canvas');
  let ctx = canvas.getContext('2d');
  draw(ctx);
 })();
 function draw(ctx){
  let currentTime = new Date().getTime();  //开始毫秒数,折返记录一次currentTime
  let arr_y = [];        //设置下落位移的数组
  window.requestAnimationFrame(function init(){
   if(dir){
    if(y >= maxHeight){
     dir = false;
     currentTime = new Date().getTime();
    }else{
     y = y + Math.pow((new Date().getTime() - currentTime)/1000,2)*10/2;
     arr_y.push(y);
    }
   }else{
    if(y <= minHeight){
     dir = true;
     currentTime = new Date().getTime();
    }else{
     y = arr_y.splice(-1,1)[0] || 60;
    }
   }
   drawArc(ctx,x,y);
   requestAnimationFrame(init);
  });
 }
 //绘制圆球和地面
 function drawArc(ctx,x,y){
  ctx.clearRect(0, 0, 600, 600);
  ctx.beginPath();
  ctx.arc(x,y,50,0,Math.PI*2);
  ctx.fillStyle='#98adf0';
  ctx.fill();
  ctx.save();
  ctx.beginPath();
  ctx.strokeStyle = '#ffffff';
  ctx.moveTo(0,500);
  ctx.lineTo(600,500);
  ctx.lineWidth = 4;
  ctx.stroke();
  ctx.closePath();
  ctx.save();
 }
</script>
</body>
</html>

4.结语

虽然只是一个简单的下落和弹起,但是为了弹起位移的实现整整花费本人6天的时间(主要是每天都思考怎么计算弹起位移)

主要开始的思路一直关注在

下落位移 (开口线上抛物线方程)

y = (1/2)gt^2

思考反弹的位移应该改是将抛物线沿x轴右移t1,得出

y = (1/2)g(t-t1)^2

有兴趣的同学可以试试看看效果

浏览器渲染反弹的效果不尽人意,所以一直没想出计算的位移方法,故使用数组实现

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
5 cool javascript apps
Mar 24 Javascript
IE6图片加载的一个BUG解决方法
Jul 13 Javascript
jquery中dom操作和事件的实例学习-表单验证
Nov 30 Javascript
实例解析jQuery中proxy()函数的用法
May 24 Javascript
关于js二维数组和多维数组的定义声明(详解)
Oct 02 Javascript
Java中int与integer的区别(基本数据类型与引用数据类型)
Feb 19 Javascript
js实现鼠标跟随运动效果
Aug 02 Javascript
vue.js $refs和$emit 父子组件交互的方法
Dec 20 Javascript
使用Angular CLI生成 Angular 5项目教程详解
Mar 18 Javascript
javascript使用正则实现去掉字符串前面的所有0
Jul 23 Javascript
js实现时分秒倒计时
Dec 03 Javascript
在 HTML 页面中使用 React的场景分析
Jan 18 Javascript
vue-cli3脚手架的配置及使用教程
Aug 28 #Javascript
vue.js实现带日期星期的数字时钟功能示例
Aug 28 #Javascript
JavaScript实现的前端AES加密解密功能【基于CryptoJS】
Aug 28 #Javascript
vue 使用自定义指令实现表单校验的方法
Aug 28 #Javascript
微信小程序多音频播放进度条问题
Aug 28 #Javascript
微信小程序获取音频时长与实时获取播放进度问题
Aug 28 #Javascript
vue表单自定义校验规则介绍
Aug 28 #Javascript
You might like
中国站长站 For Dede4.0 采集规则
2007/05/27 PHP
PHP运行出现Notice : Use of undefined constant 的完美解决方案分享
2012/03/05 PHP
PHP版微信第三方实现一键登录及获取用户信息的方法
2016/10/14 PHP
JavaScript中的变量声明早于赋值分析
2012/03/01 Javascript
探讨javascript是不是面向对象的语言
2013/11/21 Javascript
document.execCommand()的用法小结
2014/01/08 Javascript
JavaScript模版引擎的基本实现方法浅析
2016/02/15 Javascript
Bootstrap3 input输入框插入glyphicon图标的方法
2016/05/16 Javascript
JavaScript每天必学之数组和对象部分
2016/09/17 Javascript
JavaScript无阻塞加载和defer、async详解
2017/02/26 Javascript
jQuery插件DataTables分页开发心得体会
2017/08/22 jQuery
用js实现每隔一秒刷新时间的实例(含年月日时分秒)
2017/10/25 Javascript
基于zTree树形菜单的使用实例
2017/12/25 Javascript
vue移动端项目缓存问题实践记录
2018/10/29 Javascript
详解微信小程序中组件通讯
2018/10/30 Javascript
JS实现求字符串中出现最多次数的字符和次数示例
2019/07/05 Javascript
js基础之事件捕获与冒泡原理
2019/10/09 Javascript
vue iview实现动态新增和删除
2020/06/17 Javascript
Vue性能优化的方法
2020/07/30 Javascript
vue配置多代理服务接口地址操作
2020/09/08 Javascript
js实现简单商品筛选功能
2021/02/02 Javascript
windows10系统中安装python3.x+scrapy教程
2016/11/08 Python
Python3安装Pymongo详细步骤
2017/05/26 Python
python 读文件,然后转化为矩阵的实例
2018/04/23 Python
python中itertools模块zip_longest函数详解
2018/06/12 Python
python爬虫租房信息在地图上显示的方法
2019/05/13 Python
Python全面分析系统的时域特性和频率域特性
2020/02/26 Python
英国一家专门出售品牌鞋子的网站:Allsole
2016/08/07 全球购物
jQuery treeview树形结构应用
2021/03/24 jQuery
英语硕士生求职简历的自我评价
2013/10/15 职场文书
幼儿园家长会欢迎词
2014/01/09 职场文书
运动会方阵口号
2014/06/07 职场文书
政协会议宣传标语
2014/10/09 职场文书
检讨书大全
2015/01/27 职场文书
使用JS实现简易计算器
2021/06/14 Javascript
C#连接ORACLE出现乱码问题的解决方法
2021/10/05 Oracle