d3-force-straighten-paths
Version:
A force to straighten curved paths through a network
1 lines • 2.46 kB
JavaScript
!function(n,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("d3-collection")):"function"==typeof define&&define.amd?define(["exports","d3-collection"],t):t(n.d3=n.d3||{},n.d3Collection)}(this,function(n,t){"use strict";function e(n){function t(n,t){var e=n.get(t);if(!e)throw new Error("node missing: "+t);return e}function e(){if(r){var n=d3.map(r,i);o=u.map(function(e){return{nodes:a(e).map(function(e){return"object"!=typeof e?t(n,e):e}),strength:f(e)}})}}var r,o,u=n||[],i=function(n){return n.index},c=.1,a=function(n){return n.nodes},f=function(n){return"undefined"!=typeof n.strength?+n.strength:1},y=!1,s=function(n){function t(n,t){return n.x*t.x+n.y*t.y}function e(n){return Math.sqrt(n.x*n.x+n.y*n.y)}function r(n,r){var o=t(n,r)/(e(n)*e(r));return o=Math.min(o,1),o=Math.max(o,-1),Math.acos(o)}function u(n){var t=-n.y/n.x,r=1,o=e({x:t,y:r});return{x:t/o,y:r/o}}function a(n,t,e,r){var o=Math.PI-t,u=o*o;return{kind:"adjacent",x:e.x*u*r,y:e.y*u*r}}function f(n,t){return{kind:"center",x:-(n.x+t.x),y:-(n.y+t.y)}}function s(n,t){n.x+=t.x,n.y+=t.y}var x=[];o.forEach(function(n,t){var e=n.nodes,o=n.strength;if("number"!=typeof o&&(o=1),!(e.length<3)){y&&x.push({action:"init",nodes:e.map(function(n){return{id:i(n),x:n.x,y:n.y}}),edges:e.reduce(function(n,t){return Array.isArray(n)?(n.push({source:n[n.length-1].target,target:i(t)}),n):[{source:i(n),target:i(t)}]})});for(var t=1;t<e.length-1;++t){var h=e[t],d=e[t-1],g=e[t+1];if(d!==g){var l={x:d.x-h.x,y:d.y-h.y},p={x:g.x-h.x,y:g.y-h.y},m=r(l,p),v=u(l),M=u(p),b={x:(d.x+g.x)/2,y:(d.y+g.y)/2},P={x:b.x-d.x,y:b.y-d.y},j={x:b.x-g.x,y:b.y-g.y};v=r(P,v)>=Math.PI/2?v:{x:-v.x,y:-v.y},M=r(j,M)>=Math.PI/2?M:{x:-M.x,y:-M.y};var I=a(d,m,v,o*c),k=a(g,m,M,o*c),q=f(I,k);y&&x.push({action:"force",nodes:[{id:i(d),x:d.x,y:d.y,force:I},{id:i(h),x:h.x,y:h.y,force:q},{id:i(g),x:g.x,y:g.y,force:k}],edges:[{source:i(d),target:i(h)},{source:i(h),target:i(g)}]}),s(d,I),s(g,k),s(h,q)}}}}),y&&console.log(x)};return s.initialize=function(n){r=n,e()},s.paths=function(n){return arguments.length?(u=n,e(),this):o},s.id=function(n){return arguments.length?(i=n,this):i},s.angleForce=function(n){return arguments.length?(c=n,this):c},s.pathNodes=function(n){return arguments.length?(a=n,this):a},s.pathStrength=function(n){return arguments.length?(f=n,this):f},s.debug=function(n){return arguments.length?(y=n,this):y},s}n.forceStraightenPaths=e,Object.defineProperty(n,"__esModule",{value:!0})});