-
Notifications
You must be signed in to change notification settings - Fork 1
/
bezier-js.js
1 lines (1 loc) · 23.8 KB
/
bezier-js.js
1
!function(t,r){if("object"==typeof exports&&"object"==typeof module)module.exports=r();else if("function"==typeof define&&define.amd)define([],r);else{var e=r();for(var n in e)("object"==typeof exports?exports:t)[n]=e[n]}}(self,(()=>(()=>{"use strict";var r={d:(t,e)=>{for(var n in e)r.o(e,n)&&!r.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},o:(t,r)=>Object.prototype.hasOwnProperty.call(t,r),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}function i(t){return function(t){if(Array.isArray(t))return o(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||function(t,r){if(t){if("string"==typeof t)return o(t,r);var e=Object.prototype.toString.call(t).slice(8,-1);return"Object"===e&&t.constructor&&(e=t.constructor.name),"Map"===e||"Set"===e?Array.from(t):"Arguments"===e||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(e)?o(t,r):void 0}}(t)||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(t,r){(null==r||r>t.length)&&(r=t.length);for(var e=0,n=new Array(r);e<r;e++)n[e]=t[e];return n}function u(t,r){if(!(t instanceof r))throw new TypeError("Cannot call a class as a function")}function a(t,r){for(var e=0;e<r.length;e++){var n=r[e];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}function s(t,r,e){return r&&a(t.prototype,r),e&&a(t,e),Object.defineProperty(t,"prototype",{writable:!1}),t}r.r(e),r.d(e,{Bezier:()=>P});var f=Math.abs,c=Math.cos,y=Math.sin,l=Math.acos,h=Math.atan2,x=Math.sqrt,v=Math.pow;function p(t){return t<0?-v(-t,1/3):v(t,1/3)}var m=Math.PI,d=2*m,g=m/2,z=Number.MAX_SAFE_INTEGER||9007199254740991,b=Number.MIN_SAFE_INTEGER||-9007199254740991,_={x:0,y:0,z:0},k={Tvalues:[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],Cvalues:[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],arcfn:function(t,r){var e=r(t),n=e.x*e.x+e.y*e.y;return void 0!==e.z&&(n+=e.z*e.z),x(n)},compute:function(t,r,e){if(0===t)return r[0].t=0,r[0];var n=r.length-1;if(1===t)return r[n].t=1,r[n];var i=1-t,o=r;if(0===n)return r[0].t=t,r[0];if(1===n){var u={x:i*o[0].x+t*o[1].x,y:i*o[0].y+t*o[1].y,t};return e&&(u.z=i*o[0].z+t*o[1].z),u}if(n<4){var a,s,f,c=i*i,y=t*t,l=0;2===n?(o=[o[0],o[1],o[2],_],a=c,s=i*t*2,f=y):3===n&&(a=c*i,s=c*t*3,f=i*y*3,l=t*y);var h={x:a*o[0].x+s*o[1].x+f*o[2].x+l*o[3].x,y:a*o[0].y+s*o[1].y+f*o[2].y+l*o[3].y,t};return e&&(h.z=a*o[0].z+s*o[1].z+f*o[2].z+l*o[3].z),h}for(var x=JSON.parse(JSON.stringify(r));x.length>1;){for(var v=0;v<x.length-1;v++)x[v]={x:x[v].x+(x[v+1].x-x[v].x)*t,y:x[v].y+(x[v+1].y-x[v].y)*t},void 0!==x[v].z&&(x[v]=x[v].z+(x[v+1].z-x[v].z)*t);x.splice(x.length-1,1)}return x[0].t=t,x[0]},computeWithRatios:function(t,r,e,n){var i,o=1-t,u=e,a=r,s=u[0],f=u[1],c=u[2],y=u[3];return s*=o,f*=t,2===a.length?(i=s+f,{x:(s*a[0].x+f*a[1].x)/i,y:(s*a[0].y+f*a[1].y)/i,z:!!n&&(s*a[0].z+f*a[1].z)/i,t}):(s*=o,f*=2*o,c*=t*t,3===a.length?(i=s+f+c,{x:(s*a[0].x+f*a[1].x+c*a[2].x)/i,y:(s*a[0].y+f*a[1].y+c*a[2].y)/i,z:!!n&&(s*a[0].z+f*a[1].z+c*a[2].z)/i,t}):(s*=o,f*=1.5*o,c*=3*o,y*=t*t*t,4===a.length?(i=s+f+c+y,{x:(s*a[0].x+f*a[1].x+c*a[2].x+y*a[3].x)/i,y:(s*a[0].y+f*a[1].y+c*a[2].y+y*a[3].y)/i,z:!!n&&(s*a[0].z+f*a[1].z+c*a[2].z+y*a[3].z)/i,t}):void 0))},derive:function(t,r){for(var e=[],n=t,i=n.length,o=i-1;i>1;i--,o--){for(var u,a=[],s=0;s<o;s++)u={x:o*(n[s+1].x-n[s].x),y:o*(n[s+1].y-n[s].y)},r&&(u.z=o*(n[s+1].z-n[s].z)),a.push(u);e.push(a),n=a}return e},between:function(t,r,e){return r<=t&&t<=e||k.approximately(t,r)||k.approximately(t,e)},approximately:function(t,r,e){return f(t-r)<=(e||1e-6)},length:function(t){for(var r,e=k.Tvalues.length,n=0,i=0;i<e;i++)r=.5*k.Tvalues[i]+.5,n+=k.Cvalues[i]*k.arcfn(r,t);return.5*n},map:function(t,r,e,n,i){return n+(t-r)/(e-r)*(i-n)},lerp:function(t,r,e){var n={x:r.x+t*(e.x-r.x),y:r.y+t*(e.y-r.y)};return void 0!==r.z&&void 0!==e.z&&(n.z=r.z+t*(e.z-r.z)),n},pointToString:function(t){var r=t.x+"/"+t.y;return void 0!==t.z&&(r+="/"+t.z),r},pointsToString:function(t){return"["+t.map(k.pointToString).join(", ")+"]"},copy:function(t){return JSON.parse(JSON.stringify(t))},angle:function(t,r,e){var n=r.x-t.x,i=r.y-t.y,o=e.x-t.x,u=e.y-t.y;return h(n*u-i*o,n*o+i*u)},round:function(t,r){var e=""+t,n=e.indexOf(".");return parseFloat(e.substring(0,n+1+r))},dist:function(t,r){var e=t.x-r.x,n=t.y-r.y;return x(e*e+n*n)},closest:function(t,r){var e,n,i=v(2,63);return t.forEach((function(t,o){(n=k.dist(r,t))<i&&(i=n,e=o)})),{mdist:i,mpos:e}},abcratio:function(t,r){if(2!==r&&3!==r)return!1;if(void 0===t)t=.5;else if(0===t||1===t)return t;var e=v(t,r)+v(1-t,r);return f((e-1)/e)},projectionratio:function(t,r){if(2!==r&&3!==r)return!1;if(void 0===t)t=.5;else if(0===t||1===t)return t;var e=v(1-t,r);return e/(v(t,r)+e)},lli8:function(t,r,e,n,i,o,u,a){var s=(t-e)*(o-a)-(r-n)*(i-u);return 0!=s&&{x:((t*n-r*e)*(i-u)-(t-e)*(i*a-o*u))/s,y:((t*n-r*e)*(o-a)-(r-n)*(i*a-o*u))/s}},lli4:function(t,r,e,n){var i=t.x,o=t.y,u=r.x,a=r.y,s=e.x,f=e.y,c=n.x,y=n.y;return k.lli8(i,o,u,a,s,f,c,y)},lli:function(t,r){return k.lli4(t,t.c,r,r.c)},makeline:function(t,r){return new P(t.x,t.y,(t.x+r.x)/2,(t.y+r.y)/2,r.x,r.y)},findbbox:function(t){var r=z,e=z,n=b,i=b;return t.forEach((function(t){var o=t.bbox();r>o.x.min&&(r=o.x.min),e>o.y.min&&(e=o.y.min),n<o.x.max&&(n=o.x.max),i<o.y.max&&(i=o.y.max)})),{x:{min:r,mid:(r+n)/2,max:n,size:n-r},y:{min:e,mid:(e+i)/2,max:i,size:i-e}}},shapeintersections:function(t,r,e,n,i){if(!k.bboxoverlap(r,n))return[];var o=[],u=[t.startcap,t.forward,t.back,t.endcap],a=[e.startcap,e.forward,e.back,e.endcap];return u.forEach((function(r){r.virtual||a.forEach((function(n){if(!n.virtual){var u=r.intersects(n,i);u.length>0&&(u.c1=r,u.c2=n,u.s1=t,u.s2=e,o.push(u))}}))})),o},makeshape:function(t,r,e){var n=r.points.length,i=t.points.length,o=k.makeline(r.points[n-1],t.points[0]),u=k.makeline(t.points[i-1],r.points[0]),a={startcap:o,forward:t,back:r,endcap:u,bbox:k.findbbox([o,t,r,u]),intersections:function(t){return k.shapeintersections(a,a.bbox,t,t.bbox,e)}};return a},getminmax:function(t,r,e){if(!e)return{min:0,max:0};var n,i,o=z,u=b;-1===e.indexOf(0)&&(e=[0].concat(e)),-1===e.indexOf(1)&&e.push(1);for(var a=0,s=e.length;a<s;a++)n=e[a],(i=t.get(n))[r]<o&&(o=i[r]),i[r]>u&&(u=i[r]);return{min:o,mid:(o+u)/2,max:u,size:u-o}},align:function(t,r){var e=r.p1.x,n=r.p1.y,i=-h(r.p2.y-n,r.p2.x-e);return t.map((function(t){return{x:(t.x-e)*c(i)-(t.y-n)*y(i),y:(t.x-e)*y(i)+(t.y-n)*c(i)}}))},roots:function(t,r){r=r||{p1:{x:0,y:0},p2:{x:1,y:0}};var e=t.length-1,n=k.align(t,r),i=function(t){return 0<=t&&t<=1};if(2===e){var o=n[0].y,u=n[1].y,a=n[2].y,s=o-2*u+a;if(0!==s){var f=-x(u*u-o*a),y=-o+u;return[-(f+y)/s,-(-f+y)/s].filter(i)}return u!==a&&0===s?[(2*u-a)/(2*u-2*a)].filter(i):[]}var h=n[0].y,v=n[1].y,m=n[2].y,g=3*v-h-3*m+n[3].y,z=3*h-6*v+3*m,b=-3*h+3*v,_=h;if(k.approximately(g,0)){if(k.approximately(z,0))return k.approximately(b,0)?[]:[-_/b].filter(i);var w=x(b*b-4*z*_),S=2*z;return[(w-b)/S,(-b-w)/S].filter(i)}var E,O=(3*(b/=g)-(z/=g)*z)/3,M=O/3,j=(2*z*z*z-9*z*b+27*(_/=g))/27,A=j/2,T=A*A+M*M*M;if(T<0){var C=-O/3,P=x(C*C*C),B=-j/(2*P),I=l(B<-1?-1:B>1?1:B),N=2*p(P);return[N*c(I/3)-z/3,N*c((I+d)/3)-z/3,N*c((I+2*d)/3)-z/3].filter(i)}if(0===T)return[2*(E=A<0?p(-A):-p(A))-z/3,-E-z/3].filter(i);var U=x(T);return[(E=p(-A+U))-p(A+U)-z/3].filter(i)},droots:function(t){if(3===t.length){var r=t[0],e=t[1],n=t[2],i=r-2*e+n;if(0!==i){var o=-x(e*e-r*n),u=-r+e;return[-(o+u)/i,-(-o+u)/i]}return e!==n&&0===i?[(2*e-n)/(2*(e-n))]:[]}if(2===t.length){var a=t[0],s=t[1];return a!==s?[a/(a-s)]:[]}return[]},curvature:function(t,r,e,n,i){var o,u,a,s,c,y,l=k.compute(t,r),h=k.compute(t,e),p=l.x*l.x+l.y*l.y;if(n?(o=x(v(l.y*h.z-h.y*l.z,2)+v(l.z*h.x-h.z*l.x,2)+v(l.x*h.y-h.x*l.y,2)),u=v(p+l.z*l.z,1.5)):(o=l.x*h.y-l.y*h.x,u=v(p,1.5)),0===o||0===u)return{k:0,r:0};if(c=o/u,y=u/o,!i){var m=k.curvature(t-.001,r,e,n,!0).k,d=k.curvature(t+.001,r,e,n,!0).k;s=(d-c+(c-m))/2,a=(f(d-c)+f(c-m))/2}return{k:c,r:y,dk:s,adk:a}},inflections:function(t){if(t.length<4)return[];var r=k.align(t,{p1:t[0],p2:t.slice(-1)[0]}),e=r[2].x*r[1].y,n=r[3].x*r[1].y,i=r[1].x*r[2].y,o=18*(-3*e+2*n+3*i-r[3].x*r[2].y),u=18*(3*e-n-3*i),a=18*(i-e);if(k.approximately(o,0)){if(!k.approximately(u,0)){var s=-a/u;if(0<=s&&s<=1)return[s]}return[]}var f=u*u-4*o*a,c=Math.sqrt(f),y=2*o;return k.approximately(y,0)?[]:[(c-u)/y,-(u+c)/y].filter((function(t){return 0<=t&&t<=1}))},bboxoverlap:function(t,r){for(var e,n,i,o,u=["x","y"],a=u.length,s=0;s<a;s++)if(n=t[e=u[s]].mid,i=r[e].mid,o=(t[e].size+r[e].size)/2,f(n-i)>=o)return!1;return!0},expandbox:function(t,r){r.x.min<t.x.min&&(t.x.min=r.x.min),r.y.min<t.y.min&&(t.y.min=r.y.min),r.z&&r.z.min<t.z.min&&(t.z.min=r.z.min),r.x.max>t.x.max&&(t.x.max=r.x.max),r.y.max>t.y.max&&(t.y.max=r.y.max),r.z&&r.z.max>t.z.max&&(t.z.max=r.z.max),t.x.mid=(t.x.min+t.x.max)/2,t.y.mid=(t.y.min+t.y.max)/2,t.z&&(t.z.mid=(t.z.min+t.z.max)/2),t.x.size=t.x.max-t.x.min,t.y.size=t.y.max-t.y.min,t.z&&(t.z.size=t.z.max-t.z.min)},pairiteration:function(t,r,e){var n=t.bbox(),i=r.bbox(),o=1e5,u=e||.5;if(n.x.size+n.y.size<u&&i.x.size+i.y.size<u)return[(o*(t._t1+t._t2)/2|0)/o+"/"+(o*(r._t1+r._t2)/2|0)/o];var a=t.split(.5),s=r.split(.5),f=[{left:a.left,right:s.left},{left:a.left,right:s.right},{left:a.right,right:s.right},{left:a.right,right:s.left}];f=f.filter((function(t){return k.bboxoverlap(t.left.bbox(),t.right.bbox())}));var c=[];return 0===f.length?c:(f.forEach((function(t){c=c.concat(k.pairiteration(t.left,t.right,u))})),c=c.filter((function(t,r){return c.indexOf(t)===r})))},getccenter:function(t,r,e){var n,i=r.x-t.x,o=r.y-t.y,u=e.x-r.x,a=e.y-r.y,s=i*c(g)-o*y(g),f=i*y(g)+o*c(g),l=u*c(g)-a*y(g),x=u*y(g)+a*c(g),v=(t.x+r.x)/2,p=(t.y+r.y)/2,m=(r.x+e.x)/2,z=(r.y+e.y)/2,b=v+s,_=p+f,w=m+l,S=z+x,E=k.lli8(v,p,b,_,m,z,w,S),O=k.dist(E,t),M=h(t.y-E.y,t.x-E.x),j=h(r.y-E.y,r.x-E.x),A=h(e.y-E.y,e.x-E.x);return M<A?((M>j||j>A)&&(M+=d),M>A&&(n=A,A=M,M=n)):A<j&&j<M?(n=A,A=M,M=n):A+=d,E.s=M,E.e=A,E.r=O,E},numberSort:function(t,r){return t-r}},w=function(){function t(r){u(this,t),this.curves=[],this._3d=!1,r&&(this.curves=r,this._3d=this.curves[0]._3d)}return s(t,[{key:"valueOf",value:function(){return this.toString()}},{key:"toString",value:function(){return"["+this.curves.map((function(t){return k.pointsToString(t.points)})).join(", ")+"]"}},{key:"addCurve",value:function(t){this.curves.push(t),this._3d=this._3d||t._3d}},{key:"length",value:function(){return this.curves.map((function(t){return t.length()})).reduce((function(t,r){return t+r}))}},{key:"curve",value:function(t){return this.curves[t]}},{key:"bbox",value:function(){for(var t=this.curves,r=t[0].bbox(),e=1;e<t.length;e++)k.expandbox(r,t[e].bbox());return r}},{key:"offset",value:function(r){var e=[];return this.curves.forEach((function(t){e.push.apply(e,i(t.offset(r)))})),new t(e)}}]),t}(),S=Math.abs,E=Math.min,O=Math.max,M=Math.cos,j=Math.sin,A=Math.acos,T=Math.sqrt,C=Math.PI,P=function(){function r(t){u(this,r);var e=t&&t.forEach?t:Array.from(arguments).slice(),i=!1;if("object"===n(e[0])){i=e.length;var o=[];e.forEach((function(t){["x","y","z"].forEach((function(r){void 0!==t[r]&&o.push(t[r])}))})),e=o}var a=!1,s=e.length;if(i){if(i>4){if(1!==arguments.length)throw new Error("Only new Bezier(point[]) is accepted for 4th and higher order curves");a=!0}}else if(6!==s&&8!==s&&9!==s&&12!==s&&1!==arguments.length)throw new Error("Only new Bezier(point[]) is accepted for 4th and higher order curves");for(var f=this._3d=!a&&(9===s||12===s)||t&&t[0]&&void 0!==t[0].z,c=this.points=[],y=0,l=f?3:2;y<s;y+=l){var h={x:e[y],y:e[y+1]};f&&(h.z=e[y+2]),c.push(h)}var x=this.order=c.length-1,v=this.dims=["x","y"];f&&v.push("z"),this.dimlen=v.length;var p=k.align(c,{p1:c[0],p2:c[x]}),m=k.dist(c[0],c[x]);this._linear=p.reduce((function(t,r){return t+S(r.y)}),0)<m/50,this._lut=[],this._t1=0,this._t2=1,this.update()}return s(r,[{key:"getUtils",value:function(){return r.getUtils()}},{key:"valueOf",value:function(){return this.toString()}},{key:"toString",value:function(){return k.pointsToString(this.points)}},{key:"toSVG",value:function(){if(this._3d)return!1;for(var t=this.points,r=["M",t[0].x,t[0].y,2===this.order?"Q":"C"],e=1,n=t.length;e<n;e++)r.push(t[e].x),r.push(t[e].y);return r.join(" ")}},{key:"setRatios",value:function(t){if(t.length!==this.points.length)throw new Error("incorrect number of ratio values");this.ratios=t,this._lut=[]}},{key:"verify",value:function(){var t=this.coordDigest();t!==this._print&&(this._print=t,this.update())}},{key:"coordDigest",value:function(){return this.points.map((function(t,r){return""+r+t.x+t.y+(t.z?t.z:0)})).join("")}},{key:"update",value:function(){this._lut=[],this.dpoints=k.derive(this.points,this._3d),this.computedirection()}},{key:"computedirection",value:function(){var t=this.points,r=k.angle(t[0],t[this.order],t[1]);this.clockwise=r>0}},{key:"length",value:function(){return k.length(this.derivative.bind(this))}},{key:"getABC",value:function(t,e){e=e||this.get(t);var n=this.points[0],i=this.points[this.order];return r.getABC(this.order,n,e,i,t)}},{key:"getLUT",value:function(t){if(this.verify(),t=t||100,this._lut.length===t)return this._lut;this._lut=[],t++,this._lut=[];for(var r,e,n=0;n<t;n++)e=n/(t-1),(r=this.compute(e)).t=e,this._lut.push(r);return this._lut}},{key:"on",value:function(r,e){e=e||5;for(var n,i=this.getLUT(),o=[],u=0;u<i.length;u++)n=i[u],k.dist(n,r)<e&&(o.push(n),i.length);return!!o.length&&(t/=o.length)}},{key:"project",value:function(t){var r,e,n=this.getLUT(),i=n.length-1,o=k.closest(n,t),u=o.mpos,a=(u-1)/i,s=(u+1)/i,f=.1/i,c=o.mdist,y=a,l=y;for(c+=1;y<s+f;y+=f)r=this.compute(y),(e=k.dist(t,r))<c&&(c=e,l=y);return l=l<0?0:l>1?1:l,(r=this.compute(l)).t=l,r.d=c,r}},{key:"get",value:function(t){return this.compute(t)}},{key:"point",value:function(t){return this.points[t]}},{key:"compute",value:function(t){return this.ratios?k.computeWithRatios(t,this.points,this.ratios,this._3d):k.compute(t,this.points,this._3d,this.ratios)}},{key:"raise",value:function(){for(var t,e,n=this.points,i=[n[0]],o=n.length,u=1;u<o;u++)t=n[u],e=n[u-1],i[u]={x:(o-u)/o*t.x+u/o*e.x,y:(o-u)/o*t.y+u/o*e.y};return i[o]=n[o-1],new r(i)}},{key:"derivative",value:function(t){return k.compute(t,this.dpoints[0],this._3d)}},{key:"dderivative",value:function(t){return k.compute(t,this.dpoints[1],this._3d)}},{key:"align",value:function(){var t=this.points;return new r(k.align(t,{p1:t[0],p2:t[t.length-1]}))}},{key:"curvature",value:function(t){return k.curvature(t,this.dpoints[0],this.dpoints[1],this._3d)}},{key:"inflections",value:function(){return k.inflections(this.points)}},{key:"normal",value:function(t){return this._3d?this.__normal3(t):this.__normal2(t)}},{key:"__normal2",value:function(t){var r=this.derivative(t),e=T(r.x*r.x+r.y*r.y);return{x:-r.y/e,y:r.x/e}}},{key:"__normal3",value:function(t){var r=this.derivative(t),e=this.derivative(t+.01),n=T(r.x*r.x+r.y*r.y+r.z*r.z),i=T(e.x*e.x+e.y*e.y+e.z*e.z);r.x/=n,r.y/=n,r.z/=n,e.x/=i,e.y/=i,e.z/=i;var o={x:e.y*r.z-e.z*r.y,y:e.z*r.x-e.x*r.z,z:e.x*r.y-e.y*r.x},u=T(o.x*o.x+o.y*o.y+o.z*o.z);o.x/=u,o.y/=u,o.z/=u;var a=[o.x*o.x,o.x*o.y-o.z,o.x*o.z+o.y,o.x*o.y+o.z,o.y*o.y,o.y*o.z-o.x,o.x*o.z-o.y,o.y*o.z+o.x,o.z*o.z];return{x:a[0]*r.x+a[1]*r.y+a[2]*r.z,y:a[3]*r.x+a[4]*r.y+a[5]*r.z,z:a[6]*r.x+a[7]*r.y+a[8]*r.z}}},{key:"hull",value:function(t){var r=this.points,e=[],n=[],i=0;for(n[i++]=r[0],n[i++]=r[1],n[i++]=r[2],3===this.order&&(n[i++]=r[3]);r.length>1;){e=[];for(var o,u=0,a=r.length-1;u<a;u++)o=k.lerp(t,r[u],r[u+1]),n[i++]=o,e.push(o);r=e}return n}},{key:"split",value:function(t,e){if(0===t&&e)return this.split(e).left;if(1===e)return this.split(t).right;var n=this.hull(t),i={left:2===this.order?new r([n[0],n[3],n[5]]):new r([n[0],n[4],n[7],n[9]]),right:2===this.order?new r([n[5],n[4],n[2]]):new r([n[9],n[8],n[6],n[3]]),span:n};return i.left._t1=k.map(0,0,1,this._t1,this._t2),i.left._t2=k.map(t,0,1,this._t1,this._t2),i.right._t1=k.map(t,0,1,this._t1,this._t2),i.right._t2=k.map(1,0,1,this._t1,this._t2),e?(e=k.map(e,t,1,0,1),i.right.split(e).left):i}},{key:"extrema",value:function(){var t={},r=[];return this.dims.forEach(function(e){var n=function(t){return t[e]},i=this.dpoints[0].map(n);t[e]=k.droots(i),3===this.order&&(i=this.dpoints[1].map(n),t[e]=t[e].concat(k.droots(i))),t[e]=t[e].filter((function(t){return t>=0&&t<=1})),r=r.concat(t[e].sort(k.numberSort))}.bind(this)),t.values=r.sort(k.numberSort).filter((function(t,e){return r.indexOf(t)===e})),t}},{key:"bbox",value:function(){var t=this.extrema(),r={};return this.dims.forEach(function(e){r[e]=k.getminmax(this,e,t[e])}.bind(this)),r}},{key:"overlaps",value:function(t){var r=this.bbox(),e=t.bbox();return k.bboxoverlap(r,e)}},{key:"offset",value:function(t,e){if(void 0!==e){var n=this.get(t),i=this.normal(t),o={c:n,n:i,x:n.x+i.x*e,y:n.y+i.y*e};return this._3d&&(o.z=n.z+i.z*e),o}if(this._linear){var u=this.normal(0),a=this.points.map((function(r){var e={x:r.x+t*u.x,y:r.y+t*u.y};return r.z&&u.z&&(e.z=r.z+t*u.z),e}));return[new r(a)]}return this.reduce().map((function(r){return r._linear?r.offset(t)[0]:r.scale(t)}))}},{key:"simple",value:function(){if(3===this.order){var t=k.angle(this.points[0],this.points[3],this.points[1]),r=k.angle(this.points[0],this.points[3],this.points[2]);if(t>0&&r<0||t<0&&r>0)return!1}var e=this.normal(0),n=this.normal(1),i=e.x*n.x+e.y*n.y;return this._3d&&(i+=e.z*n.z),S(A(i))<C/3}},{key:"reduce",value:function(){var t,r,e=0,n=0,i=.01,o=[],u=[],a=this.extrema().values;for(-1===a.indexOf(0)&&(a=[0].concat(a)),-1===a.indexOf(1)&&a.push(1),e=a[0],t=1;t<a.length;t++)n=a[t],(r=this.split(e,n))._t1=e,r._t2=n,o.push(r),e=n;return o.forEach((function(t){for(e=0,n=0;n<=1;)for(n=e+i;n<=1.01;n+=i)if(!(r=t.split(e,n)).simple()){if(S(e-(n-=i))<i)return[];(r=t.split(e,n))._t1=k.map(e,0,1,t._t1,t._t2),r._t2=k.map(n,0,1,t._t1,t._t2),u.push(r),e=n;break}e<1&&((r=t.split(e,1))._t1=k.map(e,0,1,t._t1,t._t2),r._t2=t._t2,u.push(r))})),u}},{key:"translate",value:function(t,e,n){n="number"==typeof n?n:e;var i=this.order,o=this.points.map((function(t,r){return(1-r/i)*e+r/i*n}));return new r(this.points.map((function(r,e){return{x:r.x+t.x*o[e],y:r.y+t.y*o[e]}})))}},{key:"scale",value:function(t){var e=this,n=this.order,i=!1;if("function"==typeof t&&(i=t),i&&2===n)return this.raise().scale(i);var o=this.clockwise,u=this.points;if(this._linear)return this.translate(this.normal(0),i?i(0):t,i?i(1):t);var a=i?i(0):t,s=i?i(1):t,f=[this.offset(0,10),this.offset(1,10)],c=[],y=k.lli4(f[0],f[0].c,f[1],f[1].c);if(!y)throw new Error("cannot scale this curve. Try reducing it first.");return[0,1].forEach((function(t){var r=c[t*n]=k.copy(u[t*n]);r.x+=(t?s:a)*f[t].n.x,r.y+=(t?s:a)*f[t].n.y})),i?([0,1].forEach((function(r){if(2!==n||!r){var e=u[r+1],a={x:e.x-y.x,y:e.y-y.y},s=i?i((r+1)/n):t;i&&!o&&(s=-s);var f=T(a.x*a.x+a.y*a.y);a.x/=f,a.y/=f,c[r+1]={x:e.x+s*a.x,y:e.y+s*a.y}}})),new r(c)):([0,1].forEach((function(t){if(2!==n||!t){var r=c[t*n],i=e.derivative(t),o={x:r.x+i.x,y:r.y+i.y};c[t+1]=k.lli4(r,o,y,u[t+1])}})),new r(c))}},{key:"outline",value:function(t,e,n,i){if(e=void 0===e?t:e,this._linear){var o,u,a=this.normal(0),s=this.points[0],f=this.points[this.points.length-1];void 0===n&&(n=t,i=e),o={x:s.x+a.x*t,y:s.y+a.y*t},u={x:f.x+a.x*n,y:f.y+a.y*n};var c=[o,{x:(o.x+u.x)/2,y:(o.y+u.y)/2},u];o={x:s.x-a.x*e,y:s.y-a.y*e};var y=[u={x:f.x-a.x*i,y:f.y-a.y*i},{x:(o.x+u.x)/2,y:(o.y+u.y)/2},o],l=k.makeline(y[2],c[0]),h=k.makeline(c[2],y[0]),x=[l,new r(c),h,new r(y)];return new w(x)}var v,p=this.reduce(),m=p.length,d=[],g=[],z=0,b=this.length(),_=void 0!==n&&void 0!==i;function S(t,r,e,n,i){return function(o){var u=n/e,a=(n+i)/e,s=r-t;return k.map(o,0,1,t+u*s,t+a*s)}}p.forEach((function(r){var o=r.length();_?(d.push(r.scale(S(t,n,b,z,o))),g.push(r.scale(S(-e,-i,b,z,o)))):(d.push(r.scale(t)),g.push(r.scale(-e))),z+=o})),g=g.map((function(t){return(v=t.points)[3]?t.points=[v[3],v[2],v[1],v[0]]:t.points=[v[2],v[1],v[0]],t})).reverse();var E=d[0].points[0],O=d[m-1].points[d[m-1].points.length-1],M=g[m-1].points[g[m-1].points.length-1],j=g[0].points[0],A=k.makeline(M,E),T=k.makeline(O,j),C=[A].concat(d).concat([T]).concat(g);return new w(C)}},{key:"outlineshapes",value:function(t,r,e){r=r||t;for(var n=this.outline(t,r).curves,i=[],o=1,u=n.length;o<u/2;o++){var a=k.makeshape(n[o],n[u-o],e);a.startcap.virtual=o>1,a.endcap.virtual=o<u/2-1,i.push(a)}return i}},{key:"intersects",value:function(t,e){return t?t.p1&&t.p2?this.lineIntersects(t):(t instanceof r&&(t=t.reduce()),this.curveintersects(this.reduce(),t,e)):this.selfintersects(e)}},{key:"lineIntersects",value:function(t){var r=this,e=E(t.p1.x,t.p2.x),n=E(t.p1.y,t.p2.y),i=O(t.p1.x,t.p2.x),o=O(t.p1.y,t.p2.y);return k.roots(this.points,t).filter((function(t){var u=r.get(t);return k.between(u.x,e,i)&&k.between(u.y,n,o)}))}},{key:"selfintersects",value:function(t){for(var r,e,n,o=this.reduce(),u=o.length-2,a=[],s=0;s<u;s++)e=o.slice(s,s+1),n=o.slice(s+2),r=this.curveintersects(e,n,t),a.push.apply(a,i(r));return a}},{key:"curveintersects",value:function(t,r,e){var n=[];t.forEach((function(t){r.forEach((function(r){t.overlaps(r)&&n.push({left:t,right:r})}))}));var i=[];return n.forEach((function(t){var r=k.pairiteration(t.left,t.right,e);r.length>0&&(i=i.concat(r))})),i}},{key:"arcs",value:function(t){return t=t||.5,this._iterate(t,[])}},{key:"_error",value:function(t,r,e,n){var i=(n-e)/4,o=this.get(e+i),u=this.get(n-i),a=k.dist(t,r),s=k.dist(t,o),f=k.dist(t,u);return S(s-a)+S(f-a)}},{key:"_iterate",value:function(t,r){var e,n=0,i=1;do{e=0,i=1;var o=this.get(n),u=void 0,a=void 0,s=void 0,f=void 0,c=!1,y=!1,l=void 0,h=i,x=1;do{if(y=c,f=s,h=(n+i)/2,u=this.get(h),a=this.get(i),(s=k.getccenter(o,u,a)).interval={start:n,end:i},c=this._error(s,o,n,i)<=t,(l=y&&!c)||(x=i),c){if(i>=1){if(s.interval.end=x=1,f=s,i>1){var v={x:s.x+s.r*M(s.e),y:s.y+s.r*j(s.e)};s.e+=k.angle({x:s.x,y:s.y},v,this.get(1))}break}i+=(i-n)/2}else i=h}while(!l&&e++<100);if(e>=100)break;f=f||s,r.push(f),n=x}while(i<1);return r}}],[{key:"quadraticFromPoints",value:function(t,e,n,i){if(void 0===i&&(i=.5),0===i)return new r(e,e,n);if(1===i)return new r(t,e,e);var o=r.getABC(2,t,e,n,i);return new r(t,o.A,n)}},{key:"cubicFromPoints",value:function(t,e,n,i,o){void 0===i&&(i=.5);var u=r.getABC(3,t,e,n,i);void 0===o&&(o=k.dist(e,u.C));var a=o*(1-i)/i,s=k.dist(t,n),f=(n.x-t.x)/s,c=(n.y-t.y)/s,y=o*f,l=o*c,h=a*f,x=a*c,v=e.x-y,p=e.y-l,m=e.x+h,d=e.y+x,g=u.A,z=g.x+(v-g.x)/(1-i),b=g.y+(p-g.y)/(1-i),_=g.x+(m-g.x)/i,w=g.y+(d-g.y)/i;return new r(t,{x:t.x+(z-t.x)/i,y:t.y+(b-t.y)/i},{x:n.x+(_-n.x)/(1-i),y:n.y+(w-n.y)/(1-i)},n)}},{key:"getUtils",value:function(){return k}},{key:"PolyBezier",get:function(){return w}},{key:"getABC",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:2,r=arguments.length>1?arguments[1]:void 0,e=arguments.length>2?arguments[2]:void 0,n=arguments.length>3?arguments[3]:void 0,i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:.5,o=k.projectionratio(i,t),u=1-o,a={x:o*r.x+u*n.x,y:o*r.y+u*n.y},s=k.abcratio(i,t),f={x:e.x+(e.x-a.x)/s,y:e.y+(e.y-a.y)/s};return{A:f,B:e,C:a,S:r,E:n}}}]),r}();return e})()));