kld-contours
Version:
A collection of classes to represent and manipulate various vector shapes
3 lines (2 loc) • 28.1 kB
JavaScript
function t(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function e(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}function i(t,i,n){return i&&e(t.prototype,i),n&&e(t,n),t}function n(t){return(n=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)})(t)}function r(t,e){return(r=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t})(t,e)}function s(t,e){return!e||"object"!=typeof e&&"function"!=typeof e?function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t):e}function a(t,e,i){return(a="undefined"!=typeof Reflect&&Reflect.get?Reflect.get:function(t,e,i){var r=function(t,e){for(;!Object.prototype.hasOwnProperty.call(t,e)&&null!==(t=n(t)););return t}(t,e);if(r){var s=Object.getOwnPropertyDescriptor(r,e);return s.get?s.get.call(i):s.value}})(t,e,i||t)}var h=function(){function e(i,n,r,s){t(this,e),this.x=i,this.y=n,this.width=r,this.height=s}return i(e,[{key:"overlaps",value:function(t){return this.x<t.x+t.width&&this.x+this.width>t.x&&this.y<t.y+t.height&&this.y+this.height>t.y}},{key:"isEmpty",value:function(){return 0!==this.width&&0!==this.height}},{key:"toString",value:function(){return"bbox("+this.x+","+this.y+","+this.width+","+this.height+")"}}]),e}(),o=function(){function e(i){t(this,e),this.points=void 0!==i?i:[]}return i(e,[{key:"getBoundingBox",value:function(){if(this.points.length>0){for(var t=this.points[0],e=this.points[0],i=1;i<this.points.length;i++){var n=this.points[i];t=t.min(n),e=e.max(n)}return new h(t.x,t.y,e.x-t.x,e.y-e.y)}return new h(0,0,0,0)}},{key:"toPolygon2D",value:function(){return this}},{key:"toString",value:function(){return this.points.map(function(t){return"".concat(t.x,", ").concat(t.y)}).join(" ")}}]),e}(),u=function(){function e(i,n){t(this,e),this.center=i,this.radius=n}return i(e,[{key:"getBoundingBox",value:function(){return new h(this.center.x-this.radius,this.center.y-this.radius,2*this.radius,2*this.radius)}},{key:"toPolygon2D",value:function(){return new o}}]),e}();function c(t){return"number"==typeof t?t?t<0?-1:1:t==t?t:NaN:NaN}var l=function(){function e(){t(this,e),this.coefs=[];for(var i=arguments.length-1;i>=0;i--)this.coefs.push(i<0||arguments.length<=i?void 0:arguments[i]);this._variable="t",this._s=0}return i(e,[{key:"clone",value:function(){var t=new e;return t.coefs=this.coefs.slice(),t}},{key:"eval",value:function(t){if(isNaN(t))throw new TypeError("Parameter must be a number. Found '".concat(t,"'"));for(var e=0,i=this.coefs.length-1;i>=0;i--)e=e*t+this.coefs[i];return e}},{key:"add",value:function(t){for(var i=new e,n=this.getDegree(),r=t.getDegree(),s=Math.max(n,r),a=0;a<=s;a++){var h=a<=n?this.coefs[a]:0,o=a<=r?t.coefs[a]:0;i.coefs[a]=h+o}return i}},{key:"multiply",value:function(t){for(var i=new e,n=0;n<=this.getDegree()+t.getDegree();n++)i.coefs.push(0);for(var r=0;r<=this.getDegree();r++)for(var s=0;s<=t.getDegree();s++)i.coefs[r+s]+=this.coefs[r]*t.coefs[s];return i}},{key:"divideEqualsScalar",value:function(t){for(var e=0;e<this.coefs.length;e++)this.coefs[e]/=t}},{key:"simplifyEquals",value:function(){for(var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1e-12,e=this.getDegree();e>=0&&Math.abs(this.coefs[e])<=t;e--)this.coefs.pop()}},{key:"removeZerosEquals",value:function(){for(var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1e-15,e=this.coefs,i=10*t*Math.abs(e.reduce(function(t,e){return Math.abs(e)>Math.abs(t)?e:t})),n=0;n<e.length-1;n++)Math.abs(e[n])<i&&(e[n]=0);return this}},{key:"monicEquals",value:function(){var t=this.coefs;return 1!==t[t.length-1]&&this.divideEqualsScalar(t[t.length-1]),this}},{key:"toString",value:function(){for(var t=[],e=[],i=this.coefs.length-1;i>=0;i--){var n=Math.round(1e3*this.coefs[i])/1e3;if(0!==n){var r=n<0?" - ":" + ";n=Math.abs(n),i>0&&(1===n?n=this._variable:n+=this._variable),i>1&&(n+="^"+i),e.push(r),t.push(n)}}e[0]=" + "===e[0]?"":"-";for(var s="",a=0;a<t.length;a++)s+=e[a]+t[a];return s}},{key:"bisection",value:function(t,e){var i,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1e-6,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:15,s=this.eval(t),a=this.eval(e);if(Math.abs(s)<=n)i=t;else if(Math.abs(a)<=n)i=e;else if(s*a<=0)for(var h=Math.log(e-t),o=Math.LN10*r,u=Math.ceil((h+o)/Math.LN2),c=0;c<u;c++){i=.5*(t+e);var l=this.eval(i);if(Math.abs(l)<=n)break;l*s<0?(e=i,a=l):(t=i,s=l)}return i}},{key:"trapezoid",value:function(t,e,i){if(isNaN(t)||isNaN(e)||isNaN(i))throw new TypeError("Parameters must be numbers");var n=e-t;if(1===i){var r=this.eval(t),s=this.eval(e);this._s=.5*n*(r+s)}else{for(var a=1<<i-2,h=n/a,o=t+.5*h,u=0,c=0;c<a;c++)u+=this.eval(o),o+=h;this._s=.5*(this._s+n*u/a)}if(isNaN(this._s))throw new TypeError("this._s is NaN");return this._s}},{key:"simpson",value:function(t,e){if(isNaN(t)||isNaN(e))throw new TypeError("Parameters must be numbers");for(var i=e-t,n=.5*i*(this.eval(t)+this.eval(e)),r=n,s=4*n/3,a=s,h=n,o=1,u=2;u<=20;u++){for(var c=i/o,l=t+.5*c,f=0,y=1;y<=o;y++)f+=this.eval(l),l+=c;if(s=(4*(n=r=.5*(r+i*f/o))-h)/3,Math.abs(s-a)<1e-7*Math.abs(a))break;a=s,h=n,o<<=1}return s}},{key:"romberg",value:function(t,i){if(isNaN(t)||isNaN(i))throw new TypeError("Parameters must be numbers");var n=new Array(21),r=new Array(21),s={y:0,dy:0};r[0]=1;for(var a=1;a<=20&&(n[a-1]=this.trapezoid(t,i,a),!(a>=3&&(s=e.interpolate(r,n,3,a-3,0),Math.abs(s.dy)<=1e-6*s.y)));a++)n[a]=n[a-1],r[a]=.25*r[a-1];return s.y}},{key:"zeroErrorEstimate",value:function(t){if(void 0===t){var e=this.bounds();t=Math.max(Math.abs(e.minX),Math.abs(e.maxX))}if(t<.001)return 2*Math.abs(this.eval(1e-15));var i=this.coefs.length-1,n=this.coefs[i];return 10*1e-15*this.coefs.reduce(function(e,i,r){var s=i/n*Math.pow(t,r);return s>e?s:e},0)}},{key:"boundsUpperRealFujiwara",value:function(){var t=this.coefs,e=t.length-1,i=t[e];1!==i&&(t=this.coefs.map(function(t){return t/i}));var n,r=t.map(function(t,i){return i<e?Math.pow(Math.abs(0===i?t/2:t),1/(e-i)):t}),s=function(t,e,i){return n(i)&&(t.max<e?(t.nearmax=t.max,t.max=e):t.nearmax<e&&(t.nearmax=e)),t};n=function(i){return i<e&&t[i]<0};var a=r.reduce(s,{max:0,nearmax:0});return n=function(i){return i<e&&(e%2==i%2?t[i]<0:t[i]>0)},{negX:-2*r.reduce(s,{max:0,nearmax:0}).max,posX:2*a.max}}},{key:"boundsLowerRealFujiwara",value:function(){var t=new e;t.coefs=this.coefs.slice().reverse();var i=t.boundsUpperRealFujiwara();return i.negX=1/i.negX,i.posX=1/i.posX,i}},{key:"bounds",value:function(){var t=this.boundsUpperRealFujiwara(),e={minX:t.negX,maxX:t.posX};return 0===t.negX&&0===t.posX?e:(0===t.negX?e.minX=this.boundsLowerRealFujiwara().posX:0===t.posX&&(e.maxX=this.boundsLowerRealFujiwara().negX),e.minX>e.maxX&&(e.minX=e.maxX=0),e)}},{key:"boundUpperAbsRouche",value:function(){var t=this.coefs,e=t.length-1;return 1+t.reduce(function(t,i,n){return n!==e&&t<(i=Math.abs(i))?i:t},0)/Math.abs(t[e])}},{key:"boundLowerAbsRouche",value:function(){var t=this.coefs,e=t.reduce(function(t,e,i){return 0!==i&&t<(e=Math.abs(e))?e:t},0);return Math.abs(t[0])/(Math.abs(t[0])+e)}},{key:"boundsRealLaguerre",value:function(){var t=this.coefs,e=t.length-1,i=-t[e-1]/(e*t[e]),n=t[e-1]*t[e-1]-2*e/(e-1)*t[e]*t[e-2],r=(e-1)/(e*t[e])*Math.sqrt(n);return r<0&&(r=-r),{minX:i-r,maxX:i+r}}},{key:"countRootsDescartes",value:function(){var t=this.coefs,e=t.length-1,i=t.reduce(function(t,e,i){return 0!==t.prev_a&&0!==e&&(t.prev_a<0==e>0&&t.pos++,i%2==0!=t.prev_a<0==(i%2==1!=e>0)&&t.neg++),t.prev_a=e,t},{pos:0,neg:0,prev_a:0});return{maxRealPos:i.pos,maxRealNeg:i.neg,minComplex:e-(i.pos+i.neg)}}},{key:"getDegree",value:function(){return this.coefs.length-1}},{key:"getDerivative",value:function(){for(var t=new e,i=1;i<this.coefs.length;i++)t.coefs.push(i*this.coefs[i]);return t}},{key:"getRoots",value:function(){var t;switch(this.simplifyEquals(),this.getDegree()){case 0:t=[];break;case 1:t=this.getLinearRoot();break;case 2:t=this.getQuadraticRoots();break;case 3:t=this.getCubicRoots();break;case 4:t=this.getQuarticRoots();break;default:t=[]}return t}},{key:"getRootsInInterval",value:function(t,e){var i=[];function n(t){"number"==typeof t&&i.push(t)}if(0===this.getDegree())throw new RangeError("Unexpected empty polynomial");if(1===this.getDegree())n(this.bisection(t,e));else{var r=this.getDerivative().getRootsInInterval(t,e);if(r.length>0){n(this.bisection(t,r[0]));for(var s=0;s<=r.length-2;s++)n(this.bisection(r[s],r[s+1]));n(this.bisection(r[r.length-1],e))}else n(this.bisection(t,e))}return i}},{key:"getLinearRoot",value:function(){var t=[],e=this.coefs[1];return 0!==e&&t.push(-this.coefs[0]/e),t}},{key:"getQuadraticRoots",value:function(){var t=[];if(2===this.getDegree()){var e=this.coefs[2],i=this.coefs[1]/e,n=i*i-4*(this.coefs[0]/e);if(n>0){var r=Math.sqrt(n);t.push(.5*(-i+r)),t.push(.5*(-i-r))}else 0===n&&t.push(.5*-i)}return t}},{key:"getCubicRoots",value:function(){var t=[];if(3===this.getDegree()){var e=this.coefs[3],i=this.coefs[2]/e,n=this.coefs[1]/e,r=(3*n-i*i)/3,s=(2*i*i*i-9*n*i+27*(this.coefs[0]/e))/27,a=i/3,h=s*s/4+r*r*r/27,o=s/2,u=this.zeroErrorEstimate();if(Math.abs(h)<=u&&(h=0),h>0){var c,l=Math.sqrt(h),f=-o+l;c=f>=0?Math.pow(f,1/3):-Math.pow(-f,1/3),(f=-o-l)>=0?c+=Math.pow(f,1/3):c-=Math.pow(-f,1/3),t.push(c-a)}else if(h<0){var y=Math.sqrt(-r/3),v=Math.atan2(Math.sqrt(-h),-o)/3,p=Math.cos(v),g=Math.sin(v),d=Math.sqrt(3);t.push(2*y*p-a),t.push(-y*(p+d*g)-a),t.push(-y*(p-d*g)-a)}else{var x;x=o>=0?-Math.pow(o,1/3):Math.pow(-o,1/3),t.push(2*x-a),t.push(-x-a)}}return t}},{key:"getQuarticRoots",value:function(){var t=[],i=this.getDegree();if(4===i){var n=new e;n.coefs=this.coefs.slice(),n.divideEqualsScalar(n.coefs[i]);Math.abs(n.coefs[0])<10*1e-15*Math.abs(n.coefs[3])&&(n.coefs[0]=0);for(var r=n.getDerivative(),s=r.getRoots().sort(function(t,e){return t-e}),a=[],h=s.length-1,o=this.bounds(),u=Math.max(Math.abs(o.minX),Math.abs(o.maxX)),l=this.zeroErrorEstimate(u),f=0;f<=h;f++)a.push(n.eval(s[f]));for(var y=0;y<=h;y++)Math.abs(a[y])<l&&(a[y]=0);var v=0,p=Math.max(.1*(o.maxX-o.minX)/i,1e-15),g=[],d=[];if(h>-1){for(0!==a[0]?c(a[0])!==c(n.eval(s[0]-p)-a[0])&&(g.push(s[0]-p),d.push([o.minX,s[0]])):(t.push(s[0],s[0]),v++);v<h;v++)0===a[v+1]?(t.push(s[v+1],s[v+1]),v++):c(a[v])!==c(a[v+1])&&(g.push((s[v]+s[v+1])/2),d.push([s[v],s[v+1]]));0!==a[h]&&c(a[h])!==c(n.eval(s[h]+p)-a[h])&&(g.push(s[h]+p),d.push([s[h],o.maxX]))}var x=function(t){return n.eval(t)},m=function(t){return r.eval(t)};if(g.length>0)for(v=0;v<g.length;v++)g[v]=e.newtonSecantBisection(g[v],x,m,32,d[v][0],d[v][1]);t=t.concat(g)}return t}}],[{key:"interpolate",value:function(t,e,i,n,r){if(t.constructor!==Array||e.constructor!==Array)throw new TypeError("xs and ys must be arrays");if(isNaN(i)||isNaN(n)||isNaN(r))throw new TypeError("n, offset, and x must be numbers");var s,a,h=0,o=new Array(i),u=new Array(i),c=0,l=Math.abs(r-t[n]);for(s=0;s<i;s++){var f=Math.abs(r-t[n+s]);f<l&&(c=s,l=f),o[s]=u[s]=e[n+s]}a=e[n+c],c--;for(var y=1;y<i;y++){for(s=0;s<i-y;s++){var v=t[n+s]-r,p=t[n+s+y]-r,g=o[s+1]-u[s],d=v-p;if(0===d)throw new RangeError("Unable to interpolate polynomial. Two numbers in n were identical (to within roundoff)");d=g/d,u[s]=p*d,o[s]=v*d}a+=h=2*(c+1)<i-y?o[c+1]:u[c--]}return{y:a,dy:h}}},{key:"newtonSecantBisection",value:function(t,e,i,n,r,s){var a,h,o,u,l,f,y,v=0,p=0;a=t;var g=Math.pow(10,-14),d="number"==typeof r&&"number"==typeof s;if(d){if(r>s)throw new RangeError("Min must be greater than max");if(f=e(r),y=e(s),c(f)===c(y))throw new RangeError("Y values of bounds must be of opposite sign")}for(var x=function(){return Math.abs(o)<=g*Math.abs(a)||p===a-o-a},m=0;m<n;m++){if(0===(h=i(a))){if(0===v)throw new RangeError("df(x) is zero");h=v}if(v=h,l=e(a),u=a-(o=l/h),x())break;if(d){if(c(l)===c(y))s=a,y=l;else{if(c(l)!==c(f)){a=u;break}r=a,f=l}if(u<r||u>s){if(c(f)===c(y))break;var b=y-f,w=s-r;if(o=0===b?a-(r+.5*w):Math.abs(b/Math.min(f,y))>50?a-(r+w*(.5+(Math.abs(f)<Math.abs(y)?-.25:.25))):a-(r-f/b*w),u=a-o,x())break}}p=a-u,a=u}return a}}]),e}(),f=function(e){function h(){return t(this,h),s(this,n(h).apply(this,arguments))}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&&r(t,e)}(h,l),i(h,[{key:"eval",value:function(t){var e=a(n(h.prototype),"eval",this).call(this,t);if(Math.abs(e)<1e-7&&(e=0),e<0)throw new RangeError("Cannot take square root of negative number");return Math.sqrt(e)}},{key:"toString",value:function(){return"sqrt("+a(n(h.prototype),"toString",this).call(this)+")"}}]),h}(),y=function(){function e(){var i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;t(this,e),this.x=i,this.y=n}return i(e,[{key:"clone",value:function(){return new this.constructor(this.x,this.y)}},{key:"add",value:function(t){return new this.constructor(this.x+t.x,this.y+t.y)}},{key:"subtract",value:function(t){return new this.constructor(this.x-t.x,this.y-t.y)}},{key:"multiply",value:function(t){return new this.constructor(this.x*t,this.y*t)}},{key:"divide",value:function(t){return new this.constructor(this.x/t,this.y/t)}},{key:"equals",value:function(t){return this.x===t.x&&this.y===t.y}},{key:"precisionEquals",value:function(t,e){return Math.abs(this.x-t.x)<e&&Math.abs(this.y-t.y)<e}},{key:"lerp",value:function(t,e){var i=1-e;return new this.constructor(this.x*i+t.x*e,this.y*i+t.y*e)}},{key:"distanceFrom",value:function(t){var e=this.x-t.x,i=this.y-t.y;return Math.sqrt(e*e+i*i)}},{key:"min",value:function(t){return new this.constructor(Math.min(this.x,t.x),Math.min(this.y,t.y))}},{key:"max",value:function(t){return new this.constructor(Math.max(this.x,t.x),Math.max(this.y,t.y))}},{key:"transform",value:function(t){return new this.constructor(t.a*this.x+t.c*this.y+t.e,t.b*this.x+t.d*this.y+t.f)}},{key:"toString",value:function(){return"point(".concat(this.x,",").concat(this.y,")")}}]),e}(),v=function(){function e(){var i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;t(this,e),this.x=i,this.y=n}return i(e,[{key:"length",value:function(){return Math.sqrt(this.x*this.x+this.y*this.y)}},{key:"magnitude",value:function(){return this.x*this.x+this.y*this.y}},{key:"dot",value:function(t){return this.x*t.x+this.y*t.y}},{key:"cross",value:function(t){return this.x*t.y-this.y*t.x}},{key:"determinant",value:function(t){return this.x*t.y-this.y*t.x}},{key:"unit",value:function(){return this.divide(this.length())}},{key:"add",value:function(t){return new this.constructor(this.x+t.x,this.y+t.y)}},{key:"subtract",value:function(t){return new this.constructor(this.x-t.x,this.y-t.y)}},{key:"multiply",value:function(t){return new this.constructor(this.x*t,this.y*t)}},{key:"divide",value:function(t){return new this.constructor(this.x/t,this.y/t)}},{key:"angleBetween",value:function(t){var e=this.dot(t)/(this.length()*t.length());e=Math.max(-1,Math.min(e,1));var i=Math.acos(e);return this.cross(t)<0?-i:i}},{key:"perp",value:function(){return new this.constructor(-this.y,this.x)}},{key:"perpendicular",value:function(t){return this.subtract(this.project(t))}},{key:"project",value:function(t){var e=this.dot(t)/t.dot(t);return t.multiply(e)}},{key:"transform",value:function(t){return new this.constructor(t.a*this.x+t.c*this.y,t.b*this.x+t.d*this.y)}},{key:"equals",value:function(t){return this.x===t.x&&this.y===t.y}},{key:"precisionEquals",value:function(t,e){return Math.abs(this.x-t.x)<e&&Math.abs(this.y-t.y)<e}},{key:"toString",value:function(){return"vector(".concat(this.x,",").concat(this.y,")")}}],[{key:"fromPoints",value:function(t,i){return new e(i.x-t.x,i.y-t.y)}}]),e}(),p=function(){function e(){var i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1,a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,h=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0;t(this,e),this.a=i,this.b=n,this.c=r,this.d=s,this.e=a,this.f=h}return i(e,[{key:"multiply",value:function(t){return this.isIdentity()?t:t.isIdentity()?this:new this.constructor(this.a*t.a+this.c*t.b,this.b*t.a+this.d*t.b,this.a*t.c+this.c*t.d,this.b*t.c+this.d*t.d,this.a*t.e+this.c*t.f+this.e,this.b*t.e+this.d*t.f+this.f)}},{key:"inverse",value:function(){if(this.isIdentity())return this;var t=this.a*this.d-this.b*this.c;if(0===t)throw new Error("Matrix is not invertible");var e=1/t,i=this.f*this.c-this.e*this.d,n=this.e*this.b-this.f*this.a;return new this.constructor(this.d*e,-this.b*e,-this.c*e,this.a*e,i*e,n*e)}},{key:"translate",value:function(t,e){return new this.constructor(this.a,this.b,this.c,this.d,this.a*t+this.c*e+this.e,this.b*t+this.d*e+this.f)}},{key:"scale",value:function(t){return new this.constructor(this.a*t,this.b*t,this.c*t,this.d*t,this.e,this.f)}},{key:"scaleAt",value:function(t,e){var i=e.x-t*e.x,n=e.y-t*e.y;return new this.constructor(this.a*t,this.b*t,this.c*t,this.d*t,this.a*i+this.c*n+this.e,this.b*i+this.d*n+this.f)}},{key:"scaleNonUniform",value:function(t,e){return new this.constructor(this.a*t,this.b*t,this.c*e,this.d*e,this.e,this.f)}},{key:"scaleNonUniformAt",value:function(t,e,i){var n=i.x-t*i.x,r=i.y-e*i.y;return new this.constructor(this.a*t,this.b*t,this.c*e,this.d*e,this.a*n+this.c*r+this.e,this.b*n+this.d*r+this.f)}},{key:"rotate",value:function(t){var e=Math.cos(t),i=Math.sin(t);return new this.constructor(this.a*e+this.c*i,this.b*e+this.d*i,this.a*-i+this.c*e,this.b*-i+this.d*e,this.e,this.f)}},{key:"rotateAt",value:function(t,e){var i=Math.cos(t),n=Math.sin(t),r=e.x,s=e.y,a=this.a*i+this.c*n,h=this.b*i+this.d*n,o=this.c*i-this.a*n,u=this.d*i-this.b*n;return new this.constructor(a,h,o,u,(this.a-a)*r+(this.c-o)*s+this.e,(this.b-h)*r+(this.d-u)*s+this.f)}},{key:"rotateFromVector",value:function(t){var e=t.unit(),i=e.x,n=e.y;return new this.constructor(this.a*i+this.c*n,this.b*i+this.d*n,this.a*-n+this.c*i,this.b*-n+this.d*i,this.e,this.f)}},{key:"flipX",value:function(){return new this.constructor(-this.a,-this.b,this.c,this.d,this.e,this.f)}},{key:"flipY",value:function(){return new this.constructor(this.a,this.b,-this.c,-this.d,this.e,this.f)}},{key:"skewX",value:function(t){var e=Math.tan(t);return new this.constructor(this.a,this.b,this.c+this.a*e,this.d+this.b*e,this.e,this.f)}},{key:"skewY",value:function(t){var e=Math.tan(t);return new this.constructor(this.a+this.c*e,this.b+this.d*e,this.c,this.d,this.e,this.f)}},{key:"isIdentity",value:function(){return 1===this.a&&0===this.b&&0===this.c&&1===this.d&&0===this.e&&0===this.f}},{key:"isInvertible",value:function(){return this.a*this.d-this.b*this.c!=0}},{key:"getScale",value:function(){return{scaleX:Math.sqrt(this.a*this.a+this.c*this.c),scaleY:Math.sqrt(this.b*this.b+this.d*this.d)}}},{key:"getDecomposition",value:function(){var t=.5*(this.a+this.d),e=.5*(this.a-this.d),i=.5*(this.b+this.c),n=.5*(this.b-this.c),r=Math.sqrt(t*t+n*n),s=Math.sqrt(e*e+i*i),a=r+s,h=r-s,o=Math.atan2(i,e),u=Math.atan2(n,t),c=.5*(u-o),l=.5*(u+o);return{translation:this.constructor.translation(this.e,this.f),rotation:this.constructor.rotation(l),scale:this.constructor.nonUniformScaling(a,h),rotation0:this.constructor.rotation(c)}}},{key:"equals",value:function(t){return this.a===t.a&&this.b===t.b&&this.c===t.c&&this.d===t.d&&this.e===t.e&&this.f===t.f}},{key:"precisionEquals",value:function(t,e){return Math.abs(this.a-t.a)<e&&Math.abs(this.b-t.b)<e&&Math.abs(this.c-t.c)<e&&Math.abs(this.d-t.d)<e&&Math.abs(this.e-t.e)<e&&Math.abs(this.f-t.f)<e}},{key:"toString",value:function(){return"matrix(".concat(this.a,",").concat(this.b,",").concat(this.c,",").concat(this.d,",").concat(this.e,",").concat(this.f,")")}}],[{key:"translation",value:function(t,i){return new e(1,0,0,1,t,i)}},{key:"scaling",value:function(t){return new e(t,0,0,t,0,0)}},{key:"scalingAt",value:function(t,i){return new e(t,0,0,t,i.x-i.x*t,i.y-i.y*t)}},{key:"nonUniformScaling",value:function(t,i){return new e(t,0,0,i,0,0)}},{key:"nonUniformScalingAt",value:function(t,i,n){return new e(t,0,0,i,n.x-n.x*t,n.y-n.y*i)}},{key:"rotation",value:function(t){var i=Math.cos(t),n=Math.sin(t);return new e(i,n,-n,i,0,0)}},{key:"rotationAt",value:function(t,i){var n=Math.cos(t),r=Math.sin(t);return new e(n,r,-r,n,i.x-i.x*n+i.y*r,i.y-i.y*n-i.x*r)}},{key:"rotationFromVector",value:function(t){var i=t.unit(),n=i.x,r=i.y;return new e(n,r,-r,n,0,0)}},{key:"xFlip",value:function(){return new e(-1,0,0,1,0,0)}},{key:"yFlip",value:function(){return new e(1,0,0,-1,0,0)}},{key:"xSkew",value:function(t){return new e(1,0,Math.tan(t),1,0,0)}},{key:"ySkew",value:function(t){return new e(1,Math.tan(t),0,1,0,0)}}]),e}();p.IDENTITY=new p,p.IDENTITY.isIdentity=function(){return!0};var g=function(){function e(i,n,r,s){t(this,e),this.p1=i,this.p2=n,this.p3=r,this.p4=s}return i(e,[{key:"getPointAtParameter",value:function(t){var e=this.p1.lerp(this.p2,t),i=this.p2.lerp(this.p3,t),n=this.p3.lerp(this.p4,t),r=e.lerp(i,t),s=i.lerp(n,t);return r.lerp(s,t)}},{key:"splitAtParameter",value:function(t){var i=this.p1.lerp(this.p2,t),n=this.p2.lerp(this.p3,t),r=this.p3.lerp(this.p4,t),s=i.lerp(n,t),a=n.lerp(r,t),h=s.lerp(a,t);return[new e(this.p1,i,s,h),new e(h,a,r,this.p4)]}},{key:"getBernsteinPolynomials",value:function(){var t,e,i;t=this.p1.multiply(-1),e=this.p2.multiply(3),i=this.p3.multiply(-3);var n=t.add(e.add(i.add(this.p4)));t=this.p1.multiply(3),e=this.p2.multiply(-6),i=this.p3.multiply(3);var r=t.add(e.add(i));t=this.p1.multiply(-3),e=this.p2.multiply(3);var s=t.add(e),a=this.p1;return{x:new l(n.x,r.x,s.x,a.x),y:new l(n.y,r.y,s.y,a.y)}}},{key:"getArcLengthPolynomial",value:function(){if(!this.hasOwnProperty("arcLengthPolynomial")){var t,e,i;t=this.p1.multiply(-1),e=this.p2.multiply(3),i=this.p3.multiply(-3);var n=t.add(e.add(i.add(this.p4)));t=this.p1.multiply(3),e=this.p2.multiply(-6),i=this.p3.multiply(3);var r=t.add(e.add(i));t=this.p1.multiply(-3),e=this.p2.multiply(3);var s=t.add(e);this.arcLengthPolynomial=new f(9*(n.x*n.x+n.y*n.y),12*(r.x*n.x+r.y*n.y),4*(r.x*r.x+r.y*r.y)+6*(s.x*n.x+s.y*n.y),4*(s.x*r.x+s.y*r.y),s.x*s.x+s.y*s.y),this.arcLength=this.arcLengthPolynomial.romberg(0,1)}return this.arcLengthPolynomial}},{key:"getParameterFromArcLength",value:function(t){var e,i=this.getArcLengthPolynomial();if(t<=0)e=0;else if(t>=this.arcLength)e=1;else{e=t/this.arcLength;for(var n=0;n<=20;n++){var r=i.romberg(0,e)-t;if(Math.abs(r)<1e-9)break;var s=i.eval(e);if(0===s)break;e-=r/s}}return e}},{key:"getBoundingBox",value:function(){var t=this.getBernsteinPolynomials(),e=t.x.getDerivative(),i=t.y.getDerivative(),n=e.getRootsInInterval(0,1);n=n.concat(i.getRootsInInterval(0,1));var r=this.p1.min(this.p4),s=this.p1.max(this.p4);return n.forEach(function(e){if(0<=e&&e<=1){var i=new y(t.x.eval(e),t.y.eval(e));r=r.min(i),s=s.max(i)}}),new h(r.x,r.y,s.x-r.x,s.y-r.y)}},{key:"getAlignedBoundingBox",value:function(){return{bbox:this.getAlignedBezier().getBoundingBox(),transform:p.translation(this.p1.x,this.p1.y).rotateFromVector(v.fromPoints(this.p1,this.p4))}}},{key:"getAlignedBezier",value:function(){var t=p.translation(this.p1.x,this.p1.y).rotateFromVector(v.fromPoints(this.p1,this.p4)).inverse();return new e(this.p1.transform(t),this.p2.transform(t),this.p3.transform(t),this.p4.transform(t))}},{key:"toPolygon2D",value:function(t){var e=[],i=new v(0,0);return t=void 0!==t?t:1,e.push(this.p1),function n(r,s,a,h){var o=r.lerp(s,.5),u=s.lerp(a,.5),c=a.lerp(h,.5),l=o.lerp(u,.5),f=u.lerp(c,.5),p=l.lerp(f,.5),g=v.fromPoints(r,h),d=v.fromPoints(r,s),x=v.fromPoints(h,a),m=0;!1===i.equals(d)&&(m=g.perpendicular(d).length());if(!1===i.equals(x)){var b=g.perpendicular(x);m=Math.max(m,b.length())}m>t?(n(r,o,l,p),e.push(new y(p.x,p.y)),n(p,f,c,h)):e.push(new y(p.x,p.y))}(this.p1,this.p2,this.p3,this.p4),e.push(this.p4),new o(e)}},{key:"toString",value:function(){return"M"+this.p1.x+","+this.p1.y+" C"+this.p2.x+","+this.p2.y+" "+this.p3.x+","+this.p3.y+" "+this.p4.x+","+this.p4.y}}]),e}(),d=function(){function e(i,n,r){t(this,e),this.center=i,this.radiusX=n,this.radiusY=r}return i(e,[{key:"getBoundingBox",value:function(){return new h(this.center.x-this.radiusX,this.center.y-this.radiusY,2*this.radiusX,2*this.radiusY)}},{key:"toPolygon2D",value:function(){return new o}}]),e}(),x=function(){function e(i,n){t(this,e),this.p1=i,this.p2=n}return i(e,[{key:"getBoundingBox",value:function(){var t=this.p1.min(this.p2),e=this.p1.max(this.p2);return new h(t.x,t.y,e.x-t.x,e.y-t.y)}},{key:"toPolygon2D",value:function(){return new o([this.p1,this.p2])}}]),e}(),m=function(){function e(i,n,r){t(this,e),this.p1=i,this.p2=n,this.p3=r}return i(e,[{key:"getPointAtParameter",value:function(t){var e=this.p1.lerp(this.p2,t),i=this.p2.lerp(this.p3,t);return e.lerp(i,t)}},{key:"splitAtParameter",value:function(t){var i=this.p1.lerp(this.p2,t),n=this.p2.lerp(this.p3,t),r=i.lerp(n,t);return[new e(this.p1,i,r),new e(r,n,this.p3)]}},{key:"getBernsteinPolynomials",value:function(){var t;t=this.p2.multiply(-2);var e=this.p1.add(t.add(this.p3));t=this.p1.multiply(-2);var i=this.p2.multiply(2),n=t.add(i),r=this.p1;return{x:new l(e.x,n.x,r.x),y:new l(e.y,n.y,r.y)}}},{key:"getArcLengthPolynomial",value:function(){if(!this.hasOwnProperty("arcLengthPolynomial")){var t;t=this.p2.multiply(-2);var e=this.p1.add(t.add(this.p3));t=this.p1.multiply(-2);var i=this.p2.multiply(2),n=t.add(i);this.arcLengthPolynomial=new f(4*(e.x*e.x+e.y*e.y),4*(n.x*e.x+n.y*e.y),n.x*n.x+n.y*n.y),this.arcLength=this.arcLengthPolynomial.simpson(0,1)}return this.arcLengthPolynomial}},{key:"getParameterFromArcLength",value:function(t){var e,i=this.getArcLengthPolynomial();if(t<=0)e=0;else if(t>=this.arcLength)e=1;else{e=t/this.arcLength;for(var n=0;n<=20;n++){var r=i.romberg(0,e)-t;if(Math.abs(r)<1e-9)break;var s=i.eval(e);if(0===s)break;e-=r/s}}return e}},{key:"getBoundingBox",value:function(){var t=this.getBernsteinPolynomials(),e=t.x.getDerivative(),i=t.y.getDerivative(),n=e.getRootsInInterval(0,1);n=n.concat(i.getRootsInInterval(0,1));var r=this.p1.min(this.p3),s=this.p1.max(this.p3);return n.forEach(function(e){if(0<=e&&e<=1){var i=new y(t.x.eval(e),t.y.eval(e));r=r.min(i),s=s.max(i)}}),new h(r.x,r.y,s.x-r.x,s.y-r.y)}},{key:"getAlignedBoundingBox",value:function(){return{bbox:this.getAlignedBezier().getBoundingBox(),transform:p.translation(this.p1.x,this.p1.y).rotateFromVector(v.fromPoints(this.p1,this.p3))}}},{key:"getAlignedBezier",value:function(){var t=p.translation(this.p1.x,this.p1.y).rotateFromVector(v.fromPoints(this.p1,this.p3)).inverse();return new e(this.p1.transform(t),this.p2.transform(t),this.p3.transform(t))}},{key:"toPolygon2D",value:function(t){var e=[],i=new v(0,0);return t=void 0!==t?t:1,e.push(this.p1),function n(r,s,a){var h=r.lerp(s,.5),o=s.lerp(a,.5),u=h.lerp(o,.5),c=v.fromPoints(r,a),l=v.fromPoints(r,s),f=0;!1===i.equals(l)&&(f=c.perpendicular(l).length());f>t?(n(r,h,u),e.push(new y(u.x,u.y)),n(u,o,a)):e.push(new y(u.x,u.y))}(this.p1,this.p2,this.p3),e.push(this.p3),new o(e)}},{key:"toString",value:function(){return"M"+this.p1.x+","+this.p1.y+" Q"+this.p2.x+","+this.p2.y+" "+this.p3.x+","+this.p3.y}}]),e}(),b=function(){function e(i,n,r,s){t(this,e),this.x=i,this.y=n,this.width=r,this.height=s}return i(e,[{key:"getBoundingBox",value:function(){return new h(this.x,this.y,this.width,this.height)}},{key:"toPolygon2D",value:function(){return new o([new y(this.x,this.y),new y(this.x+this.width,this.y),new y(this.x+this.width,this.y+this.height),new y(this.x,this.y+this.height)])}}]),e}();export{h as BoundingBox2D,u as Circle2D,g as CubicBezier2D,d as Ellipse2D,x as Line2D,p as Matrix2D,y as Point2D,o as Polygon2D,m as QuadraticBezier2D,b as Rectangle2D,v as Vector2D};
//# sourceMappingURL=index-esm.min.js.map