d3-force-clustering
Version:
A clustering attraction force to group nodes for the d3-force simulation engine.
3 lines (2 loc) • 3.36 kB
JavaScript
// Version 1.0.0 d3-force-clustering - https://github.com/vasturiano/d3-force-clustering
!function(n,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((n="undefined"!=typeof globalThis?globalThis:n||self).d3=n.d3||{})}(this,(function(n){"use strict";function t(n,t){(null==t||t>n.length)&&(t=n.length);for(var r=0,e=Array(t);r<t;r++)e[r]=n[r];return e}function r(n,t){return function(n){if(Array.isArray(n))return n}(n)||function(n,t){var r=null==n?null:"undefined"!=typeof Symbol&&n[Symbol.iterator]||n["@@iterator"];if(null!=r){var e,o,i,u,a=[],f=!0,c=!1;try{if(i=(r=r.call(n)).next,0===t);else for(;!(f=(e=i.call(r)).done)&&(a.push(e.value),a.length!==t);f=!0);}catch(n){c=!0,o=n}finally{try{if(!f&&null!=r.return&&(u=r.return(),Object(u)!==u))return}finally{if(c)throw o}}return a}}(n,t)||o(n,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function e(n){return function(n){if(Array.isArray(n))return t(n)}(n)||function(n){if("undefined"!=typeof Symbol&&null!=n[Symbol.iterator]||null!=n["@@iterator"])return Array.from(n)}(n)||o(n)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function o(n,r){if(n){if("string"==typeof n)return t(n,r);var e={}.toString.call(n).slice(8,-1);return"Object"===e&&n.constructor&&(e=n.constructor.name),"Map"===e||"Set"===e?Array.from(n):"Arguments"===e||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(e)?t(n,r):void 0}}function i(n){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;return Math.sqrt(n*n+t*t+r*r)}function u(n){return function(){return n}}function a(n,t,r){var e=0,o=0,i=0,u=0;n.forEach((function(n){var a=t(n);o+=n.x*a,r>1&&(i+=n.y*a),r>2&&(u+=n.z*a),e+=a}));var a={};return a.x=o/e,r>1&&(a.y=i/e),r>2&&(a.z=u/e),a}n.forceClustering=function(){var n,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(n){return n.cluster},o=[],f=u(1),c=u(.2),l=0,s=new Map;function y(u){var y=new Map(e(s.entries()).map((function(t){var e=r(t,2);return[e[0],a(e[1],f,n)]}))),d=new Map(e(s.entries()).map((function(n){var t=r(n,2),e=t[0],o=t[1];return[e,c(e,o)]}))),h=["x",n>1&&"y",n>2&&"z"].filter((function(n){return n})),p=h.map((function(n){return"v".concat(n)}));o.forEach((function(n){var r=t(n);if(y.has(r)){var o=y.get(r),a=h.map((function(t){return o[t]-n[t]}));if(!(i.apply(void 0,e(a))<=l)){var f=d.get(r)*u;p.forEach((function(t,r){return n[t]+=a[r]*f}))}}}))}function d(){s.clear(),o.forEach((function(n){var r=t(n);s.has(r)||s.set(r,[]),s.get(r).push(n)})),s.forEach((function(n,t){return n.length<=1&&s.delete(t)}))}return y.initialize=function(t){o=t;for(var r=arguments.length,e=new Array(r>1?r-1:0),i=1;i<r;i++)e[i-1]=arguments[i];n=e.find((function(n){return[1,2,3].includes(n)}))||2,d()},y.clusterId=function(n){return arguments.length?(t=n,d(),y):t},y.weight=function(n){return arguments.length?(f="function"==typeof n?n:u(+n),y):f},y.strength=function(n){return arguments.length?(c="function"==typeof n?n:u(+n),y):c},y.distanceMin=function(n){return arguments.length?(l=n,y):l},y}}));