cubic-beziers-through-points
Version:
A function to fit fair (bending energy minimizing) cubic bezier curves through a set of given ordered points in the plane.
1 lines • 19.9 kB
JavaScript
var n={d:(t,r)=>{for(var e in r)n.o(r,e)&&!n.o(t,e)&&Object.defineProperty(t,e,{enumerable:!0,get:r[e]})},o:(n,t)=>Object.prototype.hasOwnProperty.call(n,t)},t={};function r(n,t){function r(t){return[n[0]+t[0],n[1]+t[1]]}return void 0===t?r:r(t)}function e(n){return[-n[0],-n[1]]}function o(n,t,r){function e(r){return[r[0]*t-r[1]*n,r[0]*n+r[1]*t]}return void 0===r?e:e(r)}function c(n,t){return[t*n[0],t*n[1]]}function s(n){return Math.sqrt(n[0]*n[0]+n[1]*n[1])}n.d(t,{r:()=>Ot,B6:()=>Mt,RX:()=>Tt,nV:()=>yt});const{cos:u,sin:i,atan2:f}=Math;function l(n){const t=n[0];n=n.map(r(e(t)));const[l,a]=[n[3][0],n[3][1]],h=f(a,l),p=(n=n.map(o(i(-h),u(-h))))[3][0];n=n.map((n=>c(n,1/p)));const d=n[1],g=[1-n[2][0],-n[2][1]];return{α:f(d[1],d[0]),β:f(g[1],g[0]),s0:3*s(d),s1:3*s(g),L:p,rot:h,p:t}}function a(n,t,r=16){if(t[0]===t[1])return 0;const{weights:e,abscissas:o}=h[r],[c,s]=t;let u=0;const i=(s-c)/2,f=(s+c)/2;for(let t=0;t<=r-1;t++)u+=e[t]*n(i*o[t]+f);return i*u}const h={2:{weights:[1,1],abscissas:[-.5773502691896257,.5773502691896257]},4:{weights:[.6521451548625461,.6521451548625461,.3478548451374538,.3478548451374538],abscissas:[-.3399810435848563,.3399810435848563,-.8611363115940526,.8611363115940526]},8:{weights:[.362683783378362,.362683783378362,.3137066458778873,.3137066458778873,.2223810344533745,.2223810344533745,.1012285362903763,.1012285362903763],abscissas:[-.1834346424956498,.1834346424956498,-.525532409916329,.525532409916329,-.7966664774136267,.7966664774136267,-.9602898564975363,.9602898564975363]},16:{weights:[.027152459411754096,.062253523938647894,.09515851168249279,.12462897125553388,.14959598881657674,.16915651939500254,.18260341504492358,.1894506104550685,.1894506104550685,.18260341504492358,.16915651939500254,.14959598881657674,.12462897125553388,.09515851168249279,.062253523938647894,.027152459411754096],abscissas:[-.9894009349916499,-.9445750230732326,-.8656312023878318,-.755404408355003,-.6178762444026438,-.45801677765722737,-.2816035507792589,-.09501250983763744,.09501250983763744,.2816035507792589,.45801677765722737,.6178762444026438,.755404408355003,.8656312023878318,.9445750230732326,.9894009349916499]},64:{weights:[.048690957009139724,.048690957009139724,.04857546744150343,.04857546744150343,.048344762234802954,.048344762234802954,.04799938859645831,.04799938859645831,.04754016571483031,.04754016571483031,.04696818281621002,.04696818281621002,.046284796581314416,.046284796581314416,.04549162792741814,.04549162792741814,.044590558163756566,.044590558163756566,.04358372452932345,.04358372452932345,.04247351512365359,.04247351512365359,.04126256324262353,.04126256324262353,.03995374113272034,.03995374113272034,.038550153178615626,.038550153178615626,.03705512854024005,.03705512854024005,.035472213256882386,.035472213256882386,.033805161837141606,.033805161837141606,.03205792835485155,.03205792835485155,.030234657072402478,.030234657072402478,.028339672614259483,.028339672614259483,.02637746971505466,.02637746971505466,.024352702568710874,.024352702568710874,.022270173808383253,.022270173808383253,.02013482315353021,.02013482315353021,.017951715775697343,.017951715775697343,.015726030476024718,.015726030476024718,.013463047896718643,.013463047896718643,.011168139460131128,.011168139460131128,.008846759826363947,.008846759826363947,.006504457968978363,.006504457968978363,.004147033260562468,.004147033260562468,.001783280721696433,.001783280721696433],abscissas:[-.024350292663424433,.024350292663424433,-.07299312178779904,.07299312178779904,-.12146281929612056,.12146281929612056,-.16964442042399283,.16964442042399283,-.21742364374000708,.21742364374000708,-.2646871622087674,.2646871622087674,-.31132287199021097,.31132287199021097,-.3572201583376681,.3572201583376681,-.4022701579639916,.4022701579639916,-.4463660172534641,.4463660172534641,-.48940314570705296,.48940314570705296,-.5312794640198946,.5312794640198946,-.571895646202634,.571895646202634,-.6111553551723933,.6111553551723933,-.6489654712546573,.6489654712546573,-.6852363130542333,.6852363130542333,-.7198818501716109,.7198818501716109,-.7528199072605319,.7528199072605319,-.7839723589433414,.7839723589433414,-.8132653151227975,.8132653151227975,-.8406292962525803,.8406292962525803,-.8659993981540928,.8659993981540928,-.8893154459951141,.8893154459951141,-.9105221370785028,.9105221370785028,-.9295691721319396,.9295691721319396,-.9464113748584028,.9464113748584028,-.9610087996520538,.9610087996520538,-.973326827789911,.973326827789911,-.983336253884626,.983336253884626,-.9910133714767443,.9910133714767443,-.9963401167719553,.9963401167719553,-.9993050417357722,.9993050417357722]}};function p(n,t){const r=n.length,e=t.length;let o=0,c=0;const s=[];for(;o<r&&c<e;)0!==n[o]?0!==t[c]?Math.abs(n[o])<=Math.abs(t[c])?(s.push(n[o]),o++):(s.push(t[c]),c++):c++:o++;for(;o<r;)s.push(n[o]),o++;for(;c<e;)s.push(t[c]),c++;if(0===s.length)return[0];const u=s.length;if(1===u)return s;const i=[],f=s[1],l=s[0];let a=f+l;const h=l-(a-f);0!==h&&i.push(h),c=0;for(let n=2;n<u;n++){const t=s[n],r=a+t,e=r-a,o=a-(r-e)+(t-e);0!==o&&i.push(o),a=r}return 0===a&&0!==i.length||i.push(a),i}const d=p;function g(n,t){const r=function(n){const t=n.length,r=new Array(t);for(let e=0;e<t;e++)r[e]=-n[e];return r}(t);return d(n,r)}const b=134217729;function m(n,t){const r=n.length;let e;const o=n[0];let c=o*t;const s=b*o,u=s-(s-o),i=o-u,f=b*t,l=f-(f-t),a=t-l,h=[],p=i*a-(c-u*l-i*l-u*a);0!==p&&h.push(p);for(let o=1;o<r;o++){const r=n[o],s=r*t,u=b*r,i=u-(u-r),f=r-i,l=b*t,a=l-(l-t),p=t-a,d=f*p-(s-i*a-f*a-i*p),g=c+d,m=g-c,T=c-(g-m)+(d-m);0!==T&&h.push(T),e=g;const y=s+e,O=e-(y-s);0!==O&&h.push(O),c=y}return 0===c&&0!==h.length||h.push(c),h}function T(n,t){const r=t.length;let e;const o=t[0];let c=o*n;const s=b*o,u=s-(s-o),i=o-u,f=b*n,l=f-(f-n),a=n-l,h=[],p=i*a-(c-u*l-i*l-u*a);0!==p&&h.push(p);for(let o=1;o<r;o++){const r=t[o],s=r*n,u=b*r,i=u-(u-r),f=r-i,l=b*n,a=l-(l-n),p=n-a,d=f*p-(s-i*a-f*a-i*p),g=c+d,m=g-c,T=c-(g-m)+(d-m);0!==T&&h.push(T),e=g;const y=s+e,O=e-(y-s);0!==O&&h.push(O),c=y}return 0===c&&0!==h.length||h.push(c),h}const y=m,O=p;function v(n,t){let r=[0];for(let e=0;e<n.length;e++)r=O(r,y(t,n[e]));return r}function M(n,t){const r=n.length;let e=t;const o=[];for(let t=0;t<r;t++){const r=n[t],c=e+r,s=c-e,u=e-(c-s)+(r-s);0!==u&&o.push(u),e=c}return 0===e&&0!==o.length||o.push(e),o}function w(n){return n[n.length-1]}const I=Number.EPSILON/2;function P(n){const t=n*I;return t/(1-t)}function E(n){const t=n[0][0],r=n[0][1];for(let e=1;e<n.length;e++)if(t!==n[e][0]||r!==n[e][1])return!1;return!0}function N(n,t){const r=n+t,e=r-n;return[n-(r-e)+(t-e),r]}P(1);const x=g,B=w,_=N,{abs:z}=Math,L=134217729;function A(n,t){const r=n*t,e=L*n,o=e-(e-n),c=n-o,s=L*t,u=s-(s-t),i=t-u;return[c*i-(r-o*u-c*u-o*i),r]}const S=A,$=p,V=w,j=g,q=Number.EPSILON/2,F=Math.abs;function R(n,t){const r=n-t,e=n-r;return[n-(r+e)+(e-t),r]}const X=function(n,t,r){const e=(n[0]-r[0])*(t[1]-r[1]),o=(n[1]-r[1])*(t[0]-r[0]),c=e-o;let s;if(e>0){if(o<=0)return c;s=e+o}else{if(!(e<0))return c;if(o>=0)return c;s=-e-o}return Math.abs(c)>=3330669073875472e-31*s?c:function(n,t,r,e){const o=n[0]-r[0],c=t[0]-r[0],s=n[1]-r[1],u=t[1]-r[1],i=g(A(o,u),A(s,c));let f=function(n){let t=n[0];for(let r=1;r<n.length;r++)t+=n[r];return t}(i);if(Math.abs(f)>=2220446049250315e-31*e)return f;const l=R(n[0],r[0])[0],a=R(t[0],r[0])[0],h=R(n[1],r[1])[0],d=R(t[1],r[1])[0];if(0===l&&0===h&&0===a&&0===d)return f;const b=1109335647967049e-46*e+3330669073875471e-31*Math.abs(f);if(f+=o*d+u*l-(s*a+c*h),Math.abs(f)>=b)return f;const m=p(i,g(A(l,u),A(h,c))),T=p(m,g(A(o,d),A(s,a)));let y=p(T,g(A(l,d),A(h,a)));return y=function(n){const t=n.slice(),r=t.length;if(1===r)return t;let e=t[r-1],o=r;for(let n=r-2;n>=0;--n){const r=e,c=t[n];e=r+c;const s=c-(e-r);s&&(t[--o]=e,e=s)}let c=0;for(let n=o;n<r;++n){const r=t[n],o=e;e=r+o;const s=o-(e-r);s&&(t[c++]=s)}return t[c++]=e,t.length=c,t}(y),y[y.length-1]}(n,t,r,s)};function Y(n){if(4===n.length)return 0===X(n[0],n[1],n[2])&&0===X(n[1],n[2],n[3])&&0===X(n[0],n[2],n[3]);if(3===n.length)return 0===X(n[0],n[1],n[2]);if(n.length<=2)return!0;throw new Error("The given bezier curve must be of order <= 3.")}const k=m,C=g,D=N,G=w,H=Math.abs;const J=Math.abs,K=P(1),Q=R,U=N,W=T,Z=M,nn=p;const tn=v,rn=p,en=g,on=w,cn=function(n,t){return w(g(n,t))},sn=g,un=v,fn=T,ln=function(n,t){const r=n-t,e=n-r;return[n-(r+e)+(e-t),r]},an=function(n,t){const r=n+t,e=r-n;return[n-(r-e)+(t-e),r]},hn=p,pn=M,dn=Math.abs,gn=P(1),bn={order:0,realOrder:0,collinear:!0,nodeType:"n/a"},mn={order:1,realOrder:1,collinear:!0,nodeType:"n/a"},Tn={order:1,realOrder:0,collinear:!0,nodeType:"n/a"},yn={order:2,realOrder:2,collinear:!1,nodeType:"n/a"},On={order:2,realOrder:2,collinear:!0,nodeType:"n/a"},vn={order:2,realOrder:1,collinear:!0,nodeType:"n/a"},Mn={order:2,realOrder:0,collinear:!0,nodeType:"n/a"},wn={order:3,realOrder:3,collinear:!1,nodeType:"crunode"},In={order:3,realOrder:3,collinear:!1,nodeType:"acnode"},Pn={order:3,realOrder:3,collinear:!1,nodeType:"cusp"},En={order:3,realOrder:3,collinear:!1,nodeType:"explicit"},Nn={order:3,realOrder:3,collinear:!0,nodeType:"n/a"},xn={order:3,realOrder:2,collinear:!1,nodeType:"n/a"},Bn={order:3,realOrder:2,collinear:!0,nodeType:"n/a"},_n={order:3,realOrder:1,collinear:!0,nodeType:"n/a"},zn={order:3,realOrder:0,collinear:!0,nodeType:"n/a"};function Ln(n){if(4===n.length)return function(n){const[[t,r],[e,o],[c,s],[u,i]]=n,f=u+3*e,l=t+3*c,a=f-l,h=F(3*e)+F(f)+(F(3*c)+F(l))+F(a);if(F(a)-q*h>0)return!1;const p=i+3*o,d=r+3*s,g=p-d,b=F(3*o)+F(p)+(F(3*s)+F(d))+F(g);return!(F(g)-q*b>0)&&0===V(j($([u],S(3,e)),$([t],S(3,c))))&&0===V(j($([i],S(3,o)),$([r],S(3,s))))}(n)?function(n){if(!Y(n))return!1;const[t,r,e,o]=n,[c,s]=t,[u,i]=r,[f,l]=e,[a,h]=o,p=C(k(D(u/4,f/4),3),D(c/4,a/4)),d=C(k(D(i/4,l/4),3),D(s/4,h/4));return 0===G(C(D(c/2,a/2),p))&&0===G(C(D(s/2,h/2),d))}(n)?E(n)?zn:_n:Y(n)?Bn:xn:Y(n)?Nn:function(n){const{coeffs:[t,r,e],errBound:[o,c,s]}=function(n){const{coeffs:[[t,r,e],[o,c,s]],errorBound:[[u,i],[f,l]]}=function(n){const[[t,r],[e,o],[c,s],[u,i]]=n,f=u-t,l=e-c,a=f+3*l,h=c+t,p=h-2*e,d=e-t,g=i-r,b=o-s,m=g+3*b,T=s+r,y=T-2*o,O=o-r;return{coeffs:[[a,3*p,3*d,t],[m,3*y,3*O,r]],errorBound:[[H(f)+6*H(l)+H(a),6*(H(h)+H(p)),6*H(d),0],[H(g)+6*H(b)+H(m),6*(H(T)+H(y)),6*H(O),0]]}}(n),a=J(t),h=J(r),p=J(e),d=J(o),g=J(c),b=J(s),m=r*o,T=t*c,y=t*s,O=e*o,v=r*s,M=e*c,w=i*d+h*f+J(m),I=u*g+a*l+J(T),P=u*b+J(y),E=p*f+J(O),N=i*b+J(v),x=p*l+J(M),B=m-T,_=J(B),z=w+I+_,L=O-y,A=J(L),S=E+P+A,$=v-M,V=J($),j=N+x+V,q=B*B,F=B*L,R=$*B,X=L*L,Y=R+X;return{coeffs:[q,F,Y],errBound:[2*z*_+J(q),z*A+_*S+J(F),j*_+V*z+J(R)+(2*A*S+J(X))+J(Y)].map((n=>K*n))}}(n);if(dn(t)<=o){const[[t,r],[e,o],[c,s],[u,i]]=n,f=hn(ln(u,t),fn(3,ln(e,c))),l=pn(an(c,t),-2*e),a=hn(ln(i,r),fn(3,ln(o,s))),h=pn(an(s,r),-2*o),p=un(l,a),d=un(f,h);if(0===cn(p,d))return En}const u=r*r,i=4*t*e,f=u-i,l=2*c*dn(r)+gn*u+(4*(o*dn(e)+dn(t)*s)+gn*dn(i))+gn*dn(f);if(f<-l)return In;if(f>l)return wn;const[a,h,p]=function(n){const[[t,r,e],[o,c,s]]=function(n){const[[t,r],[e,o],[c,s],[u,i]]=n;return[[nn(Q(u,t),W(3,Q(e,c))),W(3,Z(U(c,t),-2*e)),W(3,Q(e,t)),[t]],[nn(Q(i,r),W(3,Q(o,s))),W(3,Z(U(s,r),-2*o)),W(3,Q(o,r)),[r]]]}(n),u=tn(r,o),i=tn(t,c),f=tn(t,s),l=tn(e,o),a=tn(r,s),h=tn(e,c),p=en(u,i),d=en(l,f),g=en(a,h),b=tn(p,p),m=tn(p,d),T=tn(p,g),y=tn(d,d);return[b,m,rn(T,y)]}(n),d=sn(un(h,h),fn(4,un(a,p))),g=on(d);return g<0?In:g>0?wn:Pn}(n);if(3===n.length)return Y(n)?function(n){const[[t,r],[e,o],[c,s]]=n,u=t+c,i=u-2*e,f=z(u)+z(i);if(z(i)-f>0)return!1;const l=r+s,a=l-2*o,h=z(l)+z(a);return!(z(a)-h>0)&&0===B(x(_(t,c),[2*e]))&&0===B(x(_(r,s),[2*o]))}(n)?E(n)?Mn:vn:On:yn;if(2===n.length)return E(n)?Tn:mn;if(1===n.length)return bn;throw new Error("The given bezier curve must be of order <= 3")}const An=134217729,Sn=function(n,t){const r=n*t,e=An*n,o=e-(e-n),c=n-o,s=An*t,u=s-(s-t),i=t-u;return[c*i-(r-o*u-c*u-o*i),r]},$n=function(n,t){const r=n[0],e=n[1],o=t[0],c=t[1],s=e+c,u=s-e,i=r+o,f=i-r,l=e-(s-u)+(c-u)+i,a=s+l,h=r-(i-f)+(o-f)+(l-(a-s)),p=a+h;return[h-(p-a),p]},Vn=function(n,t){const r=n[0],e=n[1],o=t[0],c=t[1],s=e-c,u=s-e,i=r-o,f=i-r,l=e-(s-u)+(-c-u)+i,a=s+l,h=r-(i-f)+(-o-f)+(l-(a-s)),p=a+h;return[h-(p-a),p]},{atan2:jn}=Math;function qn(n,t){const r=n[0],e=n[1],o=t[0],c=t[1],s=Vn(Sn(c,r),Sn(o,e))[1],u=$n(Sn(o,r),Sn(c,e))[1];return jn(s,u)}const{abs:Fn}=Math;function Rn(n){const t=[];for(let r=0;r<n.length-1;r++){const e=[n[r+1][0]-n[r][0],n[r+1][1]-n[r][1]];0!==(0!==e[0]||e[1])&&t.push(e)}const r=t.length;let e=0;for(let n=0;n<r-1;n++)e+=Fn(qn(t[n],t[n+1]));return e}const Xn=function(n,t,r){return 0===t?1===r?n:function(n,t){const r=n[0],e=n[1],o=n[2],c=n[3],s=r[0],u=r[1],i=e[0],f=e[1],l=o[0],a=o[1],h=s-t*(s-i),p=i-t*(i-l),d=h-t*(h-p),g=u-t*(u-f),b=f-t*(f-a),m=g-t*(g-b);return[[s,u],[h,g],[d,m],[d-t*(d-(p-t*(p-(l-t*(l-c[0]))))),m-t*(m-(b-t*(b-(a-t*(a-c[1])))))]]}(n,r):1===r?function(n,t){const r=n[0],e=n[1],o=n[2],c=n[3],s=r[0],u=r[1],i=e[0],f=e[1],l=o[0],a=o[1],h=c[0],p=c[1],d=s-t*(s-i),g=i-t*(i-l),b=l-t*(l-h),m=d-t*(d-g),T=g-t*(g-b),y=u-t*(u-f),O=f-t*(f-a),v=a-t*(a-p),M=y-t*(y-O),w=O-t*(O-v);return[[m-t*(m-T),M-t*(M-w)],[T,w],[b,v],[h,p]]}(n,t):function(n,t,r){const e=n[0],o=n[1],c=n[2],s=n[3],u=e[0],i=e[1],f=o[0],l=o[1],a=c[0],h=c[1],p=t*t,d=t*p,g=r*r,b=r*g,m=t*r,T=u-f,y=a-f,O=T+y,v=t*T,M=r*T,w=s[0]-u-3*y,I=i-l,P=h-l,E=I+P,N=t*I,x=r*I,B=s[1]-i-3*P;return[[d*w+(3*t*(t*O-T)+u),d*B+(3*t*(t*E-I)+i)],[m*(t*w+2*O)+(p*O+u-(M+2*v)),m*(t*B+2*E)+(p*E+i-(x+2*N))],[m*(r*w+2*O)+(g*O+u-(2*M+v)),m*(r*B+2*E)+(g*E+i-(2*x+N))],[b*w+(3*r*(r*O-T)+u),b*B+(3*r*(r*E-I)+i)]]}(n,t,r)},Yn=function(n,t,r){return 0===t?1===r?n:function(n,t){const r=n[0],e=n[1],o=n[2],c=r[0],s=r[1],u=e[0],i=e[1],f=t*t,l=c-u,a=s-i;return[[c,s],[-t*l+c,-t*a+s],[f*(l+(o[0]-u))-(2*t*l-c),f*(a+(o[1]-i))-(2*t*a-s)]]}(n,r):1===r?function(n,t){const r=n[0],e=n[1],o=n[2],c=r[0],s=r[1],u=e[0],i=e[1],f=o[0],l=o[1],a=t*t,h=c-u,p=f-u,d=s-i,g=l-i;return[[a*(h+p)-(2*t*h-c),a*(d+g)-(2*t*d-s)],[t*p+u,t*g+i],[f,l]]}(n,t):function(n,t,r){const e=n[0],o=n[1],c=n[2],s=e[0],u=e[1],i=o[0],f=o[1],l=t*t,a=r*r,h=t*r,p=s-i,d=p+(c[0]-i),g=u-f,b=g+(c[1]-f);return[[l*d-(2*t*p-s),l*b-(2*t*g-u)],[h*d-(p*(r+t)-s),h*b-(g*(r+t)-u)],[a*d-(2*r*p-s),a*b-(2*r*g-u)]]}(n,t,r)},kn=function(n,t,r){return 0===t?1===r?n:function(n,t){const r=n[0],e=n[1],o=r[0],c=r[1];return[[o,c],[t*(e[0]-o)+o,t*(e[1]-c)+c]]}(n,r):1===r?function(n,t){const r=n[0],e=n[1],o=r[0],c=r[1],s=e[0],u=e[1];return[[t*(s-o)+o,t*(u-c)+c],[s,u]]}(n,t):function(n,t,r){const e=n[0],o=n[1],c=e[0],s=e[1],u=o[0],i=o[1];return[[t*(u-c)+c,t*(i-s)+s],[r*(u-c)+c,r*(i-s)+s]]}(n,t,r)};function Cn(n,t,r){if(4===n.length)return Xn(n,t,r);if(3===n.length)return Yn(n,t,r);if(2===n.length)return kn(n,t,r);if(1===n.length)return n;throw new Error("The given bezier curve must be of order <= 3.")}function Dn(n){return function(n){for(let t=1;t<n.length;t++)if(n[t-1]>n[t])return!1;return!0}(n)||function(n){for(let t=1;t<n.length;t++)if(n[t-1]<n[t])return!1;return!0}(n)}const{sqrt:Gn}=Math;function Hn(n,t=1.125,r=4){const e=Ln(n);return e.collinear?function(n){if(!Y(n))return!1;const t=n.map((n=>n[0])),r=n.map((n=>n[1]));return!(Dn(t)&&Dn(r))}(n)?Number.POSITIVE_INFINITY:0:3===e.realOrder?"cusp"===e.nodeType?Number.POSITIVE_INFINITY:Jn(Kn,n,t,r):2===e.realOrder?Jn(Qn,n,t,r):0}function Jn(n,t,r,e){const o=function(n,t=.4,r=2**-16){const e={r:[0,1]};let o=e;for(;void 0!==o;){const e=o.r;if(Rn(Cn(n,e[0],e[1]))<=t||e[1]-e[0]<=r){o=o.next;continue}const c=(e[0]+e[1])/2,s=[e[0],c],u=[c,e[1]];o.r=s,o.next={r:u,next:o.next}}o=e;const c=[];for(;void 0!==o;)c.push(o.r[0]),void 0===o.next&&c.push(o.r[1]),o=o.next;return c}(t,r);let c=0;for(let r=0;r<o.length-1;r++)c+=a(n(Cn(t,o[r],o[r+1])),[0,1],e);return c}function Kn(n){const t=n[0],r=n[1],e=n[2],o=n[3],c=t[0],s=t[1],u=r[0],i=r[1],f=e[0],l=e[1],a=o[0],h=o[1],p=a-c+3*(u-f),d=h-s+3*(i-l),g=f+c-2*u,b=l+s-2*i;return n=>{const t=n*n,r=t*p+2*n*g+(u-c),e=t*d+2*n*b+(i-s),o=r*(n*d+b)-e*(n*p+g),f=r*r+e*e;return 4/3*o*o/(f*f*Gn(f))}}function Qn(n){const t=n[0],r=n[1],e=n[2],o=t[0],c=t[1],s=r[0],u=r[1],i=e[0],f=e[1],l=i-2*s+o,a=f-2*u+c;return n=>{const t=l*n+(s-o),r=a*n+(u-c),e=t*a-r*l,i=t*t+r*r;return.5*e*e/(i*i*Gn(i))}}const{cos:Un,sin:Wn}=Math;function Zn(n){const{α:t,β:e,s0:c,s1:s,L:u,rot:i,p:f}=n;return function(n){const t=n[0].length;if(4===t){const[[t,r,e,o],[c,s,u,i]]=n;return[[o,i],[o+e/3,i+u/3],[o+2*e/3+r/3,i+2*u/3+s/3],[o+e+r+t,i+u+s+c]]}if(3===t){const[[t,r,e],[o,c,s]]=n;return[[e,s],[e+r/2,s+c/2],[e+r+t,s+c+o]]}if(2===t){const[[t,r],[e,o]]=n;return[[r,o],[r+t,o+e]]}if(1===t){const[[t],[r]]=n;return[[t,r]]}throw new Error("The given bezier curve must be of order <= 3.")}([[u*(c*Un(t)-2+s*Un(e)),u*(3-2*c*Un(t)-s*Un(e)),u*(c*Un(t)),0*u],[u*(c*Wn(t)+s*Wn(e)),u*(-2*c*Wn(t)-s*Wn(e)),u*(c*Wn(t)),0*u]]).map(o(Wn(i),Un(i))).map(r(f))}function nt(n){return t=>{const[r,e]=tt(t,n);return Hn(e)+Hn(r)}}function tt(n,t){const{ϕ:r}=t,e=t._info,o=e.$ps,c=t.$ps,s=Zn({...o,β:n-r,s0:1,s1:1}),u=Zn({...c,α:n,s0:1,s1:1});{const n=e.ps,r=t.ps;return[[n[0],s[1],s[2],n[3]],[r[0],u[1],u[2],r[3]]]}}const{PI:rt}=Math,et=rt,ot=.0625,[ct,st]=[1,1],ut=4;function it(n,t){return[t[0]-n[0],t[1]-n[1]]}const{min:ft,max:lt,PI:at,atan2:ht,sin:pt,cos:dt}=Math;function gt(n){const t=n.length,c=[];for(let n=0;n<t;n++)c.push({});for(let i=0;i<t;i++){const f=(i-1+t)%t,l=(i+1)%t,a=c[f],h=c[i],p=c[l];h._info=a,h.info_=p;const d=n[f],g=n[i],b=n[l],m=(u=b,-qn(it(d,s=g),it(s,u)));h.ϕ=m;const T=[lt(-et,m-et),ft(+et,m+et)];h.range=T;const y=r(e(g))(b),[O,v]=[y[0],y[1]],M=ht(v,O),w=o(pt(-M),dt(-M))(y)[0];h.L=w,h.rot=M,h.p=g}var s,u;for(let n=0;n<t;n++){const t=c[n],{ϕ:r,info_:e,p:o,L:s,rot:u}=t,i=r/2,f={α:i,β:-e.ϕ/2,p:o,L:s,rot:u,s0:ct,s1:st},l=Zn(f);t.ps=[o,l[1],l[2],e.p],t.$ps=f,t.l=i-at*ot,t.m=i,t.r=i+at*ot}return c}const bt={has:function(n,t,r){const e=n.get(t);return void 0!==e&&e.has(r)},add:function(n,t,r){let e=n.get(t);void 0===e&&(e=new Set,n.set(t,e)),e.add(r)},remove:function(n,t,r){let e=n.get(t);return void 0!==e&&!!e.delete(r)&&(0===e.size&&n.delete(t),!0)}};function mt(n){const t=new Map;for(const r of n)bt.add(t,r[0],r[1]);const r=[];for(const e of n)bt.has(t,e[0],e[1])&&(r.push(e),bt.remove(t,e[0],e[1]));return r}function Tt(n){const t=gt(mt(n)),r=t.length;let e=0;for(let n=0;n<ut;n++){e=0;for(let n=0;n<r;n++){const r=t[n],o=r._info,c=nt(r);let s,{l:u,m:i,r:f}=r,a=c(u),h=c(i),p=c(f);for(;;){if(({l:u,m:i,r:f}=r),s=(f-u)/2,a>=h&&h<=p){r.l=i-s/2,r.r=i+s/2,e+=h;break}a<=h&&h<=p?(r.l=u-s,r.m=u,r.r=i,p=h,h=a,a=c(r.l)):a>=h&&h>=p?(r.l=i,r.m=f,r.r=f+s,a=h,h=p,p=c(r.r)):a<=h&&h>=p&&(r.l=u-s,r.m=u,r.r=i,p=h,h=a,a=c(r.l))}const d=r.m,[g,b]=tt(d,r);r.ps=b,r.$ps=l(b),o.ps=g,o.$ps=l(g)}}return{cubics:t.map((n=>n.ps)),Energy:e}}function yt(n){const t=gt(mt(n)),r=t.length;let e=0;for(let n=0;n<r;n++){const r=t[n];e+=nt(r)(r.m)}return e}function Ot(n){return Tt(n).cubics}function vt(n,t,r,e){const o=t.slice(),c=e.slice(),s=n.length,u=s-1,i=s-2,f=s-3,l=[];l[0]=-n[0];for(let t=1;t<u;t++){if(0===o[t-1])return;const e=n[t]/o[t-1];o[t]-=e*r[t-1],c[t]-=e*c[t-1],l[t]=-e*l[t-1]}if(l[i]-=r[i],0===o[i])return;c[i]/=o[i],l[i]/=o[i];for(let n=f;n>=0;n--){if(0===o[n])return;c[n]=(c[n]-r[n]*c[n+1])/o[n],l[n]=(l[n]-r[n]*l[n+1])/o[n]}c[u]-=r[u]*c[0]+n[u]*c[i];const a=o[u]+r[u]*l[0]+n[u]*l[i];if(0!==a){c[u]/=a;for(let n=0;n<u;n++)c[n]+=l[n]*c[u];return c}}function Mt(n){const t=n.length,e=[...Array(t)].map((n=>1)),o=[...Array(t)].map((n=>4)),s=[...Array(t)].map((n=>1)),u=[];for(let e=0;e<t;e++){const o=e+1===t?0:e+1;u.push(c(r(c(n[e],2),n[o]),2))}const i=vt(e,o,s,u.map((n=>n[0]))),f=vt(e,o,s,u.map((n=>n[1]))),l=[];for(let e=0;e<t;e++){const o=e+1===t?0:e+1;l.push(r(c(n[o],2),[-i[o],-f[o]]))}const a=[];for(let r=0;r<t;r++){const e=r+1===t?0:r+1;a.push([n[r],[i[r],f[r]],l[r],n[e]])}return a}var wt=t.r,It=t.B6,Pt=t.RX,Et=t.nV;export{wt as cubicBeziersThroughPoints,It as cubicBeziersThroughPoints_C2,Pt as cubicsAndEnergyThroughPoints,Et as energyThroughPoints};