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 相关文章推荐
JavaScript 入门·JavaScript 具有全范围的运算符
Oct 01 Javascript
jQuery 创建Dom元素
May 07 Javascript
Pro JavaScript Techniques学习笔记
Dec 28 Javascript
C#中TrimStart,TrimEnd,Trim在javascript上的实现
Jan 17 Javascript
jQuery代码优化 遍历篇
Nov 01 Javascript
JQuery 控制内容长度超出规定长度显示省略号
May 23 Javascript
jQuery得到多个值只能用取Class ,不能用取ID的方法
Dec 04 Javascript
性能优化之代码优化页面加载速度
Mar 01 Javascript
微信小程序 ES6Promise.all批量上传文件实现代码
Apr 14 Javascript
为什么使用koa2搭建微信第三方公众平台的原因
May 16 Javascript
axios使用拦截器统一处理所有的http请求的方法
Nov 02 Javascript
原生JS实现飞机大战小游戏
Jun 09 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
eWebEditor v3.8 商业完整版 (PHP)
2006/12/06 PHP
用mysql触发器自动更新memcache的实现代码
2009/10/11 PHP
ThinkPHP框架实现的MySQL数据库备份功能示例
2018/05/24 PHP
ThinkPHP3.2.3框架Memcache缓存使用方法实例总结
2019/04/15 PHP
PHP判断一个变量是否为整数、正整数的方法示例
2019/09/11 PHP
php进行md5加密简单实例方法
2019/09/19 PHP
PHP8.0新功能之Match表达式的使用
2020/07/19 PHP
excel操作之Add Data to a Spreadsheet Cell
2007/06/12 Javascript
js封装的textarea操作方法集合(兼容很好)
2010/11/16 Javascript
解析jQuery的三种bind/One/Live事件绑定使用方法
2013/12/30 Javascript
jQuery实现异步获取json数据的2种方式
2014/08/29 Javascript
javascript实现验证IP地址等相关信息代码
2015/05/10 Javascript
jQuery实现ctrl+enter(回车)提交表单
2015/10/19 Javascript
第七章之菜单按钮图标组件
2016/04/25 Javascript
微信小程序 获取相册照片实例详解
2016/11/16 Javascript
深入理解JavaScript创建对象的多种方式以及优缺点
2017/06/01 Javascript
Angular实现点击按钮后在上方显示输入内容的方法
2017/12/27 Javascript
微信小程序拍照和摄像功能实现方法示例
2019/02/01 Javascript
JS将时间秒转换成天小时分钟秒的字符串
2019/07/10 Javascript
vue 框架下自定义滚动条(easyscroll)实现方法
2019/08/29 Javascript
使用layer弹窗,制作编辑User信息页面的方法
2019/09/27 Javascript
vue 对axios get pust put delete封装的实例代码
2020/01/05 Javascript
js+css3实现简单时钟特效
2020/09/13 Javascript
Python使用百度API上传文件到百度网盘代码分享
2014/11/08 Python
git查看、创建、删除、本地、远程分支方法详解
2020/02/18 Python
整理HTML5中表单的常用属性及新属性
2016/02/19 HTML / CSS
屈臣氏菲律宾官网:Watsons菲律宾
2020/06/30 全球购物
应届医学毕业生求职信分享
2013/12/02 职场文书
媒矿安全生产承诺书
2014/05/23 职场文书
党员个人剖析材料
2014/09/30 职场文书
2014年健康教育工作总结
2014/11/20 职场文书
2015年植树节活动总结
2015/02/06 职场文书
升学宴学生致辞
2015/09/29 职场文书
SpringBoot整合RabbitMQ的5种模式实战
2021/08/02 Java/Android
OpenCV实现反阈值二值化
2021/11/17 Java/Android
MongoDB使用场景总结
2022/02/24 MongoDB