Simulates a nice constellation on canvas
A Pen by Acauã Montiel on CodePen.
| /*! | |
| * @version 1.2.2 | |
| * @author Acauã Montiel <contato@acauamontiel.com.br> | |
| * @license http://acaua.mit-license.org/ | |
| */ | |
| /* | |
| * requestAnimationFrame pollyfill | |
| */ | |
| if (!window.requestAnimationFrame) { | |
| window.requestAnimationFrame = (window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.msRequestAnimationFrame || window.oRequestAnimationFrame || function (callback) { | |
| return window.setTimeout(callback, 1000 / 60); | |
| }); | |
| } | |
| (function ($, window) { | |
| /** | |
| * Makes a nice constellation on canvas | |
| * @constructor Constellation | |
| */ | |
| function Constellation (canvas, options) { | |
| var $canvas = $(canvas), | |
| context = canvas.getContext('2d'), | |
| defaults = { | |
| star: { | |
| color: 'rgba(255, 255, 255, .5)', | |
| width: 1 | |
| }, | |
| line: { | |
| color: 'rgba(255, 255, 255, .5)', | |
| width: 0.2 | |
| }, | |
| position: { | |
| x: 0, // This value will be overwritten at startup | |
| y: 0 // This value will be overwritten at startup | |
| }, | |
| width: window.innerWidth, | |
| height: window.innerHeight, | |
| velocity: 0.1, | |
| length: 100, | |
| distance: 120, | |
| radius: 150, | |
| stars: [] | |
| }, | |
| config = $.extend(true, {}, defaults, options); | |
| function Star () { | |
| this.x = Math.random() * canvas.width; | |
| this.y = Math.random() * canvas.height; | |
| this.vx = (config.velocity - (Math.random() * 0.5)); | |
| this.vy = (config.velocity - (Math.random() * 0.5)); | |
| this.radius = Math.random() * config.star.width; | |
| } | |
| Star.prototype = { | |
| create: function(){ | |
| context.beginPath(); | |
| context.arc(this.x, this.y, this.radius, 0, Math.PI * 2, false); | |
| context.fill(); | |
| }, | |
| animate: function(){ | |
| var i; | |
| for (i = 0; i < config.length; i++) { | |
| var star = config.stars[i]; | |
| if (star.y < 0 || star.y > canvas.height) { | |
| star.vx = star.vx; | |
| star.vy = - star.vy; | |
| } else if (star.x < 0 || star.x > canvas.width) { | |
| star.vx = - star.vx; | |
| star.vy = star.vy; | |
| } | |
| star.x += star.vx; | |
| star.y += star.vy; | |
| } | |
| }, | |
| line: function(){ | |
| var length = config.length, | |
| iStar, | |
| jStar, | |
| i, | |
| j; | |
| for (i = 0; i < length; i++) { | |
| for (j = 0; j < length; j++) { | |
| iStar = config.stars[i]; | |
| jStar = config.stars[j]; | |
| if ( | |
| (iStar.x - jStar.x) < config.distance && | |
| (iStar.y - jStar.y) < config.distance && | |
| (iStar.x - jStar.x) > - config.distance && | |
| (iStar.y - jStar.y) > - config.distance | |
| ) { | |
| if ( | |
| (iStar.x - config.position.x) < config.radius && | |
| (iStar.y - config.position.y) < config.radius && | |
| (iStar.x - config.position.x) > - config.radius && | |
| (iStar.y - config.position.y) > - config.radius | |
| ) { | |
| context.beginPath(); | |
| context.moveTo(iStar.x, iStar.y); | |
| context.lineTo(jStar.x, jStar.y); | |
| context.stroke(); | |
| context.closePath(); | |
| } | |
| } | |
| } | |
| } | |
| } | |
| }; | |
| this.createStars = function () { | |
| var length = config.length, | |
| star, | |
| i; | |
| context.clearRect(0, 0, canvas.width, canvas.height); | |
| for (i = 0; i < length; i++) { | |
| config.stars.push(new Star()); | |
| star = config.stars[i]; | |
| star.create(); | |
| } | |
| star.line(); | |
| star.animate(); | |
| }; | |
| this.setCanvas = function () { | |
| canvas.width = config.width; | |
| canvas.height = config.height; | |
| }; | |
| this.setContext = function () { | |
| context.fillStyle = config.star.color; | |
| context.strokeStyle = config.line.color; | |
| context.lineWidth = config.line.width; | |
| }; | |
| this.setInitialPosition = function () { | |
| if (!options || !options.hasOwnProperty('position')) { | |
| config.position = { | |
| x: canvas.width * 0.5, | |
| y: canvas.height * 0.5 | |
| }; | |
| } | |
| }; | |
| this.loop = function (callback) { | |
| callback(); | |
| window.requestAnimationFrame(function () { | |
| stats.begin(); // Only for Stats | |
| this.loop(callback); | |
| stats.end(); // Only for Stats | |
| }.bind(this)); | |
| }; | |
| this.bind = function () { | |
| $canvas.on('mousemove', function(e){ | |
| config.position.x = e.pageX - $canvas.offset().left; | |
| config.position.y = e.pageY - $canvas.offset().top; | |
| }); | |
| }; | |
| this.init = function () { | |
| this.setCanvas(); | |
| this.setContext(); | |
| this.setInitialPosition(); | |
| this.loop(this.createStars); | |
| this.bind(); | |
| }; | |
| } | |
| $.fn.constellation = function (options) { | |
| return this.each(function () { | |
| var c = new Constellation(this, options); | |
| c.init(); | |
| }); | |
| }; | |
| })($, window); | |
| $('#background').constellation({ | |
| star: { | |
| width: 1 | |
| }, | |
| line: { | |
| color: 'rgba(255, 0, 0, .5)' | |
| }, | |
| radius: 250 | |
| }); |
Simulates a nice constellation on canvas
A Pen by Acauã Montiel on CodePen.
| <!doctype html> | |
| <html class="no-js" lang="en"> | |
| <head> | |
| <meta charset="utf-8" /> | |
| <meta http-equiv="x-ua-compatible" content="ie=edge"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| </head> | |
| <body> | |
| <canvas id="background"></canvas> | |
| <script src="constellation.js"></script> | |
| </body> | |
| </html> |