1
0
Fork 0
mirror of https://github.com/maybe-finance/maybe.git synced 2025-07-18 20:59:39 +02:00
Maybe/vendor/javascript/d3-contour.js
Josh Pigford 868d4ede6e
Sankey Diagram (#2269)
* Enhance cash flow dashboard with new cash flow period handling and improved Sankey diagram rendering. Update D3 and related dependencies for better performance and features.

* Fix Rubocop offenses

* Refactor Sankey chart controller to use Number.parseFloat for value formatting and improve code readability by restructuring conditional logic for node shapes.
2025-05-20 13:31:05 -05:00

4 lines
6.3 KiB
JavaScript

// d3-contour@4.0.2 downloaded from https://ga.jspm.io/npm:d3-contour@4.0.2/src/index.js
import{thresholdSturges as n,extent as t,ticks as r,nice as o,blur2 as i,max as e}from"d3-array";var a=Array.prototype;var s=a.slice;function ascending(n,t){return n-t}function area(n){var t=0,r=n.length,o=n[r-1][1]*n[0][0]-n[r-1][0]*n[0][1];while(++t<r)o+=n[t-1][1]*n[t][0]-n[t-1][0]*n[t][1];return o}var constant=n=>()=>n;function contains(n,t){var r,o=-1,i=t.length;while(++o<i)if(r=ringContains(n,t[o]))return r;return 0}function ringContains(n,t){var r=t[0],o=t[1],i=-1;for(var e=0,a=n.length,s=a-1;e<a;s=e++){var u=n[e],f=u[0],c=u[1],h=n[s],l=h[0],d=h[1];if(segmentContains(u,h,t))return 0;c>o!==d>o&&r<(l-f)*(o-c)/(d-c)+f&&(i=-i)}return i}function segmentContains(n,t,r){var o;return collinear(n,t,r)&&within(n[o=+(n[0]===t[0])],r[o],t[o])}function collinear(n,t,r){return(t[0]-n[0])*(r[1]-n[1])===(r[0]-n[0])*(t[1]-n[1])}function within(n,t,r){return n<=t&&t<=r||r<=t&&t<=n}function noop(){}var u=[[],[[[1,1.5],[.5,1]]],[[[1.5,1],[1,1.5]]],[[[1.5,1],[.5,1]]],[[[1,.5],[1.5,1]]],[[[1,1.5],[.5,1]],[[1,.5],[1.5,1]]],[[[1,.5],[1,1.5]]],[[[1,.5],[.5,1]]],[[[.5,1],[1,.5]]],[[[1,1.5],[1,.5]]],[[[.5,1],[1,.5]],[[1.5,1],[1,1.5]]],[[[1.5,1],[1,.5]]],[[[.5,1],[1.5,1]]],[[[1,1.5],[1.5,1]]],[[[.5,1],[1,1.5]]],[]];function Contours(){var i=1,e=1,a=n,f=smoothLinear;function contours(n){var i=a(n);if(Array.isArray(i))i=i.slice().sort(ascending);else{const e=t(n,finite);i=r(...o(e[0],e[1],i),i);while(i[i.length-1]>=e[1])i.pop();while(i[1]<e[0])i.shift()}return i.map((t=>contour(n,t)))}function contour(n,t){const r=null==t?NaN:+t;if(isNaN(r))throw new Error(`invalid value: ${t}`);var o=[],i=[];isorings(n,r,(function(t){f(t,n,r);area(t)>0?o.push([t]):i.push(t)}));i.forEach((function(n){for(var t,r=0,i=o.length;r<i;++r)if(-1!==contains((t=o[r])[0],n)){t.push(n);return}}));return{type:"MultiPolygon",value:t,coordinates:o}}function isorings(n,t,r){var o,a,s,f,c,h,l=new Array,d=new Array;o=a=-1;f=above(n[0],t);u[f<<1].forEach(stitch);while(++o<i-1){s=f,f=above(n[o+1],t);u[s|f<<1].forEach(stitch)}u[f<<0].forEach(stitch);while(++a<e-1){o=-1;f=above(n[a*i+i],t);c=above(n[a*i],t);u[f<<1|c<<2].forEach(stitch);while(++o<i-1){s=f,f=above(n[a*i+i+o+1],t);h=c,c=above(n[a*i+o+1],t);u[s|f<<1|c<<2|h<<3].forEach(stitch)}u[f|c<<3].forEach(stitch)}o=-1;c=n[a*i]>=t;u[c<<2].forEach(stitch);while(++o<i-1){h=c,c=above(n[a*i+o+1],t);u[c<<2|h<<3].forEach(stitch)}u[c<<3].forEach(stitch);function stitch(n){var t,i,e=[n[0][0]+o,n[0][1]+a],s=[n[1][0]+o,n[1][1]+a],u=index(e),f=index(s);if(t=d[u])if(i=l[f]){delete d[t.end];delete l[i.start];if(t===i){t.ring.push(s);r(t.ring)}else l[t.start]=d[i.end]={start:t.start,end:i.end,ring:t.ring.concat(i.ring)}}else{delete d[t.end];t.ring.push(s);d[t.end=f]=t}else if(t=l[f])if(i=d[u]){delete l[t.start];delete d[i.end];if(t===i){t.ring.push(s);r(t.ring)}else l[i.start]=d[t.end]={start:i.start,end:t.end,ring:i.ring.concat(t.ring)}}else{delete l[t.start];t.ring.unshift(e);l[t.start=u]=t}else l[u]=d[f]={start:u,end:f,ring:[e,s]}}}function index(n){return 2*n[0]+n[1]*(i+1)*4}function smoothLinear(n,t,r){n.forEach((function(n){var o=n[0],a=n[1],s=0|o,u=0|a,f=valid(t[u*i+s]);o>0&&o<i&&s===o&&(n[0]=smooth1(o,valid(t[u*i+s-1]),f,r));a>0&&a<e&&u===a&&(n[1]=smooth1(a,valid(t[(u-1)*i+s]),f,r))}))}contours.contour=contour;contours.size=function(n){if(!arguments.length)return[i,e];var t=Math.floor(n[0]),r=Math.floor(n[1]);if(!(t>=0&&r>=0))throw new Error("invalid size");return i=t,e=r,contours};contours.thresholds=function(n){return arguments.length?(a="function"===typeof n?n:Array.isArray(n)?constant(s.call(n)):constant(n),contours):a};contours.smooth=function(n){return arguments.length?(f=n?smoothLinear:noop,contours):f===smoothLinear};return contours}function finite(n){return isFinite(n)?n:NaN}function above(n,t){return null!=n&&+n>=t}function valid(n){return null==n||isNaN(n=+n)?-Infinity:n}function smooth1(n,t,r,o){const i=o-t;const e=r-t;const a=isFinite(i)||isFinite(e)?i/e:Math.sign(i)/Math.sign(e);return isNaN(a)?n:n+a-.5}function defaultX(n){return n[0]}function defaultY(n){return n[1]}function defaultWeight(){return 1}function density(){var n=defaultX,t=defaultY,o=defaultWeight,a=960,u=500,f=20,c=2,h=3*f,l=a+2*h>>c,d=u+2*h>>c,g=constant(20);function grid(r){var e=new Float32Array(l*d),a=Math.pow(2,-c),s=-1;for(const i of r){var u=(n(i,++s,r)+h)*a,g=(t(i,s,r)+h)*a,v=+o(i,s,r);if(v&&u>=0&&u<l&&g>=0&&g<d){var y=Math.floor(u),w=Math.floor(g),p=u-y-.5,m=g-w-.5;e[y+w*l]+=(1-p)*(1-m)*v;e[y+1+w*l]+=p*(1-m)*v;e[y+1+(w+1)*l]+=p*m*v;e[y+(w+1)*l]+=(1-p)*m*v}}i({data:e,width:l,height:d},f*a);return e}function density(n){var t=grid(n),o=g(t),i=Math.pow(2,2*c);Array.isArray(o)||(o=r(Number.MIN_VALUE,e(t)/i,o));return Contours().size([l,d]).thresholds(o.map((n=>n*i)))(t).map(((n,t)=>(n.value=+o[t],transform(n))))}density.contours=function(n){var t=grid(n),r=Contours().size([l,d]),o=Math.pow(2,2*c),contour=n=>{n=+n;var i=transform(r.contour(t,n*o));i.value=n;return i};Object.defineProperty(contour,"max",{get:()=>e(t)/o});return contour};function transform(n){n.coordinates.forEach(transformPolygon);return n}function transformPolygon(n){n.forEach(transformRing)}function transformRing(n){n.forEach(transformPoint)}function transformPoint(n){n[0]=n[0]*Math.pow(2,c)-h;n[1]=n[1]*Math.pow(2,c)-h}function resize(){h=3*f;l=a+2*h>>c;d=u+2*h>>c;return density}density.x=function(t){return arguments.length?(n="function"===typeof t?t:constant(+t),density):n};density.y=function(n){return arguments.length?(t="function"===typeof n?n:constant(+n),density):t};density.weight=function(n){return arguments.length?(o="function"===typeof n?n:constant(+n),density):o};density.size=function(n){if(!arguments.length)return[a,u];var t=+n[0],r=+n[1];if(!(t>=0&&r>=0))throw new Error("invalid size");return a=t,u=r,resize()};density.cellSize=function(n){if(!arguments.length)return 1<<c;if(!((n=+n)>=1))throw new Error("invalid cell size");return c=Math.floor(Math.log(n)/Math.LN2),resize()};density.thresholds=function(n){return arguments.length?(g="function"===typeof n?n:Array.isArray(n)?constant(s.call(n)):constant(n),density):g};density.bandwidth=function(n){if(!arguments.length)return Math.sqrt(f*(f+1));if(!((n=+n)>=0))throw new Error("invalid bandwidth");return f=(Math.sqrt(4*n*n+1)-1)/2,resize()};return density}export{density as contourDensity,Contours as contours};