cssAudio - Activefile-genericCSS - ActiveGeneric - ActiveHTML - ActiveImage - ActiveJS - ActiveSVG - ActiveText - Activefile-genericVideo - ActiveLovehtmlicon-new-collectionicon-personicon-teamlog-outoctocatpop-outspinnerstartv

Pen Settings

CSS Base

Vendor Prefixing

Add External CSS

These stylesheets will be added in this order and before the code you write in the CSS editor. You can also add another Pen here, and it will pull the CSS from it. Try typing "font" or "ribbon" below.

Quick-add: + add another resource

Add External JavaScript

These scripts will run in this order and before the code in the JavaScript editor. You can also link to another Pen here, and it will run the JavaScript from it. Also try typing the name of any popular library.

Quick-add: + add another resource

Code Indentation

     

Save Automatically?

If active, Pens will autosave every 30 seconds after being saved once.

Auto-Updating Preview

If enabled, the preview panel updates automatically as you code. If disabled, use the "Run" button to update.

            
              (function() {
    var lastTime = 0;
    var vendors = ['ms', 'moz', 'webkit', 'o'];
    for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
        window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];
        window.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame'] 
                                   || window[vendors[x]+'CancelRequestAnimationFrame'];
    }
 
    if (!window.requestAnimationFrame)
        window.requestAnimationFrame = function(callback, element) {
            var currTime = new Date().getTime();
            var timeToCall = Math.max(0, 16 - (currTime - lastTime));
            var id = window.setTimeout(function() { callback(currTime + timeToCall); }, 
              timeToCall);
            lastTime = currTime + timeToCall;
            return id;
        };
 
    if (!window.cancelAnimationFrame)
        window.cancelAnimationFrame = function(id) {
            clearTimeout(id);
        };
}());

