Socket
Book a DemoInstallSign in
Socket

curve-interpolator

Package Overview
Dependencies
Maintainers
1
Versions
49
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

curve-interpolator - npm Package Compare versions

Comparing version

to
2.0.0-alpha.5

2

dist/index.cjs.js

@@ -16,2 +16,2 @@ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});

***************************************************************************** */
var __assign=function(){return(__assign=Object.assign||function(t){for(var s,i=1,n=arguments.length;i<n;i++)for(var p in s=arguments[i])Object.prototype.hasOwnProperty.call(s,p)&&(t[p]=s[p]);return t}).apply(this,arguments)};function fill(v,val){for(var i=0;i<v.length;i++)v[i]=val;return v}function map(v,func){for(var i=0;i<v.length;i++)v[i]=func(v[i],i);return v}function reduce(v,func,r){void 0===r&&(r=0);for(var i=0;i<v.length;i++)r=func(r,v[i],i);return r}function simplify2d(inputArr,maxOffset,maxDistance){var _a;if(void 0===maxOffset&&(maxOffset=.001),void 0===maxDistance&&(maxDistance=10),inputArr.length<=4)return inputArr;for(var _b=inputArr[0],o0=_b[0],o1=_b[1],arr=inputArr.map((function(d){return[d[0]-o0,d[1]-o1]})),_c=arr[0],a0=_c[0],a1=_c[1],sim=[inputArr[0]],i=1;i+1<arr.length;i++){var _d=arr[i],t0=_d[0],t1=_d[1],_e=arr[i+1],b0=_e[0],b1=_e[1];if(b0-t0!=0||b1-t1!=0){var proximity=Math.abs(a0*b1-a1*b0+b0*t1-b1*t0+a1*t0-a0*t1)/Math.sqrt(Math.pow(b0-a0,2)+Math.pow(b1-a1,2)),dir=[a0-t0,a1-t1],len=Math.sqrt(Math.pow(dir[0],2)+Math.pow(dir[1],2));(proximity>maxOffset||len>=maxDistance)&&(sim.push([t0+o0,t1+o1]),a0=(_a=[t0,t1])[0],a1=_a[1])}}var last=arr[arr.length-1];return sim.push([last[0]+o0,last[1]+o1]),sim}var EPS=Math.pow(2,-42);function cuberoot(x){var y=Math.pow(Math.abs(x),1/3);return x<0?-y:y}function getQuadRoots(a,b,c){if(Math.abs(a)<EPS)return Math.abs(b)<EPS?[]:[-c/b];var D=b*b-4*a*c;return Math.abs(D)<EPS?[-b/(2*a)]:D>0?[(-b+Math.sqrt(D))/(2*a),(-b-Math.sqrt(D))/(2*a)]:[]}function getCubicRoots(a,b,c,d){if(Math.abs(a)<EPS)return getQuadRoots(b,c,d);var roots,p=(3*a*c-b*b)/(3*a*a),q=(2*b*b*b-9*a*b*c+27*a*a*d)/(27*a*a*a);if(Math.abs(p)<EPS)roots=[cuberoot(-q)];else if(Math.abs(q)<EPS)roots=[0].concat(p<0?[Math.sqrt(-p),-Math.sqrt(-p)]:[]);else{var D=q*q/4+p*p*p/27;if(Math.abs(D)<EPS)roots=[-1.5*q/p,3*q/p];else if(D>0){roots=[(u=cuberoot(-q/2-Math.sqrt(D)))-p/(3*u)]}else{var u=2*Math.sqrt(-p/3),t=Math.acos(3*q/p/u)/3,k=2*Math.PI/3;roots=[u*Math.cos(t),u*Math.cos(t-k),u*Math.cos(t-2*k)]}}for(var i=0;i<roots.length;i++)roots[i]-=b/(3*a);return roots}function getCoefficients(v0,v1,v2,v3,v,tension){void 0===v&&(v=0),void 0===tension&&(tension=.5);var c=(1-tension)*(v2-v0)*.5,x=(1-tension)*(v3-v1)*.5;return[2*v1-2*v2+c+x,-3*v1+3*v2-2*c-x,c,v1-v]}function solveForT(t,tension,v0,v1,v2,v3){if(Math.abs(t)<EPS)return v1;if(Math.abs(1-t)<EPS)return v2;var t2=t*t,t3=t*t2,_a=getCoefficients(v0,v1,v2,v3,0,tension);return _a[0]*t3+_a[1]*t2+_a[2]*t+_a[3]}function getDerivativeOfT(t,tension,v0,v1,v2,v3){var t2=t*t,_a=getCoefficients(v0,v1,v2,v3,0,tension);return 3*_a[0]*t2+2*_a[1]*t+_a[2]}function distance(p1,p2){return Math.sqrt(reduce(p2,(function(s,c,i){return s+Math.pow(c-p1[i],2)})))}function normalize(v){var squared=reduce(v,(function(s,c){return s+Math.pow(c,2)})),l=Math.sqrt(squared);return 0===l?fill(v,0):map(v,(function(c){return c/l}))}function orthogonal(v){if(v.length>2)throw Error("Only supported for 2d vectors");var x=-v[1];return v[1]=v[0],v[0]=x,v}function clamp(value,min,max){return void 0===min&&(min=0),void 0===max&&(max=1),value<min?min:value>max?max:value}function getPointAtT(t,points,tension,target,func){void 0===func&&(func=solveForT);var p=(points.length-1)*t,idx=Math.floor(p),weight=p-idx,p0=points[0===idx?idx:idx-1],p1=points[idx],p2=points[idx>points.length-2?points.length-1:idx+1],p3=points[idx>points.length-3?points.length-1:idx+2];target=target||new Array(p0.length);for(var i=0;i<p0.length;i++)target[i]=func(weight,tension,p0[i],p1[i],p2[i],p3[i]);return target}function getTangentAtT(t,points,tension,target){return void 0===tension&&(tension=.5),1===tension&&0===t?t+=EPS:1===tension&&1===t&&(t-=EPS),getPointAtT(t,points,tension,target,getDerivativeOfT)}function getNormalAtT(t,points,tension,target){return void 0===tension&&(tension=.5),orthogonal(getTangentAtT(t,points,tension,target))}function getAngleAtT(t,points,tension){var tan=getTangentAtT(t,points,tension);return Math.atan2(tan[1],tan[0])}function getArcLengths(points,divisions,tension){void 0===tension&&(tension=.5);var current,lengths=[],last=getPointAtT(0,points,tension),sum=0;divisions=divisions||300,lengths.push(0);for(var p=1;p<=divisions;p++)sum+=distance(current=getPointAtT(p/divisions,points,tension),last),lengths.push(sum),last=current;return lengths}function getUtoTmapping(u,arcLengths){for(var comparison,il=arcLengths.length,targetArcLength=u*arcLengths[il-1],low=0,high=il-1,i=0;low<=high;)if((comparison=arcLengths[i=Math.floor(low+(high-low)/2)]-targetArcLength)<0)low=i+1;else{if(!(comparison>0)){high=i;break}high=i-1}if(arcLengths[i=high]===targetArcLength)return i/(il-1);var lengthBefore=arcLengths[i];return(i+(targetArcLength-lengthBefore)/(arcLengths[i+1]-lengthBefore))/(il-1)}function getTtoUmapping(t,arcLengths){if(0===t)return 0;if(1===t)return 1;var al=arcLengths.length-1,totalLength=arcLengths[al],tIdx=t*al,subIdx=Math.floor(tIdx),l1=arcLengths[subIdx];return tIdx===subIdx?l1/totalLength:(l1+(tIdx-subIdx)*(arcLengths[subIdx+1]-l1))/totalLength}function getTAtValue(lookup,tension,v0,v1,v2,v3){var _a=getCoefficients(v0,v1,v2,v3,lookup,tension),a=_a[0],b=_a[1],c=_a[2],d=_a[3];return 0===a&&0===b&&0===c&&0===d?[0]:getCubicRoots(a,b,c,d).filter((function(t){return t>-EPS&&t<=1+EPS})).map((function(t){return clamp(t,0,1)}))}function valuesLookup(lookup,points,options){for(var _a=__assign({axis:0,tension:.5,margin:.5,max:0,processRefAxis:!1,func:solveForT},options),func=_a.func,axis=_a.axis,tension=_a.tension,margin=_a.margin,max=_a.max,processRefAxis=_a.processRefAxis,k=axis,solutions=[],i=1;i<points.length;i+=1){var idx=max<0?points.length-i:i,p1=points[idx-1],p2=points[idx],vmin=void 0,vmax=void 0;if(p1[k]<p2[k]?(vmin=p1[k],vmax=p2[k]):(vmin=p2[k],vmax=p1[k]),lookup-margin<=vmax&&lookup+margin>=vmin){var p0=points[idx-1==0?0:idx-2],p3=points[idx>points.length-2?points.length-1:idx+1],ts=getTAtValue(lookup,tension,p0[k],p1[k],p2[k],p3[k]);max<0?ts.sort((function(a,b){return b-a})):max>=0&&ts.sort((function(a,b){return a-b}));for(var j=0;j<ts.length;j++)if(!(0===ts[j]&&i>0)){for(var coord=[],c=0;c<p0.length;c++){var v=void 0;v=c!==k||processRefAxis?func(ts[j],tension,p0[c],p1[c],p2[c],p3[c],idx-1):lookup,coord[c]=v}if(solutions.push(coord),solutions.length===Math.abs(max))return solutions}}}return solutions}function tangentsLookup(lookup,points,options){return valuesLookup(lookup,points,__assign(__assign({},options),{func:getDerivativeOfT,processRefAxis:!0}))}function normalsLookup(lookup,points,options){return tangentsLookup(lookup,points,options).map((function(v){return orthogonal(v)}))}function anglesLookup(lookup,points,options){return tangentsLookup(lookup,points,options).map((function(tan){return Math.atan2(tan[1],tan[0])}))}function getBoundingBox(points,options){void 0===options&&(options={});for(var _a=__assign({tension:.5,from:0,to:1,arcLengths:null,arcDivisions:300},options),tension=_a.tension,u0=_a.from,u1=_a.to,arcLengths=_a.arcLengths,arcDivisions=_a.arcDivisions,t0=getUtoTmapping(u0,arcLengths=arcLengths||getArcLengths(points,arcDivisions,tension)),t1=getUtoTmapping(u1,arcLengths),i0=Math.floor((points.length-1)*t0),i1=Math.ceil((points.length-1)*t1),start=getPointAtT(t0,points,tension),end=getPointAtT(t1,points,tension),min=[],max=[],c=0;c<start.length;c++)min[c]=Math.min(start[c],end[c]),max[c]=Math.max(start[c],end[c]);for(var _loop_1=function(i){var p1=points[i-1],p2=points[i];if(i<i1)for(var c=0;c<p2.length;c++)p2[c]<min[c]&&(min[c]=p2[c]),p2[c]>max[c]&&(max[c]=p2[c]);var w0=(points.length-1)*t0-(i-1),w1=(points.length-1)*t1-(i-1);if(tension<1){var p0_1=points[i-2<0?0:i-2],p3_1=points[i>points.length-2?points.length-1:i+1],valid=function(t){return t>-EPS&&t<=1+EPS&&(i-1!==i0||t>w0)&&(i!==i1||t<w1)},_loop_2=function(c){var _a=getCoefficients(p0_1[c],p1[c],p2[c],p3_1[c],0,tension);getQuadRoots(3*_a[0],2*_a[1],_a[2]).filter(valid).forEach((function(t){var v=solveForT(t,tension,p0_1[c],p1[c],p2[c],p3_1[c]);v<min[c]&&(min[c]=v),v>max[c]&&(max[c]=v)}))};for(c=0;c<p0_1.length;c++)_loop_2(c)}},i=i0+1;i<=i1;i++)_loop_1(i);return{min:min,max:max}}function extrapolateArgs(args){for(args.length<4&&args.unshift(args[0]);args.length<4;)args.push(args[args.length-1]);return args}var CurveInterpolator=function(){function CurveInterpolator(points,tension,arcDivisions){void 0===tension&&(tension=.5),void 0===arcDivisions&&(arcDivisions=300),this._cache={},this.tension=tension,this.arcDivisions=arcDivisions,this.points=points,this._lmargin=.5}return CurveInterpolator.prototype.getT=function(position){return getUtoTmapping(position,this.arcLengths)},CurveInterpolator.prototype.getPointAt=function(position,target){return getPointAtT(this.getT(position),this.points,this.tension,target)},CurveInterpolator.prototype.getTangentAt=function(position,target){return void 0===target&&(target=null),normalize(getTangentAtT(this.getT(position),this.points,this.tension,target))},CurveInterpolator.prototype.getNormalAt=function(position,target){return normalize(getNormalAtT(this.getT(position),this.points,this.tension,target))},CurveInterpolator.prototype.getAngleAt=function(position){return getAngleAtT(this.getT(position),this.points,this.tension)},CurveInterpolator.prototype.getBoundingBox=function(from,to){if(void 0===from&&(from=0),void 0===to&&(to=1),0===from&&1===to&&this._cache.bbox)return this._cache.bbox;var bbox=getBoundingBox(this.points,{tension:this.tension,from:from,to:to,arcLengths:this.arcLengths});return 0===from&&1===to&&(this._cache.bbox=bbox),bbox},CurveInterpolator.prototype.getPoints=function(samples,returnType,from,to){if(void 0===samples&&(samples=100),void 0===from&&(from=0),void 0===to&&(to=1),!(from<0||to>1||to<from)){for(var pts=[],d=0;d<=samples;d++){var u=0===from&&1===to?d/samples:from+d/samples*(to-from);pts.push(this.getPointAt(u,returnType&&new returnType))}return pts}},CurveInterpolator.prototype.lookup=function(v,axis,max,margin){void 0===axis&&(axis=0),void 0===max&&(max=0),void 0===margin&&(margin=this._lmargin);var matches=valuesLookup(v,this.points,{axis:axis,tension:this.tension,max:max,margin:margin});return 1===Math.abs(max)?matches[0]:matches},CurveInterpolator.prototype.x=function(y,max,margin){if(void 0===max&&(max=0),void 0===margin&&(margin=this._lmargin),this._points.length&&this._points[0].length>2)throw Error("This function is only supported for 2d curves and is now depricated. You should use the lookup function instead.");var matches=valuesLookup(y,this.points,{axis:1,tension:this.tension,max:max,margin:margin});return 1===Math.abs(max)?matches[0][0]:matches.map((function(d){return d[0]}))},CurveInterpolator.prototype.y=function(x,max,margin){if(void 0===max&&(max=0),void 0===margin&&(margin=this._lmargin),this._points.length&&this._points[0].length>2)throw Error("This function is only supported for 2d curves and is now depricated. You should use the lookup function instead.");var matches=valuesLookup(x,this.points,{axis:0,tension:this.tension,max:max,margin:margin});return 1===Math.abs(max)?matches[0][1]:matches.map((function(d){return d[1]}))},CurveInterpolator.prototype.invalidateCache=function(){var _this=this;return Object.keys(this._cache).forEach((function(key){delete _this._cache[key]})),this},Object.defineProperty(CurveInterpolator.prototype,"points",{get:function(){return this._points},set:function(pts){pts.length>0&&pts.length<4&&(pts=extrapolateArgs(pts)),this.invalidateCache(),this._points=pts},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"tension",{get:function(){return this._tension},set:function(t){t!==this._tension&&(this.invalidateCache(),this._tension=t)},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"arcDivisions",{get:function(){return this._arcDivisions},set:function(n){n!==this._arcDivisions&&(this._arcDivisions=n,this.invalidateCache()),this._arcDivisions=n},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"arcLengths",{get:function(){if(this._cache.arcLengths)return this._cache.arcLengths;var arcLengths=getArcLengths(this.points,this.arcDivisions,this.tension);return this._cache.arcLengths=arcLengths,arcLengths},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"length",{get:function(){var lengths=this.arcLengths;return lengths[lengths.length-1]},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"minX",{get:function(){return this.getBoundingBox().min[0]},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"maxX",{get:function(){return this.getBoundingBox().max[0]},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"minY",{get:function(){return this.getBoundingBox().min[1]},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"maxY",{get:function(){return this.getBoundingBox().max[1]},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"minZ",{get:function(){return this.getBoundingBox().min[2]},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"maxZ",{get:function(){return this.getBoundingBox().max[2]},enumerable:!0,configurable:!0}),CurveInterpolator}(),Point=function(){function Point(x,y,z,w){void 0===x&&(x=0),void 0===y&&(y=0),void 0===z&&(z=null),void 0===w&&(w=null),this.x=x,this.y=y,this.z=z,this.w=w}return Object.defineProperty(Point.prototype,0,{get:function(){return this.x},set:function(x){this.x=x},enumerable:!0,configurable:!0}),Object.defineProperty(Point.prototype,1,{get:function(){return this.y},set:function(y){this.y=y},enumerable:!0,configurable:!0}),Object.defineProperty(Point.prototype,2,{get:function(){return this.z},set:function(z){this.z=z},enumerable:!0,configurable:!0}),Object.defineProperty(Point.prototype,3,{get:function(){return this.w},set:function(w){this.w=w},enumerable:!0,configurable:!0}),Object.defineProperty(Point.prototype,"length",{get:function(){return Number.isFinite(this.w)?4:Number.isFinite(this.z)?3:2},enumerable:!0,configurable:!0}),Point}();exports.CurveInterpolator=CurveInterpolator,exports.EPS=EPS,exports.Point=Point,exports.anglesLookup=anglesLookup,exports.clamp=clamp,exports.distance=distance,exports.fill=fill,exports.getAngleAtT=getAngleAtT,exports.getArcLengths=getArcLengths,exports.getBoundingBox=getBoundingBox,exports.getCoefficients=getCoefficients,exports.getCubicRoots=getCubicRoots,exports.getDerivativeOfT=getDerivativeOfT,exports.getNormalAtT=getNormalAtT,exports.getPointAtT=getPointAtT,exports.getQuadRoots=getQuadRoots,exports.getTAtValue=getTAtValue,exports.getTangentAtT=getTangentAtT,exports.getTtoUmapping=getTtoUmapping,exports.getUtoTmapping=getUtoTmapping,exports.map=map,exports.normalize=normalize,exports.normalsLookup=normalsLookup,exports.orthogonal=orthogonal,exports.reduce=reduce,exports.simplify2d=simplify2d,exports.solveForT=solveForT,exports.tangentsLookup=tangentsLookup,exports.valuesLookup=valuesLookup;
var __assign=function(){return(__assign=Object.assign||function(t){for(var s,i=1,n=arguments.length;i<n;i++)for(var p in s=arguments[i])Object.prototype.hasOwnProperty.call(s,p)&&(t[p]=s[p]);return t}).apply(this,arguments)};function __spreadArrays(){for(var s=0,i=0,il=arguments.length;i<il;i++)s+=arguments[i].length;var r=Array(s),k=0;for(i=0;i<il;i++)for(var a=arguments[i],j=0,jl=a.length;j<jl;j++,k++)r[k]=a[j];return r}function fill(v,val){for(var i=0;i<v.length;i++)v[i]=val;return v}function map(v,func){for(var i=0;i<v.length;i++)v[i]=func(v[i],i);return v}function reduce(v,func,r){void 0===r&&(r=0);for(var i=0;i<v.length;i++)r=func(r,v[i],i);return r}function simplify2d(inputArr,maxOffset,maxDistance){var _a;if(void 0===maxOffset&&(maxOffset=.001),void 0===maxDistance&&(maxDistance=10),inputArr.length<=4)return inputArr;for(var _b=inputArr[0],o0=_b[0],o1=_b[1],arr=inputArr.map((function(d){return[d[0]-o0,d[1]-o1]})),_c=arr[0],a0=_c[0],a1=_c[1],sim=[inputArr[0]],i=1;i+1<arr.length;i++){var _d=arr[i],t0=_d[0],t1=_d[1],_e=arr[i+1],b0=_e[0],b1=_e[1];if(b0-t0!=0||b1-t1!=0){var proximity=Math.abs(a0*b1-a1*b0+b0*t1-b1*t0+a1*t0-a0*t1)/Math.sqrt(Math.pow(b0-a0,2)+Math.pow(b1-a1,2)),dir=[a0-t0,a1-t1],len=Math.sqrt(Math.pow(dir[0],2)+Math.pow(dir[1],2));(proximity>maxOffset||len>=maxDistance)&&(sim.push([t0+o0,t1+o1]),a0=(_a=[t0,t1])[0],a1=_a[1])}}var last=arr[arr.length-1];return sim.push([last[0]+o0,last[1]+o1]),sim}var EPS=Math.pow(2,-42);function cuberoot(x){var y=Math.pow(Math.abs(x),1/3);return x<0?-y:y}function getQuadRoots(a,b,c){if(Math.abs(a)<EPS)return Math.abs(b)<EPS?[]:[-c/b];var D=b*b-4*a*c;return Math.abs(D)<EPS?[-b/(2*a)]:D>0?[(-b+Math.sqrt(D))/(2*a),(-b-Math.sqrt(D))/(2*a)]:[]}function getCubicRoots(a,b,c,d){if(Math.abs(a)<EPS)return getQuadRoots(b,c,d);var roots,p=(3*a*c-b*b)/(3*a*a),q=(2*b*b*b-9*a*b*c+27*a*a*d)/(27*a*a*a);if(Math.abs(p)<EPS)roots=[cuberoot(-q)];else if(Math.abs(q)<EPS)roots=[0].concat(p<0?[Math.sqrt(-p),-Math.sqrt(-p)]:[]);else{var D=q*q/4+p*p*p/27;if(Math.abs(D)<EPS)roots=[-1.5*q/p,3*q/p];else if(D>0){roots=[(u=cuberoot(-q/2-Math.sqrt(D)))-p/(3*u)]}else{var u=2*Math.sqrt(-p/3),t=Math.acos(3*q/p/u)/3,k=2*Math.PI/3;roots=[u*Math.cos(t),u*Math.cos(t-k),u*Math.cos(t-2*k)]}}for(var i=0;i<roots.length;i++)roots[i]-=b/(3*a);return roots}function getCoefficients(v0,v1,v2,v3,v,tension){void 0===v&&(v=0),void 0===tension&&(tension=.5);var c=(1-tension)*(v2-v0)*.5,x=(1-tension)*(v3-v1)*.5;return[2*v1-2*v2+c+x,-3*v1+3*v2-2*c-x,c,v1-v]}function solveForT(t,tension,v0,v1,v2,v3){if(Math.abs(t)<EPS)return v1;if(Math.abs(1-t)<EPS)return v2;var t2=t*t,t3=t*t2,_a=getCoefficients(v0,v1,v2,v3,0,tension);return _a[0]*t3+_a[1]*t2+_a[2]*t+_a[3]}function getDerivativeOfT(t,tension,v0,v1,v2,v3){var t2=t*t,_a=getCoefficients(v0,v1,v2,v3,0,tension);return 3*_a[0]*t2+2*_a[1]*t+_a[2]}function distance(p1,p2){return Math.sqrt(reduce(p2,(function(s,c,i){return s+Math.pow(c-p1[i],2)})))}function normalize(v){var squared=reduce(v,(function(s,c){return s+Math.pow(c,2)})),l=Math.sqrt(squared);return 0===l?fill(v,0):map(v,(function(c){return c/l}))}function orthogonal(v){if(v.length>2)throw Error("Only supported for 2d vectors");var x=-v[1];return v[1]=v[0],v[0]=x,v}function clamp(value,min,max){return void 0===min&&(min=0),void 0===max&&(max=1),value<min?min:value>max?max:value}function getPointAtT(t,points,options,target){void 0===options&&(options={});var tension=Number.isFinite(options.tension)?options.tension:.5,closed=!!options.closed,func=options.func||solveForT;closed&&(points=__spreadArrays(points,[points[0]]));var p0,p3,p=(points.length-1)*t,idx=Math.floor(p),weight=p-idx,p1=points[idx],p2=points[idx>points.length-2?points.length-1:idx+1];closed?(p0=points[idx-1<0?points.length-2:idx-1],p3=points[idx>points.length-3?2:idx+2]):(p0=points[0===idx?idx:idx-1],p3=points[idx>points.length-3?points.length-1:idx+2]),target=target||new Array(p0.length);for(var i=0;i<p0.length;i++)target[i]=func(weight,tension,p0[i],p1[i],p2[i],p3[i]);return target}function getTangentAtT(t,points,options,target){void 0===options&&(options={});var tension=Number.isFinite(options.tension)?options.tension:.5,closed=!!options.closed;return 1===tension&&0===t?t+=EPS:1===tension&&1===t&&(t-=EPS),getPointAtT(t,points,{tension:tension,closed:closed,func:getDerivativeOfT},target)}function getArcLengths(points,divisions,options){void 0===options&&(options={});var current,lengths=[],last=getPointAtT(0,points,options),sum=0;divisions=divisions||300,lengths.push(0);for(var p=1;p<=divisions;p++)sum+=distance(current=getPointAtT(p/divisions,points,options),last),lengths.push(sum),last=current;return lengths}function getUtoTmapping(u,arcLengths){for(var comparison,il=arcLengths.length,targetArcLength=u*arcLengths[il-1],low=0,high=il-1,i=0;low<=high;)if((comparison=arcLengths[i=Math.floor(low+(high-low)/2)]-targetArcLength)<0)low=i+1;else{if(!(comparison>0)){high=i;break}high=i-1}if(arcLengths[i=high]===targetArcLength)return i/(il-1);var lengthBefore=arcLengths[i];return(i+(targetArcLength-lengthBefore)/(arcLengths[i+1]-lengthBefore))/(il-1)}function getTtoUmapping(t,arcLengths){if(0===t)return 0;if(1===t)return 1;var al=arcLengths.length-1,totalLength=arcLengths[al],tIdx=t*al,subIdx=Math.floor(tIdx),l1=arcLengths[subIdx];return tIdx===subIdx?l1/totalLength:(l1+(tIdx-subIdx)*(arcLengths[subIdx+1]-l1))/totalLength}function getTAtValue(lookup,tension,v0,v1,v2,v3){var _a=getCoefficients(v0,v1,v2,v3,lookup,tension),a=_a[0],b=_a[1],c=_a[2],d=_a[3];return 0===a&&0===b&&0===c&&0===d?[0]:getCubicRoots(a,b,c,d).filter((function(t){return t>-EPS&&t<=1+EPS})).map((function(t){return clamp(t,0,1)}))}function valuesLookup(lookup,points,options){for(var _a=__assign({axis:0,tension:.5,margin:.5,max:0,processRefAxis:!1,func:solveForT},options),func=_a.func,axis=_a.axis,tension=_a.tension,margin=_a.margin,max=_a.max,processRefAxis=_a.processRefAxis,k=axis,solutions=[],i=1;i<points.length;i+=1){var idx=max<0?points.length-i:i,p1=points[idx-1],p2=points[idx],vmin=void 0,vmax=void 0;if(p1[k]<p2[k]?(vmin=p1[k],vmax=p2[k]):(vmin=p2[k],vmax=p1[k]),lookup-margin<=vmax&&lookup+margin>=vmin){var p0=points[idx-1==0?0:idx-2],p3=points[idx>points.length-2?points.length-1:idx+1],ts=getTAtValue(lookup,tension,p0[k],p1[k],p2[k],p3[k]);max<0?ts.sort((function(a,b){return b-a})):max>=0&&ts.sort((function(a,b){return a-b}));for(var j=0;j<ts.length;j++)if(!(0===ts[j]&&i>0)){for(var coord=[],c=0;c<p0.length;c++){var v=void 0;v=c!==k||processRefAxis?func(ts[j],tension,p0[c],p1[c],p2[c],p3[c],idx-1):lookup,coord[c]=v}if(solutions.push(coord),solutions.length===Math.abs(max))return solutions}}}return solutions}function tangentsLookup(lookup,points,options){return valuesLookup(lookup,points,__assign(__assign({},options),{func:getDerivativeOfT,processRefAxis:!0}))}function getBoundingBox(points,options){void 0===options&&(options={});for(var _a=__assign({tension:.5,closed:!1,from:0,to:1,arcLengths:null,arcDivisions:300},options),tension=_a.tension,closed=_a.closed,u0=_a.from,u1=_a.to,arcLengths=_a.arcLengths,arcDivisions=_a.arcDivisions,t0=getUtoTmapping(u0,arcLengths=arcLengths||getArcLengths(points,arcDivisions,{tension:tension,closed:closed})),t1=getUtoTmapping(u1,arcLengths),i0=Math.floor((points.length-1)*t0),i1=Math.ceil((points.length-1)*t1),start=getPointAtT(t0,points,{tension:tension,closed:closed}),end=getPointAtT(t1,points,{tension:tension,closed:closed}),min=[],max=[],c=0;c<start.length;c++)min[c]=Math.min(start[c],end[c]),max[c]=Math.max(start[c],end[c]);for(var _loop_1=function(i){var p1=points[i-1],p2=points[i];if(i<i1)for(var c=0;c<p2.length;c++)p2[c]<min[c]&&(min[c]=p2[c]),p2[c]>max[c]&&(max[c]=p2[c]);var w0=(points.length-1)*t0-(i-1),w1=(points.length-1)*t1-(i-1);if(tension<1){var p0_1=points[i-2<0?0:i-2],p3_1=points[i>points.length-2?points.length-1:i+1],valid=function(t){return t>-EPS&&t<=1+EPS&&(i-1!==i0||t>w0)&&(i!==i1||t<w1)},_loop_2=function(c){var _a=getCoefficients(p0_1[c],p1[c],p2[c],p3_1[c],0,tension);getQuadRoots(3*_a[0],2*_a[1],_a[2]).filter(valid).forEach((function(t){var v=solveForT(t,tension,p0_1[c],p1[c],p2[c],p3_1[c]);v<min[c]&&(min[c]=v),v>max[c]&&(max[c]=v)}))};for(c=0;c<p0_1.length;c++)_loop_2(c)}},i=i0+1;i<=i1;i++)_loop_1(i);return{min:min,max:max}}function extrapolateArgs(args){for(args.length<4&&args.unshift(args[0]);args.length<4;)args.push(args[args.length-1]);return args}var CurveInterpolator=function(){function CurveInterpolator(points,options){void 0===options&&(options={}),options=__assign({tension:.5,arcDivisions:300,closed:!1},options),this._cache={},this._tension=options.tension,this._arcDivisions=options.arcDivisions,this._lmargin=.5,this._closed=options.closed,this.points=points}return CurveInterpolator.prototype.getT=function(position){return getUtoTmapping(position,this.arcLengths)},CurveInterpolator.prototype.getPointAt=function(position,target){var options={tension:this.tension,closed:this.closed};return getPointAtT(this.getT(position),this.points,options,target)},CurveInterpolator.prototype.getTangentAt=function(position,target){return void 0===target&&(target=null),normalize(getTangentAtT(this.getT(position),this.points,{tension:this.tension,closed:this.closed},target))},CurveInterpolator.prototype.getBoundingBox=function(from,to){if(void 0===from&&(from=0),void 0===to&&(to=1),0===from&&1===to&&this._cache.bbox)return this._cache.bbox;var bbox=getBoundingBox(this.points,{from:from,to:to,tension:this.tension,closed:this.closed,arcLengths:this.arcLengths});return 0===from&&1===to&&(this._cache.bbox=bbox),bbox},CurveInterpolator.prototype.getPoints=function(samples,returnType,from,to){if(void 0===samples&&(samples=100),void 0===from&&(from=0),void 0===to&&(to=1),!(from<0||to>1||to<from)){for(var pts=[],d=0;d<=samples;d++){var u=0===from&&1===to?d/samples:from+d/samples*(to-from);pts.push(this.getPointAt(u,returnType&&new returnType))}return pts}},CurveInterpolator.prototype.lookup=function(v,axis,max,margin){void 0===axis&&(axis=0),void 0===max&&(max=0),void 0===margin&&(margin=this._lmargin);var matches=valuesLookup(v,this.points,{axis:axis,tension:this.tension,closed:this.closed,max:max,margin:margin});return 1===Math.abs(max)?matches[0]:matches},CurveInterpolator.prototype.invalidateCache=function(){var _this=this;return Object.keys(this._cache).forEach((function(key){delete _this._cache[key]})),this},Object.defineProperty(CurveInterpolator.prototype,"points",{get:function(){return this._points},set:function(pts){pts.length>0&&pts.length<4&&(pts=extrapolateArgs(pts)),this._points=pts,this.invalidateCache()},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"tension",{get:function(){return this._tension},set:function(t){t!==this._tension&&(this._tension=t,this.invalidateCache())},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"closed",{get:function(){return this._closed},set:function(isClosed){isClosed!==this._closed&&(this._closed=isClosed,this.invalidateCache())},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"arcDivisions",{get:function(){return this._arcDivisions},set:function(n){n!==this._arcDivisions&&(this._arcDivisions=n,this.invalidateCache())},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"arcLengths",{get:function(){if(this._cache.arcLengths)return this._cache.arcLengths;var arcLengths=getArcLengths(this.points,this.arcDivisions,{tension:this.tension,closed:this.closed});return this._cache.arcLengths=arcLengths,arcLengths},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"length",{get:function(){var lengths=this.arcLengths;return lengths[lengths.length-1]},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"minX",{get:function(){return this.getBoundingBox().min[0]},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"maxX",{get:function(){return this.getBoundingBox().max[0]},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"minY",{get:function(){return this.getBoundingBox().min[1]},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"maxY",{get:function(){return this.getBoundingBox().max[1]},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"minZ",{get:function(){return this.getBoundingBox().min[2]},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"maxZ",{get:function(){return this.getBoundingBox().max[2]},enumerable:!0,configurable:!0}),CurveInterpolator}(),Point=function(){function Point(x,y,z,w){void 0===x&&(x=0),void 0===y&&(y=0),void 0===z&&(z=null),void 0===w&&(w=null),this.x=x,this.y=y,this.z=z,this.w=w}return Object.defineProperty(Point.prototype,0,{get:function(){return this.x},set:function(x){this.x=x},enumerable:!0,configurable:!0}),Object.defineProperty(Point.prototype,1,{get:function(){return this.y},set:function(y){this.y=y},enumerable:!0,configurable:!0}),Object.defineProperty(Point.prototype,2,{get:function(){return this.z},set:function(z){this.z=z},enumerable:!0,configurable:!0}),Object.defineProperty(Point.prototype,3,{get:function(){return this.w},set:function(w){this.w=w},enumerable:!0,configurable:!0}),Object.defineProperty(Point.prototype,"length",{get:function(){return Number.isFinite(this.w)?4:Number.isFinite(this.z)?3:2},enumerable:!0,configurable:!0}),Point}();exports.CurveInterpolator=CurveInterpolator,exports.EPS=EPS,exports.Point=Point,exports.clamp=clamp,exports.distance=distance,exports.fill=fill,exports.getArcLengths=getArcLengths,exports.getBoundingBox=getBoundingBox,exports.getCoefficients=getCoefficients,exports.getCubicRoots=getCubicRoots,exports.getDerivativeOfT=getDerivativeOfT,exports.getPointAtT=getPointAtT,exports.getQuadRoots=getQuadRoots,exports.getTAtValue=getTAtValue,exports.getTangentAtT=getTangentAtT,exports.getTtoUmapping=getTtoUmapping,exports.getUtoTmapping=getUtoTmapping,exports.map=map,exports.normalize=normalize,exports.orthogonal=orthogonal,exports.reduce=reduce,exports.simplify2d=simplify2d,exports.solveForT=solveForT,exports.tangentsLookup=tangentsLookup,exports.valuesLookup=valuesLookup;

@@ -15,2 +15,2 @@ /*! *****************************************************************************

***************************************************************************** */
var __assign=function(){return(__assign=Object.assign||function(t){for(var s,i=1,n=arguments.length;i<n;i++)for(var p in s=arguments[i])Object.prototype.hasOwnProperty.call(s,p)&&(t[p]=s[p]);return t}).apply(this,arguments)};function fill(v,val){for(var i=0;i<v.length;i++)v[i]=val;return v}function map(v,func){for(var i=0;i<v.length;i++)v[i]=func(v[i],i);return v}function reduce(v,func,r){void 0===r&&(r=0);for(var i=0;i<v.length;i++)r=func(r,v[i],i);return r}function simplify2d(inputArr,maxOffset,maxDistance){var _a;if(void 0===maxOffset&&(maxOffset=.001),void 0===maxDistance&&(maxDistance=10),inputArr.length<=4)return inputArr;for(var _b=inputArr[0],o0=_b[0],o1=_b[1],arr=inputArr.map((function(d){return[d[0]-o0,d[1]-o1]})),_c=arr[0],a0=_c[0],a1=_c[1],sim=[inputArr[0]],i=1;i+1<arr.length;i++){var _d=arr[i],t0=_d[0],t1=_d[1],_e=arr[i+1],b0=_e[0],b1=_e[1];if(b0-t0!=0||b1-t1!=0){var proximity=Math.abs(a0*b1-a1*b0+b0*t1-b1*t0+a1*t0-a0*t1)/Math.sqrt(Math.pow(b0-a0,2)+Math.pow(b1-a1,2)),dir=[a0-t0,a1-t1],len=Math.sqrt(Math.pow(dir[0],2)+Math.pow(dir[1],2));(proximity>maxOffset||len>=maxDistance)&&(sim.push([t0+o0,t1+o1]),a0=(_a=[t0,t1])[0],a1=_a[1])}}var last=arr[arr.length-1];return sim.push([last[0]+o0,last[1]+o1]),sim}var EPS=Math.pow(2,-42);function cuberoot(x){var y=Math.pow(Math.abs(x),1/3);return x<0?-y:y}function getQuadRoots(a,b,c){if(Math.abs(a)<EPS)return Math.abs(b)<EPS?[]:[-c/b];var D=b*b-4*a*c;return Math.abs(D)<EPS?[-b/(2*a)]:D>0?[(-b+Math.sqrt(D))/(2*a),(-b-Math.sqrt(D))/(2*a)]:[]}function getCubicRoots(a,b,c,d){if(Math.abs(a)<EPS)return getQuadRoots(b,c,d);var roots,p=(3*a*c-b*b)/(3*a*a),q=(2*b*b*b-9*a*b*c+27*a*a*d)/(27*a*a*a);if(Math.abs(p)<EPS)roots=[cuberoot(-q)];else if(Math.abs(q)<EPS)roots=[0].concat(p<0?[Math.sqrt(-p),-Math.sqrt(-p)]:[]);else{var D=q*q/4+p*p*p/27;if(Math.abs(D)<EPS)roots=[-1.5*q/p,3*q/p];else if(D>0){roots=[(u=cuberoot(-q/2-Math.sqrt(D)))-p/(3*u)]}else{var u=2*Math.sqrt(-p/3),t=Math.acos(3*q/p/u)/3,k=2*Math.PI/3;roots=[u*Math.cos(t),u*Math.cos(t-k),u*Math.cos(t-2*k)]}}for(var i=0;i<roots.length;i++)roots[i]-=b/(3*a);return roots}function getCoefficients(v0,v1,v2,v3,v,tension){void 0===v&&(v=0),void 0===tension&&(tension=.5);var c=(1-tension)*(v2-v0)*.5,x=(1-tension)*(v3-v1)*.5;return[2*v1-2*v2+c+x,-3*v1+3*v2-2*c-x,c,v1-v]}function solveForT(t,tension,v0,v1,v2,v3){if(Math.abs(t)<EPS)return v1;if(Math.abs(1-t)<EPS)return v2;var t2=t*t,t3=t*t2,_a=getCoefficients(v0,v1,v2,v3,0,tension);return _a[0]*t3+_a[1]*t2+_a[2]*t+_a[3]}function getDerivativeOfT(t,tension,v0,v1,v2,v3){var t2=t*t,_a=getCoefficients(v0,v1,v2,v3,0,tension);return 3*_a[0]*t2+2*_a[1]*t+_a[2]}function distance(p1,p2){return Math.sqrt(reduce(p2,(function(s,c,i){return s+Math.pow(c-p1[i],2)})))}function normalize(v){var squared=reduce(v,(function(s,c){return s+Math.pow(c,2)})),l=Math.sqrt(squared);return 0===l?fill(v,0):map(v,(function(c){return c/l}))}function orthogonal(v){if(v.length>2)throw Error("Only supported for 2d vectors");var x=-v[1];return v[1]=v[0],v[0]=x,v}function clamp(value,min,max){return void 0===min&&(min=0),void 0===max&&(max=1),value<min?min:value>max?max:value}function getPointAtT(t,points,tension,target,func){void 0===func&&(func=solveForT);var p=(points.length-1)*t,idx=Math.floor(p),weight=p-idx,p0=points[0===idx?idx:idx-1],p1=points[idx],p2=points[idx>points.length-2?points.length-1:idx+1],p3=points[idx>points.length-3?points.length-1:idx+2];target=target||new Array(p0.length);for(var i=0;i<p0.length;i++)target[i]=func(weight,tension,p0[i],p1[i],p2[i],p3[i]);return target}function getTangentAtT(t,points,tension,target){return void 0===tension&&(tension=.5),1===tension&&0===t?t+=EPS:1===tension&&1===t&&(t-=EPS),getPointAtT(t,points,tension,target,getDerivativeOfT)}function getNormalAtT(t,points,tension,target){return void 0===tension&&(tension=.5),orthogonal(getTangentAtT(t,points,tension,target))}function getAngleAtT(t,points,tension){var tan=getTangentAtT(t,points,tension);return Math.atan2(tan[1],tan[0])}function getArcLengths(points,divisions,tension){void 0===tension&&(tension=.5);var current,lengths=[],last=getPointAtT(0,points,tension),sum=0;divisions=divisions||300,lengths.push(0);for(var p=1;p<=divisions;p++)sum+=distance(current=getPointAtT(p/divisions,points,tension),last),lengths.push(sum),last=current;return lengths}function getUtoTmapping(u,arcLengths){for(var comparison,il=arcLengths.length,targetArcLength=u*arcLengths[il-1],low=0,high=il-1,i=0;low<=high;)if((comparison=arcLengths[i=Math.floor(low+(high-low)/2)]-targetArcLength)<0)low=i+1;else{if(!(comparison>0)){high=i;break}high=i-1}if(arcLengths[i=high]===targetArcLength)return i/(il-1);var lengthBefore=arcLengths[i];return(i+(targetArcLength-lengthBefore)/(arcLengths[i+1]-lengthBefore))/(il-1)}function getTtoUmapping(t,arcLengths){if(0===t)return 0;if(1===t)return 1;var al=arcLengths.length-1,totalLength=arcLengths[al],tIdx=t*al,subIdx=Math.floor(tIdx),l1=arcLengths[subIdx];return tIdx===subIdx?l1/totalLength:(l1+(tIdx-subIdx)*(arcLengths[subIdx+1]-l1))/totalLength}function getTAtValue(lookup,tension,v0,v1,v2,v3){var _a=getCoefficients(v0,v1,v2,v3,lookup,tension),a=_a[0],b=_a[1],c=_a[2],d=_a[3];return 0===a&&0===b&&0===c&&0===d?[0]:getCubicRoots(a,b,c,d).filter((function(t){return t>-EPS&&t<=1+EPS})).map((function(t){return clamp(t,0,1)}))}function valuesLookup(lookup,points,options){for(var _a=__assign({axis:0,tension:.5,margin:.5,max:0,processRefAxis:!1,func:solveForT},options),func=_a.func,axis=_a.axis,tension=_a.tension,margin=_a.margin,max=_a.max,processRefAxis=_a.processRefAxis,k=axis,solutions=[],i=1;i<points.length;i+=1){var idx=max<0?points.length-i:i,p1=points[idx-1],p2=points[idx],vmin=void 0,vmax=void 0;if(p1[k]<p2[k]?(vmin=p1[k],vmax=p2[k]):(vmin=p2[k],vmax=p1[k]),lookup-margin<=vmax&&lookup+margin>=vmin){var p0=points[idx-1==0?0:idx-2],p3=points[idx>points.length-2?points.length-1:idx+1],ts=getTAtValue(lookup,tension,p0[k],p1[k],p2[k],p3[k]);max<0?ts.sort((function(a,b){return b-a})):max>=0&&ts.sort((function(a,b){return a-b}));for(var j=0;j<ts.length;j++)if(!(0===ts[j]&&i>0)){for(var coord=[],c=0;c<p0.length;c++){var v=void 0;v=c!==k||processRefAxis?func(ts[j],tension,p0[c],p1[c],p2[c],p3[c],idx-1):lookup,coord[c]=v}if(solutions.push(coord),solutions.length===Math.abs(max))return solutions}}}return solutions}function tangentsLookup(lookup,points,options){return valuesLookup(lookup,points,__assign(__assign({},options),{func:getDerivativeOfT,processRefAxis:!0}))}function normalsLookup(lookup,points,options){return tangentsLookup(lookup,points,options).map((function(v){return orthogonal(v)}))}function anglesLookup(lookup,points,options){return tangentsLookup(lookup,points,options).map((function(tan){return Math.atan2(tan[1],tan[0])}))}function getBoundingBox(points,options){void 0===options&&(options={});for(var _a=__assign({tension:.5,from:0,to:1,arcLengths:null,arcDivisions:300},options),tension=_a.tension,u0=_a.from,u1=_a.to,arcLengths=_a.arcLengths,arcDivisions=_a.arcDivisions,t0=getUtoTmapping(u0,arcLengths=arcLengths||getArcLengths(points,arcDivisions,tension)),t1=getUtoTmapping(u1,arcLengths),i0=Math.floor((points.length-1)*t0),i1=Math.ceil((points.length-1)*t1),start=getPointAtT(t0,points,tension),end=getPointAtT(t1,points,tension),min=[],max=[],c=0;c<start.length;c++)min[c]=Math.min(start[c],end[c]),max[c]=Math.max(start[c],end[c]);for(var _loop_1=function(i){var p1=points[i-1],p2=points[i];if(i<i1)for(var c=0;c<p2.length;c++)p2[c]<min[c]&&(min[c]=p2[c]),p2[c]>max[c]&&(max[c]=p2[c]);var w0=(points.length-1)*t0-(i-1),w1=(points.length-1)*t1-(i-1);if(tension<1){var p0_1=points[i-2<0?0:i-2],p3_1=points[i>points.length-2?points.length-1:i+1],valid=function(t){return t>-EPS&&t<=1+EPS&&(i-1!==i0||t>w0)&&(i!==i1||t<w1)},_loop_2=function(c){var _a=getCoefficients(p0_1[c],p1[c],p2[c],p3_1[c],0,tension);getQuadRoots(3*_a[0],2*_a[1],_a[2]).filter(valid).forEach((function(t){var v=solveForT(t,tension,p0_1[c],p1[c],p2[c],p3_1[c]);v<min[c]&&(min[c]=v),v>max[c]&&(max[c]=v)}))};for(c=0;c<p0_1.length;c++)_loop_2(c)}},i=i0+1;i<=i1;i++)_loop_1(i);return{min:min,max:max}}var CurveInterpolator=function(){function CurveInterpolator(points,tension,arcDivisions){void 0===tension&&(tension=.5),void 0===arcDivisions&&(arcDivisions=300),this._cache={},this.tension=tension,this.arcDivisions=arcDivisions,this.points=points,this._lmargin=.5}return CurveInterpolator.prototype.getT=function(position){return getUtoTmapping(position,this.arcLengths)},CurveInterpolator.prototype.getPointAt=function(position,target){return getPointAtT(this.getT(position),this.points,this.tension,target)},CurveInterpolator.prototype.getTangentAt=function(position,target){return void 0===target&&(target=null),normalize(getTangentAtT(this.getT(position),this.points,this.tension,target))},CurveInterpolator.prototype.getNormalAt=function(position,target){return normalize(getNormalAtT(this.getT(position),this.points,this.tension,target))},CurveInterpolator.prototype.getAngleAt=function(position){return getAngleAtT(this.getT(position),this.points,this.tension)},CurveInterpolator.prototype.getBoundingBox=function(from,to){if(void 0===from&&(from=0),void 0===to&&(to=1),0===from&&1===to&&this._cache.bbox)return this._cache.bbox;var bbox=getBoundingBox(this.points,{tension:this.tension,from:from,to:to,arcLengths:this.arcLengths});return 0===from&&1===to&&(this._cache.bbox=bbox),bbox},CurveInterpolator.prototype.getPoints=function(samples,returnType,from,to){if(void 0===samples&&(samples=100),void 0===from&&(from=0),void 0===to&&(to=1),!(from<0||to>1||to<from)){for(var pts=[],d=0;d<=samples;d++){var u=0===from&&1===to?d/samples:from+d/samples*(to-from);pts.push(this.getPointAt(u,returnType&&new returnType))}return pts}},CurveInterpolator.prototype.lookup=function(v,axis,max,margin){void 0===axis&&(axis=0),void 0===max&&(max=0),void 0===margin&&(margin=this._lmargin);var matches=valuesLookup(v,this.points,{axis:axis,tension:this.tension,max:max,margin:margin});return 1===Math.abs(max)?matches[0]:matches},CurveInterpolator.prototype.x=function(y,max,margin){if(void 0===max&&(max=0),void 0===margin&&(margin=this._lmargin),this._points.length&&this._points[0].length>2)throw Error("This function is only supported for 2d curves and is now depricated. You should use the lookup function instead.");var matches=valuesLookup(y,this.points,{axis:1,tension:this.tension,max:max,margin:margin});return 1===Math.abs(max)?matches[0][0]:matches.map((function(d){return d[0]}))},CurveInterpolator.prototype.y=function(x,max,margin){if(void 0===max&&(max=0),void 0===margin&&(margin=this._lmargin),this._points.length&&this._points[0].length>2)throw Error("This function is only supported for 2d curves and is now depricated. You should use the lookup function instead.");var matches=valuesLookup(x,this.points,{axis:0,tension:this.tension,max:max,margin:margin});return 1===Math.abs(max)?matches[0][1]:matches.map((function(d){return d[1]}))},CurveInterpolator.prototype.invalidateCache=function(){var _this=this;return Object.keys(this._cache).forEach((function(key){delete _this._cache[key]})),this},Object.defineProperty(CurveInterpolator.prototype,"points",{get:function(){return this._points},set:function(pts){pts.length>0&&pts.length<4&&(pts=function(args){for(args.length<4&&args.unshift(args[0]);args.length<4;)args.push(args[args.length-1]);return args}(pts)),this.invalidateCache(),this._points=pts},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"tension",{get:function(){return this._tension},set:function(t){t!==this._tension&&(this.invalidateCache(),this._tension=t)},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"arcDivisions",{get:function(){return this._arcDivisions},set:function(n){n!==this._arcDivisions&&(this._arcDivisions=n,this.invalidateCache()),this._arcDivisions=n},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"arcLengths",{get:function(){if(this._cache.arcLengths)return this._cache.arcLengths;var arcLengths=getArcLengths(this.points,this.arcDivisions,this.tension);return this._cache.arcLengths=arcLengths,arcLengths},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"length",{get:function(){var lengths=this.arcLengths;return lengths[lengths.length-1]},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"minX",{get:function(){return this.getBoundingBox().min[0]},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"maxX",{get:function(){return this.getBoundingBox().max[0]},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"minY",{get:function(){return this.getBoundingBox().min[1]},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"maxY",{get:function(){return this.getBoundingBox().max[1]},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"minZ",{get:function(){return this.getBoundingBox().min[2]},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"maxZ",{get:function(){return this.getBoundingBox().max[2]},enumerable:!0,configurable:!0}),CurveInterpolator}(),Point=function(){function Point(x,y,z,w){void 0===x&&(x=0),void 0===y&&(y=0),void 0===z&&(z=null),void 0===w&&(w=null),this.x=x,this.y=y,this.z=z,this.w=w}return Object.defineProperty(Point.prototype,0,{get:function(){return this.x},set:function(x){this.x=x},enumerable:!0,configurable:!0}),Object.defineProperty(Point.prototype,1,{get:function(){return this.y},set:function(y){this.y=y},enumerable:!0,configurable:!0}),Object.defineProperty(Point.prototype,2,{get:function(){return this.z},set:function(z){this.z=z},enumerable:!0,configurable:!0}),Object.defineProperty(Point.prototype,3,{get:function(){return this.w},set:function(w){this.w=w},enumerable:!0,configurable:!0}),Object.defineProperty(Point.prototype,"length",{get:function(){return Number.isFinite(this.w)?4:Number.isFinite(this.z)?3:2},enumerable:!0,configurable:!0}),Point}();export{CurveInterpolator,EPS,Point,anglesLookup,clamp,distance,fill,getAngleAtT,getArcLengths,getBoundingBox,getCoefficients,getCubicRoots,getDerivativeOfT,getNormalAtT,getPointAtT,getQuadRoots,getTAtValue,getTangentAtT,getTtoUmapping,getUtoTmapping,map,normalize,normalsLookup,orthogonal,reduce,simplify2d,solveForT,tangentsLookup,valuesLookup};
var __assign=function(){return(__assign=Object.assign||function(t){for(var s,i=1,n=arguments.length;i<n;i++)for(var p in s=arguments[i])Object.prototype.hasOwnProperty.call(s,p)&&(t[p]=s[p]);return t}).apply(this,arguments)};function fill(v,val){for(var i=0;i<v.length;i++)v[i]=val;return v}function map(v,func){for(var i=0;i<v.length;i++)v[i]=func(v[i],i);return v}function reduce(v,func,r){void 0===r&&(r=0);for(var i=0;i<v.length;i++)r=func(r,v[i],i);return r}function simplify2d(inputArr,maxOffset,maxDistance){var _a;if(void 0===maxOffset&&(maxOffset=.001),void 0===maxDistance&&(maxDistance=10),inputArr.length<=4)return inputArr;for(var _b=inputArr[0],o0=_b[0],o1=_b[1],arr=inputArr.map((function(d){return[d[0]-o0,d[1]-o1]})),_c=arr[0],a0=_c[0],a1=_c[1],sim=[inputArr[0]],i=1;i+1<arr.length;i++){var _d=arr[i],t0=_d[0],t1=_d[1],_e=arr[i+1],b0=_e[0],b1=_e[1];if(b0-t0!=0||b1-t1!=0){var proximity=Math.abs(a0*b1-a1*b0+b0*t1-b1*t0+a1*t0-a0*t1)/Math.sqrt(Math.pow(b0-a0,2)+Math.pow(b1-a1,2)),dir=[a0-t0,a1-t1],len=Math.sqrt(Math.pow(dir[0],2)+Math.pow(dir[1],2));(proximity>maxOffset||len>=maxDistance)&&(sim.push([t0+o0,t1+o1]),a0=(_a=[t0,t1])[0],a1=_a[1])}}var last=arr[arr.length-1];return sim.push([last[0]+o0,last[1]+o1]),sim}var EPS=Math.pow(2,-42);function cuberoot(x){var y=Math.pow(Math.abs(x),1/3);return x<0?-y:y}function getQuadRoots(a,b,c){if(Math.abs(a)<EPS)return Math.abs(b)<EPS?[]:[-c/b];var D=b*b-4*a*c;return Math.abs(D)<EPS?[-b/(2*a)]:D>0?[(-b+Math.sqrt(D))/(2*a),(-b-Math.sqrt(D))/(2*a)]:[]}function getCubicRoots(a,b,c,d){if(Math.abs(a)<EPS)return getQuadRoots(b,c,d);var roots,p=(3*a*c-b*b)/(3*a*a),q=(2*b*b*b-9*a*b*c+27*a*a*d)/(27*a*a*a);if(Math.abs(p)<EPS)roots=[cuberoot(-q)];else if(Math.abs(q)<EPS)roots=[0].concat(p<0?[Math.sqrt(-p),-Math.sqrt(-p)]:[]);else{var D=q*q/4+p*p*p/27;if(Math.abs(D)<EPS)roots=[-1.5*q/p,3*q/p];else if(D>0){roots=[(u=cuberoot(-q/2-Math.sqrt(D)))-p/(3*u)]}else{var u=2*Math.sqrt(-p/3),t=Math.acos(3*q/p/u)/3,k=2*Math.PI/3;roots=[u*Math.cos(t),u*Math.cos(t-k),u*Math.cos(t-2*k)]}}for(var i=0;i<roots.length;i++)roots[i]-=b/(3*a);return roots}function getCoefficients(v0,v1,v2,v3,v,tension){void 0===v&&(v=0),void 0===tension&&(tension=.5);var c=(1-tension)*(v2-v0)*.5,x=(1-tension)*(v3-v1)*.5;return[2*v1-2*v2+c+x,-3*v1+3*v2-2*c-x,c,v1-v]}function solveForT(t,tension,v0,v1,v2,v3){if(Math.abs(t)<EPS)return v1;if(Math.abs(1-t)<EPS)return v2;var t2=t*t,t3=t*t2,_a=getCoefficients(v0,v1,v2,v3,0,tension);return _a[0]*t3+_a[1]*t2+_a[2]*t+_a[3]}function getDerivativeOfT(t,tension,v0,v1,v2,v3){var t2=t*t,_a=getCoefficients(v0,v1,v2,v3,0,tension);return 3*_a[0]*t2+2*_a[1]*t+_a[2]}function distance(p1,p2){return Math.sqrt(reduce(p2,(function(s,c,i){return s+Math.pow(c-p1[i],2)})))}function normalize(v){var squared=reduce(v,(function(s,c){return s+Math.pow(c,2)})),l=Math.sqrt(squared);return 0===l?fill(v,0):map(v,(function(c){return c/l}))}function orthogonal(v){if(v.length>2)throw Error("Only supported for 2d vectors");var x=-v[1];return v[1]=v[0],v[0]=x,v}function clamp(value,min,max){return void 0===min&&(min=0),void 0===max&&(max=1),value<min?min:value>max?max:value}function getPointAtT(t,points,options,target){void 0===options&&(options={});var tension=Number.isFinite(options.tension)?options.tension:.5,closed=!!options.closed,func=options.func||solveForT;closed&&(points=function(){for(var s=0,i=0,il=arguments.length;i<il;i++)s+=arguments[i].length;var r=Array(s),k=0;for(i=0;i<il;i++)for(var a=arguments[i],j=0,jl=a.length;j<jl;j++,k++)r[k]=a[j];return r}(points,[points[0]]));var p0,p3,p=(points.length-1)*t,idx=Math.floor(p),weight=p-idx,p1=points[idx],p2=points[idx>points.length-2?points.length-1:idx+1];closed?(p0=points[idx-1<0?points.length-2:idx-1],p3=points[idx>points.length-3?2:idx+2]):(p0=points[0===idx?idx:idx-1],p3=points[idx>points.length-3?points.length-1:idx+2]),target=target||new Array(p0.length);for(var i=0;i<p0.length;i++)target[i]=func(weight,tension,p0[i],p1[i],p2[i],p3[i]);return target}function getTangentAtT(t,points,options,target){void 0===options&&(options={});var tension=Number.isFinite(options.tension)?options.tension:.5,closed=!!options.closed;return 1===tension&&0===t?t+=EPS:1===tension&&1===t&&(t-=EPS),getPointAtT(t,points,{tension:tension,closed:closed,func:getDerivativeOfT},target)}function getArcLengths(points,divisions,options){void 0===options&&(options={});var current,lengths=[],last=getPointAtT(0,points,options),sum=0;divisions=divisions||300,lengths.push(0);for(var p=1;p<=divisions;p++)sum+=distance(current=getPointAtT(p/divisions,points,options),last),lengths.push(sum),last=current;return lengths}function getUtoTmapping(u,arcLengths){for(var comparison,il=arcLengths.length,targetArcLength=u*arcLengths[il-1],low=0,high=il-1,i=0;low<=high;)if((comparison=arcLengths[i=Math.floor(low+(high-low)/2)]-targetArcLength)<0)low=i+1;else{if(!(comparison>0)){high=i;break}high=i-1}if(arcLengths[i=high]===targetArcLength)return i/(il-1);var lengthBefore=arcLengths[i];return(i+(targetArcLength-lengthBefore)/(arcLengths[i+1]-lengthBefore))/(il-1)}function getTtoUmapping(t,arcLengths){if(0===t)return 0;if(1===t)return 1;var al=arcLengths.length-1,totalLength=arcLengths[al],tIdx=t*al,subIdx=Math.floor(tIdx),l1=arcLengths[subIdx];return tIdx===subIdx?l1/totalLength:(l1+(tIdx-subIdx)*(arcLengths[subIdx+1]-l1))/totalLength}function getTAtValue(lookup,tension,v0,v1,v2,v3){var _a=getCoefficients(v0,v1,v2,v3,lookup,tension),a=_a[0],b=_a[1],c=_a[2],d=_a[3];return 0===a&&0===b&&0===c&&0===d?[0]:getCubicRoots(a,b,c,d).filter((function(t){return t>-EPS&&t<=1+EPS})).map((function(t){return clamp(t,0,1)}))}function valuesLookup(lookup,points,options){for(var _a=__assign({axis:0,tension:.5,margin:.5,max:0,processRefAxis:!1,func:solveForT},options),func=_a.func,axis=_a.axis,tension=_a.tension,margin=_a.margin,max=_a.max,processRefAxis=_a.processRefAxis,k=axis,solutions=[],i=1;i<points.length;i+=1){var idx=max<0?points.length-i:i,p1=points[idx-1],p2=points[idx],vmin=void 0,vmax=void 0;if(p1[k]<p2[k]?(vmin=p1[k],vmax=p2[k]):(vmin=p2[k],vmax=p1[k]),lookup-margin<=vmax&&lookup+margin>=vmin){var p0=points[idx-1==0?0:idx-2],p3=points[idx>points.length-2?points.length-1:idx+1],ts=getTAtValue(lookup,tension,p0[k],p1[k],p2[k],p3[k]);max<0?ts.sort((function(a,b){return b-a})):max>=0&&ts.sort((function(a,b){return a-b}));for(var j=0;j<ts.length;j++)if(!(0===ts[j]&&i>0)){for(var coord=[],c=0;c<p0.length;c++){var v=void 0;v=c!==k||processRefAxis?func(ts[j],tension,p0[c],p1[c],p2[c],p3[c],idx-1):lookup,coord[c]=v}if(solutions.push(coord),solutions.length===Math.abs(max))return solutions}}}return solutions}function tangentsLookup(lookup,points,options){return valuesLookup(lookup,points,__assign(__assign({},options),{func:getDerivativeOfT,processRefAxis:!0}))}function getBoundingBox(points,options){void 0===options&&(options={});for(var _a=__assign({tension:.5,closed:!1,from:0,to:1,arcLengths:null,arcDivisions:300},options),tension=_a.tension,closed=_a.closed,u0=_a.from,u1=_a.to,arcLengths=_a.arcLengths,arcDivisions=_a.arcDivisions,t0=getUtoTmapping(u0,arcLengths=arcLengths||getArcLengths(points,arcDivisions,{tension:tension,closed:closed})),t1=getUtoTmapping(u1,arcLengths),i0=Math.floor((points.length-1)*t0),i1=Math.ceil((points.length-1)*t1),start=getPointAtT(t0,points,{tension:tension,closed:closed}),end=getPointAtT(t1,points,{tension:tension,closed:closed}),min=[],max=[],c=0;c<start.length;c++)min[c]=Math.min(start[c],end[c]),max[c]=Math.max(start[c],end[c]);for(var _loop_1=function(i){var p1=points[i-1],p2=points[i];if(i<i1)for(var c=0;c<p2.length;c++)p2[c]<min[c]&&(min[c]=p2[c]),p2[c]>max[c]&&(max[c]=p2[c]);var w0=(points.length-1)*t0-(i-1),w1=(points.length-1)*t1-(i-1);if(tension<1){var p0_1=points[i-2<0?0:i-2],p3_1=points[i>points.length-2?points.length-1:i+1],valid=function(t){return t>-EPS&&t<=1+EPS&&(i-1!==i0||t>w0)&&(i!==i1||t<w1)},_loop_2=function(c){var _a=getCoefficients(p0_1[c],p1[c],p2[c],p3_1[c],0,tension);getQuadRoots(3*_a[0],2*_a[1],_a[2]).filter(valid).forEach((function(t){var v=solveForT(t,tension,p0_1[c],p1[c],p2[c],p3_1[c]);v<min[c]&&(min[c]=v),v>max[c]&&(max[c]=v)}))};for(c=0;c<p0_1.length;c++)_loop_2(c)}},i=i0+1;i<=i1;i++)_loop_1(i);return{min:min,max:max}}var CurveInterpolator=function(){function CurveInterpolator(points,options){void 0===options&&(options={}),options=__assign({tension:.5,arcDivisions:300,closed:!1},options),this._cache={},this._tension=options.tension,this._arcDivisions=options.arcDivisions,this._lmargin=.5,this._closed=options.closed,this.points=points}return CurveInterpolator.prototype.getT=function(position){return getUtoTmapping(position,this.arcLengths)},CurveInterpolator.prototype.getPointAt=function(position,target){var options={tension:this.tension,closed:this.closed};return getPointAtT(this.getT(position),this.points,options,target)},CurveInterpolator.prototype.getTangentAt=function(position,target){return void 0===target&&(target=null),normalize(getTangentAtT(this.getT(position),this.points,{tension:this.tension,closed:this.closed},target))},CurveInterpolator.prototype.getBoundingBox=function(from,to){if(void 0===from&&(from=0),void 0===to&&(to=1),0===from&&1===to&&this._cache.bbox)return this._cache.bbox;var bbox=getBoundingBox(this.points,{from:from,to:to,tension:this.tension,closed:this.closed,arcLengths:this.arcLengths});return 0===from&&1===to&&(this._cache.bbox=bbox),bbox},CurveInterpolator.prototype.getPoints=function(samples,returnType,from,to){if(void 0===samples&&(samples=100),void 0===from&&(from=0),void 0===to&&(to=1),!(from<0||to>1||to<from)){for(var pts=[],d=0;d<=samples;d++){var u=0===from&&1===to?d/samples:from+d/samples*(to-from);pts.push(this.getPointAt(u,returnType&&new returnType))}return pts}},CurveInterpolator.prototype.lookup=function(v,axis,max,margin){void 0===axis&&(axis=0),void 0===max&&(max=0),void 0===margin&&(margin=this._lmargin);var matches=valuesLookup(v,this.points,{axis:axis,tension:this.tension,closed:this.closed,max:max,margin:margin});return 1===Math.abs(max)?matches[0]:matches},CurveInterpolator.prototype.invalidateCache=function(){var _this=this;return Object.keys(this._cache).forEach((function(key){delete _this._cache[key]})),this},Object.defineProperty(CurveInterpolator.prototype,"points",{get:function(){return this._points},set:function(pts){pts.length>0&&pts.length<4&&(pts=function(args){for(args.length<4&&args.unshift(args[0]);args.length<4;)args.push(args[args.length-1]);return args}(pts)),this._points=pts,this.invalidateCache()},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"tension",{get:function(){return this._tension},set:function(t){t!==this._tension&&(this._tension=t,this.invalidateCache())},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"closed",{get:function(){return this._closed},set:function(isClosed){isClosed!==this._closed&&(this._closed=isClosed,this.invalidateCache())},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"arcDivisions",{get:function(){return this._arcDivisions},set:function(n){n!==this._arcDivisions&&(this._arcDivisions=n,this.invalidateCache())},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"arcLengths",{get:function(){if(this._cache.arcLengths)return this._cache.arcLengths;var arcLengths=getArcLengths(this.points,this.arcDivisions,{tension:this.tension,closed:this.closed});return this._cache.arcLengths=arcLengths,arcLengths},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"length",{get:function(){var lengths=this.arcLengths;return lengths[lengths.length-1]},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"minX",{get:function(){return this.getBoundingBox().min[0]},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"maxX",{get:function(){return this.getBoundingBox().max[0]},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"minY",{get:function(){return this.getBoundingBox().min[1]},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"maxY",{get:function(){return this.getBoundingBox().max[1]},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"minZ",{get:function(){return this.getBoundingBox().min[2]},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"maxZ",{get:function(){return this.getBoundingBox().max[2]},enumerable:!0,configurable:!0}),CurveInterpolator}(),Point=function(){function Point(x,y,z,w){void 0===x&&(x=0),void 0===y&&(y=0),void 0===z&&(z=null),void 0===w&&(w=null),this.x=x,this.y=y,this.z=z,this.w=w}return Object.defineProperty(Point.prototype,0,{get:function(){return this.x},set:function(x){this.x=x},enumerable:!0,configurable:!0}),Object.defineProperty(Point.prototype,1,{get:function(){return this.y},set:function(y){this.y=y},enumerable:!0,configurable:!0}),Object.defineProperty(Point.prototype,2,{get:function(){return this.z},set:function(z){this.z=z},enumerable:!0,configurable:!0}),Object.defineProperty(Point.prototype,3,{get:function(){return this.w},set:function(w){this.w=w},enumerable:!0,configurable:!0}),Object.defineProperty(Point.prototype,"length",{get:function(){return Number.isFinite(this.w)?4:Number.isFinite(this.z)?3:2},enumerable:!0,configurable:!0}),Point}();export{CurveInterpolator,EPS,Point,clamp,distance,fill,getArcLengths,getBoundingBox,getCoefficients,getCubicRoots,getDerivativeOfT,getPointAtT,getQuadRoots,getTAtValue,getTangentAtT,getTtoUmapping,getUtoTmapping,map,normalize,orthogonal,reduce,simplify2d,solveForT,tangentsLookup,valuesLookup};

@@ -15,2 +15,2 @@ !function(global,factory){"object"==typeof exports&&"undefined"!=typeof module?factory(exports):"function"==typeof define&&define.amd?define(["exports"],factory):factory((global=global||self)["curve-interpolator"]={})}(this,(function(exports){"use strict";

and limitations under the License.
***************************************************************************** */var __assign=function(){return(__assign=Object.assign||function(t){for(var s,i=1,n=arguments.length;i<n;i++)for(var p in s=arguments[i])Object.prototype.hasOwnProperty.call(s,p)&&(t[p]=s[p]);return t}).apply(this,arguments)};function fill(v,val){for(var i=0;i<v.length;i++)v[i]=val;return v}function map(v,func){for(var i=0;i<v.length;i++)v[i]=func(v[i],i);return v}function reduce(v,func,r){void 0===r&&(r=0);for(var i=0;i<v.length;i++)r=func(r,v[i],i);return r}var EPS=Math.pow(2,-42);function cuberoot(x){var y=Math.pow(Math.abs(x),1/3);return x<0?-y:y}function getQuadRoots(a,b,c){if(Math.abs(a)<EPS)return Math.abs(b)<EPS?[]:[-c/b];var D=b*b-4*a*c;return Math.abs(D)<EPS?[-b/(2*a)]:D>0?[(-b+Math.sqrt(D))/(2*a),(-b-Math.sqrt(D))/(2*a)]:[]}function getCubicRoots(a,b,c,d){if(Math.abs(a)<EPS)return getQuadRoots(b,c,d);var roots,p=(3*a*c-b*b)/(3*a*a),q=(2*b*b*b-9*a*b*c+27*a*a*d)/(27*a*a*a);if(Math.abs(p)<EPS)roots=[cuberoot(-q)];else if(Math.abs(q)<EPS)roots=[0].concat(p<0?[Math.sqrt(-p),-Math.sqrt(-p)]:[]);else{var D=q*q/4+p*p*p/27;if(Math.abs(D)<EPS)roots=[-1.5*q/p,3*q/p];else if(D>0){roots=[(u=cuberoot(-q/2-Math.sqrt(D)))-p/(3*u)]}else{var u=2*Math.sqrt(-p/3),t=Math.acos(3*q/p/u)/3,k=2*Math.PI/3;roots=[u*Math.cos(t),u*Math.cos(t-k),u*Math.cos(t-2*k)]}}for(var i=0;i<roots.length;i++)roots[i]-=b/(3*a);return roots}function getCoefficients(v0,v1,v2,v3,v,tension){void 0===v&&(v=0),void 0===tension&&(tension=.5);var c=(1-tension)*(v2-v0)*.5,x=(1-tension)*(v3-v1)*.5;return[2*v1-2*v2+c+x,-3*v1+3*v2-2*c-x,c,v1-v]}function solveForT(t,tension,v0,v1,v2,v3){if(Math.abs(t)<EPS)return v1;if(Math.abs(1-t)<EPS)return v2;var t2=t*t,t3=t*t2,_a=getCoefficients(v0,v1,v2,v3,0,tension);return _a[0]*t3+_a[1]*t2+_a[2]*t+_a[3]}function getDerivativeOfT(t,tension,v0,v1,v2,v3){var t2=t*t,_a=getCoefficients(v0,v1,v2,v3,0,tension);return 3*_a[0]*t2+2*_a[1]*t+_a[2]}function distance(p1,p2){return Math.sqrt(reduce(p2,(function(s,c,i){return s+Math.pow(c-p1[i],2)})))}function normalize(v){var squared=reduce(v,(function(s,c){return s+Math.pow(c,2)})),l=Math.sqrt(squared);return 0===l?fill(v,0):map(v,(function(c){return c/l}))}function orthogonal(v){if(v.length>2)throw Error("Only supported for 2d vectors");var x=-v[1];return v[1]=v[0],v[0]=x,v}function clamp(value,min,max){return void 0===min&&(min=0),void 0===max&&(max=1),value<min?min:value>max?max:value}function getPointAtT(t,points,tension,target,func){void 0===func&&(func=solveForT);var p=(points.length-1)*t,idx=Math.floor(p),weight=p-idx,p0=points[0===idx?idx:idx-1],p1=points[idx],p2=points[idx>points.length-2?points.length-1:idx+1],p3=points[idx>points.length-3?points.length-1:idx+2];target=target||new Array(p0.length);for(var i=0;i<p0.length;i++)target[i]=func(weight,tension,p0[i],p1[i],p2[i],p3[i]);return target}function getTangentAtT(t,points,tension,target){return void 0===tension&&(tension=.5),1===tension&&0===t?t+=EPS:1===tension&&1===t&&(t-=EPS),getPointAtT(t,points,tension,target,getDerivativeOfT)}function getNormalAtT(t,points,tension,target){return void 0===tension&&(tension=.5),orthogonal(getTangentAtT(t,points,tension,target))}function getAngleAtT(t,points,tension){var tan=getTangentAtT(t,points,tension);return Math.atan2(tan[1],tan[0])}function getArcLengths(points,divisions,tension){void 0===tension&&(tension=.5);var current,lengths=[],last=getPointAtT(0,points,tension),sum=0;divisions=divisions||300,lengths.push(0);for(var p=1;p<=divisions;p++)sum+=distance(current=getPointAtT(p/divisions,points,tension),last),lengths.push(sum),last=current;return lengths}function getUtoTmapping(u,arcLengths){for(var comparison,il=arcLengths.length,targetArcLength=u*arcLengths[il-1],low=0,high=il-1,i=0;low<=high;)if((comparison=arcLengths[i=Math.floor(low+(high-low)/2)]-targetArcLength)<0)low=i+1;else{if(!(comparison>0)){high=i;break}high=i-1}if(arcLengths[i=high]===targetArcLength)return i/(il-1);var lengthBefore=arcLengths[i];return(i+(targetArcLength-lengthBefore)/(arcLengths[i+1]-lengthBefore))/(il-1)}function getTAtValue(lookup,tension,v0,v1,v2,v3){var _a=getCoefficients(v0,v1,v2,v3,lookup,tension),a=_a[0],b=_a[1],c=_a[2],d=_a[3];return 0===a&&0===b&&0===c&&0===d?[0]:getCubicRoots(a,b,c,d).filter((function(t){return t>-EPS&&t<=1+EPS})).map((function(t){return clamp(t,0,1)}))}function valuesLookup(lookup,points,options){for(var _a=__assign({axis:0,tension:.5,margin:.5,max:0,processRefAxis:!1,func:solveForT},options),func=_a.func,axis=_a.axis,tension=_a.tension,margin=_a.margin,max=_a.max,processRefAxis=_a.processRefAxis,k=axis,solutions=[],i=1;i<points.length;i+=1){var idx=max<0?points.length-i:i,p1=points[idx-1],p2=points[idx],vmin=void 0,vmax=void 0;if(p1[k]<p2[k]?(vmin=p1[k],vmax=p2[k]):(vmin=p2[k],vmax=p1[k]),lookup-margin<=vmax&&lookup+margin>=vmin){var p0=points[idx-1==0?0:idx-2],p3=points[idx>points.length-2?points.length-1:idx+1],ts=getTAtValue(lookup,tension,p0[k],p1[k],p2[k],p3[k]);max<0?ts.sort((function(a,b){return b-a})):max>=0&&ts.sort((function(a,b){return a-b}));for(var j=0;j<ts.length;j++)if(!(0===ts[j]&&i>0)){for(var coord=[],c=0;c<p0.length;c++){var v=void 0;v=c!==k||processRefAxis?func(ts[j],tension,p0[c],p1[c],p2[c],p3[c],idx-1):lookup,coord[c]=v}if(solutions.push(coord),solutions.length===Math.abs(max))return solutions}}}return solutions}function tangentsLookup(lookup,points,options){return valuesLookup(lookup,points,__assign(__assign({},options),{func:getDerivativeOfT,processRefAxis:!0}))}function getBoundingBox(points,options){void 0===options&&(options={});for(var _a=__assign({tension:.5,from:0,to:1,arcLengths:null,arcDivisions:300},options),tension=_a.tension,u0=_a.from,u1=_a.to,arcLengths=_a.arcLengths,arcDivisions=_a.arcDivisions,t0=getUtoTmapping(u0,arcLengths=arcLengths||getArcLengths(points,arcDivisions,tension)),t1=getUtoTmapping(u1,arcLengths),i0=Math.floor((points.length-1)*t0),i1=Math.ceil((points.length-1)*t1),start=getPointAtT(t0,points,tension),end=getPointAtT(t1,points,tension),min=[],max=[],c=0;c<start.length;c++)min[c]=Math.min(start[c],end[c]),max[c]=Math.max(start[c],end[c]);for(var _loop_1=function(i){var p1=points[i-1],p2=points[i];if(i<i1)for(var c=0;c<p2.length;c++)p2[c]<min[c]&&(min[c]=p2[c]),p2[c]>max[c]&&(max[c]=p2[c]);var w0=(points.length-1)*t0-(i-1),w1=(points.length-1)*t1-(i-1);if(tension<1){var p0_1=points[i-2<0?0:i-2],p3_1=points[i>points.length-2?points.length-1:i+1],valid=function(t){return t>-EPS&&t<=1+EPS&&(i-1!==i0||t>w0)&&(i!==i1||t<w1)},_loop_2=function(c){var _a=getCoefficients(p0_1[c],p1[c],p2[c],p3_1[c],0,tension);getQuadRoots(3*_a[0],2*_a[1],_a[2]).filter(valid).forEach((function(t){var v=solveForT(t,tension,p0_1[c],p1[c],p2[c],p3_1[c]);v<min[c]&&(min[c]=v),v>max[c]&&(max[c]=v)}))};for(c=0;c<p0_1.length;c++)_loop_2(c)}},i=i0+1;i<=i1;i++)_loop_1(i);return{min:min,max:max}}var CurveInterpolator=function(){function CurveInterpolator(points,tension,arcDivisions){void 0===tension&&(tension=.5),void 0===arcDivisions&&(arcDivisions=300),this._cache={},this.tension=tension,this.arcDivisions=arcDivisions,this.points=points,this._lmargin=.5}return CurveInterpolator.prototype.getT=function(position){return getUtoTmapping(position,this.arcLengths)},CurveInterpolator.prototype.getPointAt=function(position,target){return getPointAtT(this.getT(position),this.points,this.tension,target)},CurveInterpolator.prototype.getTangentAt=function(position,target){return void 0===target&&(target=null),normalize(getTangentAtT(this.getT(position),this.points,this.tension,target))},CurveInterpolator.prototype.getNormalAt=function(position,target){return normalize(getNormalAtT(this.getT(position),this.points,this.tension,target))},CurveInterpolator.prototype.getAngleAt=function(position){return getAngleAtT(this.getT(position),this.points,this.tension)},CurveInterpolator.prototype.getBoundingBox=function(from,to){if(void 0===from&&(from=0),void 0===to&&(to=1),0===from&&1===to&&this._cache.bbox)return this._cache.bbox;var bbox=getBoundingBox(this.points,{tension:this.tension,from:from,to:to,arcLengths:this.arcLengths});return 0===from&&1===to&&(this._cache.bbox=bbox),bbox},CurveInterpolator.prototype.getPoints=function(samples,returnType,from,to){if(void 0===samples&&(samples=100),void 0===from&&(from=0),void 0===to&&(to=1),!(from<0||to>1||to<from)){for(var pts=[],d=0;d<=samples;d++){var u=0===from&&1===to?d/samples:from+d/samples*(to-from);pts.push(this.getPointAt(u,returnType&&new returnType))}return pts}},CurveInterpolator.prototype.lookup=function(v,axis,max,margin){void 0===axis&&(axis=0),void 0===max&&(max=0),void 0===margin&&(margin=this._lmargin);var matches=valuesLookup(v,this.points,{axis:axis,tension:this.tension,max:max,margin:margin});return 1===Math.abs(max)?matches[0]:matches},CurveInterpolator.prototype.x=function(y,max,margin){if(void 0===max&&(max=0),void 0===margin&&(margin=this._lmargin),this._points.length&&this._points[0].length>2)throw Error("This function is only supported for 2d curves and is now depricated. You should use the lookup function instead.");var matches=valuesLookup(y,this.points,{axis:1,tension:this.tension,max:max,margin:margin});return 1===Math.abs(max)?matches[0][0]:matches.map((function(d){return d[0]}))},CurveInterpolator.prototype.y=function(x,max,margin){if(void 0===max&&(max=0),void 0===margin&&(margin=this._lmargin),this._points.length&&this._points[0].length>2)throw Error("This function is only supported for 2d curves and is now depricated. You should use the lookup function instead.");var matches=valuesLookup(x,this.points,{axis:0,tension:this.tension,max:max,margin:margin});return 1===Math.abs(max)?matches[0][1]:matches.map((function(d){return d[1]}))},CurveInterpolator.prototype.invalidateCache=function(){var _this=this;return Object.keys(this._cache).forEach((function(key){delete _this._cache[key]})),this},Object.defineProperty(CurveInterpolator.prototype,"points",{get:function(){return this._points},set:function(pts){pts.length>0&&pts.length<4&&(pts=function(args){for(args.length<4&&args.unshift(args[0]);args.length<4;)args.push(args[args.length-1]);return args}(pts)),this.invalidateCache(),this._points=pts},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"tension",{get:function(){return this._tension},set:function(t){t!==this._tension&&(this.invalidateCache(),this._tension=t)},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"arcDivisions",{get:function(){return this._arcDivisions},set:function(n){n!==this._arcDivisions&&(this._arcDivisions=n,this.invalidateCache()),this._arcDivisions=n},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"arcLengths",{get:function(){if(this._cache.arcLengths)return this._cache.arcLengths;var arcLengths=getArcLengths(this.points,this.arcDivisions,this.tension);return this._cache.arcLengths=arcLengths,arcLengths},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"length",{get:function(){var lengths=this.arcLengths;return lengths[lengths.length-1]},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"minX",{get:function(){return this.getBoundingBox().min[0]},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"maxX",{get:function(){return this.getBoundingBox().max[0]},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"minY",{get:function(){return this.getBoundingBox().min[1]},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"maxY",{get:function(){return this.getBoundingBox().max[1]},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"minZ",{get:function(){return this.getBoundingBox().min[2]},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"maxZ",{get:function(){return this.getBoundingBox().max[2]},enumerable:!0,configurable:!0}),CurveInterpolator}(),Point=function(){function Point(x,y,z,w){void 0===x&&(x=0),void 0===y&&(y=0),void 0===z&&(z=null),void 0===w&&(w=null),this.x=x,this.y=y,this.z=z,this.w=w}return Object.defineProperty(Point.prototype,0,{get:function(){return this.x},set:function(x){this.x=x},enumerable:!0,configurable:!0}),Object.defineProperty(Point.prototype,1,{get:function(){return this.y},set:function(y){this.y=y},enumerable:!0,configurable:!0}),Object.defineProperty(Point.prototype,2,{get:function(){return this.z},set:function(z){this.z=z},enumerable:!0,configurable:!0}),Object.defineProperty(Point.prototype,3,{get:function(){return this.w},set:function(w){this.w=w},enumerable:!0,configurable:!0}),Object.defineProperty(Point.prototype,"length",{get:function(){return Number.isFinite(this.w)?4:Number.isFinite(this.z)?3:2},enumerable:!0,configurable:!0}),Point}();exports.CurveInterpolator=CurveInterpolator,exports.EPS=EPS,exports.Point=Point,exports.anglesLookup=function(lookup,points,options){return tangentsLookup(lookup,points,options).map((function(tan){return Math.atan2(tan[1],tan[0])}))},exports.clamp=clamp,exports.distance=distance,exports.fill=fill,exports.getAngleAtT=getAngleAtT,exports.getArcLengths=getArcLengths,exports.getBoundingBox=getBoundingBox,exports.getCoefficients=getCoefficients,exports.getCubicRoots=getCubicRoots,exports.getDerivativeOfT=getDerivativeOfT,exports.getNormalAtT=getNormalAtT,exports.getPointAtT=getPointAtT,exports.getQuadRoots=getQuadRoots,exports.getTAtValue=getTAtValue,exports.getTangentAtT=getTangentAtT,exports.getTtoUmapping=function(t,arcLengths){if(0===t)return 0;if(1===t)return 1;var al=arcLengths.length-1,totalLength=arcLengths[al],tIdx=t*al,subIdx=Math.floor(tIdx),l1=arcLengths[subIdx];return tIdx===subIdx?l1/totalLength:(l1+(tIdx-subIdx)*(arcLengths[subIdx+1]-l1))/totalLength},exports.getUtoTmapping=getUtoTmapping,exports.map=map,exports.normalize=normalize,exports.normalsLookup=function(lookup,points,options){return tangentsLookup(lookup,points,options).map((function(v){return orthogonal(v)}))},exports.orthogonal=orthogonal,exports.reduce=reduce,exports.simplify2d=function(inputArr,maxOffset,maxDistance){var _a;if(void 0===maxOffset&&(maxOffset=.001),void 0===maxDistance&&(maxDistance=10),inputArr.length<=4)return inputArr;for(var _b=inputArr[0],o0=_b[0],o1=_b[1],arr=inputArr.map((function(d){return[d[0]-o0,d[1]-o1]})),_c=arr[0],a0=_c[0],a1=_c[1],sim=[inputArr[0]],i=1;i+1<arr.length;i++){var _d=arr[i],t0=_d[0],t1=_d[1],_e=arr[i+1],b0=_e[0],b1=_e[1];if(b0-t0!=0||b1-t1!=0){var proximity=Math.abs(a0*b1-a1*b0+b0*t1-b1*t0+a1*t0-a0*t1)/Math.sqrt(Math.pow(b0-a0,2)+Math.pow(b1-a1,2)),dir=[a0-t0,a1-t1],len=Math.sqrt(Math.pow(dir[0],2)+Math.pow(dir[1],2));(proximity>maxOffset||len>=maxDistance)&&(sim.push([t0+o0,t1+o1]),a0=(_a=[t0,t1])[0],a1=_a[1])}}var last=arr[arr.length-1];return sim.push([last[0]+o0,last[1]+o1]),sim},exports.solveForT=solveForT,exports.tangentsLookup=tangentsLookup,exports.valuesLookup=valuesLookup,Object.defineProperty(exports,"__esModule",{value:!0})}));
***************************************************************************** */var __assign=function(){return(__assign=Object.assign||function(t){for(var s,i=1,n=arguments.length;i<n;i++)for(var p in s=arguments[i])Object.prototype.hasOwnProperty.call(s,p)&&(t[p]=s[p]);return t}).apply(this,arguments)};function fill(v,val){for(var i=0;i<v.length;i++)v[i]=val;return v}function map(v,func){for(var i=0;i<v.length;i++)v[i]=func(v[i],i);return v}function reduce(v,func,r){void 0===r&&(r=0);for(var i=0;i<v.length;i++)r=func(r,v[i],i);return r}var EPS=Math.pow(2,-42);function cuberoot(x){var y=Math.pow(Math.abs(x),1/3);return x<0?-y:y}function getQuadRoots(a,b,c){if(Math.abs(a)<EPS)return Math.abs(b)<EPS?[]:[-c/b];var D=b*b-4*a*c;return Math.abs(D)<EPS?[-b/(2*a)]:D>0?[(-b+Math.sqrt(D))/(2*a),(-b-Math.sqrt(D))/(2*a)]:[]}function getCubicRoots(a,b,c,d){if(Math.abs(a)<EPS)return getQuadRoots(b,c,d);var roots,p=(3*a*c-b*b)/(3*a*a),q=(2*b*b*b-9*a*b*c+27*a*a*d)/(27*a*a*a);if(Math.abs(p)<EPS)roots=[cuberoot(-q)];else if(Math.abs(q)<EPS)roots=[0].concat(p<0?[Math.sqrt(-p),-Math.sqrt(-p)]:[]);else{var D=q*q/4+p*p*p/27;if(Math.abs(D)<EPS)roots=[-1.5*q/p,3*q/p];else if(D>0){roots=[(u=cuberoot(-q/2-Math.sqrt(D)))-p/(3*u)]}else{var u=2*Math.sqrt(-p/3),t=Math.acos(3*q/p/u)/3,k=2*Math.PI/3;roots=[u*Math.cos(t),u*Math.cos(t-k),u*Math.cos(t-2*k)]}}for(var i=0;i<roots.length;i++)roots[i]-=b/(3*a);return roots}function getCoefficients(v0,v1,v2,v3,v,tension){void 0===v&&(v=0),void 0===tension&&(tension=.5);var c=(1-tension)*(v2-v0)*.5,x=(1-tension)*(v3-v1)*.5;return[2*v1-2*v2+c+x,-3*v1+3*v2-2*c-x,c,v1-v]}function solveForT(t,tension,v0,v1,v2,v3){if(Math.abs(t)<EPS)return v1;if(Math.abs(1-t)<EPS)return v2;var t2=t*t,t3=t*t2,_a=getCoefficients(v0,v1,v2,v3,0,tension);return _a[0]*t3+_a[1]*t2+_a[2]*t+_a[3]}function getDerivativeOfT(t,tension,v0,v1,v2,v3){var t2=t*t,_a=getCoefficients(v0,v1,v2,v3,0,tension);return 3*_a[0]*t2+2*_a[1]*t+_a[2]}function distance(p1,p2){return Math.sqrt(reduce(p2,(function(s,c,i){return s+Math.pow(c-p1[i],2)})))}function normalize(v){var squared=reduce(v,(function(s,c){return s+Math.pow(c,2)})),l=Math.sqrt(squared);return 0===l?fill(v,0):map(v,(function(c){return c/l}))}function clamp(value,min,max){return void 0===min&&(min=0),void 0===max&&(max=1),value<min?min:value>max?max:value}function getPointAtT(t,points,options,target){void 0===options&&(options={});var tension=Number.isFinite(options.tension)?options.tension:.5,closed=!!options.closed,func=options.func||solveForT;closed&&(points=function(){for(var s=0,i=0,il=arguments.length;i<il;i++)s+=arguments[i].length;var r=Array(s),k=0;for(i=0;i<il;i++)for(var a=arguments[i],j=0,jl=a.length;j<jl;j++,k++)r[k]=a[j];return r}(points,[points[0]]));var p0,p3,p=(points.length-1)*t,idx=Math.floor(p),weight=p-idx,p1=points[idx],p2=points[idx>points.length-2?points.length-1:idx+1];closed?(p0=points[idx-1<0?points.length-2:idx-1],p3=points[idx>points.length-3?2:idx+2]):(p0=points[0===idx?idx:idx-1],p3=points[idx>points.length-3?points.length-1:idx+2]),target=target||new Array(p0.length);for(var i=0;i<p0.length;i++)target[i]=func(weight,tension,p0[i],p1[i],p2[i],p3[i]);return target}function getTangentAtT(t,points,options,target){void 0===options&&(options={});var tension=Number.isFinite(options.tension)?options.tension:.5,closed=!!options.closed;return 1===tension&&0===t?t+=EPS:1===tension&&1===t&&(t-=EPS),getPointAtT(t,points,{tension:tension,closed:closed,func:getDerivativeOfT},target)}function getArcLengths(points,divisions,options){void 0===options&&(options={});var current,lengths=[],last=getPointAtT(0,points,options),sum=0;divisions=divisions||300,lengths.push(0);for(var p=1;p<=divisions;p++)sum+=distance(current=getPointAtT(p/divisions,points,options),last),lengths.push(sum),last=current;return lengths}function getUtoTmapping(u,arcLengths){for(var comparison,il=arcLengths.length,targetArcLength=u*arcLengths[il-1],low=0,high=il-1,i=0;low<=high;)if((comparison=arcLengths[i=Math.floor(low+(high-low)/2)]-targetArcLength)<0)low=i+1;else{if(!(comparison>0)){high=i;break}high=i-1}if(arcLengths[i=high]===targetArcLength)return i/(il-1);var lengthBefore=arcLengths[i];return(i+(targetArcLength-lengthBefore)/(arcLengths[i+1]-lengthBefore))/(il-1)}function getTAtValue(lookup,tension,v0,v1,v2,v3){var _a=getCoefficients(v0,v1,v2,v3,lookup,tension),a=_a[0],b=_a[1],c=_a[2],d=_a[3];return 0===a&&0===b&&0===c&&0===d?[0]:getCubicRoots(a,b,c,d).filter((function(t){return t>-EPS&&t<=1+EPS})).map((function(t){return clamp(t,0,1)}))}function valuesLookup(lookup,points,options){for(var _a=__assign({axis:0,tension:.5,margin:.5,max:0,processRefAxis:!1,func:solveForT},options),func=_a.func,axis=_a.axis,tension=_a.tension,margin=_a.margin,max=_a.max,processRefAxis=_a.processRefAxis,k=axis,solutions=[],i=1;i<points.length;i+=1){var idx=max<0?points.length-i:i,p1=points[idx-1],p2=points[idx],vmin=void 0,vmax=void 0;if(p1[k]<p2[k]?(vmin=p1[k],vmax=p2[k]):(vmin=p2[k],vmax=p1[k]),lookup-margin<=vmax&&lookup+margin>=vmin){var p0=points[idx-1==0?0:idx-2],p3=points[idx>points.length-2?points.length-1:idx+1],ts=getTAtValue(lookup,tension,p0[k],p1[k],p2[k],p3[k]);max<0?ts.sort((function(a,b){return b-a})):max>=0&&ts.sort((function(a,b){return a-b}));for(var j=0;j<ts.length;j++)if(!(0===ts[j]&&i>0)){for(var coord=[],c=0;c<p0.length;c++){var v=void 0;v=c!==k||processRefAxis?func(ts[j],tension,p0[c],p1[c],p2[c],p3[c],idx-1):lookup,coord[c]=v}if(solutions.push(coord),solutions.length===Math.abs(max))return solutions}}}return solutions}function getBoundingBox(points,options){void 0===options&&(options={});for(var _a=__assign({tension:.5,closed:!1,from:0,to:1,arcLengths:null,arcDivisions:300},options),tension=_a.tension,closed=_a.closed,u0=_a.from,u1=_a.to,arcLengths=_a.arcLengths,arcDivisions=_a.arcDivisions,t0=getUtoTmapping(u0,arcLengths=arcLengths||getArcLengths(points,arcDivisions,{tension:tension,closed:closed})),t1=getUtoTmapping(u1,arcLengths),i0=Math.floor((points.length-1)*t0),i1=Math.ceil((points.length-1)*t1),start=getPointAtT(t0,points,{tension:tension,closed:closed}),end=getPointAtT(t1,points,{tension:tension,closed:closed}),min=[],max=[],c=0;c<start.length;c++)min[c]=Math.min(start[c],end[c]),max[c]=Math.max(start[c],end[c]);for(var _loop_1=function(i){var p1=points[i-1],p2=points[i];if(i<i1)for(var c=0;c<p2.length;c++)p2[c]<min[c]&&(min[c]=p2[c]),p2[c]>max[c]&&(max[c]=p2[c]);var w0=(points.length-1)*t0-(i-1),w1=(points.length-1)*t1-(i-1);if(tension<1){var p0_1=points[i-2<0?0:i-2],p3_1=points[i>points.length-2?points.length-1:i+1],valid=function(t){return t>-EPS&&t<=1+EPS&&(i-1!==i0||t>w0)&&(i!==i1||t<w1)},_loop_2=function(c){var _a=getCoefficients(p0_1[c],p1[c],p2[c],p3_1[c],0,tension);getQuadRoots(3*_a[0],2*_a[1],_a[2]).filter(valid).forEach((function(t){var v=solveForT(t,tension,p0_1[c],p1[c],p2[c],p3_1[c]);v<min[c]&&(min[c]=v),v>max[c]&&(max[c]=v)}))};for(c=0;c<p0_1.length;c++)_loop_2(c)}},i=i0+1;i<=i1;i++)_loop_1(i);return{min:min,max:max}}var CurveInterpolator=function(){function CurveInterpolator(points,options){void 0===options&&(options={}),options=__assign({tension:.5,arcDivisions:300,closed:!1},options),this._cache={},this._tension=options.tension,this._arcDivisions=options.arcDivisions,this._lmargin=.5,this._closed=options.closed,this.points=points}return CurveInterpolator.prototype.getT=function(position){return getUtoTmapping(position,this.arcLengths)},CurveInterpolator.prototype.getPointAt=function(position,target){var options={tension:this.tension,closed:this.closed};return getPointAtT(this.getT(position),this.points,options,target)},CurveInterpolator.prototype.getTangentAt=function(position,target){return void 0===target&&(target=null),normalize(getTangentAtT(this.getT(position),this.points,{tension:this.tension,closed:this.closed},target))},CurveInterpolator.prototype.getBoundingBox=function(from,to){if(void 0===from&&(from=0),void 0===to&&(to=1),0===from&&1===to&&this._cache.bbox)return this._cache.bbox;var bbox=getBoundingBox(this.points,{from:from,to:to,tension:this.tension,closed:this.closed,arcLengths:this.arcLengths});return 0===from&&1===to&&(this._cache.bbox=bbox),bbox},CurveInterpolator.prototype.getPoints=function(samples,returnType,from,to){if(void 0===samples&&(samples=100),void 0===from&&(from=0),void 0===to&&(to=1),!(from<0||to>1||to<from)){for(var pts=[],d=0;d<=samples;d++){var u=0===from&&1===to?d/samples:from+d/samples*(to-from);pts.push(this.getPointAt(u,returnType&&new returnType))}return pts}},CurveInterpolator.prototype.lookup=function(v,axis,max,margin){void 0===axis&&(axis=0),void 0===max&&(max=0),void 0===margin&&(margin=this._lmargin);var matches=valuesLookup(v,this.points,{axis:axis,tension:this.tension,closed:this.closed,max:max,margin:margin});return 1===Math.abs(max)?matches[0]:matches},CurveInterpolator.prototype.invalidateCache=function(){var _this=this;return Object.keys(this._cache).forEach((function(key){delete _this._cache[key]})),this},Object.defineProperty(CurveInterpolator.prototype,"points",{get:function(){return this._points},set:function(pts){pts.length>0&&pts.length<4&&(pts=function(args){for(args.length<4&&args.unshift(args[0]);args.length<4;)args.push(args[args.length-1]);return args}(pts)),this._points=pts,this.invalidateCache()},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"tension",{get:function(){return this._tension},set:function(t){t!==this._tension&&(this._tension=t,this.invalidateCache())},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"closed",{get:function(){return this._closed},set:function(isClosed){isClosed!==this._closed&&(this._closed=isClosed,this.invalidateCache())},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"arcDivisions",{get:function(){return this._arcDivisions},set:function(n){n!==this._arcDivisions&&(this._arcDivisions=n,this.invalidateCache())},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"arcLengths",{get:function(){if(this._cache.arcLengths)return this._cache.arcLengths;var arcLengths=getArcLengths(this.points,this.arcDivisions,{tension:this.tension,closed:this.closed});return this._cache.arcLengths=arcLengths,arcLengths},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"length",{get:function(){var lengths=this.arcLengths;return lengths[lengths.length-1]},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"minX",{get:function(){return this.getBoundingBox().min[0]},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"maxX",{get:function(){return this.getBoundingBox().max[0]},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"minY",{get:function(){return this.getBoundingBox().min[1]},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"maxY",{get:function(){return this.getBoundingBox().max[1]},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"minZ",{get:function(){return this.getBoundingBox().min[2]},enumerable:!0,configurable:!0}),Object.defineProperty(CurveInterpolator.prototype,"maxZ",{get:function(){return this.getBoundingBox().max[2]},enumerable:!0,configurable:!0}),CurveInterpolator}(),Point=function(){function Point(x,y,z,w){void 0===x&&(x=0),void 0===y&&(y=0),void 0===z&&(z=null),void 0===w&&(w=null),this.x=x,this.y=y,this.z=z,this.w=w}return Object.defineProperty(Point.prototype,0,{get:function(){return this.x},set:function(x){this.x=x},enumerable:!0,configurable:!0}),Object.defineProperty(Point.prototype,1,{get:function(){return this.y},set:function(y){this.y=y},enumerable:!0,configurable:!0}),Object.defineProperty(Point.prototype,2,{get:function(){return this.z},set:function(z){this.z=z},enumerable:!0,configurable:!0}),Object.defineProperty(Point.prototype,3,{get:function(){return this.w},set:function(w){this.w=w},enumerable:!0,configurable:!0}),Object.defineProperty(Point.prototype,"length",{get:function(){return Number.isFinite(this.w)?4:Number.isFinite(this.z)?3:2},enumerable:!0,configurable:!0}),Point}();exports.CurveInterpolator=CurveInterpolator,exports.EPS=EPS,exports.Point=Point,exports.clamp=clamp,exports.distance=distance,exports.fill=fill,exports.getArcLengths=getArcLengths,exports.getBoundingBox=getBoundingBox,exports.getCoefficients=getCoefficients,exports.getCubicRoots=getCubicRoots,exports.getDerivativeOfT=getDerivativeOfT,exports.getPointAtT=getPointAtT,exports.getQuadRoots=getQuadRoots,exports.getTAtValue=getTAtValue,exports.getTangentAtT=getTangentAtT,exports.getTtoUmapping=function(t,arcLengths){if(0===t)return 0;if(1===t)return 1;var al=arcLengths.length-1,totalLength=arcLengths[al],tIdx=t*al,subIdx=Math.floor(tIdx),l1=arcLengths[subIdx];return tIdx===subIdx?l1/totalLength:(l1+(tIdx-subIdx)*(arcLengths[subIdx+1]-l1))/totalLength},exports.getUtoTmapping=getUtoTmapping,exports.map=map,exports.normalize=normalize,exports.orthogonal=function(v){if(v.length>2)throw Error("Only supported for 2d vectors");var x=-v[1];return v[1]=v[0],v[0]=x,v},exports.reduce=reduce,exports.simplify2d=function(inputArr,maxOffset,maxDistance){var _a;if(void 0===maxOffset&&(maxOffset=.001),void 0===maxDistance&&(maxDistance=10),inputArr.length<=4)return inputArr;for(var _b=inputArr[0],o0=_b[0],o1=_b[1],arr=inputArr.map((function(d){return[d[0]-o0,d[1]-o1]})),_c=arr[0],a0=_c[0],a1=_c[1],sim=[inputArr[0]],i=1;i+1<arr.length;i++){var _d=arr[i],t0=_d[0],t1=_d[1],_e=arr[i+1],b0=_e[0],b1=_e[1];if(b0-t0!=0||b1-t1!=0){var proximity=Math.abs(a0*b1-a1*b0+b0*t1-b1*t0+a1*t0-a0*t1)/Math.sqrt(Math.pow(b0-a0,2)+Math.pow(b1-a1,2)),dir=[a0-t0,a1-t1],len=Math.sqrt(Math.pow(dir[0],2)+Math.pow(dir[1],2));(proximity>maxOffset||len>=maxDistance)&&(sim.push([t0+o0,t1+o1]),a0=(_a=[t0,t1])[0],a1=_a[1])}}var last=arr[arr.length-1];return sim.push([last[0]+o0,last[1]+o1]),sim},exports.solveForT=solveForT,exports.tangentsLookup=function(lookup,points,options){return valuesLookup(lookup,points,__assign(__assign({},options),{func:getDerivativeOfT,processRefAxis:!0}))},exports.valuesLookup=valuesLookup,Object.defineProperty(exports,"__esModule",{value:!0})}));

@@ -1,2 +0,2 @@

import { Vector, PointFunction, LookupOptions, BBoxOptions, BBox, VectorType } from './interfaces';
import { Vector, LookupOptions, BBoxOptions, BBox, VectorType, CurveOptions, InterpolationOptions } from './interfaces';
/**

@@ -8,11 +8,10 @@ * Find the point on the curve at time t, where t is a number between 0 and 1.

* @param points set of coordinates/control points making out the curve
* @param tension curve tension (0 = Catmull-Rom curve, 1 = linear curve)
* @param options interpolation options
* @param target optional target instance to add results to
* @param func override function used to retrieve the x and y values of the point at t
*/
export declare function getPointAtT<T extends VectorType>(t: number, points: Vector[], target: T): T;
export declare function getPointAtT<T extends VectorType>(t: number, points: Vector[], tension: number, target: T): T;
export declare function getPointAtT(t: number, points: Vector[], tension: number): Vector;
export declare function getPointAtT(t: number, points: Vector[], tension: number, target: Vector): Vector;
export declare function getPointAtT(t: number, points: Vector[], tension: number, target: Vector, func: PointFunction): Vector;
export declare function getPointAtT<T extends VectorType>(t: number, points: Vector[], options: InterpolationOptions, target: T): T;
export declare function getPointAtT(t: number, points: Vector[], options: null, target: Vector): Vector;
export declare function getPointAtT(t: number, points: Vector[], options: InterpolationOptions): Vector;
export declare function getPointAtT(t: number, points: Vector[], options: InterpolationOptions, target: Vector): Vector;
/**

@@ -27,33 +26,8 @@ * Find the tangent on the curve at time t, where t is a number between 0 and 1.

*/
export declare function getTangentAtT<T extends VectorType>(t: number, points: Vector[], tension: null, target: T): T;
export declare function getTangentAtT<T extends VectorType>(t: number, points: Vector[], tension: number, target: T): T;
export declare function getTangentAtT<T extends VectorType>(t: number, points: Vector[], options: null, target: T): T;
export declare function getTangentAtT<T extends VectorType>(t: number, points: Vector[], options: CurveOptions, target: T): T;
export declare function getTangentAtT(t: number, points: Vector[]): Vector;
export declare function getTangentAtT(t: number, points: Vector[], tension: number): Vector;
export declare function getTangentAtT(t: number, points: Vector[], tension: number, target: Vector): Vector;
export declare function getTangentAtT(t: number, points: Vector[], options: CurveOptions): Vector;
export declare function getTangentAtT(t: number, points: Vector[], options: CurveOptions, target: Vector): Vector;
/**
* @deprecated This is only valid for 2d curves. Use the tangent function instead.
* Find the normal on the curve at time t, where t is a number between 0 and 1.
* Note that splines (curve segements) may have different lengths, thus t will
* not be evenly distributed.
* @param t time along curve (0 - 1)
* @param points set of coordinates/control points making out the curve
* @param tension curve tension (0 = Catmull-Rom curve, 1 = linear curve)
* @param target optional target instance to add results to
*/
export declare function getNormalAtT<T extends VectorType>(t: number, points: Vector[], tension: null, target: T): T;
export declare function getNormalAtT<T extends VectorType>(t: number, points: Vector[], tension: number, target: T): T;
export declare function getNormalAtT(t: number, points: Vector[]): Vector;
export declare function getNormalAtT(t: number, points: Vector[], tension: number): Vector;
export declare function getNormalAtT(t: number, points: Vector[], tension: number, target: Vector): Vector;
/**
* @deprecated This is only valid for 2d curves. Use the tangent function instead.
* Find the angle in radians on the curve at time t, where t is a number between 0 and 1.
* Note that splines (curve segements) may have different lengths, thus t will
* not be evenly distributed.
* @param t time along curve (0 - 1)
* @param points set of coordinates/control points making out the curve
* @param tension curve tension (0 = Catmull-Rom curve, 1 = linear curve)
*/
export declare function getAngleAtT(t: number, points: Vector[], tension: number): number;
/**
* Break curve into segments and return the curve length at each segment index.

@@ -63,5 +37,5 @@ * Used for mapping between t and u along the curve.

* @param divisions number of segments to divide the curve into to estimate its length
* @param tension curve tension (0 = Catmull-Rom curve, 1 = linear curve)
* @param options curve options
*/
export declare function getArcLengths(points: Vector[], divisions: number, tension?: number): any[];
export declare function getArcLengths(points: Vector[], divisions: number, options?: CurveOptions): any[];
/**

@@ -106,16 +80,2 @@ * This maps a value of t (time along curve) to a value of u, where u is an uniformly

/**
* Lookup normals at the intersection points formed by a value along the x-axis or y-axis.
* @param lookup lookup value along the axis
* @param points control points
* @param options lookup options to control axis, tension, max solutions etc.
*/
export declare function normalsLookup(lookup: number, points: Vector[], options?: LookupOptions): Vector[];
/**
* Lookup angles at the intersection points formed by a value along the x-axis or y-axis.
* @param lookup lookup value along the axis
* @param points control points
* @param options lookup options to control axis, tension, max solutions etc.
*/
export declare function anglesLookup(lookup: number, points: Vector[], options?: LookupOptions): number[];
/**
* Get the bounding box for the curve or a segment of the curve

@@ -122,0 +82,0 @@ * @param points Curve points

@@ -1,2 +0,5 @@

import { BBox, Vector, VectorType } from './interfaces';
import { BBox, Vector, VectorType, CurveOptions } from './interfaces';
export interface CurveInterpolatorOptions extends CurveOptions {
arcDivisions?: number;
}
/**

@@ -10,2 +13,3 @@ * Cubic curve interpolator

_arcDivisions: number;
_closed: boolean;
_cache: {

@@ -21,3 +25,3 @@ arcLengths?: number[];

*/
constructor(points: Vector[], tension?: number, arcDivisions?: number);
constructor(points: Vector[], options?: CurveInterpolatorOptions);
/**

@@ -43,17 +47,2 @@ * Returns the time on curve at a position, given as a value between 0 and 1

/**
* @deprecated This is only valid for 2d curves. Use the tangent function instead.
* Get the normal at the given position.
* @param position position on curve (0 - 1)
* @param target optional target
*/
getNormalAt<T extends VectorType>(position: number, target: T): T;
getNormalAt(position: number): Vector;
/**
* @deprecated This is only valid for 2d curves. Use the tangent function instead.
* Get the angle (in radians) at the given position.
* @param position position on curve (0 - 1)
* @param target optional target
*/
getAngleAt(position: number): number;
/**
* Get a bounding box for the curve or the segment given by the

@@ -91,18 +80,2 @@ * from and to parameters

/**
* @deprecated Use lookup function
* Find at which value(s) of x the curve is intersected by the given value
* along the y-axis
* @param y value at y-axis
* @param max max solutions (i.e. 0=all, 1=first along curve, -1=last along curve)
*/
x(y: number, max?: number, margin?: number): number[] | number;
/**
* @deprecated Use lookup function
* Find at which value(s) of y the curve is intersected by the given value
* along the x-axis
* @param x value at x-axis
* @param max max solutions (i.e. 0=all, 1=first along curve, -1=last along curve)
*/
y(x: number, max?: number, margin?: number): number[] | number;
/**
* Invalidates/clears cache

@@ -113,2 +86,3 @@ */

get tension(): number;
get closed(): boolean;
get arcDivisions(): number;

@@ -126,2 +100,3 @@ get arcLengths(): any[];

set arcDivisions(n: number);
set closed(isClosed: boolean);
}

@@ -31,7 +31,20 @@ /**

/**
* Curve characteristics
*/
export interface CurveOptions {
tension?: number;
closed?: boolean;
}
/**
* Used by getPointAtT to control curve characteristics and
* which function to use to process the curve coordinates.
*/
export interface InterpolationOptions extends CurveOptions {
func?: PointFunction;
}
/**
* Used by the valuesLookup function to set axis, tension etc.
*/
export interface LookupOptions {
export interface LookupOptions extends CurveOptions {
axis?: number;
tension?: number;
margin?: number;

@@ -52,4 +65,3 @@ max?: number;

*/
export interface BBoxOptions {
tension?: number;
export interface BBoxOptions extends CurveOptions {
from?: number;

@@ -56,0 +68,0 @@ to?: number;

{
"private": false,
"name": "curve-interpolator",
"version": "2.0.0-alpha.4",
"version": "2.0.0-alpha.5",
"description": "Interpolate values on a Cardinal/Catmull-Rom spline curve",

@@ -6,0 +6,0 @@ "repository": "https://github.com/kjerandp/curve-interpolator",

SocketSocket SOC 2 Logo

Product

About

Packages

Stay in touch

Get open source security insights delivered straight into your inbox.

  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc

U.S. Patent No. 12,346,443 & 12,314,394. Other pending.