Path: blob/master/web-gui/buildyourownbotnet/assets/js/custom/canvas-init.js
1293 views
(function() {12var width, height, largeHeader, canvas, ctx, points, target, animateHeader = true;34// Main5initHeader();6initAnimation();7addListeners();89function initHeader() {10width = window.innerWidth;11height = window.innerHeight;12target = {x: width/2, y: height/2};1314largeHeader = document.getElementById('large-header');15largeHeader.style.height = height+'px';1617canvas = document.getElementById('demo-canvas');18canvas.width = width;19canvas.height = 500;20ctx = canvas.getContext('2d');2122// calculate divisors23x_div = width * 0.015;24y_div = height * 0.015;2526// create points27points = [];28for(var x = 0; x < width; x = x + width/x_div) {29for(var y = 0; y < height; y = y + height/y_div) {30var px = x + Math.random()*width/x_div;31var py = y + Math.random()*height/y_div;32var p = {x: px, originX: px, y: py, originY: py };33points.push(p);34}35}3637// for each point find the 5 closest points38for(var i = 0; i < points.length; i++) {39var closest = [];40var p1 = points[i];41for(var j = 0; j < points.length; j++) {42var p2 = points[j]43if(!(p1 == p2)) {44var placed = false;45for(var k = 0; k < 5; k++) {46if(!placed) {47if(closest[k] == undefined) {48closest[k] = p2;49placed = true;50}51}52}5354for(var k = 0; k < 5; k++) {55if(!placed) {56if(getDistance(p1, p2) < getDistance(p1, closest[k])) {57closest[k] = p2;58placed = true;59}60}61}62}63}64p1.closest = closest;65}6667// assign a circle to each point68for(var i in points) {69var c = new Circle(points[i], 2+Math.random()*2, 'rgba(255,255,255,0.3)');70points[i].circle = c;71}72}7374// Event handling75function addListeners() {76if(!('ontouchstart' in window)) {77window.addEventListener('mousemove', mouseMove);78}79window.addEventListener('scroll', scrollCheck);80window.addEventListener('resize', resize);81}8283function mouseMove(e) {84var posx = posy = 0;85if (e.pageX || e.pageY) {86posx = e.pageX;87posy = e.pageY;88}89else if (e.clientX || e.clientY) {90posx = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;91posy = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;92}93target.x = posx;94target.y = posy;95}9697function scrollCheck() {98if(document.body.scrollTop > height) animateHeader = false;99else animateHeader = true;100}101102function resize() {103width = window.innerWidth;104height = window.innerHeight;105largeHeader.style.height = height+'px';106canvas.width = width;107canvas.height = height;108}109110// animation111function initAnimation() {112animate();113for(var i in points) {114shiftPoint(points[i]);115}116}117118function animate() {119if(animateHeader) {120ctx.clearRect(0,0,width,height);121for(var i in points) {122// detect points in range123if(Math.abs(getDistance(target, points[i])) < 4000) {124points[i].active = 0.3;125points[i].circle.active = 0.6;126} else if(Math.abs(getDistance(target, points[i])) < 20000) {127points[i].active = 0.1;128points[i].circle.active = 0.3;129} else if(Math.abs(getDistance(target, points[i])) < 40000) {130points[i].active = 0.02;131points[i].circle.active = 0.1;132} else {133points[i].active = 0;134points[i].circle.active = 0;135}136137drawLines(points[i]);138points[i].circle.draw();139}140}141requestAnimationFrame(animate);142}143144function shiftPoint(p) {145TweenLite.to(p, 1+1*Math.random(), {x:p.originX-50+Math.random()*100,146y: p.originY-50+Math.random()*100, ease:Circ.easeInOut,147onComplete: function() {148shiftPoint(p);149}});150}151152// Canvas manipulation153function drawLines(p) {154if(!p.active) return;155for(var i in p.closest) {156ctx.beginPath();157ctx.moveTo(p.x, p.y);158ctx.lineTo(p.closest[i].x, p.closest[i].y);159ctx.strokeStyle = 'rgba(156,217,249,'+ p.active+')';160ctx.stroke();161}162}163164function Circle(pos,rad,color) {165var _this = this;166167// constructor168(function() {169_this.pos = pos || null;170_this.radius = rad || null;171_this.color = color || null;172})();173174this.draw = function() {175if(!_this.active) return;176ctx.beginPath();177ctx.arc(_this.pos.x, _this.pos.y, _this.radius, 0, 2 * Math.PI, false);178ctx.fillStyle = 'rgba(156,217,249,'+ _this.active+')';179ctx.fill();180};181}182183// Util184function getDistance(p1, p2) {185return Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2);186}187188})();189190