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 相关文章推荐
jquery 提示信息显示后自动消失的具体实现
Dec 18 Javascript
Jquery实现Div上下移动示例
Apr 23 Javascript
jQuery中has()方法用法实例
Jan 06 Javascript
jquery插件之文字间歇自动向上滚动效果代码
Feb 25 Javascript
理解js回收机制通俗易懂版
Feb 29 Javascript
jQuery实现右下角可缩放大小的层完整实例
Jun 20 Javascript
vue页面使用阿里oss上传功能的实例(二)
Aug 09 Javascript
jQuery中常用动画效果函数知识点整理
Aug 19 jQuery
Vue.set()动态的新增与修改数据,触发视图更新的方法
Sep 15 Javascript
微信小程序中使用Async-await方法异步请求变为同步请求方法
Mar 28 Javascript
实用Javascript调试技巧分享(小结)
Jun 18 Javascript
js实现简单页面全屏
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
PHP 双链表(SplDoublyLinkedList)简介和使用实例
2015/05/12 PHP
CI框架数据库查询缓存优化的方法
2016/11/21 PHP
PHP合并数组函数array_merge用法分析
2017/02/17 PHP
[原创]PHP获取数组表示的路径方法分析【数组转字符串】
2017/09/01 PHP
Thinkphp框架+Layui实现图片/文件上传功能分析
2020/02/07 PHP
Swoole扩展的6种模式深入详解
2021/03/04 PHP
JS 文字符串转换unicode编码函数
2009/05/30 Javascript
Js sort排序使用方法
2011/10/17 Javascript
详解JavaScript对Date对象的操作问题(生成一个倒数7天的数组)
2015/10/01 Javascript
js获取当前日期时间及其它日期操作汇总
2016/03/08 Javascript
vue.js入门教程之基础语法小结
2016/09/01 Javascript
详解使用Visual Studio Code对Node.js进行断点调试
2017/09/14 Javascript
AngularJs分页插件使用详解
2018/06/30 Javascript
详解小程序缓存插件(mrc)
2018/08/17 Javascript
浅谈angular表单提交中ng-submit的默认使用方法
2018/09/30 Javascript
微信小程序开发之tabbar图标和颜色的实现
2018/10/17 Javascript
[01:32]DOTA2 2015国际邀请赛中国区预选赛第四日战报
2015/05/29 DOTA
python连接oracle数据库实例
2014/10/17 Python
Python写入数据到MP3文件中的方法
2015/07/10 Python
在Python的Django框架中编写错误提示页面
2015/07/22 Python
Python打印“菱形”星号代码方法
2018/02/05 Python
详解Python数据分析--Pandas知识点
2019/03/23 Python
numpy下的flatten()函数用法详解
2019/05/27 Python
python操作gitlab API过程解析
2019/12/27 Python
python不同版本的_new_不同点总结
2020/12/09 Python
往来会计岗位职责
2013/12/19 职场文书
群众路线教育实践活动方案
2014/02/02 职场文书
房屋转让协议书
2014/04/11 职场文书
平安家庭示范户事迹
2014/06/02 职场文书
毕业实习指导教师评语
2014/12/31 职场文书
4S店销售内勤岗位职责
2015/04/13 职场文书
2015领导干部廉洁自律工作总结
2015/07/23 职场文书
2015国庆节放假通知范文
2015/07/30 职场文书
2016大学迎新晚会开场白
2015/11/24 职场文书
vue中data改变后让视图同步更新的方法
2021/03/29 Vue.js
python 如何将两个实数矩阵合并为一个复数矩阵
2021/05/19 Python