!function(f){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=f();else if("function"==typeof define&&define.amd)define([],f);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).ngraphCreate2dLayout=f()}}((function(){return function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a="function"==typeof require&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,(function(e){var n=t[o][1][e];return s(n||e)}),l,l.exports,e,t,n,r)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;omax_x&&(max_x=bodyPos.x),bodyPos.y>max_y&&(max_y=bodyPos.y)}boundingBox.min_x=min_x,boundingBox.min_y=min_y,boundingBox.max_x=max_x,boundingBox.max_y=max_y},reset:function(){boundingBox.min_x=boundingBox.max_x=0,boundingBox.min_y=boundingBox.max_y=0},getBestNewPosition:function(neighbors){var base_x=0,base_y=0;if(neighbors.length){for(var i=0;i0?spring.coefficient:options.springCoefficient)*d/r;body1.force.x+=coefficient*dx,body1.force.y+=coefficient*dy,body1.springCount+=1,body1.springLength+=r,body2.force.x-=coefficient*dx,body2.force.y-=coefficient*dy,body2.springCount+=1,body2.springLength+=r}}}}},{}],6:[function(require,module,exports){module.exports=function(){return function(bodies,timeStep,adaptiveTimeStepWeight){var length=bodies.length;if(0===length)return 0;for(var dx=0,tx=0,dy=0,ty=0,i=0;i1&&(body.velocity.x=vx/v,body.velocity.y=vy/v),dx=timeStep*body.velocity.x,dy=timeStep*body.velocity.y,body.pos.x+=dx,body.pos.y+=dy,tx+=Math.abs(dx),ty+=Math.abs(dy)}}return(tx*tx+ty*ty)/length}}},{}],7:[function(require,module,exports){function InsertStack(){this.stack=[],this.popIdx=0}function InsertStackElement(node,body){this.node=node,this.body=body}function QuadNode(){this.body=null,this.quad0=null,this.quad1=null,this.quad2=null,this.quad3=null,this.mass=0,this.mass_x=0,this.mass_y=0,this.min_x=0,this.min_y=0,this.max_x=0,this.max_y=0}function isSamePosition(point1,point2){var dx=Math.abs(point1.x-point2.x),dy=Math.abs(point1.y-point2.y);return dx<1e-8&&dy<1e-8}function getChild(node,idx){return 0===idx?node.quad0:1===idx?node.quad1:2===idx?node.quad2:3===idx?node.quad3:null}function setChild(node,idx,child){0===idx?node.quad0=child:1===idx?node.quad1=child:2===idx?node.quad2=child:3===idx&&(node.quad3=child)}InsertStack.prototype={isEmpty:function(){return 0===this.popIdx},push:function(node,body){var item=this.stack[this.popIdx];item?(item.node=node,item.body=body):this.stack[this.popIdx]=new InsertStackElement(node,body),++this.popIdx},pop:function(){if(this.popIdx>0)return this.stack[--this.popIdx]},reset:function(){this.popIdx=0}},module.exports=function(){return function(options,random){(options=options||{}).gravity="number"==typeof options.gravity?options.gravity:-1,options.theta="number"==typeof options.theta?options.theta:.8;var gravity=options.gravity,updateQueue=[],insertStack=new InsertStack,theta=options.theta,nodesCache=[],currentInCache=0,root=newNode();return{insertBodies:function(bodies){var xmin=Number.MAX_VALUE,ymin=Number.MAX_VALUE,xmax=Number.MIN_VALUE,ymax=Number.MIN_VALUE,i=bodies.length;for(;i--;){var pos=bodies[i].pos;pos.xxmax&&(xmax=pos.x),pos.y>ymax&&(ymax=pos.y)}var maxSideLength=-1/0;xmax-xmin>maxSideLength&&(maxSideLength=xmax-xmin);ymax-ymin>maxSideLength&&(maxSideLength=ymax-ymin);currentInCache=0,(root=newNode()).min_x=xmin,root.min_y=ymin,root.max_x=xmin+maxSideLength,root.max_y=ymin+maxSideLength,(i=bodies.length-1)>=0&&(root.body=bodies[i]);for(;i--;)insert(bodies[i])},getRoot:function(){return root},updateBodyForce:function(sourceBody){var v,dx,dy,r,queue=updateQueue,fx=0,fy=0,queueLength=1,shiftIdx=0,pushIdx=1;queue[0]=root;for(;queueLength;){var node=queue[shiftIdx],body=node.body;queueLength-=1,shiftIdx+=1;var differentBody=body!==sourceBody;body&&differentBody?(dx=body.pos.x-sourceBody.pos.x,dy=body.pos.y-sourceBody.pos.y,0===(r=Math.sqrt(dx*dx+dy*dy))&&(dx=(random.nextDouble()-.5)/50,dy=(random.nextDouble()-.5)/50,r=Math.sqrt(dx*dx+dy*dy)),v=gravity*body.mass*sourceBody.mass/(r*r*r),fx+=v*dx,fy+=v*dy):differentBody&&(dx=node.mass_x/node.mass-sourceBody.pos.x,dy=node.mass_y/node.mass-sourceBody.pos.y,0===(r=Math.sqrt(dx*dx+dy*dy))&&(dx=(random.nextDouble()-.5)/50,dy=(random.nextDouble()-.5)/50,r=Math.sqrt(dx*dx+dy*dy)),(node.max_x-node.min_x)/r0&&isSamePosition(oldBody.pos,body.pos));if(0===retriesCount&&isSamePosition(oldBody.pos,body.pos))return}insertStack.push(node,oldBody),insertStack.push(node,body)}else{var x=body.pos.x,y=body.pos.y;node.mass+=body.mass,node.mass_x+=body.mass*x,node.mass_y+=body.mass*y;var quadIdx=0,min_x=node.min_x,min_y=node.min_y,max_x=(min_x+node.max_x)/2,max_y=(min_y+node.max_y)/2;x>max_x&&(quadIdx+=1,min_x=max_x,max_x=node.max_x),y>max_y&&(quadIdx+=2,min_y=max_y,max_y=node.max_y);var child=getChild(node,quadIdx);child?insertStack.push(child,body):((child=newNode()).min_x=min_x,child.min_y=min_y,child.max_x=max_x,child.max_y=max_y,child.body=body,setChild(node,quadIdx,child))}}}}}},{}],8:[function(require,module,exports){module.exports=function(settings){var Spring=require("./spring"),merge=require("ngraph.merge"),eventify=require("ngraph.events");if(settings){if(void 0!==settings.springCoeff)throw new Error("springCoeff was renamed to springCoefficient");if(void 0!==settings.dragCoeff)throw new Error("dragCoeff was renamed to dragCoefficient")}settings=merge(settings,{springLength:10,springCoefficient:.8,gravity:-12,theta:.8,dragCoefficient:.9,timeStep:.5,adaptiveTimeStepWeight:0,dimensions:2,debug:!1});var factory=dimensionalCache[settings.dimensions];if(!factory){var dimensions=settings.dimensions;factory={Body:generateCreateBodyFunction(dimensions,settings.debug),createQuadTree:generateQuadTreeFunction(dimensions),createBounds:generateBoundsFunction(dimensions),createDragForce:generateCreateDragForceFunction(dimensions),createSpringForce:generateCreateSpringForceFunction(dimensions),integrate:generateIntegratorFunction(dimensions)},dimensionalCache[dimensions]=factory}var Body=factory.Body,createQuadTree=factory.createQuadTree,createBounds=factory.createBounds,createDragForce=factory.createDragForce,createSpringForce=factory.createSpringForce,integrate=factory.integrate,random=require("ngraph.random").random(42),bodies=[],springs=[],quadTree=createQuadTree(settings,random),bounds=createBounds(bodies,settings,random),springForce=createSpringForce(settings,random),dragForce=createDragForce(settings),forces=[],forceMap=new Map,iterationNumber=0;addForce("nbody",(function(){if(0===bodies.length)return;quadTree.insertBodies(bodies);var i=bodies.length;for(;i--;){var body=bodies[i];body.isPinned||(body.reset(),quadTree.updateBodyForce(body),dragForce.update(body))}})),addForce("spring",(function(){var i=springs.length;for(;i--;)springForce.update(springs[i])}));var publicApi={bodies:bodies,quadTree:quadTree,springs:springs,settings:settings,addForce:addForce,removeForce:function(forceName){var forceIndex=forces.indexOf(forceMap.get(forceName));if(forceIndex<0)return;forces.splice(forceIndex,1),forceMap.delete(forceName)},getForces:function(){return forceMap},step:function(){for(var i=0;inew Body(pos))(pos);return bodies.push(body),body},removeBody:function(body){if(body){var idx=bodies.indexOf(body);if(!(idx<0))return bodies.splice(idx,1),0===bodies.length&&bounds.reset(),!0}},addSpring:function(body1,body2,springLength,springCoefficient){if(!body1||!body2)throw new Error("Cannot add null spring to force simulator");"number"!=typeof springLength&&(springLength=-1);var spring=new Spring(body1,body2,springLength,springCoefficient>=0?springCoefficient:-1);return springs.push(spring),spring},getTotalMovement:function(){return 0},removeSpring:function(spring){if(spring){var idx=springs.indexOf(spring);return idx>-1?(springs.splice(idx,1),!0):void 0}},getBestNewBodyPosition:function(neighbors){return bounds.getBestNewPosition(neighbors)},getBBox:getBoundingBox,getBoundingBox:getBoundingBox,invalidateBBox:function(){console.warn("invalidateBBox() is deprecated, bounds always recomputed on `getBBox()` call")},gravity:function(value){return void 0!==value?(settings.gravity=value,quadTree.options({gravity:value}),this):settings.gravity},theta:function(value){return void 0!==value?(settings.theta=value,quadTree.options({theta:value}),this):settings.theta},random:random};return function(settings,target){for(var key in settings)augment(settings,target,key)}(settings,publicApi),eventify(publicApi),publicApi;function getBoundingBox(){return bounds.update(),bounds.box}function addForce(forceName,forceFunction){if(forceMap.has(forceName))throw new Error("Force "+forceName+" is already added");forceMap.set(forceName,forceFunction),forces.push(forceFunction)}};var generateCreateBodyFunction=require("./codeGenerators/generateCreateBody"),generateQuadTreeFunction=require("./codeGenerators/generateQuadTree"),generateBoundsFunction=require("./codeGenerators/generateBounds"),generateCreateDragForceFunction=require("./codeGenerators/generateCreateDragForce"),generateCreateSpringForceFunction=require("./codeGenerators/generateCreateSpringForce"),generateIntegratorFunction=require("./codeGenerators/generateIntegrator"),dimensionalCache={};function augment(source,target,key){if(source.hasOwnProperty(key)&&"function"!=typeof target[key]){var sourceIsNumber=Number.isFinite(source[key]);target[key]=sourceIsNumber?function(value){if(void 0!==value){if(!Number.isFinite(value))throw new Error("Value of "+key+" should be a valid number.");return source[key]=value,target}return source[key]}:function(value){return void 0!==value?(source[key]=value,target):source[key]}}}},{"./codeGenerators/generateBounds":2,"./codeGenerators/generateCreateBody":3,"./codeGenerators/generateCreateDragForce":4,"./codeGenerators/generateCreateSpringForce":5,"./codeGenerators/generateIntegrator":6,"./codeGenerators/generateQuadTree":7,"./spring":9,"ngraph.events":10,"ngraph.merge":11,"ngraph.random":12}],9:[function(require,module,exports){module.exports=function(fromBody,toBody,length,springCoefficient){this.from=fromBody,this.to=toBody,this.length=length,this.coefficient=springCoefficient}},{}],10:[function(require,module,exports){module.exports=function(subject){!function(subject){if(!subject)throw new Error("Eventify cannot use falsy object as events subject");for(var reservedWords=["on","fire","off"],i=0;i1&&(fireArguments=Array.prototype.splice.call(arguments,1));for(var i=0;i>>19))+374761393+(seed<<5)&4294967295)+3550635116^seed<<9))+4251993797+(seed<<3)&4294967295)^seed>>>16),this.seed=seed,(268435455&seed)/268435456}module.exports=random,module.exports.random=random,module.exports.randomIterator=function(array,customRandom){var localRandom=customRandom||random();if("function"!=typeof localRandom.next)throw new Error("customRandom does not match expected API: next() function is missing");return{forEach:function(callback){var i,j,t;for(i=array.length-1;i>0;--i)j=localRandom.next(i+1),t=array[j],array[j]=array[i],array[i]=t,callback(t);array.length&&callback(array[0])},shuffle:function(){var i,j,t;for(i=array.length-1;i>0;--i)j=localRandom.next(i+1),t=array[j],array[j]=array[i],array[i]=t;return array}}},Generator.prototype.next=function(maxValue){return Math.floor(this.nextDouble()*maxValue)},Generator.prototype.nextDouble=nextDouble,Generator.prototype.uniform=nextDouble,Generator.prototype.gaussian=function(){var r,x,y;do{x=2*this.nextDouble()-1,y=2*this.nextDouble()-1,r=x*x+y*y}while(r>=1||0===r);return x*Math.sqrt(-2*Math.log(r)/r)}},{}]},{},[1])(1)}));