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 动画弹出窗体支持多种展现方式
Apr 29 Javascript
学习并汇集javascript匿名函数
Nov 25 Javascript
js倒计时小程序
Nov 05 Javascript
javascript实现数字验证码的简单实例
Feb 10 Javascript
js设置document.domain实现跨域的注意点分析
May 21 Javascript
超精准的javascript验证身份证号的具体实现方法
Nov 18 Javascript
基于JS如何实现给字符加千分符(65,541,694,158)
Aug 03 Javascript
vue2.0构建单页应用最佳实战
Apr 01 Javascript
JavaScript引用类型Function实例详解
Aug 09 Javascript
浅谈JavaScript闭包
Apr 09 Javascript
实用的Vue开发技巧
May 30 Javascript
js正则表达式简单校验方法
Jan 03 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
重置版战役片段
2020/04/09 魔兽争霸
用在PHP里的JS打印函数
2006/10/09 PHP
PHP 批量删除数据的方法分析
2009/10/30 PHP
php提交表单时判断 if($_POST[submit])与 if(isset($_POST[submit])) 的区别
2011/02/08 PHP
采用thinkphp自带方法生成静态html文件详解
2014/06/13 PHP
非常重要的php正则表达式详解
2016/01/04 PHP
PHP获取ttf格式文件字体名的方法示例
2019/03/06 PHP
Javascript操纵Cookie实现购物车程序
2007/02/15 Javascript
javascript 关闭IE6、IE7
2009/06/01 Javascript
深入理解JavaScript定时机制
2010/10/29 Javascript
通过JS来判断页面控件是否获取焦点
2014/01/03 Javascript
AngularJS iframe跨域打开内容时报错误的解决办法
2015/01/26 Javascript
元素绑定click点击事件方法
2015/06/08 Javascript
javascript跨域方法、原理以及出现问题解决方法(详解)
2015/08/06 Javascript
javascript实现方法调用与方法触发小结
2016/03/26 Javascript
Angular2学习教程之组件中的DOM操作详解
2017/05/28 Javascript
JavaScript事件方法(实例讲解)
2017/06/27 Javascript
详解vue页面首次加载缓慢原因及解决方案
2019/11/06 Javascript
Vue.js实现大屏数字滚动翻转效果
2019/11/29 Javascript
vue props 单项数据流实例分享
2020/02/16 Javascript
[07:57]2018DOTA2国际邀请赛寻真——PSG.LGD凤凰浴火
2018/08/12 DOTA
[51:50]完美世界DOTA2联赛 Magma vs GXR 第一场 11.07
2020/11/10 DOTA
用Python实现命令行闹钟脚本实例
2016/09/05 Python
python字符串,数值计算
2016/10/05 Python
python类中super()和__init__()的区别
2016/10/18 Python
python3.6+django2.0开发一套学员管理系统
2018/03/03 Python
Python实现读取txt文件并转换为excel的方法示例
2018/05/17 Python
一篇文章弄懂Python中所有数组数据类型
2019/06/23 Python
基于python进行抽样分布描述及实践详解
2019/09/02 Python
基于Python爬取股票数据过程详解
2020/10/21 Python
Nike英国官网:Nike.com (UK)
2017/02/13 全球购物
改变生活的男士内衣:SAXX Underwear
2019/08/28 全球购物
Lancer Skincare官方网站:抗衰老皮肤护理
2020/11/20 全球购物
英国银首饰公司:e&e Jewellery
2021/02/11 全球购物
大学生创业计划书的范文
2014/01/07 职场文书
学习党史心得体会2016
2016/01/23 职场文书