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中获取选中对象的类型
Apr 02 Javascript
js将控件隐藏的方法及display属性介绍
Jul 04 Javascript
document.forms[].submit()使用介绍
Feb 19 Javascript
使用JS获取当前地理位置方法汇总
Dec 18 Javascript
JavaScript学习笔记之数组随机排序
Mar 23 Javascript
使用jquery提交form表单并自定义action的实现代码
May 25 Javascript
JS判断非空至少输入两个字符的简单实现方法
Jun 23 Javascript
jQuery 禁止表单用户名、密码自动填充功能
Oct 30 jQuery
JavaScript函数、闭包、原型、面向对象学习笔记
Sep 06 Javascript
在Vue中获取组件声明时的name属性方法
Sep 12 Javascript
产制造追溯系统之通过微信小程序实现移动端报表平台
Jun 03 Javascript
JS将指定的某个字符全部转换为其他字符实例代码
Oct 13 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
完美解决dedecms中的[html][/html]和[code][/code]问题
2007/03/20 PHP
奇怪的PHP引用效率问题分析
2012/03/23 PHP
php需登录的文件上传管理系统
2020/03/21 PHP
php生成图片缩略图功能示例
2017/02/22 PHP
php文件包含的几种方式总结
2019/09/19 PHP
在网页中屏蔽快捷键
2006/09/06 Javascript
Javascript 获取LI里的内容
2008/12/17 Javascript
JavaScript 判断用户输入的邮箱及手机格式是否正确
2013/12/08 Javascript
javascript实现方法调用与方法触发小结
2016/03/26 Javascript
JavaScript Date对象应用实例分享
2017/10/30 Javascript
js 获取json数组里面数组的长度实例
2017/10/31 Javascript
vue添加axios,并且指定baseurl的方法
2018/09/19 Javascript
JavaScript常见继承模式实例小结
2019/01/11 Javascript
微信小程序模板消息限制实现无限制主动推送的示例代码
2019/08/27 Javascript
Javascript异步流程控制之串行执行详解
2020/09/27 Javascript
[01:24:51]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS NewBee第二场
2014/05/26 DOTA
[00:39]DOTA2上海特级锦标赛 Liquid战队宣传片
2016/03/04 DOTA
python win32 简单操作方法
2017/05/25 Python
python入门教程 python入门神图一张
2018/03/05 Python
Python使用combinations实现排列组合的方法
2018/11/13 Python
Python根据成绩分析系统浅析
2019/02/11 Python
在Python中合并字典模块ChainMap的隐藏坑【推荐】
2019/06/27 Python
Python中正反斜杠(‘/’和‘\’)的意义与用法
2019/08/12 Python
Scrapy爬虫文件批量运行的实现
2020/09/30 Python
Python爬虫之Selenium多窗口切换的实现
2020/12/04 Python
美国维生素、补充剂、保健食品购物网站:Vitacost
2016/08/05 全球购物
PHP面试题附答案
2015/11/28 面试题
办公室岗位职责
2014/02/12 职场文书
幼儿教师研修感言
2014/02/12 职场文书
安全生产承诺书范文
2014/05/22 职场文书
公务员培的训心得体会
2014/09/01 职场文书
防灾减灾标语
2014/10/07 职场文书
社区党的群众路线教育实践活动剖析材料
2014/10/09 职场文书
明确岗位职责
2015/02/14 职场文书
带你学习MySQL执行计划
2021/05/31 MySQL
APP界面设计技巧和注意事项
2022/04/29 杂记