Toggle navigation
Sign Up
Log In
Explore
Works
Folders
Tools
Collections
Artists
Groups
Groups
Topics
Tasks
Tasks
Jobs
Teams
Jobs
Recommendation
More Effects...
JS
/*! Hammer.JS - v1.0.6dev - 2013-11-05 * http://eightmedia.github.com/hammer.js * * Copyright (c) 2013 Jorik Tangelder
; * Licensed under the MIT license */ !function(a,b){"use strict";function c(){if(!d.READY){d.event.determineEventTypes();for(var a in d.gestures)d.gestures.hasOwnProperty(a)&&d.detection.register(d.gestures[a]);d.event.onTouch(d.DOCUMENT,d.EVENT_MOVE,d.detection.detect),d.event.onTouch(d.DOCUMENT,d.EVENT_END,d.detection.detect),d.READY=!0}}var d=function(a,b){return new d.Instance(a,b||{})};d.defaults={stop_browser_behavior:{userSelect:"none",touchAction:"none",touchCallout:"none",contentZooming:"none",userDrag:"none",tapHighlightColor:"rgba(0,0,0,0)"}},d.HAS_POINTEREVENTS=a.navigator.pointerEnabled||a.navigator.msPointerEnabled,d.HAS_TOUCHEVENTS="ontouchstart"in a,d.MOBILE_REGEX=/mobile|tablet|ip(ad|hone|od)|android|silk/i,d.NO_MOUSEEVENTS=d.HAS_TOUCHEVENTS&&a.navigator.userAgent.match(d.MOBILE_REGEX),d.EVENT_TYPES={},d.DIRECTION_DOWN="down",d.DIRECTION_LEFT="left",d.DIRECTION_UP="up",d.DIRECTION_RIGHT="right",d.POINTER_MOUSE="mouse",d.POINTER_TOUCH="touch",d.POINTER_PEN="pen",d.EVENT_START="start",d.EVENT_MOVE="move",d.EVENT_END="end",d.DOCUMENT=a.document,d.plugins=d.plugins||{},d.gestures=d.gestures||{},d.READY=!1,d.Instance=function(a,b){var e=this;return c(),this.element=a,this.enabled=!0,this.options=d.utils.extend(d.utils.extend({},d.defaults),b||{}),this.options.stop_browser_behavior&&d.utils.stopDefaultBrowserBehavior(this.element,this.options.stop_browser_behavior),d.event.onTouch(a,d.EVENT_START,function(a){e.enabled&&d.detection.startDetect(e,a)}),this},d.Instance.prototype={on:function(a,b){for(var c=a.split(" "),d=0;d
0&&b==d.EVENT_END?b=d.EVENT_MOVE:k||(b=d.EVENT_END),(k||null===e)&&(e=i),c.call(d.detection,h.collectEventData(a,b,h.getTouchList(e,b),i)),d.HAS_POINTEREVENTS&&b==d.EVENT_END&&(k=d.PointerEvent.updatePointer(b,i))),k||(e=null,f=!1,g=!1,d.PointerEvent.reset())}})},determineEventTypes:function(){var a;a=d.HAS_POINTEREVENTS?d.PointerEvent.getEvents():d.NO_MOUSEEVENTS?["touchstart","touchmove","touchend touchcancel"]:["touchstart mousedown","touchmove mousemove","touchend touchcancel mouseup"],d.EVENT_TYPES[d.EVENT_START]=a[0],d.EVENT_TYPES[d.EVENT_MOVE]=a[1],d.EVENT_TYPES[d.EVENT_END]=a[2]},getTouchList:function(a){return d.HAS_POINTEREVENTS?d.PointerEvent.getTouchList():a.touches?a.touches:(a.indentifier=1,[a])},collectEventData:function(a,b,c,e){var f=d.POINTER_TOUCH;return(e.type.match(/mouse/)||d.PointerEvent.matchType(d.POINTER_MOUSE,e))&&(f=d.POINTER_MOUSE),{center:d.utils.getCenter(c),timeStamp:(new Date).getTime(),target:e.target,touches:c,eventType:b,pointerType:f,srcEvent:e,preventDefault:function(){this.srcEvent.preventManipulation&&this.srcEvent.preventManipulation(),this.srcEvent.preventDefault&&this.srcEvent.preventDefault()},stopPropagation:function(){this.srcEvent.stopPropagation()},stopDetect:function(){return d.detection.stopDetect()}}}},d.PointerEvent={pointers:{},getTouchList:function(){var a=this,b=[];return Object.keys(a.pointers).sort().forEach(function(c){b.push(a.pointers[c])}),b},updatePointer:function(a,b){return a==d.EVENT_END?this.pointers={}:(b.identifier=b.pointerId,this.pointers[b.pointerId]=b),Object.keys(this.pointers).length},matchType:function(a,b){if(!b.pointerType)return!1;var c={};return c[d.POINTER_MOUSE]=b.pointerType==b.MSPOINTER_TYPE_MOUSE||b.pointerType==d.POINTER_MOUSE,c[d.POINTER_TOUCH]=b.pointerType==b.MSPOINTER_TYPE_TOUCH||b.pointerType==d.POINTER_TOUCH,c[d.POINTER_PEN]=b.pointerType==b.MSPOINTER_TYPE_PEN||b.pointerType==d.POINTER_PEN,c[a]},getEvents:function(){return["pointerdown MSPointerDown","pointermove MSPointerMove","pointerup pointercancel MSPointerUp MSPointerCancel"]},reset:function(){this.pointers={}}},d.utils={extend:function(a,c,d){for(var e in c)a[e]!==b&&d||(a[e]=c[e]);return a},hasParent:function(a,b){for(;a;){if(a==b)return!0;a=a.parentNode}return!1},getCenter:function(a){for(var b,c=[],d=[],e=0,f=a.length;f>e;e++)b=a[e],c.push("undefined"!=typeof b.clientX?b.clientX:b.pageX),d.push("undefined"!=typeof b.clientY?b.clientY:b.pageY);return{pageX:(Math.min.apply(Math,c)+Math.max.apply(Math,c))/2,pageY:(Math.min.apply(Math,d)+Math.max.apply(Math,d))/2}},getVelocity:function(a,b,c){return{x:Math.abs(b/a)||0,y:Math.abs(c/a)||0}},getAngle:function(a,b){var c=b.pageY-a.pageY,d=b.pageX-a.pageX;return 180*Math.atan2(c,d)/Math.PI},getDirection:function(a,b){var c=Math.abs(a.pageX-b.pageX),e=Math.abs(a.pageY-b.pageY);return c>=e?a.pageX-b.pageX>0?d.DIRECTION_LEFT:d.DIRECTION_RIGHT:a.pageY-b.pageY>0?d.DIRECTION_UP:d.DIRECTION_DOWN},getDistance:function(a,b){var c=b.pageX-a.pageX,d=b.pageY-a.pageY;return Math.sqrt(c*c+d*d)},getScale:function(a,b){return a.length>=2&&b.length>=2?this.getDistance(b[0],b[1])/this.getDistance(a[0],a[1]):1},getRotation:function(a,b){return a.length>=2&&b.length>=2?this.getAngle(b[1],b[0])-this.getAngle(a[1],a[0]):0},isVertical:function(a){return a==d.DIRECTION_UP||a==d.DIRECTION_DOWN},stopDefaultBrowserBehavior:function(a,b){var c,d=["webkit","khtml","moz","Moz","ms","o",""];if(b&&a.style){for(var e=0;e
c;c++){var f=this.gestures[c];if(!this.stopped&&b[f.name]!==!1&&f.handler.call(f,a,this.current.inst)===!1){this.stopDetect();break}}return this.current&&(this.current.lastEvent=a),a.eventType==d.EVENT_END&&!a.touches.length-1&&this.stopDetect(),a}},stopDetect:function(){this.previous=d.utils.extend({},this.current),this.current=null,this.stopped=!0},extendEventData:function(a){var b=this.current.startEvent;if(b&&(a.touches.length!=b.touches.length||a.touches===b.touches)){b.touches=[];for(var c=0,e=a.touches.length;e>c;c++)b.touches.push(d.utils.extend({},a.touches[c]))}var f,g,h=a.timeStamp-b.timeStamp,i=a.center.pageX-b.center.pageX,j=a.center.pageY-b.center.pageY,k=d.utils.getVelocity(h,i,j);return"end"===a.eventType?(f=this.current.lastEvent&&this.current.lastEvent.interimAngle,g=this.current.lastEvent&&this.current.lastEvent.interimDirection):(f=this.current.lastEvent&&d.utils.getAngle(this.current.lastEvent.center,a.center),g=this.current.lastEvent&&d.utils.getDirection(this.current.lastEvent.center,a.center)),d.utils.extend(a,{deltaTime:h,deltaX:i,deltaY:j,velocityX:k.x,velocityY:k.y,distance:d.utils.getDistance(b.center,a.center),angle:d.utils.getAngle(b.center,a.center),interimAngle:f,direction:d.utils.getDirection(b.center,a.center),interimDirection:g,scale:d.utils.getScale(b.touches,a.touches),rotation:d.utils.getRotation(b.touches,a.touches),startEvent:b}),a},register:function(a){var c=a.defaults||{};return c[a.name]===b&&(c[a.name]=!0),d.utils.extend(d.defaults,c,!0),a.index=a.index||1e3,this.gestures.push(a),this.gestures.sort(function(a,b){return a.index
b.index?1:0}),this.gestures}},d.gestures.Drag={name:"drag",index:50,defaults:{drag_min_distance:10,correct_for_drag_min_distance:!0,drag_max_touches:1,drag_block_horizontal:!1,drag_block_vertical:!1,drag_lock_to_axis:!1,drag_lock_min_distance:25},triggered:!1,handler:function(a,b){if(d.detection.current.name!=this.name&&this.triggered)return b.trigger(this.name+"end",a),this.triggered=!1,void 0;if(!(b.options.drag_max_touches>0&&a.touches.length>b.options.drag_max_touches))switch(a.eventType){case d.EVENT_START:this.triggered=!1;break;case d.EVENT_MOVE:if(a.distance
0)){var c=Math.abs(b.options.drag_min_distance/a.distance);d.detection.current.startEvent.center.pageX+=a.deltaX*c,d.detection.current.startEvent.center.pageY+=a.deltaY*c,a=d.detection.extendEventData(a)}(d.detection.current.lastEvent.drag_locked_to_axis||b.options.drag_lock_to_axis&&b.options.drag_lock_min_distance<=a.distance)&&(a.drag_locked_to_axis=!0);var e=d.detection.current.lastEvent.direction;a.drag_locked_to_axis&&e!==a.direction&&(a.direction=d.utils.isVertical(e)?a.deltaY<0?d.DIRECTION_UP:d.DIRECTION_DOWN:a.deltaX<0?d.DIRECTION_LEFT:d.DIRECTION_RIGHT),this.triggered||(b.trigger(this.name+"start",a),this.triggered=!0),b.trigger(this.name,a),b.trigger(this.name+a.direction,a),(b.options.drag_block_vertical&&d.utils.isVertical(a.direction)||b.options.drag_block_horizontal&&!d.utils.isVertical(a.direction))&&a.preventDefault();break;case d.EVENT_END:this.triggered&&b.trigger(this.name+"end",a),this.triggered=!1}}},d.gestures.Hold={name:"hold",index:10,defaults:{hold_timeout:500,hold_threshold:1},timer:null,handler:function(a,b){switch(a.eventType){case d.EVENT_START:clearTimeout(this.timer),d.detection.current.name=this.name,this.timer=setTimeout(function(){"hold"==d.detection.current.name&&b.trigger("hold",a)},b.options.hold_timeout);break;case d.EVENT_MOVE:a.distance>b.options.hold_threshold&&clearTimeout(this.timer);break;case d.EVENT_END:clearTimeout(this.timer)}}},d.gestures.Release={name:"release",index:1/0,handler:function(a,b){a.eventType==d.EVENT_END&&b.trigger(this.name,a)}},d.gestures.Swipe={name:"swipe",index:40,defaults:{swipe_min_touches:1,swipe_max_touches:1,swipe_velocity:.7},handler:function(a,b){if(a.eventType==d.EVENT_END){if(b.options.swipe_max_touches>0&&a.touches.length
b.options.swipe_max_touches)return;(a.velocityX>b.options.swipe_velocity||a.velocityY>b.options.swipe_velocity)&&(b.trigger(this.name,a),b.trigger(this.name+a.direction,a))}}},d.gestures.Tap={name:"tap",index:100,defaults:{tap_max_touchtime:250,tap_max_distance:10,tap_always:!0,doubletap_distance:20,doubletap_interval:300},handler:function(a,b){if(a.eventType==d.EVENT_END&&"touchcancel"!=a.srcEvent.type){var c=d.detection.previous,e=!1;if(a.deltaTime>b.options.tap_max_touchtime||a.distance>b.options.tap_max_distance)return;c&&"tap"==c.name&&a.timeStamp-c.lastEvent.timeStamp
b.options.transform_min_rotation&&b.trigger("rotate",a),c>b.options.transform_min_scale&&(b.trigger("pinch",a),b.trigger("pinch"+(a.scale<1?"in":"out"),a));break;case d.EVENT_END:this.triggered&&b.trigger(this.name+"end",a),this.triggered=!1}}},"function"==typeof define&&"object"==typeof define.amd&&define.amd?define(function(){return d}):"object"==typeof module&&"object"==typeof module.exports?module.exports=d:a.Hammer=d}(this); /** * Created by nico on 07/03/14. */ var Events = {}; Events.DOWN = "touch"; Events.UP = "release"; Events.MOVE = "drag"; Events.CLICK = "tap"; Events.DOUBLE_CLICK = "doubletap"; Events.LOAD = "load"; var mouseDown, mouseX, mouseY, width, height; if( typeof Point == "undefined" ) { startPoint = {x:0, y:0}; endPoint = {x:0, y:0}; } else { startPoint = new Point(); endPoint = new Point(); } function onDocumentTouchDown( e ) { mouseDown = true; getMousePosition( e.target, e ); startPoint.x = mouseX; startPoint.y = mouseY; // killEvent( e ); } function onDocumentTouchUp( e ) { mouseDown = false; getMousePosition( e.target, e ); endPoint.x = mouseX; endPoint.y = mouseY; // killEvent( e ); } function onDocumentTouchClick( e ) { mouseDown = false; getMousePosition( e.target, e ); endPoint.x = mouseX; endPoint.y = mouseY; killEvent( e ); } function onDocumentTouchMove( e ) { getMousePosition( e.target, e ); if( mouseDown ) { endPoint.x = mouseX; endPoint.y = mouseY; } killEvent( e ); } ////////////////////////////////////////////////// function addEventHandler( elem, eventType, handler) { Hammer( elem ).on( eventType, handler ); } function addHandler( elem, eventType, handler) { if (elem.addEventListener) { elem.addEventListener(eventType, handler, false); } else if (elem.attachEvent) { elem.attachEvent('on' + eventType, handler); } } function addListeners( element ) { addEventHandler( element, Events.MOVE , onDocumentTouchMove ); addEventHandler( element, Events.DOWN , onDocumentTouchDown ); addEventHandler( element, Events.CLICK , onDocumentTouchClick ); addEventHandler( element, Events.UP , onDocumentTouchUp ); } function killEvent(event) { event.cancelBubble = true; if (event.stopPropagation) event.stopPropagation(); if (event.preventDefault) event.preventDefault(); if (event.gesture != null ) event.gesture.stopPropagation(); if (event.gesture != null ) event.gesture.preventDefault(); } function getMousePosition( node, e ) { mouseX = e.gesture.center.pageX; mouseY = e.gesture.center.pageY; var clientRectangle = node.getBoundingClientRect(); mouseX -= clientRectangle.left; mouseY -= clientRectangle.top; } function getLocation(el) { var c = { x : 0, y : 0 }; while (el) { c.x += el.offsetLeft; c.y += el.offsetTop; el = el.offsetParent; } return c; } ////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////// var DomUtils = function(){}; //http://stackoverflow.com/questions/11381673/javascript-solution-to-detect-mobile-browser function isMobileDevice() { var check = false; (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4)))check = true})(navigator.userAgent||navigator.vendor||window.opera); return check; }; //http://stackoverflow.com/questions/3974827/detecting-touch-screen-devices-with-javascript function isTouchDevice(){ return true == ("ontouchstart" in window || window.DocumentTouch && document instanceof DocumentTouch); } DomUtils.isMobile = isMobileDevice(); DomUtils.isTouch = isTouchDevice(); DomUtils.fullScreenHtml = function() { var html = document.getElementsByTagName( "html" )[0]; var body = document.getElementsByTagName( "body" )[0]; html.style.width = body.style.width = "100%"; html.style.height = body.style.height = "100%"; html.style.margin = body.style.margin = "0"; html.style.padding = body.style.padding = "0"; html.style.overflow = body.style.overflow = "hidden"; }; DomUtils.isDisconnected = function( node ) { return !node || !node.parentNode || node.parentNode.nodeType === 11; }; DomUtils.getDiv = function( id ) { var div = document.getElementById( id ); if( div == null ) { div = document.createElement( "div" ); document.body.appendChild( div ); div.id = id; return div; } return div; }; DomUtils.getSize = function( element ) { if( typeof Point != "undefined" ) return new Point( element.clientWidth, element.clientHeight ); return { x:element.clientWidth, y:element.clientHeight }; }; //from http://davidwalsh.name/convert-canvas-image // Converts canvas to an image DomUtils.convertCanvasToImage = function(canvas) { var image = new Image(); image.src = canvas.toDataURL("image/png"); return image; }; // Converts image to canvas; returns new canvas element DomUtils.convertImageToCanvas = function( image ) { var canvas = document.createElement("canvas"); canvas.width = image.width; canvas.height = image.height; canvas.getContext("2d").drawImage(image, 0, 0); return canvas; }; ( function() { function getMousePosition( node, e ) { e = e || window.event; mouseX = ( e.pageX || e.clientX || e.offsetX );// - node.offsetLeft; mouseY = ( e.pageY || e.clientY || e.offsetY );// - node.offsetTop; var loc = getLocation( node ); mouseX -= loc.x; mouseY -= loc.y; } function getLocation(el) { var c = { x : 0, y : 0 }; while (el) { c.x += el.offsetLeft; c.y += el.offsetTop; el = el.offsetParent; } return c; } function onMouseDown( e ) { reset(); update(); e.preventDefault(); } if( typeof addEventHandler != 'function' ) { window.addEventHandler = function(elem, eventType, handler) { if (elem.addEventListener) { elem.addEventListener(eventType, handler, false); } else if (elem.attachEvent) { elem.attachEvent('on' + eventType, handler); } } } var Point = function( x, y) { this.x = x||0; this.y = y||0; this.angle = 0; this.distancee = 0; this.clone = function() { return new Point( this.x, this.y ); } }; if( document.location.toString().lastIndexOf( "compound.html" ) != -1 ) { var html = document.getElementsByTagName( "html" )[0]; var body = document.getElementsByTagName( "body" )[0]; html.style.width = body.style.width = "100%"; html.style.height = body.style.height = "100%"; html.style.margin = body.style.margin = "0"; html.style.padding = body.style.padding = "0"; html.style.overflow = body.style.overflow = "hidden"; } DomUtils.fullScreenHtml(); var div = document.getElementById( "compound" ); var size = { x:div.clientWidth, y:div.clientHeight }; window.addEventHandler( div, (typeof Events == "undefined" ) ? "mousedown" : Events.DOWN, onMouseDown ); var canvas = document.createElement( "canvas" ); div.appendChild( canvas ); canvas.style.position = "absolute"; canvas.width = size.x; canvas.height = size.y; var context = canvas.getContext( "2d" ); ///////////////////////////////////////////////////////////////// function distance( p0, p1 ){ var dx = p1.x - p0.x; var dy = p1.y - p0.y; return Math.sqrt( dx*dx + dy*dy ); } function angle( p0,p1 ){return Math.atan2( p0.y - p1.y,p0.x - p1.x ); } function angleSpan( angle0, angle1 ){ return Math.atan2( Math.sin( angle1 - angle0 ), Math.cos( angle1 - angle0 ) ); } function polarToCartesian( angle, distance, origin, out ){ out = out || new Point();out.x = origin.x + Math.cos( angle ) * distance;out.y = origin.y + Math.sin( angle ) * distance; return out; } function normalize( point ){var length = Math.sqrt( point.x * point.x + point.y * point.y );point.x /= length;point.y /= length;return point;} function normal( p0, p1 ){return new Point( -( p0.y - p1.y ), ( p0.x - p1.x ) );} function dotProduct( p0, p1 ){return ( p0.x * p1.x + p0.y * p1.y );} ///////////////////////////////////////////////////////////////// var Edge = function() { this.p0 = null; this.p1 = null; this.a0 = 0; this.a1 = 0; this.norm = null; this.init = function( p0, a0, d0, p1, a1, d1, light ) { a0 = ( a0 + PI2 ); a1 = ( a1 + PI2 ); this.p0 = new EdgePoint( p0.x, p0.y, a0, d0, light ); this.a0 = a0; this.p1 = new EdgePoint( p1.x, p1.y, a1, d1, light ); this.a1 = a1; this.A = this.p1.y - this.p0.y; this.B = this.p0.x - this.p1.x; this.C = this.A * this.p0.x + this.B * this.p0.y; this.p0.edge = this; this.p1.edge = this; }; }; ///////////////////////////////////////////////////////////////// var EdgePoint = function( x, y, angle, distance, light ) { this.x = x||0; this.y = y||0; this.angle = angle||0; this.distance = distance||0; this.A = this.y - light.y; this.B = light.x - this.x; this.C = this.A * light.x + this.B * light.y; this.edge = null; this.isChained = false; this.isArc = false; }; ///////////////////////////////////////////////////////////////// function compute( points, light, range ) { var solution = [], angles = [], edges = [], edge = null, i, j, p0, p1, d0, d1, a0, a1, span, A, API2, dir = new Point(), norm = new Point(), CW = false, projection = new Point(), closest, denominator, occluded; for( i = 0; i < points.length; i+= 2 ) { p0 = points[ i ]; d0 = distance( p0, light ); p1 = points[ i+1 ]; d1 = distance( p1, light ); if( d0 > range && d1 > range ) continue; dir.x = p0.x - light.x; dir.y = p0.y - light.y; norm = normalize( normal( p0, p1 ) ); if( dotProduct( norm, dir ) >= 0 ) continue; a0 = angle( light, p0 ) + PI; a1 = angle( light, p1 ) + PI; if( a0 == a1 ) continue; span = angleSpan( a0, a1 ); CW = ( span > 0 ); edge = new Edge(); if( CW ) { edge.init( p0, a0, d0, p1, a0+span, d1, light ); } else { edge.init( p1, a0+span, d1, p0, a0, d0, light ); } edges.push( edge ); angles.push( edge.p0, edge.p1 ); } // checking connexity for( i = 0; i < edges.length; i++ ) { var chain0 = false; var chain1 = false; edge = edges[ i ]; for( j = 0; j < edges.length; j++ ) { if( i == j ) continue; var other = edges[ j ]; if( edge.p0.x == other.p1.x && edge.p0.y == other.p1.y ) { chain0 = true; } if( edge.p1.x == other.p0.x && edge.p1.y == other.p0.y ) { chain1 = true; } } edge.p0.isChained = chain0; edge.p1.isChained = chain1; } angles.sort( function( a, b ){ return a.angle < b.angle ? -1 : 1; } ); angles.forEach( function( p ) { closest = null; occluded = false; A = p.angle % PI2; API2 = A + PI2; edges.forEach( function( edge ) { if( p.edge == edge )return; if( ( A < edge.a0 || A > edge.a1 ) && ( API2 <= edge.a0 || API2 >= edge.a1 ) ) return; var det = p.A * edge.B - edge.A * p.B; if(det == 0) { //Lines are parallel occluded = true; return; } else { projection.x = ( edge.B * p.C - p.B * edge.C ) / det; projection.y = ( p.A * edge.C - edge.A * p.C ) / det; } projection.distance = distance( light, projection ); if( closest == null || closest.distance > projection.distance ) { closest = projection.clone(); closest.angle = A; closest.distance = projection.distance; } if( projection.distance < p.distance ) { occluded = true; } } ); if( !occluded ) { if( !p.isChained ) { if( closest == null ) { closest = polarToCartesian( p.angle, range, light ); closest.angle = A; closest.distance = range; closest.isArc = true; } if( p == p.edge.p0 )// p is start { solution.push( closest, p ); } else // p is end { solution.push( p, closest ); } } else { solution.push( p ); } } }); return solution; } function update() { var i, p, n; context.clearRect(0, 0 , size.x, size.y ); context.fillStyle = context.createPattern( noiseCanvas, "repeat" ); context.save(); context.scale( 1.5,1.5 ); context.fillRect( 0, 0 , size.x, size.y ); context.restore(); context.globalCompositeOperation = "source-over"; context.lineJoin = 'round'; context.lineWidth = 1; context.strokeStyle = "rgba( 0x80,0x80,0x80,1 )"; context.fillStyle = "0x000000"; /* context.beginPath(); for( i = 0; i < points.length; i+=2 ) { p = points[ i ]; n = points[ ( i+1 ) % points.length ]; context.moveTo( p.x, p.y ); context.lineTo( n.x, n.y ); } context.closePath(); context.stroke(); context.fill(); //*/ context.globalCompositeOperation = "lighter"; lights.forEach( function (light ) { var solution = compute( points, light, light.range ); context.beginPath(); for( i = 0; i < solution.length; i++ ) { p = solution[ i ]; n = solution[ ( i+1 ) % solution.length ]; if( p.isArc && n.isArc ) { context.moveTo( light.x, light.y ); context.arc( light.x, light.y, light.range, p.angle, n.angle, false ); context.lineTo( light.x, light.y ); } else { context.moveTo( light.x, light.y ); context.lineTo( p.x, p.y ); context.lineTo( n.x, n.y ); context.lineTo( light.x, light.y ); } } context.closePath(); var grd = context.createRadialGradient( light.x, light.y, 5, light.x, light.y, light.range ); grd.addColorStop( 0, "rgba( "+light.r+","+light.g+","+light.b+","+light.a+" )" ); grd.addColorStop( 1, "rgba( "+light.r+","+light.g+","+light.b+", 0 )" ); context.fillStyle = grd; context.fill(); }); } var Light = function(x,y,range, r,g,b,a ) { this.x = x; this.y = y; this.range = range; this.r = r; this.g = g; this.b = b; this.a = a; }; //set up a noisy background var noiseSize = 256; var noiseCanvas = document.createElement('canvas'); var noiseCtx = noiseCanvas.getContext('2d'); noiseCanvas.width = noiseCanvas.height = noiseSize; function noise( noiseCtx, min, max ) { min = min ||0; max = max ||0xFF; var img = noiseCtx.getImageData( 0, 0, noiseSize, noiseSize ); idata = img.data, len = idata.length, i = 0, delta = ( max - min ); while( i < len ) { //the value is a grey level so using the same RGB value is fine idata[i] = idata[i+1] = idata[i+2] = min + parseInt( delta * Math.random() ); //setting the alpha could be avoided by filling the //original noiseContext with an opaque color idata[i+3] = 255; i+=4; } noiseCtx.putImageData( img, 0, 0 ); } noise( noiseCtx, 0x20, 0x30 ); function reset() { edges = []; points = []; var edge = null, i, p, n, j, p0, p1, d0, d1, a0, a1, span, dir = new Point(), norm = new Point(); var min = new Point(10e6,10e6); var max = new Point(-10e6, -10e6); CW.forEach( function( coords ) { for( i = 0; i < coords.length; i+=2 ) { p = new Point( size.x *.5 + coords[ i ] * scale, size.y / 2 + coords[ i + 1 ] * scale ); n = new Point( size.x *.5 + coords[ ( i + 2 ) % coords.length ] * scale, size.y / 2 + coords[ ( i + 3 ) % coords.length ] * scale ); points.push( p,n ); min.x = Math.min( Math.min( p.x, n.x ), min.x ); min.y = Math.min( Math.min( p.y, n.y ), min.y ); max.x = Math.max( Math.min( p.x, n.x ), max.x ); max.y = Math.max( Math.min( p.y, n.y ), max.y ); } }); CCW.forEach( function( coords ) { for( i = 0; i < coords.length; i+=2 ) { p = new Point( size.x *.5 + coords[ i ] * scale, size.y / 2 + coords[ i + 1 ] * scale ); n = new Point( size.x *.5 + coords[ ( i + 2 ) % coords.length ] * scale, size.y / 2 + coords[ ( i + 3 ) % coords.length ] * scale ); points.push( n,p ); min.x = Math.min( Math.min( p.x, n.x ), min.x ); min.y = Math.min( Math.min( p.y, n.y ), min.y ); max.x = Math.max( Math.min( p.x, n.x ), max.x ); max.y = Math.max( Math.min( p.y, n.y ), max.y ); } }); paletteId++; var pal = palettes[ paletteId % palettes.length ]; i = 0; min.x -= 50; min.y -= 50; max.x += 50; max.y += 50; var a = .25; var dx = max.x - min.x; var dy = max.y - min.y; lights = [ new Light( min.x + Math.random() * dx, min.y + Math.random() * dy, 250 + Math.random() * 50, pal[ i++ % pal.length ], pal[ i++% pal.length ], pal[ i++ % pal.length ], a ), new Light( min.x + Math.random() * dx, min.y + Math.random() * dy, 250 + Math.random() * 50, pal[ i++ % pal.length ], pal[ i++% pal.length ], pal[ i++ % pal.length ], a ), new Light( min.x + Math.random() * dx, min.y + Math.random() * dy, 250 + Math.random() * 50, pal[ i++ % pal.length ], pal[ i++% pal.length ], pal[ i++ % pal.length ], a ), new Light( min.x + Math.random() * dx, min.y + Math.random() * dy, 250 + Math.random() * 50, pal[ i++ % pal.length ], pal[ i++% pal.length ], pal[ i++ % pal.length ], a ), new Light( min.x + Math.random() * dx, min.y + Math.random() * dy, 250 + Math.random() * 50, pal[ i++ % pal.length ], pal[ i++% pal.length ], pal[ i++ % pal.length ], a ), new Light( min.x + Math.random() * dx, min.y + Math.random() * dy, 250 + Math.random() * 100, pal[ i++ % pal.length ], pal[ i++% pal.length ], pal[ i++ % pal.length ], a ), new Light( min.x + Math.random() * dx, min.y + Math.random() * dy, 250 + Math.random() * 100, pal[ i++ % pal.length ], pal[ i++% pal.length ], pal[ i++ % pal.length ], a ), new Light( min.x + Math.random() * dx, min.y + Math.random() * dy, 250 + Math.random() * 100, pal[ i++ % pal.length ], pal[ i++% pal.length ], pal[ i++ % pal.length ], a ), new Light( min.x + Math.random() * dx, min.y + Math.random() * dy, 250 + Math.random() * 100, pal[ i++ % pal.length ], pal[ i++% pal.length ], pal[ i++ % pal.length ], a ), new Light( min.x + Math.random() * dx, min.y + Math.random() * dy, 250 + Math.random() * 100, pal[ i++ % pal.length ], pal[ i++% pal.length ], pal[ i++ % pal.length ], a ), new Light( min.x + Math.random() * dx, min.y + Math.random() * dy, 250 + Math.random() * 500, pal[ i++ % pal.length ], pal[ i++% pal.length ], pal[ i++ % pal.length ], a ), new Light( min.x + Math.random() * dx, min.y + Math.random() * dy, 250 + Math.random() * 500, pal[ i++ % pal.length ], pal[ i++% pal.length ], pal[ i++ % pal.length ], a ), new Light( min.x + Math.random() * dx, min.y + Math.random() * dy, 250 + Math.random() * 500, pal[ i++ % pal.length ], pal[ i++% pal.length ], pal[ i++ % pal.length ], a ), new Light( min.x + Math.random() * dx, min.y + Math.random() * dy, 250 + Math.random() * 500, pal[ i++ % pal.length ], pal[ i++% pal.length ], pal[ i++ % pal.length ], a ), new Light( min.x + Math.random() * dx, min.y + Math.random() * dy, 250 + Math.random() * 500, pal[ i++ % pal.length ], pal[ i++% pal.length ], pal[ i++ % pal.length ], a ), new Light( min.x + Math.random() * dx, min.y + Math.random() * dy, 250 + Math.random() * 1000, pal[ i++ % pal.length ], pal[ i++% pal.length ], pal[ i++ % pal.length ], a ), new Light( min.x + Math.random() * dx, min.y + Math.random() * dy, 250 + Math.random() * 1000, pal[ i++ % pal.length ], pal[ i++% pal.length ], pal[ i++ % pal.length ], a ), new Light( min.x + Math.random() * dx, min.y + Math.random() * dy, 250 + Math.random() * 1000, pal[ i++ % pal.length ], pal[ i++% pal.length ], pal[ i++ % pal.length ], a ), new Light( min.x + Math.random() * dx, min.y + Math.random() * dy, 250 + Math.random() * 1000, pal[ i++ % pal.length ], pal[ i++% pal.length ], pal[ i++ % pal.length ], a ), new Light( min.x + Math.random() * dx, min.y + Math.random() * dy, 250 + Math.random() * 1000, pal[ i++ % pal.length ], pal[ i++% pal.length ], pal[ i++ % pal.length ], a ), new Light( min.x + Math.random() * dx, min.y + Math.random() * dy, 250 + Math.random() * 1000, pal[ i++ % pal.length ], pal[ i++% pal.length ], pal[ i++ % pal.length ], a ), new Light( min.x + Math.random() * dx, min.y + Math.random() * dy, 250 + Math.random() * 1000, pal[ i++ % pal.length ], pal[ i++% pal.length ], pal[ i++ % pal.length ], a ), new Light( min.x + Math.random() * dx, min.y + Math.random() * dy, 250 + Math.random() * 1000, pal[ i++ % pal.length ], pal[ i++% pal.length ], pal[ i++ % pal.length ], a ), new Light( min.x + Math.random() * dx, min.y + Math.random() * dy, 250 + Math.random() * 1000, pal[ i++ % pal.length ], pal[ i++% pal.length ], pal[ i++ % pal.length ], a ), new Light( min.x + Math.random() * dx, min.y + Math.random() * dy, 250 + Math.random() * 1000, pal[ i++ % pal.length ], pal[ i++% pal.length ], pal[ i++ % pal.length ], a ), new Light( min.x + Math.random() * dx, min.y + Math.random() * dy, 250 + Math.random() * 1000, pal[ i++ % pal.length ], pal[ i++% pal.length ], pal[ i++ % pal.length ], a ), new Light( min.x + Math.random() * dx, min.y + Math.random() * dy, 250 + Math.random() * 1000, pal[ i++ % pal.length ], pal[ i++% pal.length ], pal[ i++ % pal.length ], a ), new Light( min.x + Math.random() * dx, min.y + Math.random() * dy, 250 + Math.random() * 1000, pal[ i++ % pal.length ], pal[ i++% pal.length ], pal[ i++ % pal.length ], a ), new Light( min.x + Math.random() * dx, min.y + Math.random() * dy, 250 + Math.random() * 1000, pal[ i++ % pal.length ], pal[ i++% pal.length ], pal[ i++ % pal.length ], a ), new Light( min.x + Math.random() * dx, min.y + Math.random() * dy, 250 + Math.random() * 1000, pal[ i++ % pal.length ], pal[ i++% pal.length ], pal[ i++ % pal.length ], a ) ]; } //canary http://www.colourlovers.com/palette/372674/Canary // http://www.colourlovers.com/palette/3350257/Hibiki var paletteId = 0; var palettes = [ [ 134,179,167, 99,201,176, 240,233,96, 240,221,50, 138,89,54 ], [ 207,187,116, 113,92,71, 200,103,96, 241,182,106, 138,158,123 ] ]; var scale = 1; var range = 300; var mouseX, mouseY; var PI = Math.PI; var PI2 = Math.PI * 2; var RAD = Math.PI / 180; var CW = [ [206.55,-236.4,208.05,-224.85,209.1,-206.4,209.1,-206.4,210.6,-181.65,211.05,-176.2,211.05,-176.2,212.15,-163.5,206.9,-149.1,206.9,-149.1,205.4,-145.2,195.65,-124.2,195.65,-124.2,192.55,-117.4,186.05,-103.85,186.05,-103.85,180.85,-92,178.9,-82.9,178.9,-82.9,176.8,-72.9,176.95,-62.55,176.95,-62.55,177.1,-51.7,179.7,-42.45,179.7,-42.45,181.9,-34.6,181.4,-27.9,181.4,-27.9,181,-21.4,178.05,-14.55,178.05,-14.55,171.1,1.6,150.65,4.2,150.65,4.2,140.95,5.4,115.3,6.9,115.3,6.9,110.85,7.15,107.95,8.85,107.95,8.85,104.75,10.7,102.9,14.45,102.9,14.45,95.55,28.75,83.25,31.45,83.25,31.45,76.6,32.85,73.75,37.3,73.75,37.3,71.45,40.95,71.15,47.8,71.15,47.8,71.15,48.3,71.05,51.85,71.05,51.85,71.05,54.3,70.8,55.85,70.8,55.85,70.5,57.4,69.85,59.55,69.85,59.55,69.5,60.75,68.7,63.25,68.7,63.25,65.55,62.4,63.9,61.85,63.9,61.85,61.1,61.05,59.75,59.8,59.75,59.8,58.4,58.6,56.85,55.45,56.85,55.45,55.15,52,54.15,50.8,54.15,50.8,53,49.35,51.1,48.35,51.1,48.35,49.1,47.15,48,47.55,48,47.55,46.1,48.2,44.3,50,44.3,50,42.4,51.8,42.15,53.4,42.15,53.4,41.65,55.9,42,59.7,42,59.7,42.2,61.75,42.7,66,42.7,66,43.1,72.1,37.3,71.9,37.3,71.9,34.1,71.9,33.25,72.15,33.25,72.15,27.5,73.85,25.85,72.65,25.85,72.65,23.8,71.2,23.75,64.2,23.75,64.2,23.75,63.25,22.65,62,22.65,62,21.6,60.7,20.7,60.7,20.7,60.7,19.4,60.65,17.95,61.3,17.95,61.3,16.45,62,15.8,63,15.8,63,14.65,64.8,13.35,67.7,13.35,67.7,12.7,69.4,11.35,72.7,11.35,72.7,8.25,72.25,5.15,71.75,5.15,71.75,0.8,71.2,-1.25,69.65,-1.25,69.65,-3.85,67.7,-4.7,63.25,-4.7,63.25,-6.85,51.45,-16.6,59.6,-16.6,59.6,-21.7,63.95,-27.5,61.9,-27.5,61.9,-33.3,59.9,-34.15,53.3,-34.15,53.3,-34.65,49.75,-34.5,43.7,-34.5,43.7,-34.3,36.45,-34.45,34.05,-34.45,34.05,-34.5,32.65,-35.4,30.7,-35.4,30.7,-36.55,28.55,-37,27.4,-37,27.4,-37.25,28.55,-38.15,30.7,-38.15,30.7,-38.8,32.7,-38.7,34,-38.7,34,-38.15,40.95,-44,46.45,-44,46.45,-50,52.05,-56.2,50.05,-56.2,50.05,-58.3,49.35,-60.55,46.75,-60.55,46.75,-61.6,45.55,-64.1,41.9,-64.1,41.9,-65.1,40.4,-66.05,38,-66.05,38,-66.95,35.35,-67.4,34.25,-67.4,34.25,-70.9,36.1,-72.45,36.85,-72.45,36.85,-75.15,38.2,-75.5,37.8,-75.5,37.8,-79.15,33.95,-80.55,28.45,-80.55,28.45,-81.15,26.1,-81.5,21.55,-81.5,21.55,-81.9,16.7,-82.35,14.5,-82.35,14.5,-85.15,2.4,-99.35,-3.05,-99.35,-3.05,-108.45,-6.65,-115,-7,-115,-7,-123.5,-7.4,-130.65,-2.6,-130.65,-2.6,-132.7,-1.2,-135.6,-1.65,-135.6,-1.65,-145.25,-3.3,-151.35,-12.1,-151.35,-12.1,-157.4,-20.85,-155.7,-30.6,-155.7,-30.6,-154.05,-38.55,-153.3,-42.5,-153.3,-42.5,-151.95,-49.5,-152.2,-54.35,-152.2,-54.35,-152.8,-67,-158.05,-79.65,-158.05,-79.65,-160.95,-86.65,-166.85,-98.1,-166.85,-98.1,-173.7,-111.45,-176,-116.45,-176,-116.45,-202.1,-173.9,-197.65,-226.9,-197.65,-226.9,-196.9,-235.8,-193.85,-246.75,-193.85,-246.75,-192,-253.55,-187.55,-266.25,-187.55,-266.25,-184.5,-274.75,-179.1,-286.85,-179.1,-286.85,-172.9,-300.4,-169.95,-307.3,-169.95,-307.3,-166.85,-314.3,-160.75,-320.1,-160.75,-320.1,-155.85,-324.8,-148.15,-329.4,-148.15,-329.4,-140.6,-333.9,-129.3,-340.25,-129.3,-340.25,-122.9,-343.75,-110.2,-350.85,-110.2,-350.85,-61.65,-378.2,-7.6,-381.1,-7.6,-381.1,45.6,-383.95,101,-368.45,101,-368.45,129.3,-360.55,150.6,-340,150.6,-340,155.3,-335.55,161.95,-325.15,161.95,-325.15,167.85,-316.05,179.8,-297.85,179.8,-297.85,190.05,-282,196.5,-270,196.5,-270,204,-256.15,206.55,-236.4], [122.4,28.4,123.3,31.15,123.1,32.9,123.1,32.9,122.55,37.7,120.25,52.9,120.25,52.9,118.4,65.3,117.9,72.85,117.9,72.85,116.95,86.5,119.55,102.6,119.55,102.6,120.4,108.3,118.9,113,118.9,113,117.5,117.5,113.8,121.7,113.8,121.7,94.65,143,64.3,156.4,64.3,156.4,39.6,166.95,27.45,172.6,27.45,172.6,9.6,180.9,-12.2,173.15,-12.2,173.15,-50.9,159.2,-80.55,134.15,-80.55,134.15,-87.3,128.45,-95.05,118.65,-95.05,118.65,-103.6,107.2,-108,101.55,-108,101.55,-109,100.2,-108.85,97.25,-108.85,97.25,-108.75,94.45,-107.7,92.5,-107.7,92.5,-103.65,84.5,-103.6,74.25,-103.6,74.25,-103.55,68,-105.5,55.7,-105.5,55.7,-106.35,50.25,-108.1,40.9,-108.1,40.9,-110.15,30,-110.8,26.05,-110.8,26.05,-111,24.75,-110.8,23.2,-110.8,23.2,-110.6,21.55,-110,21.25,-110,21.25,-108.85,20.8,-107.25,20.85,-107.25,20.85,-105.6,20.9,-104.5,21.45,-104.5,21.45,-99.9,23.55,-97.35,27.95,-97.35,27.95,-95.3,31.35,-94.15,37.1,-94.15,37.1,-92.7,44.1,-89.9,58.15,-89.9,58.15,-87.35,70.65,-85.45,79.1,-85.45,79.1,-85.05,81,-83.45,83.6,-83.45,83.6,-82.5,85.1,-80.7,88,-80.7,88,-79.3,87.6,-77.9,87.2,-77.9,87.2,-79.1,76.4,-80.35,65.55,-80.35,65.55,-72.55,63.45,-70.1,65.3,-70.1,65.3,-67.65,67.1,-67.85,74.85,-67.85,74.85,-67.95,76.55,-68.3,79.85,-68.3,79.85,-68.7,83.2,-68.75,84.85,-68.75,84.85,-68.9,87.85,-67.55,89.4,-67.55,89.4,-66.05,91.15,-63.3,90.4,-63.3,90.4,-61.75,90,-60.2,88.35,-60.2,88.35,-58.7,86.7,-58.3,85.05,-58.3,85.05,-57.75,83.15,-57.85,80.2,-57.85,80.2,-58.05,76.85,-58.05,75.3,-58.05,75.3,-50.75,72.15,-47.9,73.25,-47.9,73.25,-45.15,74.3,-42.55,81.2,-42.55,81.2,-41.8,83.15,-40.1,85.95,-40.1,85.95,-37.2,90.9,-37.05,91.1,-37.05,91.1,-34.8,87.65,-33.9,86.3,-33.9,86.3,-32.5,84,-31.2,83.3,-31.2,83.3,-26.6,80.45,-22.7,82,-22.7,82,-18.8,83.5,-16.7,88.65,-16.7,88.65,-16.15,89.95,-15.45,92.6,-15.45,92.6,-14.6,94.85,-13.6,96,-13.6,96,-12.45,97.35,-10.5,98.3,-10.5,98.3,-8.5,99.3,-7,99.05,-7,99.05,-5.8,98.85,-4.45,97.1,-4.45,97.1,-3.35,95.6,-2.55,93.75,-2.55,93.75,-1.95,92.2,-1.6,89.55,-1.6,89.55,-1.25,86.4,-1,84.5,-1,84.5,3.45,86.3,11.35,89.35,11.35,89.35,17.35,92.5,19.15,99,19.15,99,20.15,102.55,23.25,102.5,23.25,102.5,26.3,102.5,28.3,99.05,28.3,99.05,29.2,97.7,30.05,95.4,30.05,95.4,31,92.9,31.55,91.65,31.55,91.65,34.2,85.55,38.35,84.5,38.35,84.5,42.5,83.35,47.75,87.4,47.75,87.4,51.25,90.1,53.15,89.95,53.15,89.95,55.5,89.75,57.1,85.15,57.1,85.15,57.65,83.7,60.2,82.05,60.2,82.05,63.35,80.4,64.65,79.45,64.65,79.45,66.6,82.6,68.5,85.7,68.5,85.7,68.75,86.2,69.5,88.2,69.5,88.2,70.1,89.8,70.7,90.55,70.7,90.55,71.65,91.75,76,95.95,76,95.95,77.8,92.9,78.7,91.35,78.7,91.35,80.25,88.65,81.1,86.7,81.1,86.7,81.35,86.2,80.9,84.9,80.9,84.9,80.5,83.9,80.1,82.85,80.1,82.85,77.95,74.85,80.15,71.7,80.15,71.7,82.45,68.45,90.55,68.7,90.55,68.7,94.05,68.8,95.55,66.5,95.55,66.5,96.65,63.45,97.3,62,97.3,62,98.9,58,102.25,48.5,102.25,48.5,105.45,39.8,107.4,35.1,107.4,35.1,109.15,30.9,113.85,26.7,113.85,26.7,114.95,25.8,117.15,25.05,117.15,25.05,118.4,24.65,120.85,23.8,120.85,23.8,121.3,25.35,122.4,28.4], [227.2,135.85,231.1,143.35,236.6,147.25,236.6,147.25,242.4,151.35,250.55,152.1,250.55,152.1,258.65,152.85,261.95,156.5,261.95,156.5,265.2,160,265.35,168.1,265.35,168.1,265.45,174.95,265.4,177.5,265.4,177.5,265.2,182.85,264.2,186.7,264.2,186.7,261.95,194.9,252.25,200.1,252.25,200.1,242.75,205.2,233.4,203.6,233.4,203.6,222.85,201.4,217.6,200.25,217.6,200.25,208.25,198.3,201.85,197.9,201.85,197.9,196.25,197.55,190.6,198.5,190.6,198.5,184.65,199.45,179.85,201.65,179.85,201.65,166.45,207.85,145.9,218.25,145.9,218.25,117.1,232.75,112.05,235.2,112.05,235.2,104.35,239,92.35,244.5,92.35,244.5,74.5,252.7,72.6,253.55,72.6,253.55,71.6,254.05,68.75,256.05,68.75,256.05,70.65,257.45,74.1,260.1,74.1,260.1,77,262.3,79.15,263.45,79.15,263.45,96.05,272.55,129.75,290.9,129.75,290.9,159.25,306.8,180.85,317.35,180.85,317.35,188.55,321.1,200,323.35,200,323.35,201.7,323.6,220.35,326.45,220.35,326.45,225.35,327.15,232.25,326.75,232.25,326.75,232.45,326.7,244.25,325.6,244.25,325.6,251.7,324.9,256.25,326.15,256.25,326.15,262.15,327.75,265.65,333.3,265.65,333.3,274.85,347.6,266.3,361.35,266.3,361.35,263.8,365.4,260.75,371.95,260.75,371.95,255.9,382.25,255.65,382.8,255.65,382.8,253.25,387.45,248.6,396.85,248.6,396.85,244.45,405.15,240.95,410.55,240.95,410.55,237.1,416.55,229.65,417.5,229.65,417.5,225.85,417.95,216.35,416.7,216.35,416.7,212.9,416.2,209.3,414.25,209.3,414.25,205.75,412.3,203.45,409.7,203.45,409.7,189.7,393.95,190.8,377.3,190.8,377.3,191.05,373.15,189.25,370.45,189.25,370.45,187.5,367.75,183.45,366,183.45,366,168.4,359.8,167.65,359.45,167.65,359.45,158.75,355.55,152.7,351.65,152.7,351.65,116.75,328.25,70.6,308.55,70.6,308.55,56.45,302.55,47.95,298.65,47.95,298.65,35.6,292.85,25.95,287.35,25.95,287.35,18.7,283.15,11.35,283.3,11.35,283.3,5.15,283.4,-3.05,286.85,-3.05,286.85,-15.1,292.05,-42.95,303.35,-42.95,303.35,-68.75,313.9,-82.75,319.95,-82.75,319.95,-118.65,335.6,-174,361.5,-174,361.5,-187.35,367.75,-194.05,384,-194.05,384,-197.75,392.75,-202.5,400.8,-202.5,400.8,-208.75,411.45,-221.5,414.75,-221.5,414.75,-234.25,418.05,-243.4,411.3,-243.4,411.3,-245.45,409.8,-247.65,406.85,-247.65,406.85,-250.15,403.35,-251.45,401.65,-251.45,401.65,-264.15,384.85,-267.75,379.6,-267.75,379.6,-271.2,374.7,-272.85,371.85,-272.85,371.85,-275.5,367.4,-276.8,363.55,-276.8,363.55,-277.45,361.7,-276.15,358.4,-276.15,358.4,-274.9,355.15,-273.15,354.15,-273.15,354.15,-263.55,348.65,-259.95,346.85,-259.95,346.85,-252.4,343.1,-246.1,341.6,-246.1,341.6,-221.65,335.75,-194.6,325.6,-194.6,325.6,-172.65,317.4,-144.9,304.7,-144.9,304.7,-127.45,296.75,-100.05,284.75,-100.05,284.75,-61.9,268.05,-55.05,265,-55.05,265,-51.5,263.4,-46.25,260.7,-46.25,260.7,-39.9,257.4,-36.1,255.45,-36.1,255.45,-46.35,248.85,-51.1,245.8,-51.1,245.8,-59.4,240.55,-65.05,237.6,-65.05,237.6,-97.2,220.8,-104.3,217.15,-104.3,217.15,-126.6,205.7,-144,197.75,-144,197.75,-163,189,-187.35,195.8,-187.35,195.8,-202.45,200.1,-217,198.95,-217,198.95,-228.05,198.1,-235.6,189.4,-235.6,189.4,-242.4,181.65,-243.55,171.5,-243.55,171.5,-244.55,163,-241.1,153.6,-241.1,153.6,-239.9,150.35,-233.55,137.25,-233.55,137.25,-230.8,131.75,-229.95,127.35,-229.95,127.35,-228.8,121.9,-229.95,116.7,-229.95,116.7,-232.5,105.4,-222.5,99,-222.5,99,-216.5,95.05,-211.75,94.05,-211.75,94.05,-205.8,92.8,-200.6,95.6,-200.6,95.6,-190.35,101.15,-181,110.4,-181,110.4,-175.1,116.15,-162.7,129.5,-162.7,129.5,-151,142.15,-144.3,148.6,-144.3,148.6,-140.9,151.9,-135.2,155.2,-135.2,155.2,-134.15,155.9,-125.15,160.65,-125.15,160.65,-99.2,174.5,-9.25,222,-9.25,222,-3.9,224.85,2.3,228.35,2.3,228.35,6.35,230.45,8.7,230.45,8.7,230.45,11.05,230.5,15.5,228.5,15.5,228.5,18.4,227.2,28.2,222.6,28.2,222.6,34.1,220,67.4,205.3,67.4,205.3,91.35,194.75,106.5,187.75,106.5,187.75,124.1,179.6,158.5,161.8,158.5,161.8,161.1,160.45,164.2,157.9,164.2,157.9,164.7,157.5,169.55,153.25,169.55,153.25,177.15,146.45,176.35,135.2,176.35,135.2,175.95,129.1,176.6,126,176.6,126,177.75,121.15,181.95,118.25,181.95,118.25,188.15,114,199.2,114.7,199.2,114.7,210.4,115.3,215.45,120.55,215.45,120.55,223.4,128.8,227.2,135.85] ]; var CCW = [ [-15.35,-130.75,-14.5,-128.3,-14.3,-126.55,-14.3,-126.55,-13.95,-123.55,-13.95,-121.9,-13.95,-121.9,-14,-119.3,-14.9,-117.8,-14.9,-117.8,-18.35,-112.35,-24.55,-103.4,-24.55,-103.4,-31.8,-92.85,-34.3,-89.1,-34.3,-89.1,-37,-85,-41.05,-82.75,-41.05,-82.75,-44.7,-80.8,-49.8,-80.2,-49.8,-80.2,-50,-80.2,-64.15,-77.95,-64.15,-77.95,-68.95,-79.6,-71.7,-80.55,-71.7,-80.55,-76.75,-82.3,-80.1,-83.9,-80.1,-83.9,-86.5,-87.15,-93.3,-87.4,-93.3,-87.4,-99.65,-87.65,-106.7,-85.4,-106.7,-85.4,-110.4,-84.15,-114.5,-83.95,-114.5,-83.95,-117.6,-83.85,-119.15,-85.3,-119.15,-85.3,-120.8,-86.95,-120.5,-90.1,-120.5,-90.1,-119.65,-100.2,-122.55,-112.4,-122.55,-112.4,-123.9,-118.1,-129.15,-133.85,-129.15,-133.85,-134.2,-149.1,-119.7,-155,-119.7,-155,-97,-164.3,-76.1,-160.5,-76.1,-160.5,-69.1,-159.2,-39.9,-154.6,-39.9,-154.6,-22.65,-151.9,-16.85,-134.85,-16.85,-134.85,-16.35,-133.5,-15.35,-130.75], [123.75,-152.35,132.6,-150.7,136.9,-150.2,136.9,-150.2,143.15,-149.4,145.75,-146.6,145.75,-146.6,148.45,-143.8,148.45,-137.65,148.45,-137.65,148.5,-131.3,148.55,-118.75,148.55,-118.75,148.55,-107.85,148.25,-99.9,148.25,-99.9,148.15,-97.75,146.8,-95.25,146.8,-95.25,145.4,-92.6,143.7,-91.8,143.7,-91.8,126.7,-83.65,105.15,-74.95,105.15,-74.95,103.25,-74.15,99.95,-74,99.95,-74,96.3,-73.95,94.5,-73.8,94.5,-73.8,78.85,-73.4,66.5,-86,66.5,-86,62.75,-89.8,56.35,-94.7,56.35,-94.7,41.6,-105.85,36.85,-126,36.85,-126,35.9,-130.15,38.15,-133.4,38.15,-133.4,40.05,-136.15,43.8,-137.85,43.8,-137.85,60,-144.85,65.8,-147.2,65.8,-147.2,78.2,-152.35,88.15,-155.35,88.15,-155.35,92.5,-156.65,99.1,-156.05,99.1,-156.05,102.95,-155.7,110.55,-154.5,110.55,-154.5,115.05,-153.95,123.75,-152.35], [9.85,-103.05,12.15,-103,14.7,-101.7,14.7,-101.7,17.35,-100.4,18.6,-98.6,18.6,-98.6,21.7,-94.35,26.3,-86.95,26.3,-86.95,31.75,-77.95,33.7,-75.05,33.7,-75.05,37.75,-69.2,46.1,-59.3,46.1,-59.3,50.75,-53.85,51.1,-45.05,51.1,-45.05,51.5,-36.15,47.15,-30.65,47.15,-30.65,46.4,-29.7,45.1,-28.95,45.1,-28.95,43.8,-28.2,42.7,-28.1,42.7,-28.1,34.65,-27.2,28.3,-32.15,28.3,-32.15,22.05,-37.05,20.5,-45.25,20.5,-45.25,20.1,-47.55,19,-50.85,19,-50.85,18.15,-53.6,17.25,-56.4,17.25,-56.4,16.2,-56.55,15.1,-56.75,15.1,-56.75,14.5,-55.7,12.95,-53.85,12.95,-53.85,11.65,-52,11.4,-50.75,11.4,-50.75,10.5,-46.5,9.65,-36.1,9.65,-36.1,9.2,-30.25,4.2,-26.95,4.2,-26.95,-0.75,-23.75,-6.4,-25.5,-6.4,-25.5,-19.55,-29.65,-20.6,-33.7,-20.6,-33.7,-21.1,-35.5,-20.3,-39.5,-20.3,-39.5,-18.95,-46.1,-18.65,-48.7,-18.65,-48.7,-17.6,-58.3,-12.15,-68.55,-12.15,-68.55,-9.5,-73.5,-0.95,-86.2,-0.95,-86.2,0.3,-87.95,1.9,-91.45,1.9,-91.45,3.65,-95.45,4.5,-96.85,4.5,-96.85,6.7,-100.3,7.1,-100.8,7.1,-100.8,8.75,-103.1,9.85,-103.05] ]; var points = []; var edges = []; reset(); update(); })();
CSS
HTML
Join Effecthub.com
Working with Global Gaming Artists and Developers!
Login
Sign Up
Or Login with Your Email Address:
Email
Password
Remember
Or Sign Up with Your Email Address:
Your Email
This field must contain a valid email
Set Password
Password should be at least 1 character
Stay informed via email