html5碰撞小球模拟
这里根据动量守恒和能量守恒定理来计算小球的位置,从而模拟完全弹性碰撞下的小球运行轨迹。
html代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script class="jquery library" src="/js/sandbox/jquery/jquery-1.8.2.min.js" type="text/javascript"></script>
<title>碰撞小球</title>
</head>
<body>
<canvas id='box' width="300" height="300" style="border:2px; background:black;">
</canvas>
</body>
</html>
js代码:
//get a random color to render the ball
function getRandomColor(){
return (function(m,s,c){
return (c ? arguments.callee(m,s,c-1) : '#') +
s[m.floor(m.random() * 16)]
})(Math,'0123456789abcdef',5)
} //get a random number between min and max
function getRandomNumber(min, max) {
return min + Math.ceil(Math.random() * (max - min));
} var balls = [];
var ballCount = 4;
var boxLen = 300; function createBall() {
var r = getRandomNumber(10,20);
var ball = {
m:r,
r:r,
x:getRandomNumber(0,boxLen-2*r),
y:getRandomNumber(0,boxLen-2*r),
vx:getRandomNumber(1,3),
vy:getRandomNumber(1,3),
color:getRandomColor()
};
return ball;
} //test collision
function checkCollision(b1, b2) {
var dx = b1.x - b2.x;
var dy = b1.y - b2.y;
var dist = Math.ceil(Math.sqrt(dx * dx + dy * dy));
return dist < b1.r + b2.r;
} //initialize the balls
for(var i = 0; i < ballCount; i++) {
var collision = false;
while(true) {
var b = createBall();
for(var j = 0; j < i; j++) {
collision = checkCollision(b,balls[j]);
if(collision) break;
}
if(!collision) {
balls[i] = b;
break;
}
}
} function calcV(m1, m2, v1, v2) {
return ((m1 - m2) * v1 + 2 * m2 * v2) / (m1 + m2);
} function draw() {
//handle collisions
for(var i = 0; i < balls.length; i++) {
for(var j = i + 1; j < balls.length; j++) {
if(checkCollision(balls[i],balls[j])) {
var b1 = balls[i], b2 = balls[j];
var v1 = { x : b1.vx, y : b1.vy };
var v2 = { x : b2.vx, y : b2.vy };
b1.vx = calcV(b1.m, b2.m, v1.x, v2.x);
b1.vy = calcV(b1.m, b2.m, v1.y, v2.y);
b2.vx = calcV(b2.m, b1.m, v2.x, v1.x);
b2.vy = calcV(b2.m, b1.m, v2.y, v1.y);
}
}
} //move the balls
for(var i in balls) {
var b = balls[i];
b.x += b.vx;
b.y += b.vy;
var closeSide = false;
var maxPos = boxLen - 2 * b.r;
if(b.x < 0) {
b.x = 0;
closeSide = true;
} else if(b.x > maxPos) {
b.x = maxPos;
closeSide = true;
}
if(closeSide)
b.vx = -1 * b.vx;
closeSide = false;
if(b.y < 0) {
b.y = 0;
closeSide = true;
} else if(b.y > maxPos) {
b.y = maxPos;
closeSide = true;
}
if(closeSide)
b.vy = -1 * b.vy;
} //draw the balls
var canvas = document.getElementById('box');
var ctx = canvas.getContext('2d');
ctx.fillStyle = "#000";
ctx.fillRect(0,0,canvas.width, canvas.height);
for(var i in balls) {
var b = balls[i];
ctx.beginPath();
ctx.arc(b.x+b.r, b.y+b.r, b.r, 0, 2 * Math.PI,true);
ctx.closePath();
ctx.fillStyle = b.color;
ctx.fill();
}
setTimeout(draw,10);
} draw();
html5碰撞小球模拟的更多相关文章
- html5 滚动小球
<html> <head> <meta charset="utf-8"/> </head> <body onkeydown=& ...
- VUE错误记录 - 小球模拟购物车
<body> <div id="app"> <input type="button" value="Add to Car ...
- (NO.00004)iOS实现打砖块游戏(八):游戏中小球与砖块的碰撞
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 现在回到GameScene.m中,我们所有的碰撞处理就放在该类中 ...
- js实现多个小球碰撞
实现思路:小球的移动,是通过改变小球的left和top值来改变,坐标分别为(x,y)当x/y值加到最大,即加到父级的宽度或者高度时,使x值或者y值减小,同理当x值或者y值减到最小时,同样的使x值或者y ...
- [Canvas]碰撞球 增加小球间碰撞检测
请点此下载代码并用Chrome或是Firefox打开index.html 图例: 代码: <!DOCTYPE html> <html lang="utf-8"&g ...
- 基于Seajs的可控台球碰撞游戏
前言 不记得哪个黑色星期五,贪吃鱼基本完工的时候,产品突然增加需求,要求金币扔出去后不消失,互相可碰撞,其最终结果还要由服务器控制(没错,至今做的所有游戏都有幕后黑手,=W=). 对于碰撞以前只写过一 ...
- 7个惊艳的HTML5 Canvas动画效果及源码
HTML5非常强大,尤其是现在大部分浏览器都支持HTML5和CSS3,用HTML5制作的动画也多了起来.另外,Canvas上绘制图形非常简单,本文就分享了一些强大的HTML5 Cnavas动画,一起来 ...
- 8款HTML5动画特效推荐源码
1.HTML5 Canvas发光Loading动画 之前我们分享过很多基于CSS3的Loading动画效果,相信大家都很喜欢.今天我们要来分享一款基于HTML5 Canvas的发光Loading加载动 ...
- 10款强大的jQuery/HTML5应用新鲜出炉
1.CSS3/jQuery自定义弹出窗口 多种弹出动画 这是一款利用jQuery和CSS3实现的自定义弹出窗口,这可比浏览器默认的弹出窗口漂亮多了.弹出窗口中可以自定义html,十分灵活.另外最重要的 ...
随机推荐
- 2)Java中的==和equals
Java中的==和equals 1.如果比较对象是值变量:只用== 2.如果比较对象是引用型变量: ==:比较两个引用是不是指向同一个对象实例. equals: ...
- delphi 基础之二 面向对象概念初步
面向对象概念初步 •类自动生成 快捷键:ctrl+shift+c 1.类的定义 类是用户创建的数据类型,包括状态.表达式和一些操作.有3个组成部分,即字段.方法和属性.字段是类的内部数据变量,方法就是 ...
- 实战Django:官方实例Part5
俗话说,人非圣贤,孰能无过.在堆代码的过程中,即便是老攻城狮,也会写下一些错误的内容.俗话又说,过而能改,善莫大焉.要改,首先要知道哪里存在错误,这便是我们要对投票应用进行测试的原因. 21.撰写 ...
- openerp 常见问题 OpenERP为什么选择了时区后时间还是不对?(转载)
OpenERP为什么选择了时区后时间还是不对? 原文地址:http://cn.openerp.cn/%E4%B8%BA%E4%BB%80%E4%B9%88%E9%80%89%E6%8B%A9%E4%B ...
- Ruby求出数组中最小值及其下标
其实很简单 Ruby的Array类自带了min方法可以求出最小值,然后调用Array的index方法传入元素值就可以求出下标 a = [1, 2, 3, 4, 5, 6] theMin = a.min ...
- C++中int *p[4]和 int (*q)[4]的区别
这俩兄弟长得实在太像,以至于经常让人混淆.然而细心领会和甄别就会发现它们大有不同. 前者是指针数组,后者是指向数组的指针.更详细地说. 前: 指针数组;是一个元素全为指针的数组.后: 数组指针;可以直 ...
- Http协议[Get和Post]详解
(2012-11-27 11:23:26) 标签: android http get post mars 分类: Android系列 访问url,需要连接网络.所以,首先应该添加Manifest权限: ...
- 正益工作是何许APP?凭什么作为第一届大会的“闪亮”点
参加过很多发布会,看过很多宣传稿,渐渐的你也读懂了“大会亮点”,这是技术人.市场人绞尽脑汁.加班加点的成果,更渗透着企业未来的战略思路.在2016AppCan移动开发者大会的官方新闻发布后,很多人留言 ...
- Oracle 12c 数据库中scott用户不存在的解决方法
-- 使用超级管理员登录CONN sys/change_on_install AS SYSDBA ;-- 创建c##scott用户CREATE USER c##scott IDENTIFIED BY ...
- jquery 源码学习(一)
从上边的注释看,jQuery的源码结构相当清晰.条理,不像代码那般晦涩和让人纠结 1. 总体架构 1.1 自调用匿名函数 self-invoking anonymous function 打开jQ ...