UNPKG

d3-beeswarm

Version:

D3 plugin which computes a 'beeswarm' arrangement

1 lines 4.68 kB
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t(e.d3=e.d3||{})}(this,function(e){"use strict";function t(){this._valueAccessor=function(e){return e.value},this._idAccessor=function(e){return e.id},this._min=null,this._max=null,this._closestTo0=null,this.size=0,this._idToNode={}}function n(){function e(){}function n(){T=w.map(function(e,t){return{datum:e,id:t,fixed:E(e),free:-(1/0)}}),v=2*C,p=Math.pow(v,2),_=(new t).valueAccessor(function(e){return e.fixed}).addMany(T),x=(new t).valueAccessor(function(e){return e.fixed}),m=(new t).valueAccessor(function(e){return e.free}),y=A=0,M=0,g=b=z=0}function i(e,t,n){return null===t?null:("prev"===n?e.value-t.value>v:t.value-e.value>v)?null:isFinite(t.datum.free)?t.datum:i(e,t[n],n)}function s(e,t,n,i){null!==t&&(("prev"===n?e.value-t.value>v:t.value-e.value>v)||(i.push(t.datum),s(e,t[n],n,i)))}function r(e){var t=[],n=_.dln(e),r=i(n,n.prev,"prev"),o=i(n,n.next,"next");return null!=r&&(n=x.dln(r),s(n,n,"prev",t)),null!=o&&(n=x.dln(o),s(n,n,"next",t)),y+=t.length,t.length>A&&(A=t.length),t}function o(e){return"symetric"===P||("positive"===P?e.free>=0:e.free<=0)}function u(e,t){return Math.abs(e.free)<Math.abs(t)}function l(e,t){return Math.sqrt(p-Math.pow(t.fixed-e.fixed,2))+1e-6}function a(e,t,n){e.free=t.free-n}function c(e,t,n){e.free=t.free+n}function h(e,t){return g++,Math.pow(t.free-e.free,2)+Math.pow(t.fixed-e.fixed,2)<p}function f(e,t,n,i){return null!==t&&(!("prev"===n?e.free-t.datum.free>v:t.datum.free-e.free>v)&&(!!h(e,t.datum)||f(e,t[n],n,i++)))}function d(e,t){var n=0;return!!f(e,t,"prev",n++)||f(e,t,"next",n++)}var v,p,_,x,m,T,y,A,M,g,b,z,w=[],C=4,N="horizontal",P="symetric",E=function(e){return e.x};return e.data=function(t){return arguments.length?(w=t,e):w},e.radius=function(t){return arguments.length?(C=t,e):C},e.orientation=function(t){return arguments.length?("horizontal"!==t&&"vertical"!==t||(N=t),e):N},e.side=function(t){return arguments.length?("symetric"!==t&&"positive"!==t&&"negative"!==t||(P=t),e):P},e.distributeOn=function(t){return arguments.length?(E=t,e):E},e.arrange=function(){return n(),T.forEach(function(e){var t,n=-(1/0),i=r(e);0===i.length?n=0:(m.empty(),m.addMany(i),e.free=0,d(e,m.closestTo0())?i.forEach(function(i){t=l(i,e),a(e,i,t),o(e)&&u(e,n)&&!d(e,m.dln(i))&&(n=e.free),b+=g,g>z&&(z=g),g=0,M+=1,c(e,i,t),o(e)&&u(e,n)&&!d(e,m.dln(i))&&(n=e.free),b+=g,g>z&&(z=g),g=0,M+=1}):(n=0,b+=g,g>z&&(z=g),g=0,M+=1)),e.free=n,"horizontal"===N?(e.x=e.fixed,e.y=n):(e.x=n,e.y=e.fixed),x.add(e)}),T},e.metrics=function(){return{totalPossibleColliders:y,maxPossibleColliders:A,totalTestedPlacements:M,visitedColliderCount:g,totalVisitedColliders:b,maxVisitedColliders:z}},e}t.prototype.valueAccessor=function(e){return arguments.length?(this._valueAccessor=e,this):this._valueAccessor},t.prototype.idAccessor=function(e){return arguments.length?(this._idAccessor=e,this):this._idAccessor},t.prototype.min=function(){return this._min},t.prototype.max=function(){return this._max},t.prototype.closestTo0=function(){return this._closestTo0},t.prototype.dln=function(e){return this._idToNode[this._idAccessor(e)]},t.prototype.empty=function(){return this._min=null,this._max=null,this._closestTo0=null,this.size=0,this._idToNode={},this},t.prototype.add=function(e){var t={datum:e,value:this._valueAccessor(e),prev:null,next:null};if(0===this.size)this._min=this._max=this._closestTo0=t;else{if(t.value<=this._min.value)t.next=this._min,t.next.prev=t,this._min=t;else if(t.value>=this._max.value)t.prev=this._max,t.prev.next=t,this._max=t;else{for(var n=this._max;n.value>t.value;)n=n.prev;t.prev=n,t.next=n.next,t.next.prev=t,t.prev.next=t}Math.abs(t.value)<Math.abs(this._closestTo0.value)&&(this._closestTo0=t)}return this._idToNode[this._idAccessor(e)]=t,this.size++,this},t.prototype.addMany=function(e){return e.forEach(function(e,t){this.add(e)},this),this},t.prototype.remove=function(e){var t=this.dln(e);if(1===this.size)this._min=this._max=this._closestTo0=null;else{if(t===this._closestTo0)if(null===this._closestTo0.next)this._closestTo0=t.prev;else if(null===this._closestTo0.prev)this._closestTo0=t.prev;else{var n=Math.abs(this._closestTo0.prev.value),i=Math.abs(this._closestTo0.next.value);n<i?this._closestTo0=this._closestTo0.prev:this._closestTo0=this._closestTo0.next}t===this._min?(this._min=this._min.next,this._min.prev=null):t===this._max?(this._max=this._max.prev,this._max.next=null):(t.next.prev=t.prev,t.prev.next=t.next)}return delete this._idToNode[this._idAccessor(e)],t=null,this.size--,this},e.beeswarm=n,Object.defineProperty(e,"__esModule",{value:!0})});