UNPKG

@arcgis/core

Version:

ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API

3 lines (2 loc) 2.39 kB
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.19/LICENSE.txt */ import{floatEqualRelative as t,floatEqualAbsolute as n}from"../../../core/mathUtils.js";import{expandPointInPlace as o,containsXY as r,expandXInPlace as s,expandYInPlace as c}from"../aaBoundingRect.js";import{distance2 as u,findClosestAndFurthestCurveParametersToPoint as e,interpolateSegment as f}from"./mathUtils.js";const i=[0,0];function a(t){const n=1-t,o=n*n,r=t*t;return[o*n,3*t*o,3*r*n,r*t]}function h(t,n,o,r,s){const[c,u,e,f]=a(s);return[t[0]*c+n[0]*u+o[0]*e+r[0]*f,t[1]*c+n[1]*u+o[1]*e+r[1]*f]}function m(t,n,o,r,s){const[c,u,e,f]=a(s);return t*c+n*u+o*e+r*f}function p(t,n,o){const r=t,[s,c,u]=n.b;return h(r,c,u,s,o)}function M(t,n,o){const r=t,[s,c,u]=n.b,e=f([0,0],r,c,o),a=f(i,c,u,o),h=f([0,0],u,s,o),m=f([0,0],e,a,o),p=f([0,0],a,h,o);return[{b:[f([],m,p,o),e,m]},{b:[[...s],p,h]}]}function b(o,r,s){const c=o,[u,f,i]=r.b,a=e(s,[.1,.5,.9],t=>{const n=1-t,[o,r]=h(c,f,i,u,t);return[o,r,3*n*n*(f[0]-c[0])+6*n*t*(i[0]-f[0])+3*t*t*(u[0]-i[0]),3*n*n*(f[1]-c[1])+6*n*t*(i[1]-f[1])+3*t*t*(u[1]-i[1]),6*n*(i[0]-2*f[0]+c[0])+6*t*(u[0]-2*i[0]+f[0]),6*n*(i[1]-2*f[1]+c[1])+6*t*(u[1]-2*i[1]+f[1])]}).map(t=>Math.min(1,Math.max(0,t)));a.push(0,1);let m=1/0;const p=a.map(t=>{const n=h(c,f,i,u,t),[o,r]=n,e=s[0]-o,a=s[1]-r,p=Math.sqrt(e*e+a*a);return m=Math.min(p,m),{t,curvePoint:n,distance:p}}),M=[];for(const e of p){const{t:o,distance:r}=e;t(r,m)&&!M.some(({t})=>n(t,o))&&M.push(e)}return M}function l(t,n,u){const e=n,[f,i,a]=u.b;if(o(t,e),o(t,f),r(t,i[0],i[1])&&r(t,a[0],a[1]))return t;for(const o of q(e[0],i[0],a[0],f[0]))o>0&&o<1&&s(t,m(e[0],i[0],a[0],f[0],o));for(const o of q(e[1],i[1],a[1],f[1]))o>0&&o<1&&c(t,m(e[1],i[1],a[1],f[1],o));return t}function q(t,n,o,r){const s=3*(3*(n-o)-t+r),c=6*(t-2*n+o),u=3*(n-t);if(0===s)return 0!==c?[-u/c]:[];const e=Math.sqrt(c*c-4*s*u);return[(-c+e)/(2*s),(-c-e)/(2*s)]}function d(t,n,o){const r=16;let s=0,c=[n];for(let e=0;e<r;e++){let n=t;const r=[];for(const t of c)r.push(...M(n,t,.5)),n=t.b[0];c=r,n=t,s=0;let e=0;for(const t of c){const[o,r,c]=t.b,f=Math.sqrt(u(n,o));s+=(f+(Math.sqrt(u(n,r))+Math.sqrt(u(r,c))+Math.sqrt(u(c,o))))/2,e+=f,n=o}if(s-e<o)return s}return s}export{l as bezierCurveExtent,d as bezierCurveLength,b as closestPointsOnBezierCurve,p as interpolateBezierCurve,h as interpolateCubicBezier,m as interpolateCubicBezier1D,M as splitBezierCurve};