[Canvas]更多的球
欲观看动态效果请点此下载代码并用Chrome或者Firefox打开。
图例:
代码:
- <!DOCTYPE html>
- <html lang="utf-8">
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
- <head>
- <title>更多碰撞球 19.3.4 8:53 by:逆火狂飙 horn19782016@163.com</title>
- <style>
- #canvas{
- background:#ffffff;
- cursor:pointer;
- margin-left:10px;
- margin-top:10px;
- -webkit-box-shadow:3px 3px 6px rgba(0,0,0,0.5);
- -moz-box-shadow:3px 3px 6px rgba(0,0,0,0.5);
- box-shadow:3px 3px 6px rgba(0,0,0,0.5);
- }
- #controls{
- margin-top:10px;
- margin-left:15px;
- }
- </style>
- </head>
- <body onload="init()">
- <div id="controls">
- <input id='animateBtn' type='button' value='运动'/>
- </div>
- <canvas id="canvas" width="750px" height="500px" >
- 出现文字表示你的浏览器不支持HTML5
- </canvas>
- </body>
- </html>
- <script type="text/javascript">
- <!--
- var paused=true;
- animateBtn.onclick=function(e){
- paused=! paused;
- if(paused){
- animateBtn.value="运动";
- }else{
- animateBtn.value="暂停";
- window.requestAnimationFrame(animate);
- }
- }
- //生成从minNum到maxNum的随机数
- function randomNum(minNum,maxNum){
- switch(arguments.length){
- case 1:
- return parseInt(Math.random()*minNum+1,10);
- break;
- case 2:
- return parseInt(Math.random()*(maxNum-minNum+1)+minNum,10);
- break;
- default:
- return 0;
- break;
- }
- }
- var ctx;// 绘图环境
- var balls=[];// 球数组
- function init(){
- var canvas=document.getElementById('canvas');
- canvas.width=750;
- canvas.height=500;
- ctx=canvas.getContext('2d');
- for(var i=0;i<500;i++){
- var ball={};
- ball.x=randomNum(0,canvas.width);
- ball.y=randomNum(0,canvas.height);
- ball.vx=randomNum(-10,10);
- ball.vy=randomNum(-10,10);
- ball.radius=25;
- var r=randomNum(0,255);
- var g=randomNum(0,255);
- var b=randomNum(0,255);
- ball.innerColor='rgba('+r+','+g+','+b+',1)';
- ball.middleColor='rgba('+r+','+g+','+b+',0.5)';
- ball.outerColor='rgba('+r+','+g+','+b+',0.3)';
- ball.strokeStyle='rgba('+r+','+g+','+b+')';
- balls.push(ball);
- }
- };
- function update(){
- for(var i=0;i<balls.length;i++){
- var ball=balls[i];
- // 与左右墙壁的碰撞检测
- if(ball.x+ball.vx+ball.radius>ctx.canvas.width || ball.x+ball.vx-ball.radius<0){
- ball.vx=-ball.vx;
- }
- // 与上下墙壁的碰撞检测
- if(ball.y+ball.vy+ball.radius>ctx.canvas.height || ball.y+ball.vy-ball.radius<0){
- ball.vy=-ball.vy;
- }
- // 小球之前的碰撞检测
- for(var j=0;j<balls.length;j++){
- if(i!=j){
- var other=balls[j];
- var distance=Math.sqrt( Math.pow((ball.x+ball.vx-other.x-other.vx),2)+Math.pow((ball.y+ball.vy-other.y-other.vy),2));
- if(distance<ball.radius+other.radius){
- // 如果两个碰撞小球的质量相等,联立动量守恒和能量守恒方程时可解得:两个小球碰撞后交换速度。
- var x=ball.vx;
- ball.vx=other.vx;
- other.vx=x;
- var y=ball.vy;
- ball.vy=other.vy;
- other.vy=y;
- }
- }
- }
- ball.x+=ball.vx;
- ball.y+=ball.vy;
- }
- }
- function draw(){
- ctx.clearRect(0,0,ctx.canvas.width,ctx.canvas.height);
- for(var i=0;i<balls.length;i++){
- var ball=balls[i];
- gradient=ctx.createRadialGradient(ball.x,ball.y,0,ball.x,ball.y,ball.radius);
- gradient.addColorStop(0.3,ball.innerColor);
- gradient.addColorStop(0.5,ball.middleColor);
- gradient.addColorStop(1.0,ball.outerColor);
- ctx.save();
- ctx.beginPath();
- ctx.arc(ball.x,ball.y,ball.radius,0,Math.PI*2,false);
- ctx.fillStyle=gradient;
- ctx.strokeStyle=ball.strokeStyle;
- ctx.fill();
- ctx.stroke();
- ctx.restore();
- }
- }
- function animate(){
- if(!paused){
- update();
- draw();
- setTimeout( function(){
- window.requestAnimationFrame(animate); /// 让浏览器自行决定帧速率
- }, 0.10 * 1000 );// 延时执行
- }
- }
- //-->
- </script>
2019年3月4日09点12分
[Canvas]更多的球的更多相关文章
- 简单的运动学,用canvas写弹力球
声明:本文为原创文章,如需转载,请注明来源WAxes,谢谢! 跟之前的随笔一样,因为本人仍是菜鸟一只,所以用到的技术比较简单,不适合大神观看...... 学canvas学了有一个多礼拜了,觉得canv ...
- THREE.js代码备份——canvas - geometry - earth(球体贴纹理)
<!DOCTYPE html> <html lang="en"> <head> <title>three.js canvas - g ...
- Android核心分析之二十八Android GDI之Surface&Canvas
Surface&Canvas Canvas为在画布的意思.Android上层的作图几乎都通过Canvas实例来完成,其实Canvas更多是一种接口的包装.drawPaints ,drawPoi ...
- canvas动画气球
canvas小球的动画我用canvas画布实现的小球动画效果,可以参考下 我用canvas画布实现的小球动画效果,可以参考下 我用canvas画布实现的小球动画效果,可以参考下 我用canvas画布实 ...
- 从0开发3D引擎(四):搭建测试环境
目录 上一篇博文 了解自动化测试 单元测试 集成测试 端对端测试 通过打印日志来调试 了解运行测试 断点调试 通过Spector.js测试WebGL 通过log调试Shader 移动端测试 了解性能测 ...
- 【转载】VC维的来龙去脉
本文转载自 火光摇曳 原文链接:VC维的来龙去脉 目录: 说说历史 Hoeffding不等式 Connection to Learning 学习可行的两个核心条件 Effective Number o ...
- android图形基础知识
Android核心分析(23)-----Andoird GDI之基本原理及其总体框架 2010-06-13 22:49 18223人阅读 评论(18) 收藏 举报 AndroidGDI基本框架 在An ...
- 机器学习之支持向量机(SVM)
支持向量机 百度百科(基本看不懂):http://baike.baidu.com/link?url=Z4MU6AYlf5lOX7UGHVYg9tBvxBGOkriPtNt0DixmscnMz06q5f ...
- VC维的来龙去脉——转载
VC维的来龙去脉——转载自“火光摇曳” 在研究VC维的过程中,发现一篇写的很不错的VC维的来龙去脉的文章,以此转载进行学习. 原文链接,有兴趣的可以参考原文进行研究学习 目录: 说说历史 Hoeffd ...
随机推荐
- CRC 概述
Acquired from: ftp.adelaide.edu.au:/pub/rocksoft/crc_v3.txt or ftp://ftp.rocksoft.com/papers/crc_v3. ...
- PHP 7 来了,PHP 6 去哪儿了?
PHP7来了,那么PHP6去哪儿了呢? PHP7简介 PHP7是PHP编程语言全新的一个版本,主要在性能方面获得了极大的提升.官方的文档显示,PHP7可以达到PHP5.x版本两倍的性能.同时还 对PH ...
- 多用StringBuilder,少用字符串拼接
在C#中,在处理字符串拼接的时候,使用StringBuilder的效率会比硬拼接字符串高很多.到底有多高,如下: static void Main(string[] args) { string st ...
- 发布网站时应该把debug设置false
在ASP.NET项目根目录下的Web.config中有这样的一个节点: <compilation debug="true" targetFramework="4.5 ...
- Java Calendar,Date,DateFormat,TimeZone,Locale等时间相关内容的认知和使用(6) Locale
本章介绍Locale. 1 Locale 介绍 Locale 表示地区.每一个Locale对象都代表了一个特定的地理.政治和文化地区. 在操作 Date, Calendar等表示日期/时间的对象时,经 ...
- ios 获得通讯录中联系人的所有属性 亲测,可行 兼容io6 和 ios 7
//获取通讯录中的所有属性,并存储在 textView 中,已检验,切实可行.兼容io6 和 ios 7 ,而且ios7还没有权限确认提示. -(void)getAddressBook { ABAdd ...
- zTree树
<link rel="stylesheet" href="/static/zTreeV3/css/metroStyle/metroStyle.css" t ...
- 【docker】【Gitlab】gitlab中clone项目时,IP地址是一串数字(内网Gitlab的IP地址不正确)的问题解决
首次在内网搭建Gitlab环境,在成功后在Gitlab上新建了一个项目. 然而在IDEA上clone项目时发现,项目地址如下: git@0096ce63c43f:root/jump.git 或者这样 ...
- Linux内核:分析coredump文件 - 内核代码崩溃
转自:http://blog.csdn.net/guowenyan001/article/details/12975221 一.分析Core文件 1.1 找到core文件目录,启动mycrash:my ...
- Spring+Velocity(平台升级至Spring Framework 5.0.2)
下载: http://repo.spring.io/release/org/springframework/spring/ Dear Spring community, I’m pleased to ...