var sketch = Sketch.create(), center = { x: sketch.width / 2, y: sketch.height / 2 }, orbs = [], dt = 1, opt = { total: 0, count: 100, spacing: 2, speed: 65, scale: 1, jitterRadius: 0, jitterHue: 0, clearAlpha: 10, toggleOrbitals: true, orbitalAlpha: 100, toggleLight: true, lightAlpha: 5, clear: function(){ sketch.clearRect( 0, 0, sketch.width, sketch.height ), orbs.length = 0; } }; var Orb = function( x, y ){ var dx = ( x / opt.scale ) - ( center.x / opt.scale ), dy = ( y / opt.scale ) - ( center.y / opt.scale ); this.angle = atan2( dy, dx ); this.lastAngle = this.angle; this.radius = sqrt( dx * dx + dy * dy ); console.log(this.radius); this.size = ( this.radius / 300 ) + 1; this.speed = ( random( 1, 10 ) / 300000 ) * ( this.radius ) + 0.015; }; Orb.prototype.update = function(){ this.lastAngle = this.angle; this.angle += this.speed * ( opt.speed / 50 ) * dt; this.x = this.radius * cos( this.angle ); this.y = this.radius * sin( this.angle ); }; Orb.prototype.render = function(){ if(opt.toggleOrbitals){ var radius = ( opt.jitterRadius === 0 ) ? this.radius : this.radius + random( -opt.jitterRadius, opt.jitterRadius ); radius = ( opt.jitterRadius != 0 && radius < 0 ) ? 0.001 : radius; sketch.strokeStyle = 'hsla( ' + ( ( this.angle + 90 ) / ( PI / 180 ) + random( -opt.jitterHue, opt.jitterHue ) ) + ', 100%, 50%, ' + ( opt.orbitalAlpha / 100 ) + ' )'; sketch.lineWidth = this.size; sketch.beginPath(); if(opt.speed >= 0){ sketch.arc( 0, 0, radius, this.lastAngle, this.angle + 0.001, false ); } else { sketch.arc( 0, 0, radius, this.angle, this.lastAngle + 0.001, false ); }; sketch.stroke(); sketch.closePath(); }; if(opt.toggleLight){ sketch.lineWidth = .5; sketch.strokeStyle = 'hsla( ' + ( ( this.angle + 90 ) / ( PI / 180 ) + random( -opt.jitterHue, opt.jitterHue ) ) + ', 100%, 70%, ' + ( opt.lightAlpha / 100 ) + ' )'; sketch.beginPath(); sketch.moveTo( 0, 0 ); sketch.lineTo( this.x, this.y ); sketch.stroke(); }; }; var createOrb = function( config ){ var x = ( config && config.x ) ? config.x : sketch.mouse.x, y = ( config && config.y ) ? config.y : sketch.mouse.y; console.log("Create orb", `${x} et ${y}`); orbs.push( new Orb( x, y ) ); }; var turnOnMove = function(){ sketch.mousemove = createOrb; }; var turnOffMove = function(){ sketch.mousemove = null; }; sketch.mousedown = function(){ createOrb(); turnOnMove(); }; sketch.mouseup = turnOffMove; sketch.resize = function(){ center.x = sketch.width / 2; center.y = sketch.height / 2; sketch.lineCap = 'round'; }; sketch.setup = function(){ while( opt.count-- ){ createOrb( { x: random( sketch.width / 2 - 300, sketch.width / 2 + 300 ), y: random( sketch.height / 2 - 300, sketch.height / 2 + 300 ) } ); }; }; sketch.clear = function(){ sketch.globalCompositeOperation = 'destination-out'; sketch.fillStyle = 'rgba( 0, 0, 0 , ' + ( opt.clearAlpha / 100 ) + ' )'; sketch.fillRect( 0, 0, sketch.width, sketch.height ); sketch.globalCompositeOperation = 'lighter'; }; sketch.update = function(){ dt = ( sketch.dt < 0.1 ) ? 0.1 : sketch.dt / 16; dt = ( dt > 5 ) ? 5 : dt; var i = orbs.length; opt.total = i; while( i-- ){ orbs[i].update(); } }; sketch.draw = function(){ sketch.save(); sketch.translate( center.x, center.y ); sketch.scale( opt.scale, opt.scale ); var i = orbs.length; while( i-- ){ orbs[i].render(); } sketch.restore(); }; gui = new dat.GUI( { autoPlace: false } ) gui.add( opt, 'total' ).name( 'Total Orbitals' ).listen(); gui.add( opt, 'speed' ).min( -300 ).max( 300 ).step( 1 ).name( 'Speed' ); gui.add( opt, 'scale' ).min( 0.5 ).max( 5 ).step( 0.001 ).name( 'Scale' ); gui.add( opt, 'jitterRadius' ).min( 0 ).max( 5 ).step( 0.001 ).name( 'Radius Jitter' ); gui.add( opt, 'jitterHue' ).min( 0 ).max( 90 ).step( 1 ).name( 'Hue Jitter' ); gui.add( opt, 'clearAlpha' ).min( 0 ).max( 100 ).step( 1 ).name( 'Clear Alpha' ); gui.add( opt, 'toggleOrbitals' ).name( 'Toggle Orbitals' ) gui.add( opt, 'orbitalAlpha' ).min( 0 ).max( 100 ).step( 1 ).name( 'Orbital Alpha' ); gui.add( opt, 'toggleLight' ).name( 'Toggle Light' ); gui.add( opt, 'lightAlpha' ).min( 0 ).max( 100 ).step( 1 ).name( 'Light Alpha' ); gui.add( opt, 'clear' ).name( 'Clear' ); customContainer = document.getElementById( 'gui' ); customContainer.appendChild(gui.domElement); document.onselectstart = function(){ return false; };