(fixed version of random lightnings of rainbowness)
Here's the video of the original
| <canvas id=c></canvas> |
(fixed version of random lightnings of rainbowness)
Here's the video of the original
| var w = c.width = window.innerWidth, | |
| h = c.height = window.innerHeight, | |
| ctx = c.getContext('2d'), | |
| spawnProb = 1, | |
| numberOfMoves = [8, 16], //[min, max] | |
| distance = [50, 200], | |
| attenuator = 900, | |
| timeBetweenMoves = [6, 10], | |
| size = [.5, 3], | |
| lines = [], | |
| frame = (Math.random()*360)|0; | |
| function rand(ar){ | |
| return Math.random() * (ar[1] - ar[0]) + ar[0]; | |
| } | |
| function Line(){ | |
| this.x = Math.random() * w; | |
| this.y = Math.random() * h; | |
| this.vx = this.vy = 0; | |
| this.last = {}; | |
| this.target = {}; | |
| this.totalMoves = rand(numberOfMoves); | |
| this.move = 0; | |
| this.timeBetweenMoves = rand(timeBetweenMoves); | |
| this.timeSpentThisMove = this.timeBetweenMoves; | |
| this.distance = rand(distance); | |
| this.color = 'hsl(hue, 80%, 50%)'.replace('hue', frame%360); | |
| this.size = rand(size); | |
| } | |
| Line.prototype.use = function(){ | |
| ++this.timeSpentThisMove; | |
| if(this.timeSpentThisMove >= this.timeBetweenMoves){ | |
| ++this.move; | |
| this.timeSpentThisMove = 0; | |
| var rad = Math.random() * 2 * Math.PI; | |
| this.target.x = this.x + Math.cos(rad) * this.distance; | |
| this.target.y = this.y + Math.sin(rad) * this.distance; | |
| } | |
| this.last.x = this.x; | |
| this.last.y = this.y; | |
| this.vx += (this.x - this.target.x)/attenuator; | |
| this.vy += (this.y - this.target.y)/attenuator; | |
| this.x += this.vx; | |
| this.y += this.vy; | |
| ctx.lineWidth = this.size; | |
| ctx.strokeStyle = ctx.shadowColor = this.color; | |
| ctx.beginPath(); | |
| ctx.moveTo(this.last.x, this.last.y); | |
| ctx.lineTo(this.x, this.y); | |
| ctx.stroke(); | |
| } | |
| function anim(){ | |
| window.requestAnimationFrame(anim); | |
| ++frame; | |
| ctx.shadowBlur = 0; | |
| ctx.fillStyle = 'rgba(0, 0, 0, .04)'; | |
| ctx.fillRect(0, 0, w, h); | |
| ctx.shadowBlur = 20; | |
| if(Math.random() < spawnProb) lines.push(new Line); | |
| for(var i = 0; i < lines.length; ++i){ | |
| lines[i].use(); | |
| if(lines[i].move >= lines[i].totalMoves){ | |
| lines.splice(i, 1); | |
| --i; | |
| } | |
| } | |
| } | |
| anim(); |
| canvas { | |
| position:absolute; | |
| top:0; left:0; | |
| background-color:black; | |
| } |