They just move,if they find a 'friend' they get bigger
A Pen by A Non Ymous on CodePen.
They just move,if they find a 'friend' they get bigger
A Pen by A Non Ymous on CodePen.
| <canvas></canvas> |
| var canvas = document.querySelector('canvas'), | |
| ctx = canvas.getContext('2d'), | |
| particles = [], | |
| patriclesNum = 500, | |
| w = 500, | |
| h = 500, | |
| colors = ['#f35d4f','#f36849','#c0d988','#6ddaf1','#f1e85b']; | |
| canvas.width = 500; | |
| canvas.height = 500; | |
| canvas.style.left = (window.innerWidth - 500)/2+'px'; | |
| if(window.innerHeight>500) | |
| canvas.style.top = (window.innerHeight - 500)/2+'px'; | |
| function Factory(){ | |
| this.x = Math.round( Math.random() * w); | |
| this.y = Math.round( Math.random() * h); | |
| this.rad = Math.round( Math.random() * 1) + 1; | |
| this.rgba = colors[ Math.round( Math.random() * 3) ]; | |
| this.vx = Math.round( Math.random() * 3) - 1.5; | |
| this.vy = Math.round( Math.random() * 3) - 1.5; | |
| } | |
| function draw(){ | |
| ctx.clearRect(0, 0, w, h); | |
| ctx.globalCompositeOperation = 'lighter'; | |
| for(var i = 0;i < patriclesNum; i++){ | |
| var temp = particles[i]; | |
| var factor = 1; | |
| for(var j = 0; j<patriclesNum; j++){ | |
| var temp2 = particles[j]; | |
| ctx.linewidth = 0.5; | |
| if(temp.rgba == temp2.rgba && findDistance(temp, temp2)<50){ | |
| ctx.strokeStyle = temp.rgba; | |
| ctx.beginPath(); | |
| ctx.moveTo(temp.x, temp.y); | |
| ctx.lineTo(temp2.x, temp2.y); | |
| ctx.stroke(); | |
| factor++; | |
| } | |
| } | |
| ctx.fillStyle = temp.rgba; | |
| ctx.strokeStyle = temp.rgba; | |
| ctx.beginPath(); | |
| ctx.arc(temp.x, temp.y, temp.rad*factor, 0, Math.PI*2, true); | |
| ctx.fill(); | |
| ctx.closePath(); | |
| ctx.beginPath(); | |
| ctx.arc(temp.x, temp.y, (temp.rad+5)*factor, 0, Math.PI*2, true); | |
| ctx.stroke(); | |
| ctx.closePath(); | |
| temp.x += temp.vx; | |
| temp.y += temp.vy; | |
| if(temp.x > w)temp.x = 0; | |
| if(temp.x < 0)temp.x = w; | |
| if(temp.y > h)temp.y = 0; | |
| if(temp.y < 0)temp.y = h; | |
| } | |
| } | |
| function findDistance(p1,p2){ | |
| return Math.sqrt( Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2) ); | |
| } | |
| window.requestAnimFrame = (function(){ | |
| return window.requestAnimationFrame || | |
| window.webkitRequestAnimationFrame || | |
| window.mozRequestAnimationFrame || | |
| function( callback ){ | |
| window.setTimeout(callback, 1000 / 60); | |
| }; | |
| })(); | |
| (function init(){ | |
| for(var i = 0; i < patriclesNum; i++){ | |
| particles.push(new Factory); | |
| } | |
| })(); | |
| (function loop(){ | |
| draw(); | |
| requestAnimFrame(loop); | |
| })(); | |
| *{margin:0;padding:0;}body{background:#222;} | |
| canvas{ | |
| position:absolute; | |
| border:5px solid rgba(255,255,255,0.1); | |
| box-shadow:inset 0 0 100px #4162a9; | |
| } |