五个小球完全弹性碰撞
2013-11-07 19:19
381 查看
实例网址http://runjs.cn/code/g9jukpct
<!DOCTYPE HTML>
<html>
<head>
<script>
window.onload=function(){
var canvas=document.getElementById("ball");
var cxt=canvas.getContext("2d");
var r=20;
var maxNum=5;
var ballArray=new Array();
var maxX=canvas.width;
var maxY=canvas.height;
for(var n=0;n<maxNum;n++){
var x={
x:getRandomNumber(r, maxX-r),
y:getRandomNumber(r, maxY-r),
r:r,
vX:getRandomNumber(0.5, 1),
vY:getRandomNumber(0.5,1),
color:getRandomColor(),
}
ballArray.push(x);
}
function getRandomColor(){
return (function(m,s,c){
return (c ? arguments.callee(m,s,c-1) : '#') +
s[m.floor(m.random() * 16)]
})(Math,'0123456789abcdef',5)
}
draw();
function draw(){
cxt.fillStyle="#000";
cxt.fillRect(0,0,canvas.width,canvas.height);
for (i in ballArray){
var x=i;
ballArray[i].x+=ballArray[i].vX;
ballArray[i].y+=ballArray[i].vY;
if(ballArray[i].x>=maxX-r){
ballArray[i].x=maxX-r;
ballArray[i].vX=-ballArray[i].vX;
}
if(ballArray[i].x<=r){
ballArray[i].x=r;
ballArray[i].vX=-ballArray[i].vX;
}
if(ballArray[i].y>=maxY-r){
ballArray[i].y=maxY-r;
ballArray[i].vY=-ballArray[i].vY;
}
if(ballArray[i].y<=r){
ballArray[i].y=r;
ballArray[i].vY=-
ballArray[i].vY;
}
for(var j=0;j<maxNum;j++)
if(j!==x){
if(Math.round(Math.pow(ballArray[x].x-ballArray[j].x,2)+
Math.pow(ballArray[x].y-ballArray[j].y,2)) <=
Math.round(Math.pow(r+r,2)))
{
var tempX=ballArray[x].vX;
var tempY=ballArray[x].vY;
ballArray[x].vX=ballArray[j].vX;
ballArray[j].vX=tempX;
ballArray[x].vY=ballArray[j].vY;
ballArray[j].vY=tempY;
}
}
cxt.beginPath();
cxt.fillStyle=ballArray[i].color;
cxt.arc(ballArray[i].x,ballArray[i].y,ballArray[i].r,0,Math.PI*2,true);
cxt.closePath();
cxt.fill();
}
setTimeout(function(){draw();},1);
}
function getRandomNumber(min, max) {
return (min + Math.floor(Math.random() * (max - min + 1)))
}
}
</script>
</head>
<body>
<canvas id="ball" width="500" height="200" style=" border:2px"></canvas>
</body>
</html>
<!DOCTYPE HTML>
<html>
<head>
<script>
window.onload=function(){
var canvas=document.getElementById("ball");
var cxt=canvas.getContext("2d");
var r=20;
var maxNum=5;
var ballArray=new Array();
var maxX=canvas.width;
var maxY=canvas.height;
for(var n=0;n<maxNum;n++){
var x={
x:getRandomNumber(r, maxX-r),
y:getRandomNumber(r, maxY-r),
r:r,
vX:getRandomNumber(0.5, 1),
vY:getRandomNumber(0.5,1),
color:getRandomColor(),
}
ballArray.push(x);
}
function getRandomColor(){
return (function(m,s,c){
return (c ? arguments.callee(m,s,c-1) : '#') +
s[m.floor(m.random() * 16)]
})(Math,'0123456789abcdef',5)
}
draw();
function draw(){
cxt.fillStyle="#000";
cxt.fillRect(0,0,canvas.width,canvas.height);
for (i in ballArray){
var x=i;
ballArray[i].x+=ballArray[i].vX;
ballArray[i].y+=ballArray[i].vY;
if(ballArray[i].x>=maxX-r){
ballArray[i].x=maxX-r;
ballArray[i].vX=-ballArray[i].vX;
}
if(ballArray[i].x<=r){
ballArray[i].x=r;
ballArray[i].vX=-ballArray[i].vX;
}
if(ballArray[i].y>=maxY-r){
ballArray[i].y=maxY-r;
ballArray[i].vY=-ballArray[i].vY;
}
if(ballArray[i].y<=r){
ballArray[i].y=r;
ballArray[i].vY=-
ballArray[i].vY;
}
for(var j=0;j<maxNum;j++)
if(j!==x){
if(Math.round(Math.pow(ballArray[x].x-ballArray[j].x,2)+
Math.pow(ballArray[x].y-ballArray[j].y,2)) <=
Math.round(Math.pow(r+r,2)))
{
var tempX=ballArray[x].vX;
var tempY=ballArray[x].vY;
ballArray[x].vX=ballArray[j].vX;
ballArray[j].vX=tempX;
ballArray[x].vY=ballArray[j].vY;
ballArray[j].vY=tempY;
}
}
cxt.beginPath();
cxt.fillStyle=ballArray[i].color;
cxt.arc(ballArray[i].x,ballArray[i].y,ballArray[i].r,0,Math.PI*2,true);
cxt.closePath();
cxt.fill();
}
setTimeout(function(){draw();},1);
}
function getRandomNumber(min, max) {
return (min + Math.floor(Math.random() * (max - min + 1)))
}
}
</script>
</head>
<body>
<canvas id="ball" width="500" height="200" style=" border:2px"></canvas>
</body>
</html>
相关文章推荐
- 增加难度的抽签问题(最内层使用二分法)
- What does grep stand for in Linux operating system?
- hdu 1544 水题
- php应用数据库连接中的单例模式
- 【Android】菜单功能的实现:使用Java代码
- 将java源码打成jar包的两种方法
- WordPress Think Responsive Themes ‘upload_settings_image.php’任意文件上传漏洞
- DELL-linux-风扇
- 有关爬虫的
- 如何设置ubuntu和redhat网络接口
- 长英文自动换行的最终解决方法
- C语言结构体
- C#中 托管资源和非托管资源
- hdu2087
- Linux Kernel ‘write_tag_3_packet()’函数本地基于堆的缓冲区溢出漏洞
- Linux Kernel 整数溢出漏洞
- 网络体系结构(OSI七层模型)介绍
- javascript null与undefined
- Linux Kernel ‘drivers/staging/wlags49_h2/wl_priv.c’本地缓冲区溢出漏洞
- 【iOS开发】---- 表格滚动时隐藏及显示导航条和标签栏