warpvas-perspective
Version:
A derivative strategy library for warpvas enabling perspective transformation effects
3 lines (2 loc) • 24.9 kB
JavaScript
"function"==typeof SuppressedError&&SuppressedError;const n=(t,n,e)=>{if(t.x===n.x)return{x:t.x,y:e.y};if(t.y===n.y)return{x:e.x,y:t.y};const r=(n.y-t.y)/(n.x-t.x),i=-1/r,s=(-r*t.x+t.y+i*e.x-e.y)/(i-r);return{x:s,y:r*(s-t.x)+t.y}},e=(t,n)=>Math.sqrt(Math.pow(n.x-t.x,2)+Math.pow(n.y-t.y,2)),r=(t,n,e)=>{const r=Object.assign({},t),i={x:n.x-t.x,y:n.y-t.y};if(0===i.x&&0===i.y)return r;if(0===i.x)r.y+=e*Math.sign(i.y);else if(0===i.y)r.x+=e*Math.sign(i.x);else{const t=Math.sqrt(Math.pow(i.x,2)+Math.pow(i.y,2));r.x+=i.x*(e/t),r.y+=i.y*(e/t)}return r};var i,s,o=Object.freeze({__proto__:null,calcBoundingBox:(t,n,e)=>{const r=Math.min(t.x,n.x,e.x),i=Math.max(t.x,n.x,e.x),s=Math.min(t.y,n.y,e.y);return{width:i-r,height:Math.max(t.y,n.y,e.y)-s}},calcCoordDistance:e,calcExpandCoord:(t,i,s,o=1)=>{const c=n(i,s,t),u=e(t,c),a=r(t,c,u+o);return{x:a.x-c.x+i.x,y:a.y-c.y+i.y}},calcIntersection:(t,n,e,r)=>{const i=(t,n)=>Math.abs(t-n)<Math.pow(.1,12);if(i(t.x,n.x)&&i(e.x,r.x))return null;if(i(t.y,n.y)&&i(e.y,r.y))return null;const s=1e4*(n.y-t.y)/Math.round(1e4*(n.x-t.x)),o=1e4*(r.y-e.y)/Math.round(1e4*(r.x-e.x)),c=t.y-s*t.x,u=e.y-o*e.x;if(Math.abs(s)===1/0)return{x:t.x,y:o*t.x+u};if(Math.abs(o)===1/0)return{x:e.x,y:s*e.x+c};const a=(u-c)/(s-o);return{x:a,y:s*a+c}},calcMatrix:(t,n)=>{const[e,r,i]=t,[s,o,c]=n,u=.1/Math.abs([...t,...n].reduce(((t,n)=>Math.min(t,n.x,n.y)),-1)),a=(t,n,e)=>{const[r,i,s,o]=t.map(Number),[c,u,a,h]=n.map(Number),[l,x,y,f]=e.map(Number),p=s-i*a/u,m=a-u*y/x,d=h-u*f/x,g=c-u*l/x,z=(p/m*d-(o-i*h/u))/(p/m*g-(r-i*c/u)),b=(d-g*z)/m;return{x:z,y:(o-r*z-s*b)/i,z:b}},h=[s.x+u,s.y+u,1,e.x+u],l=[o.x+u,o.y+u,1,r.x+u],x=[c.x+u,c.y+u,1,i.x+u],y=a(h,l,x);h[3]=e.y+u,l[3]=r.y+u,x[3]=i.y+u;const f=a(h,l,x),p=y.x,m=y.y,d=y.z;return[p,f.x,m,f.y,d,f.z]},calcPerpendicularIntersection:n,calcRelativeCoord:r,isTriangleContainsPoint:(t,n,e,r,i=.1)=>{const s=(t,n,e)=>Math.abs(t.x*(n.y-e.y)+n.x*(e.y-t.y)+e.x*(t.y-n.y))/2,o=s(n,e,r);return s(n,e,t)+s(e,r,t)+s(r,n,t)<=o+i}});!function(t){t.TOP_LEFT="tl",t.TOP_RIGHT="tr",t.BOTTOM_LEFT="bl",t.BOTTOM_RIGHT="br"}(i||(i={})),function(t){t.TOP="top",t.BOTTOM="bottom",t.LEFT="left",t.RIGHT="right"}(s||(s={}));const{abs:c,cos:u,sin:a,acos:h,atan2:l,sqrt:x,pow:y}=Math;function f(t){return t<0?-y(-t,1/3):y(t,1/3)}const p=Math.PI,m=2*p,d=p/2,g=Number.MAX_SAFE_INTEGER||9007199254740991,z=Number.MIN_SAFE_INTEGER||-9007199254740991,b={x:0,y:0,z:0},v={Tvalues:[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],Cvalues:[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],arcfn:function(t,n){const e=n(t);let r=e.x*e.x+e.y*e.y;return void 0!==e.z&&(r+=e.z*e.z),x(r)},compute:function(t,n,e){if(0===t)return n[0].t=0,n[0];const r=n.length-1;if(1===t)return n[r].t=1,n[r];const i=1-t;let s=n;if(0===r)return n[0].t=t,n[0];if(1===r){const n={x:i*s[0].x+t*s[1].x,y:i*s[0].y+t*s[1].y,t:t};return e&&(n.z=i*s[0].z+t*s[1].z),n}if(r<4){let n,o,c,u=i*i,a=t*t,h=0;2===r?(s=[s[0],s[1],s[2],b],n=u,o=i*t*2,c=a):3===r&&(n=u*i,o=u*t*3,c=i*a*3,h=t*a);const l={x:n*s[0].x+o*s[1].x+c*s[2].x+h*s[3].x,y:n*s[0].y+o*s[1].y+c*s[2].y+h*s[3].y,t:t};return e&&(l.z=n*s[0].z+o*s[1].z+c*s[2].z+h*s[3].z),l}const o=JSON.parse(JSON.stringify(n));for(;o.length>1;){for(let n=0;n<o.length-1;n++)o[n]={x:o[n].x+(o[n+1].x-o[n].x)*t,y:o[n].y+(o[n+1].y-o[n].y)*t},void 0!==o[n].z&&(o[n].z=o[n].z+(o[n+1].z-o[n].z)*t);o.splice(o.length-1,1)}return o[0].t=t,o[0]},computeWithRatios:function(t,n,e,r){const i=1-t,s=e,o=n;let c,u=s[0],a=s[1],h=s[2],l=s[3];return u*=i,a*=t,2===o.length?(c=u+a,{x:(u*o[0].x+a*o[1].x)/c,y:(u*o[0].y+a*o[1].y)/c,z:!!r&&(u*o[0].z+a*o[1].z)/c,t:t}):(u*=i,a*=2*i,h*=t*t,3===o.length?(c=u+a+h,{x:(u*o[0].x+a*o[1].x+h*o[2].x)/c,y:(u*o[0].y+a*o[1].y+h*o[2].y)/c,z:!!r&&(u*o[0].z+a*o[1].z+h*o[2].z)/c,t:t}):(u*=i,a*=1.5*i,h*=3*i,l*=t*t*t,4===o.length?(c=u+a+h+l,{x:(u*o[0].x+a*o[1].x+h*o[2].x+l*o[3].x)/c,y:(u*o[0].y+a*o[1].y+h*o[2].y+l*o[3].y)/c,z:!!r&&(u*o[0].z+a*o[1].z+h*o[2].z+l*o[3].z)/c,t:t}):void 0))},derive:function(t,n){const e=[];for(let r=t,i=r.length,s=i-1;i>1;i--,s--){const t=[];for(let e,i=0;i<s;i++)e={x:s*(r[i+1].x-r[i].x),y:s*(r[i+1].y-r[i].y)},n&&(e.z=s*(r[i+1].z-r[i].z)),t.push(e);e.push(t),r=t}return e},between:function(t,n,e){return n<=t&&t<=e||v.approximately(t,n)||v.approximately(t,e)},approximately:function(t,n,e){return c(t-n)<=(e||1e-6)},length:function(t){const n=v.Tvalues.length;let e=0;for(let r,i=0;i<n;i++)r=.5*v.Tvalues[i]+.5,e+=v.Cvalues[i]*v.arcfn(r,t);return.5*e},map:function(t,n,e,r,i){return r+(i-r)*((t-n)/(e-n))},lerp:function(t,n,e){const r={x:n.x+t*(e.x-n.x),y:n.y+t*(e.y-n.y)};return void 0!==n.z&&void 0!==e.z&&(r.z=n.z+t*(e.z-n.z)),r},pointToString:function(t){let n=t.x+"/"+t.y;return void 0!==t.z&&(n+="/"+t.z),n},pointsToString:function(t){return"["+t.map(v.pointToString).join(", ")+"]"},copy:function(t){return JSON.parse(JSON.stringify(t))},angle:function(t,n,e){const r=n.x-t.x,i=n.y-t.y,s=e.x-t.x,o=e.y-t.y;return l(r*o-i*s,r*s+i*o)},round:function(t,n){const e=""+t,r=e.indexOf(".");return parseFloat(e.substring(0,r+1+n))},dist:function(t,n){const e=t.x-n.x,r=t.y-n.y;return x(e*e+r*r)},closest:function(t,n){let e,r,i=y(2,63);return t.forEach((function(t,s){r=v.dist(n,t),r<i&&(i=r,e=s)})),{mdist:i,mpos:e}},abcratio:function(t,n){if(2!==n&&3!==n)return!1;if(void 0===t)t=.5;else if(0===t||1===t)return t;const e=y(t,n)+y(1-t,n);return c((e-1)/e)},projectionratio:function(t,n){if(2!==n&&3!==n)return!1;if(void 0===t)t=.5;else if(0===t||1===t)return t;const e=y(1-t,n);return e/(y(t,n)+e)},lli8:function(t,n,e,r,i,s,o,c){const u=(t-e)*(s-c)-(n-r)*(i-o);return 0!=u&&{x:((t*r-n*e)*(i-o)-(t-e)*(i*c-s*o))/u,y:((t*r-n*e)*(s-c)-(n-r)*(i*c-s*o))/u}},lli4:function(t,n,e,r){const i=t.x,s=t.y,o=n.x,c=n.y,u=e.x,a=e.y,h=r.x,l=r.y;return v.lli8(i,s,o,c,u,a,h,l)},lli:function(t,n){return v.lli4(t,t.c,n,n.c)},makeline:function(t,n){return new I(t.x,t.y,(t.x+n.x)/2,(t.y+n.y)/2,n.x,n.y)},findbbox:function(t){let n=g,e=g,r=z,i=z;return t.forEach((function(t){const s=t.bbox();n>s.x.min&&(n=s.x.min),e>s.y.min&&(e=s.y.min),r<s.x.max&&(r=s.x.max),i<s.y.max&&(i=s.y.max)})),{x:{min:n,mid:(n+r)/2,max:r,size:r-n},y:{min:e,mid:(e+i)/2,max:i,size:i-e}}},shapeintersections:function(t,n,e,r,i){if(!v.bboxoverlap(n,r))return[];const s=[],o=[t.startcap,t.forward,t.back,t.endcap],c=[e.startcap,e.forward,e.back,e.endcap];return o.forEach((function(n){n.virtual||c.forEach((function(r){if(r.virtual)return;const o=n.intersects(r,i);o.length>0&&(o.c1=n,o.c2=r,o.s1=t,o.s2=e,s.push(o))}))})),s},makeshape:function(t,n,e){const r=n.points.length,i=t.points.length,s=v.makeline(n.points[r-1],t.points[0]),o=v.makeline(t.points[i-1],n.points[0]),c={startcap:s,forward:t,back:n,endcap:o,bbox:v.findbbox([s,t,n,o]),intersections:function(t){return v.shapeintersections(c,c.bbox,t,t.bbox,e)}};return c},getminmax:function(t,n,e){if(!e)return{min:0,max:0};let r,i,s=g,o=z;-1===e.indexOf(0)&&(e=[0].concat(e)),-1===e.indexOf(1)&&e.push(1);for(let c=0,u=e.length;c<u;c++)r=e[c],i=t.get(r),i[n]<s&&(s=i[n]),i[n]>o&&(o=i[n]);return{min:s,mid:(s+o)/2,max:o,size:o-s}},align:function(t,n){const e=n.p1.x,r=n.p1.y,i=-l(n.p2.y-r,n.p2.x-e);return t.map((function(t){return{x:(t.x-e)*u(i)-(t.y-r)*a(i),y:(t.x-e)*a(i)+(t.y-r)*u(i)}}))},roots:function(t,n){n=n||{p1:{x:0,y:0},p2:{x:1,y:0}};const e=t.length-1,r=v.align(t,n),i=function(t){return 0<=t&&t<=1};if(2===e){const t=r[0].y,n=r[1].y,e=r[2].y,s=t-2*n+e;if(0!==s){const r=-x(n*n-t*e),o=-t+n;return[-(r+o)/s,-(-r+o)/s].filter(i)}return n!==e&&0===s?[(2*n-e)/(2*n-2*e)].filter(i):[]}const s=r[0].y,o=r[1].y,c=r[2].y;let a=3*o-s-3*c+r[3].y,l=3*s-6*o+3*c,y=-3*s+3*o,p=s;if(v.approximately(a,0)){if(v.approximately(l,0))return v.approximately(y,0)?[]:[-p/y].filter(i);const t=x(y*y-4*l*p),n=2*l;return[(t-y)/n,(-y-t)/n].filter(i)}l/=a,y/=a,p/=a;const d=(3*y-l*l)/3,g=d/3,z=(2*l*l*l-9*l*y+27*p)/27,b=z/2,_=b*b+g*g*g;let w,E,M,T,O;if(_<0){const t=-d/3,n=x(t*t*t),e=-z/(2*n),r=h(e<-1?-1:e>1?1:e),s=2*f(n);return M=s*u(r/3)-l/3,T=s*u((r+m)/3)-l/3,O=s*u((r+2*m)/3)-l/3,[M,T,O].filter(i)}if(0===_)return w=b<0?f(-b):-f(b),M=2*w-l/3,T=-w-l/3,[M,T].filter(i);{const t=x(_);return w=f(-b+t),E=f(b+t),[w-E-l/3].filter(i)}},droots:function(t){if(3===t.length){const n=t[0],e=t[1],r=t[2],i=n-2*e+r;if(0!==i){const t=-x(e*e-n*r),s=-n+e;return[-(t+s)/i,-(-t+s)/i]}return e!==r&&0===i?[(2*e-r)/(2*(e-r))]:[]}if(2===t.length){const n=t[0],e=t[1];return n!==e?[n/(n-e)]:[]}return[]},curvature:function(t,n,e,r,i){let s,o,u,a,h=0,l=0;const f=v.compute(t,n),p=v.compute(t,e),m=f.x*f.x+f.y*f.y;if(r?(s=x(y(f.y*p.z-p.y*f.z,2)+y(f.z*p.x-p.z*f.x,2)+y(f.x*p.y-p.x*f.y,2)),o=y(m+f.z*f.z,1.5)):(s=f.x*p.y-f.y*p.x,o=y(m,1.5)),0===s||0===o)return{k:0,r:0};if(h=s/o,l=o/s,!i){const i=v.curvature(t-.001,n,e,r,!0).k,s=v.curvature(t+.001,n,e,r,!0).k;a=(s-h+(h-i))/2,u=(c(s-h)+c(h-i))/2}return{k:h,r:l,dk:a,adk:u}},inflections:function(t){if(t.length<4)return[];const n=v.align(t,{p1:t[0],p2:t.slice(-1)[0]}),e=n[2].x*n[1].y,r=n[3].x*n[1].y,i=n[1].x*n[2].y,s=18*(-3*e+2*r+3*i-n[3].x*n[2].y),o=18*(3*e-r-3*i),c=18*(i-e);if(v.approximately(s,0)){if(!v.approximately(o,0)){let t=-c/o;if(0<=t&&t<=1)return[t]}return[]}const u=2*s;if(v.approximately(u,0))return[];const a=o*o-4*s*c;if(a<0)return[];const h=Math.sqrt(a);return[(h-o)/u,-(o+h)/u].filter((function(t){return 0<=t&&t<=1}))},bboxoverlap:function(t,n){const e=["x","y"],r=e.length;for(let i,s,o,u,a=0;a<r;a++)if(i=e[a],s=t[i].mid,o=n[i].mid,u=(t[i].size+n[i].size)/2,c(s-o)>=u)return!1;return!0},expandbox:function(t,n){n.x.min<t.x.min&&(t.x.min=n.x.min),n.y.min<t.y.min&&(t.y.min=n.y.min),n.z&&n.z.min<t.z.min&&(t.z.min=n.z.min),n.x.max>t.x.max&&(t.x.max=n.x.max),n.y.max>t.y.max&&(t.y.max=n.y.max),n.z&&n.z.max>t.z.max&&(t.z.max=n.z.max),t.x.mid=(t.x.min+t.x.max)/2,t.y.mid=(t.y.min+t.y.max)/2,t.z&&(t.z.mid=(t.z.min+t.z.max)/2),t.x.size=t.x.max-t.x.min,t.y.size=t.y.max-t.y.min,t.z&&(t.z.size=t.z.max-t.z.min)},pairiteration:function(t,n,e){const r=t.bbox(),i=n.bbox(),s=1e5,o=e||.5;if(r.x.size+r.y.size<o&&i.x.size+i.y.size<o)return[(s*(t._t1+t._t2)/2|0)/s+"/"+(s*(n._t1+n._t2)/2|0)/s];let c=t.split(.5),u=n.split(.5),a=[{left:c.left,right:u.left},{left:c.left,right:u.right},{left:c.right,right:u.right},{left:c.right,right:u.left}];a=a.filter((function(t){return v.bboxoverlap(t.left.bbox(),t.right.bbox())}));let h=[];return 0===a.length||(a.forEach((function(t){h=h.concat(v.pairiteration(t.left,t.right,o))})),h=h.filter((function(t,n){return h.indexOf(t)===n}))),h},getccenter:function(t,n,e){const r=n.x-t.x,i=n.y-t.y,s=e.x-n.x,o=e.y-n.y,c=r*u(d)-i*a(d),h=r*a(d)+i*u(d),x=s*u(d)-o*a(d),y=s*a(d)+o*u(d),f=(t.x+n.x)/2,p=(t.y+n.y)/2,g=(n.x+e.x)/2,z=(n.y+e.y)/2,b=f+c,_=p+h,w=g+x,E=z+y,M=v.lli8(f,p,b,_,g,z,w,E),T=v.dist(M,t);let O,C=l(t.y-M.y,t.x-M.x),k=l(n.y-M.y,n.x-M.x),S=l(e.y-M.y,e.x-M.x);return C<S?((C>k||k>S)&&(C+=m),C>S&&(O=S,S=C,C=O)):S<k&&k<C?(O=S,S=C,C=O):S+=m,M.s=C,M.e=S,M.r=T,M},numberSort:function(t,n){return t-n}};class _{constructor(t){this.curves=[],this._3d=!1,t&&(this.curves=t,this._3d=this.curves[0]._3d)}valueOf(){return this.toString()}toString(){return"["+this.curves.map((function(t){return v.pointsToString(t.points)})).join(", ")+"]"}addCurve(t){this.curves.push(t),this._3d=this._3d||t._3d}length(){return this.curves.map((function(t){return t.length()})).reduce((function(t,n){return t+n}))}curve(t){return this.curves[t]}bbox(){const t=this.curves;for(var n=t[0].bbox(),e=1;e<t.length;e++)v.expandbox(n,t[e].bbox());return n}offset(t){const n=[];return this.curves.forEach((function(e){n.push(...e.offset(t))})),new _(n)}}const{abs:w,min:E,max:M,cos:T,sin:O,acos:C,sqrt:k}=Math,S=Math.PI;class I{constructor(t){let n=t&&t.forEach?t:Array.from(arguments).slice(),e=!1;if("object"==typeof n[0]){e=n.length;const t=[];n.forEach((function(n){["x","y","z"].forEach((function(e){void 0!==n[e]&&t.push(n[e])}))})),n=t}let r=!1;const i=n.length;if(e){if(e>4){if(1!==arguments.length)throw new Error("Only new Bezier(point[]) is accepted for 4th and higher order curves");r=!0}}else if(6!==i&&8!==i&&9!==i&&12!==i&&1!==arguments.length)throw new Error("Only new Bezier(point[]) is accepted for 4th and higher order curves");const s=this._3d=!r&&(9===i||12===i)||t&&t[0]&&void 0!==t[0].z,o=this.points=[];for(let t=0,e=s?3:2;t<i;t+=e){var c={x:n[t],y:n[t+1]};s&&(c.z=n[t+2]),o.push(c)}const u=this.order=o.length-1,a=this.dims=["x","y"];s&&a.push("z"),this.dimlen=a.length;const h=v.align(o,{p1:o[0],p2:o[u]}),l=v.dist(o[0],o[u]);this._linear=h.reduce(((t,n)=>t+w(n.y)),0)<l/50,this._lut=[],this._t1=0,this._t2=1,this.update()}static quadraticFromPoints(t,n,e,r){if(void 0===r&&(r=.5),0===r)return new I(n,n,e);if(1===r)return new I(t,n,n);const i=I.getABC(2,t,n,e,r);return new I(t,i.A,e)}static cubicFromPoints(t,n,e,r,i){void 0===r&&(r=.5);const s=I.getABC(3,t,n,e,r);void 0===i&&(i=v.dist(n,s.C));const o=i*(1-r)/r,c=v.dist(t,e),u=(e.x-t.x)/c,a=(e.y-t.y)/c,h=i*u,l=i*a,x=o*u,y=o*a,f=n.x-h,p=n.y-l,m=n.x+x,d=n.y+y,g=s.A,z=g.x+(f-g.x)/(1-r),b=g.y+(p-g.y)/(1-r),_=g.x+(m-g.x)/r,w=g.y+(d-g.y)/r,E={x:t.x+(z-t.x)/r,y:t.y+(b-t.y)/r},M={x:e.x+(_-e.x)/(1-r),y:e.y+(w-e.y)/(1-r)};return new I(t,E,M,e)}static getUtils(){return v}getUtils(){return I.getUtils()}static get PolyBezier(){return _}valueOf(){return this.toString()}toString(){return v.pointsToString(this.points)}toSVG(){if(this._3d)return!1;const t=this.points,n=["M",t[0].x,t[0].y,2===this.order?"Q":"C"];for(let e=1,r=t.length;e<r;e++)n.push(t[e].x),n.push(t[e].y);return n.join(" ")}setRatios(t){if(t.length!==this.points.length)throw new Error("incorrect number of ratio values");this.ratios=t,this._lut=[]}verify(){const t=this.coordDigest();t!==this._print&&(this._print=t,this.update())}coordDigest(){return this.points.map((function(t,n){return""+n+t.x+t.y+(t.z?t.z:0)})).join("")}update(){this._lut=[],this.dpoints=v.derive(this.points,this._3d),this.computedirection()}computedirection(){const t=this.points,n=v.angle(t[0],t[this.order],t[1]);this.clockwise=n>0}length(){return v.length(this.derivative.bind(this))}static getABC(t=2,n,e,r,i=.5){const s=v.projectionratio(i,t),o=1-s,c={x:s*n.x+o*r.x,y:s*n.y+o*r.y},u=v.abcratio(i,t);return{A:{x:e.x+(e.x-c.x)/u,y:e.y+(e.y-c.y)/u},B:e,C:c,S:n,E:r}}getABC(t,n){n=n||this.get(t);let e=this.points[0],r=this.points[this.order];return I.getABC(this.order,e,n,r,t)}getLUT(t){if(this.verify(),t=t||100,this._lut.length===t+1)return this._lut;this._lut=[],t++,this._lut=[];for(let n,e,r=0;r<t;r++)e=r/(t-1),n=this.compute(e),n.t=e,this._lut.push(n);return this._lut}on(n,e){e=e||5;const r=this.getLUT(),i=[];for(let t,s=0,o=0;s<r.length;s++)t=r[s],v.dist(t,n)<e&&(i.push(t),o+=s/r.length);return!!i.length&&(t/=i.length)}project(t){const n=this.getLUT(),e=n.length-1,r=v.closest(n,t),i=r.mpos,s=(i-1)/e,o=(i+1)/e,c=.1/e;let u,a=r.mdist,h=s,l=h;a+=1;for(let n;h<o+c;h+=c)u=this.compute(h),n=v.dist(t,u),n<a&&(a=n,l=h);return l=l<0?0:l>1?1:l,u=this.compute(l),u.t=l,u.d=a,u}get(t){return this.compute(t)}point(t){return this.points[t]}compute(t){return this.ratios?v.computeWithRatios(t,this.points,this.ratios,this._3d):v.compute(t,this.points,this._3d,this.ratios)}raise(){const t=this.points,n=[t[0]],e=t.length;for(let r,i,s=1;s<e;s++)r=t[s],i=t[s-1],n[s]={x:(e-s)/e*r.x+s/e*i.x,y:(e-s)/e*r.y+s/e*i.y};return n[e]=t[e-1],new I(n)}derivative(t){return v.compute(t,this.dpoints[0],this._3d)}dderivative(t){return v.compute(t,this.dpoints[1],this._3d)}align(){let t=this.points;return new I(v.align(t,{p1:t[0],p2:t[t.length-1]}))}curvature(t){return v.curvature(t,this.dpoints[0],this.dpoints[1],this._3d)}inflections(){return v.inflections(this.points)}normal(t){return this._3d?this.__normal3(t):this.__normal2(t)}__normal2(t){const n=this.derivative(t),e=k(n.x*n.x+n.y*n.y);return{t:t,x:-n.y/e,y:n.x/e}}__normal3(t){const n=this.derivative(t),e=this.derivative(t+.01),r=k(n.x*n.x+n.y*n.y+n.z*n.z),i=k(e.x*e.x+e.y*e.y+e.z*e.z);n.x/=r,n.y/=r,n.z/=r,e.x/=i,e.y/=i,e.z/=i;const s={x:e.y*n.z-e.z*n.y,y:e.z*n.x-e.x*n.z,z:e.x*n.y-e.y*n.x},o=k(s.x*s.x+s.y*s.y+s.z*s.z);s.x/=o,s.y/=o,s.z/=o;const c=[s.x*s.x,s.x*s.y-s.z,s.x*s.z+s.y,s.x*s.y+s.z,s.y*s.y,s.y*s.z-s.x,s.x*s.z-s.y,s.y*s.z+s.x,s.z*s.z];return{t:t,x:c[0]*n.x+c[1]*n.y+c[2]*n.z,y:c[3]*n.x+c[4]*n.y+c[5]*n.z,z:c[6]*n.x+c[7]*n.y+c[8]*n.z}}hull(t){let n=this.points,e=[],r=[],i=0;for(r[i++]=n[0],r[i++]=n[1],r[i++]=n[2],3===this.order&&(r[i++]=n[3]);n.length>1;){e=[];for(let s,o=0,c=n.length-1;o<c;o++)s=v.lerp(t,n[o],n[o+1]),r[i++]=s,e.push(s);n=e}return r}split(t,n){if(0===t&&n)return this.split(n).left;if(1===n)return this.split(t).right;const e=this.hull(t),r={left:2===this.order?new I([e[0],e[3],e[5]]):new I([e[0],e[4],e[7],e[9]]),right:2===this.order?new I([e[5],e[4],e[2]]):new I([e[9],e[8],e[6],e[3]]),span:e};return r.left._t1=v.map(0,0,1,this._t1,this._t2),r.left._t2=v.map(t,0,1,this._t1,this._t2),r.right._t1=v.map(t,0,1,this._t1,this._t2),r.right._t2=v.map(1,0,1,this._t1,this._t2),n?(n=v.map(n,t,1,0,1),r.right.split(n).left):r}extrema(){const t={};let n=[];return this.dims.forEach(function(e){let r=function(t){return t[e]},i=this.dpoints[0].map(r);t[e]=v.droots(i),3===this.order&&(i=this.dpoints[1].map(r),t[e]=t[e].concat(v.droots(i))),t[e]=t[e].filter((function(t){return t>=0&&t<=1})),n=n.concat(t[e].sort(v.numberSort))}.bind(this)),t.values=n.sort(v.numberSort).filter((function(t,e){return n.indexOf(t)===e})),t}bbox(){const t=this.extrema(),n={};return this.dims.forEach(function(e){n[e]=v.getminmax(this,e,t[e])}.bind(this)),n}overlaps(t){const n=this.bbox(),e=t.bbox();return v.bboxoverlap(n,e)}offset(t,n){if(void 0!==n){const e=this.get(t),r=this.normal(t),i={c:e,n:r,x:e.x+r.x*n,y:e.y+r.y*n};return this._3d&&(i.z=e.z+r.z*n),i}if(this._linear){const n=this.normal(0),e=this.points.map((function(e){const r={x:e.x+t*n.x,y:e.y+t*n.y};return e.z&&n.z&&(r.z=e.z+t*n.z),r}));return[new I(e)]}return this.reduce().map((function(n){return n._linear?n.offset(t)[0]:n.scale(t)}))}simple(){if(3===this.order){const t=v.angle(this.points[0],this.points[3],this.points[1]),n=v.angle(this.points[0],this.points[3],this.points[2]);if(t>0&&n<0||t<0&&n>0)return!1}const t=this.normal(0),n=this.normal(1);let e=t.x*n.x+t.y*n.y;return this._3d&&(e+=t.z*n.z),w(C(e))<S/3}reduce(){let t,n,e=0,r=0,i=.01,s=[],o=[],c=this.extrema().values;for(-1===c.indexOf(0)&&(c=[0].concat(c)),-1===c.indexOf(1)&&c.push(1),e=c[0],t=1;t<c.length;t++)r=c[t],n=this.split(e,r),n._t1=e,n._t2=r,s.push(n),e=r;return s.forEach((function(t){for(e=0,r=0;r<=1;)for(r=e+i;r<=1.01;r+=i)if(n=t.split(e,r),!n.simple()){if(r-=i,w(e-r)<i)return[];n=t.split(e,r),n._t1=v.map(e,0,1,t._t1,t._t2),n._t2=v.map(r,0,1,t._t1,t._t2),o.push(n),e=r;break}e<1&&(n=t.split(e,1),n._t1=v.map(e,0,1,t._t1,t._t2),n._t2=t._t2,o.push(n))})),o}translate(t,n,e){e="number"==typeof e?e:n;const r=this.order;let i=this.points.map(((t,i)=>(1-i/r)*n+i/r*e));return new I(this.points.map(((n,e)=>({x:n.x+t.x*i[e],y:n.y+t.y*i[e]}))))}scale(t){const n=this.order;let e=!1;if("function"==typeof t&&(e=t),e&&2===n)return this.raise().scale(e);const r=this.clockwise,i=this.points;if(this._linear)return this.translate(this.normal(0),e?e(0):t,e?e(1):t);const s=e?e(0):t,o=e?e(1):t,c=[this.offset(0,10),this.offset(1,10)],u=[],a=v.lli4(c[0],c[0].c,c[1],c[1].c);if(!a)throw new Error("cannot scale this curve. Try reducing it first.");return[0,1].forEach((function(t){const e=u[t*n]=v.copy(i[t*n]);e.x+=(t?o:s)*c[t].n.x,e.y+=(t?o:s)*c[t].n.y})),e?([0,1].forEach((function(s){if(2!==n||!s){var o=i[s+1],c={x:o.x-a.x,y:o.y-a.y},h=e?e((s+1)/n):t;e&&!r&&(h=-h);var l=k(c.x*c.x+c.y*c.y);c.x/=l,c.y/=l,u[s+1]={x:o.x+h*c.x,y:o.y+h*c.y}}})),new I(u)):([0,1].forEach((t=>{if(2===n&&t)return;const e=u[t*n],r=this.derivative(t),s={x:e.x+r.x,y:e.y+r.y};u[t+1]=v.lli4(e,s,a,i[t+1])})),new I(u))}outline(t,n,e,r){if(n=void 0===n?t:n,this._linear){const i=this.normal(0),s=this.points[0],o=this.points[this.points.length-1];let c,u,a;void 0===e&&(e=t,r=n),c={x:s.x+i.x*t,y:s.y+i.y*t},a={x:o.x+i.x*e,y:o.y+i.y*e},u={x:(c.x+a.x)/2,y:(c.y+a.y)/2};const h=[c,u,a];c={x:s.x-i.x*n,y:s.y-i.y*n},a={x:o.x-i.x*r,y:o.y-i.y*r},u={x:(c.x+a.x)/2,y:(c.y+a.y)/2};const l=[a,u,c],x=v.makeline(l[2],h[0]),y=v.makeline(h[2],l[0]),f=[x,new I(h),y,new I(l)];return new _(f)}const i=this.reduce(),s=i.length,o=[];let c,u=[],a=0,h=this.length();const l=void 0!==e&&void 0!==r;function x(t,n,e,r,i){return function(s){const o=r/e,c=(r+i)/e,u=n-t;return v.map(s,0,1,t+o*u,t+c*u)}}i.forEach((function(i){const s=i.length();l?(o.push(i.scale(x(t,e,h,a,s))),u.push(i.scale(x(-n,-r,h,a,s)))):(o.push(i.scale(t)),u.push(i.scale(-n))),a+=s})),u=u.map((function(t){return c=t.points,c[3]?t.points=[c[3],c[2],c[1],c[0]]:t.points=[c[2],c[1],c[0]],t})).reverse();const y=o[0].points[0],f=o[s-1].points[o[s-1].points.length-1],p=u[s-1].points[u[s-1].points.length-1],m=u[0].points[0],d=v.makeline(p,y),g=v.makeline(f,m),z=[d].concat(o).concat([g]).concat(u);return new _(z)}outlineshapes(t,n,e){n=n||t;const r=this.outline(t,n).curves,i=[];for(let t=1,n=r.length;t<n/2;t++){const s=v.makeshape(r[t],r[n-t],e);s.startcap.virtual=t>1,s.endcap.virtual=t<n/2-1,i.push(s)}return i}intersects(t,n){return t?t.p1&&t.p2?this.lineIntersects(t):(t instanceof I&&(t=t.reduce()),this.curveintersects(this.reduce(),t,n)):this.selfintersects(n)}lineIntersects(t){const n=E(t.p1.x,t.p2.x),e=E(t.p1.y,t.p2.y),r=M(t.p1.x,t.p2.x),i=M(t.p1.y,t.p2.y);return v.roots(this.points,t).filter((t=>{var s=this.get(t);return v.between(s.x,n,r)&&v.between(s.y,e,i)}))}selfintersects(t){const n=this.reduce(),e=n.length-2,r=[];for(let i,s,o,c=0;c<e;c++)s=n.slice(c,c+1),o=n.slice(c+2),i=this.curveintersects(s,o,t),r.push(...i);return r}curveintersects(t,n,e){const r=[];t.forEach((function(t){n.forEach((function(n){t.overlaps(n)&&r.push({left:t,right:n})}))}));let i=[];return r.forEach((function(t){const n=v.pairiteration(t.left,t.right,e);n.length>0&&(i=i.concat(n))})),i}arcs(t){return t=t||.5,this._iterate(t,[])}_error(t,n,e,r){const i=(r-e)/4,s=this.get(e+i),o=this.get(r-i),c=v.dist(t,n),u=v.dist(t,s),a=v.dist(t,o);return w(u-c)+w(a-c)}_iterate(t,n){let e,r=0,i=1;do{e=0,i=1;let s,o,c,u,a,h=this.get(r),l=!1,x=!1,y=i,f=1;do{if(x=l,u=c,y=(r+i)/2,s=this.get(y),o=this.get(i),c=v.getccenter(h,s,o),c.interval={start:r,end:i},l=this._error(c,h,r,i)<=t,a=x&&!l,a||(f=i),l){if(i>=1){if(c.interval.end=f=1,u=c,i>1){let t={x:c.x+c.r*T(c.e),y:c.y+c.r*O(c.e)};c.e+=v.angle({x:c.x,y:c.y},t,this.get(1))}break}i+=(i-r)/2}else i=y}while(!a&&e++<100);if(e>=100)break;u=u||c,n.push(u),r=f}while(i<1);return n}}const B={name:"perspective",execute:t=>{const n=[],e=(t,n,e,r)=>{if(t===n)return e/r;const i=1-(1/(1+e/r*(t/n-1))*t-n)/(t-n);return Math.min(1,Math.max(0,i))};return t.regionBoundaryCurves.forEach(((r,i)=>{const s=[];r.forEach(((n,r)=>{const c=[],u=n,a={tl:u.top.points[0],tr:u.top.points[3],bl:u.bottom.points[0],br:u.bottom.points[3]};if((t=>{const n=o.calcIntersection(t.tl,t.tr,t.bl,t.br),e=o.calcIntersection(t.tl,t.bl,t.tr,t.br),r=n=>n&&Object.values(t).some(((t,e,r)=>o.isTriangleContainsPoint(n,r[e],r[(e+1)%4],r[(e+2)%4])));return r(n)||r(e)})(a))throw new Error("[Warpvas: Perspective] Invalid perspective shape: The four control points cannot form a triangle or cross each other");const h={left:new I(u.left.points).length(),right:new I(u.right.points).length(),top:new I(u.top.points).length(),bottom:new I(u.bottom.points).length()},l=o.calcIntersection(a.tl,a.bl,a.tr,a.br),x=o.calcIntersection(a.tl,a.tr,a.bl,a.br),{vertical:y,horizontal:f}=t.regionCurves[i][r],p=f.length-1,m=y.length-1;for(let t=0;t<f.length;t++)for(let n=0;n<y.length;n++){let r=u.top.get(n/m),i=u.bottom.get(n/m);if(x){const t=o.calcCoordDistance(a.tl,x)/o.calcCoordDistance(a.tr,x),s=e(h.left,h.left/t,n,m);r=u.top.get(s);const c=o.calcCoordDistance(a.bl,x)/o.calcCoordDistance(a.br,x),l=e(h.left,h.left/c,n,m);i=u.bottom.get(l)}let s=u.left.get(t/p),y=u.right.get(t/p);if(l){const n=o.calcCoordDistance(a.tl,l)/o.calcCoordDistance(a.bl,l),r=e(h.top,h.top/n,t,p);s=u.left.get(r);const i=o.calcCoordDistance(a.tr,l)/o.calcCoordDistance(a.br,l),c=e(h.top,h.top/i,t,p);y=u.right.get(c)}const f=o.calcIntersection(r,i,s,y);f?c.push(f):c.push(r)}s.push(c)})),n.push(s)})),n}};export{B as default};
//# sourceMappingURL=index.esm.js.map