UNPKG

d3-force-straighten

Version:

A D3 force plugin that straightens chains of connected nodes into rigid lines.

3 lines (2 loc) 4.93 kB
// Version 1.0.0 d3-force-straighten - https://github.com/vasturiano/d3-force-straighten !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){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 e(n){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(n){return typeof n}:function(n){return n&&"function"==typeof Symbol&&n.constructor===Symbol&&n!==Symbol.prototype?"symbol":typeof n},e(n)}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}}n.forceStraighten=function(){var n,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],i=[],u=function(n){return n.index},f=1,a=!1,c=[];function l(t){var r=f*(a?t:1);c.forEach((function(t){var e=function(n){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:2;if(n.length<2)throw new Error("At least two points are required for linear regression.");var r,e=["x",t>1?"y":null,t>2?"z":null].filter((function(n){return n})),i=Object.fromEntries(e.map((function(t){return[t,n.map((function(n){return n[t]})).reduce((function(n,t){return n+t}),0)/n.length]}))),u=0,f=0,a=0,c=0,l=0,s=0,y=function(n,t){var r="undefined"!=typeof Symbol&&n[Symbol.iterator]||n["@@iterator"];if(!r){if(Array.isArray(n)||(r=o(n))||t){r&&(n=r);var e=0,i=function(){};return{s:i,n:function(){return e>=n.length?{done:!0}:{done:!1,value:n[e++]}},e:function(n){throw n},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var u,f=!0,a=!1;return{s:function(){r=r.call(n)},n:function(){var n=r.next();return f=n.done,n},e:function(n){a=!0,u=n},f:function(){try{f||null==r.return||r.return()}finally{if(a)throw u}}}}(n);try{var d=function(){var n=r.value,o=Object.fromEntries(e.map((function(t){return[t,n[t]-i[t]]})));u+=o.x*o.x,t>1&&(f+=o.x*o.y,c+=o.y*o.y),t>2&&(a+=o.x*o.z,l+=o.y*o.z,s+=o.z*o.z)};for(y.s();!(r=y.n()).done;)d()}catch(n){y.e(n)}finally{y.f()}function h(n){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:100,r=[1,1,1],e=function(){var t=[n[0][0]*r[0]+n[0][1]*r[1]+n[0][2]*r[2],n[1][0]*r[0]+n[1][1]*r[1]+n[1][2]*r[2],n[2][0]*r[0]+n[2][1]*r[1]+n[2][2]*r[2]],e=Math.hypot.apply(Math,t);r=t.map((function(n){return n/e}))},o=0;o<t;o++)e();return r}var p=h([[u,f,a],[f,c,l],[a,l,s]]);return{point:i,direction:Object.fromEntries(e.map((function(n,t){return[n,p[t]]})))}}(t,n);t.forEach((function(t){var o=function(n,t,r){var e=["x",r>1?"y":null,r>2?"z":null].filter((function(n){return n})),o=n.point,i=n.direction,u=Object.fromEntries(e.map((function(n){return[n,t[n]-o[n]]}))),f=e.reduce((function(n,t){return n+u[t]*i[t]}),0),a=e.reduce((function(n,t){return n+i[t]*i[t]}),0),c=0===a?0:f/a;return Object.fromEntries(e.map((function(n){return[n,o[n]+c*i[n]]})))}(e,t,n);t.vx+=(o.x-t.x)*r,t.vy+=(o.y-t.y)*r}))}))}function s(){var n=new Map(i.map((function(n,t){return[u(n,t,i),n]}))),o=new Map;t.forEach((function(t){"object"!==e(t.source)&&(t.source=n.get(t.source)||t.source),"object"!==e(t.target)&&(t.target=n.get(t.target)||t.target),[t.source,t.target].forEach((function(n){!o.has(n)&&o.set(n,[]),o.get(n).push(t)}))})),c.length=0;var f=new Set,a=function(n,t){var e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:new Set;e.add(n);var i=o.get(n);if(2!==new Set(i.map((function(n){return[n.source,n.target].flat()}))).size)return[n];var u=i.filter((function(n){return!f.has(n)})).map((function(n){return f.add(n),n[t]})).filter((function(n){return!e.has(n)}))[0]||null;return[n].concat(r(u?a(u,t,e):[]))};t.forEach((function(n){if(!f.has(n)){f.add(n);var t=[].concat(r(a(n.source,"source").reverse()),r(a(n.target,"target")));t.length>2&&new Set(t).size===t.length&&c.push(t)}}))}return l.initialize=function(t){i=t;for(var r=arguments.length,e=new Array(r>1?r-1:0),o=1;o<r;o++)e[o-1]=arguments[o];n=e.find((function(n){return[1,2,3].includes(n)}))||2,s()},l.links=function(n){return arguments.length?(t=n,s(),l):t},l.id=function(n){return arguments.length?(u=n,l):u},l.strength=function(n){return arguments.length?(f=n,l):f},l.considerAlpha=function(n){return arguments.length?(a=n,l):a},l}}));