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 相关文章推荐
[原创]静态页面也可以实现预览 列表不同的显示方式
Oct 14 Javascript
jquery(hide方法)隐藏指定元素实例
Nov 11 Javascript
使用GruntJS构建Web程序之构建篇
Jun 04 Javascript
详谈jQuery中的一些正则匹配表达式
Mar 08 Javascript
AngularJS+Bootstrap3多级导航菜单的实现代码
Aug 16 Javascript
Node.js使用cookie保持登录的方法
May 11 Javascript
小程序红包雨的实现示例
Feb 19 Javascript
微信小程序云开发(数据库)详解
May 17 Javascript
javascript实现的字符串转换成数组操作示例
Jun 13 Javascript
JS中this的4种绑定规则详解
Feb 04 Javascript
基于VUE实现判断设备是PC还是移动端
Jul 03 Javascript
JavaScript 常见的继承方式汇总
Sep 17 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
老照片 - 几十年前的收音机与人
2021/03/02 无线电
php基础知识:类与对象(4) 范围解析操作符(::)
2006/12/13 PHP
PHP数组操作类实例
2015/07/11 PHP
完美解决JS中汉字显示乱码问题(已解决)
2006/12/27 Javascript
Jquery 插件学习实例1 插件制作说明与tableUI优化
2010/04/02 Javascript
JS数学函数Exp使用说明
2012/08/09 Javascript
JS+CSS模拟可以无刷新显示内容的留言板实例
2015/03/03 Javascript
Bootstrap CSS布局之表格
2016/12/17 Javascript
JS简单实现获取元素的封装操作示例
2017/04/07 Javascript
让bootstrap的carousel支持滑动滚屏的实现代码
2017/11/27 Javascript
vue中promise的使用及异步请求数据的方法
2018/11/08 Javascript
使用RxJS更优雅地进行定时请求详析
2019/06/02 Javascript
Vue的生命周期操作示例
2019/09/17 Javascript
webpack 处理CSS资源的实现
2019/09/27 Javascript
跟老齐学Python之画圈还不简单吗?
2014/09/20 Python
Python警察与小偷的实现之一客户端与服务端通信实例
2014/10/09 Python
centos 下面安装python2.7 +pip +mysqld
2014/11/18 Python
使用Pyrex来扩展和加速Python程序的教程
2015/04/13 Python
详解Django中的过滤器
2015/07/16 Python
分享Python文本生成二维码实例
2016/01/06 Python
Python画图学习入门教程
2016/07/01 Python
Python+OpenCV让电脑帮你玩微信跳一跳
2018/01/04 Python
python图的深度优先和广度优先算法实例分析
2019/10/26 Python
Pytorch使用MNIST数据集实现CGAN和生成指定的数字方式
2020/01/10 Python
python变量的作用域是什么
2020/05/26 Python
python用700行代码实现http客户端
2021/01/14 Python
瑞典手机壳品牌:Richmond & Finch
2018/04/28 全球购物
英国露营设备和户外服装购物网站:Simply Hike
2019/05/05 全球购物
Java工程师面试集锦之Spring框架
2013/06/16 面试题
货代行业个人求职简历的自我评价
2013/10/22 职场文书
点菜员岗位职责范本
2014/02/14 职场文书
艺校音乐专业自我鉴定范文
2014/03/01 职场文书
公司廉洁自律承诺书
2014/03/27 职场文书
党员考试作弊检讨书1000字
2015/02/16 职场文书
2015年乡镇扶贫工作总结
2015/04/08 职场文书
Pytorch DataLoader shuffle验证方式
2021/06/02 Python