var Nodes = {

  // Settings
  density: 16,
  
  drawDistance: 24,
  baseRadius: 4,
  maxLineThickness: 4,
  reactionSensitivity: 3,
  lineThickness: 1,

  points: [],
  mouse: { x: -1000, y: -1000, down: false },

  animation: null,

  canvas: null,
  context: null,

  imageInput: null,
  bgImage: null,
  bgCanvas: null,
  bgContext: null,
  bgContextPixelData: null,

  init: function() {
    // Set up the visual canvas 
    this.canvas = document.getElementById( 'canvas' );
    this.context = canvas.getContext( '2d' );
    this.context.globalCompositeOperation = "lighter";
    this.canvas.width = window.innerWidth;
    this.canvas.height = window.innerHeight;
    this.canvas.style.display = 'block'

    this.imageInput = document.createElement( 'input' );
    this.imageInput.setAttribute( 'type', 'file' );
    this.imageInput.style.visibility = 'hidden';
    this.imageInput.addEventListener('change', this.upload, false);
    document.body.appendChild( this.imageInput );

    this.canvas.addEventListener('mousemove', this.mouseMove, false);
    this.canvas.addEventListener('mousedown', this.mouseDown, false);
    this.canvas.addEventListener('mouseup',   this.mouseUp,   false);
    this.canvas.addEventListener('mouseout',  this.mouseOut,  false);

    window.onresize = function(event) {
      Nodes.canvas.width = window.innerWidth;
      Nodes.canvas.height = window.innerHeight;
      Nodes.onWindowResize();    
    }

    // Load initial input image (the chrome logo!)
    this.loadData('data:image/gif;base64,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');
  },

  preparePoints: function() {

    // Clear the current points
    this.points = [];
    
    var width, height, i, j;

    var colors = this.bgContextPixelData.data;

    for( i = 0; i < this.canvas.height; i += this.density ) {

      for ( j = 0; j < this.canvas.width; j += this.density ) {

        var pixelPosition = ( j + i * this.bgContextPixelData.width ) * 4;

        // Dont use whiteish pixels
        if ( colors[pixelPosition] > 200 && (colors[pixelPosition + 1]) > 200 && (colors[pixelPosition + 2]) > 200 || colors[pixelPosition + 3] === 0 ) {
          continue;
        }
        
        var color = 'rgba(' + colors[pixelPosition] + ',' + colors[pixelPosition + 1] + ',' + colors[pixelPosition + 2] + ',' + '1)';
        this.points.push( { x: j, y: i, originalX: j, originalY: i, color: color } );

      }
    }
  },

  updatePoints: function() {

    var i, currentPoint, theta, distance;
    
    for (i = 0; i < this.points.length; i++ ){

      currentPoint = this.points[i];

      theta = Math.atan2( currentPoint.y - this.mouse.y, currentPoint.x - this.mouse.x);

      if ( this.mouse.down ) {
        distance = this.reactionSensitivity * 200 / Math.sqrt((this.mouse.x - currentPoint.x) * (this.mouse.x - currentPoint.x) +
         (this.mouse.y - currentPoint.y) * (this.mouse.y - currentPoint.y));
      } else {
        distance = this.reactionSensitivity * 100 / Math.sqrt((this.mouse.x - currentPoint.x) * (this.mouse.x - currentPoint.x) +
         (this.mouse.y - currentPoint.y) * (this.mouse.y - currentPoint.y));  
      }
      

      currentPoint.x += Math.cos(theta) * distance + (currentPoint.originalX - currentPoint.x) * 0.05;
      currentPoint.y += Math.sin(theta) * distance + (currentPoint.originalY - currentPoint.y) * 0.05;

    }
  },

  drawLines: function() {
    
    var i, j, currentPoint, otherPoint, distance, lineThickness;

    for ( i = 0; i < this.points.length; i++ ) {

      currentPoint = this.points[i];

      // Draw the dot.
      this.context.fillStyle = currentPoint.color;
      this.context.strokeStyle = currentPoint.color;

      for ( j = 0; j < this.points.length; j++ ){

        // Distaqnce between two points.
        otherPoint = this.points[j];

        if ( otherPoint == currentPoint ) {
          continue;
        }

        distance = Math.sqrt((otherPoint.x - currentPoint.x) * (otherPoint.x - currentPoint.x) +
         (otherPoint.y - currentPoint.y) * (otherPoint.y - currentPoint.y));

        if (distance <= this.drawDistance) {

          this.context.lineWidth = (1 - (distance / this.drawDistance)) * this.maxLineThickness * this.lineThickness;
          this.context.beginPath();
          this.context.moveTo(currentPoint.x, currentPoint.y);
          this.context.lineTo(otherPoint.x, otherPoint.y);
          this.context.stroke();
        }
      }
    }
  },

  drawPoints: function() {

    var i, currentPoint;

    for ( i = 0; i < this.points.length; i++ ) {

      currentPoint = this.points[i];

      // Draw the dot.
      this.context.fillStyle = currentPoint.color;
      this.context.strokeStyle = currentPoint.color;

      this.context.beginPath();
      this.context.arc(currentPoint.x, currentPoint.y, this.baseRadius ,0 , Math.PI*2, true);
      this.context.closePath();
      this.context.fill();

    }
  },

  draw: function() {
    this.animation = requestAnimationFrame( function(){ Nodes.draw() } );

    this.clear();
    this.updatePoints();
    this.drawLines();
    this.drawPoints();

  },

  clear: function() {
    this.canvas.width = this.canvas.width;
  },

  // The filereader has loaded the image... add it to image object to be drawn
  loadData: function( data ) {
    
    this.bgImage = new Image;
    this.bgImage.src = data;

    this.bgImage.onload = function() {

      //this
      Nodes.drawImageToBackground();
    }
  },

  // Image is loaded... draw to bg canvas
  drawImageToBackground: function () {

    this.bgCanvas = document.createElement( 'canvas' );
    this.bgCanvas.width = this.canvas.width;
    this.bgCanvas.height = this.canvas.height;

    var newWidth, newHeight;

    // If the image is too big for the screen... scale it down.
    if ( this.bgImage.width > this.bgCanvas.width - 100 || this.bgImage.height > this.bgCanvas.height - 100) {

      var maxRatio = Math.max( this.bgImage.width / (this.bgCanvas.width - 100) , this.bgImage.height / (this.bgCanvas.height - 100) );
      newWidth = this.bgImage.width / maxRatio;
      newHeight = this.bgImage.height / maxRatio;

    } else {
      newWidth = this.bgImage.width;
      newHeight = this.bgImage.height;
    }

    // Draw to background canvas
    this.bgContext = this.bgCanvas.getContext( '2d' );
    this.bgContext.drawImage( this.bgImage, (this.canvas.width - newWidth) / 2, (this.canvas.height - newHeight) / 2, newWidth, newHeight);
    this.bgContextPixelData = this.bgContext.getImageData( 0, 0, this.bgCanvas.width, this.bgCanvas.height );

    this.preparePoints();
    this.draw();
  },

  mouseDown: function( event ){
    Nodes.mouse.down = true;
  },

  mouseUp: function( event ){
    Nodes.mouse.down = false;
  },
  
  mouseMove: function(event){
    Nodes.mouse.x = event.offsetX || (event.layerX - Nodes.canvas.offsetLeft);
    Nodes.mouse.y = event.offsetY || (event.layerY - Nodes.canvas.offsetTop);
  },
  
  mouseOut: function(event){
    Nodes.mouse.x = -1000;
    Nodes.mouse.y = -1000;
    Nodes.mouse.down = false;
  },

  // Resize and redraw the canvas.
  onWindowResize: function() {
    cancelAnimationFrame( this.animation );
    this.drawImageToBackground();
  }
}
  
Nodes.init();
            
          
!
999px
Loading ..................

Console