UNPKG

@arcgis/core

Version:

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

6 lines (5 loc) 3.66 kB
/* All material copyright ESRI, All Rights Reserved, unless otherwise specified. See https://js.arcgis.com/4.32/esri/copyright.txt for details. */ import{floatEqualAbsolute as t}from"../../core/mathUtils.js";import{set as e,determinant as n}from"../../core/libs/gl-matrix-2/math/mat3.js";import{create as r}from"../../core/libs/gl-matrix-2/factories/mat3f64.js";import{squaredDistance as s}from"../../core/libs/gl-matrix-2/math/vec2.js";import{isCurvedGeometry as a,getCurves as o,getEndpoint as u,isBezierCurve as c,isCircularArc as h,isEllipticArc as m,isEllipticArc4 as i,isCoordinate as f}from"./curveUtils.js";const g={maxSegmentLength:1/0,maxSegmentsPerCurve:12e3,minSegmentsPerCurve:1},p=1e-6,M=r();function l(t,e){return s(t,e)}function P(t,e){const n=Math.atan2(t,e);return n<0?n+2*Math.PI:n}function x(t,e,n,{maxSegmentLength:r,maxSegmentsPerCurve:s,minSegmentsPerCurve:a},o){const u=r*r,c=1/s,h=o(0),m=o(1);l(e,h)>p&&t.push(h);const i=[1],f=[m],g=1/a;for(let p=a-1;p>0;p--){const t=p*g;i.push(t),f.push(o(t))}let M=0,P=h;for(;i.length>0;){const e=i.pop(),n=f.pop();if(l(P,n)<u||M===e||e-M<c)t.push(n),M=e,P=n;else{i.push(e),f.push(n);const t=(M+e)/2;i.push(t),f.push(o(t))}}return l(n,m)>p&&t.push([...n]),t}function S(t,e,n,r,s){const a=1-s,o=a*a,u=s*s,c=o*a,h=3*s*o,m=3*u*a,i=u*s;return[t[0]*c+e[0]*h+n[0]*m+r[0]*i,t[1]*c+e[1]*h+n[1]*m+r[1]*i]}function v(t,e,n,r){const[s,a,o]=n.b;return x(t,e,s,r,(t=>S(e,a,o,s,t)))}function C(t,r,s,a){const[o,u]=r,[c,h]=s,[m,i]=a,f=o*o+u*u,g=c*c+h*h,p=m*m+i*i;e(M,o,c,m,u,h,i,1,1,1);const l=n(M);if(0===l)return null;e(M,f,g,p,u,h,i,1,1,1);const P=n(M);e(M,f,g,p,o,c,m,1,1,1);const x=P/l*.5,S=n(M)/l*-.5;return t[0]=x,t[1]=S,t}function b(t,e,n,r,s,a,o,u,{maxSegmentLength:c,maxSegmentsPerCurve:h,minSegmentsPerCurve:m}){const i=2*a,f=[r+a*Math.cos(o),s+a*Math.sin(o)],g=[r+a*Math.cos(u),s+a*Math.sin(u)];l(e,f)>p&&t.push(f);const M=u-o,P=c<i?2*Math.asin(c/i):M,x=Math.min(h,Math.max(m,Math.ceil(Math.abs(M/P)))),S=1/x;for(let p=1;p<x;p++){const e=p*S,n=o*(1-e)+u*e;t.push([r+a*Math.cos(n),s+a*Math.sin(n)])}return t.push(g),l(n,g)>p&&t.push([...n]),t}function I(t,e,n,r){const[s,a]=n.c,o=C([],e,a,s);if(null==o)return t.push([...s]),t;const[u,c]=e,[h,m]=a,[i,f]=s,[g,p]=o,M=u-g,l=c-p,x=Math.sqrt(M*M+l*l),S=P(c-p,u-g),v=P(m-p,h-g);let I=P(f-p,i-g);return(v-S)*(I-v)<0&&(I+=2*Math.sign(S-I)*Math.PI),b(t,e,s,g,p,x,S,I,r)}function L(e,n,r){const[s,a,o,u]=r.a,c=Math.abs(e-n),h=c>Math.PI,m=c<Math.PI,i=t(c,Math.PI);return(!i&&(h&&o||m&&!o)||i&&(e>n&&u||e<n&&!u))&&(e+=2*(Math.sign(n-e)||1)*Math.PI),e}function j(t,e,n,r){const[s,a]=n.a,[o,u]=e,[c,h]=s,[m,i]=a,f=o-m,g=u-i,p=Math.sqrt(f*f+g*g),M=P(u-i,o-m);return b(t,e,s,m,i,p,M,L(P(h-i,c-m),M,n),r)}function R(t,e,n,r){const[s,a,o,u,c,h,m]=n.a,[i,f]=e,[g,p]=s,[M,l]=a,S=h*m,v=Math.cos(c),C=Math.sin(c),b=P(1/S*(f-l)*v-1/S*(i-M)*C,1/h*(f-l)*C+1/h*(i-M)*v),I=L(P(1/S*(p-l)*v-1/S*(g-M)*C,1/h*(p-l)*C+1/h*(g-M)*v),b,n);return x(t,e,s,r,(t=>{const e=b*(1-t)+I*t,n=Math.cos(e),r=Math.sin(e);return[h*n*v-S*r*C+M,h*n*C+S*r*v+l]}))}function q(t,e,n,r){return c(n)?v(t,e,n,r):h(n)?I(t,e,n,r):m(n)?i(n)?j(t,e,n,r):R(t,e,n,r):f(n)?(t.push([...n]),t):t}function U(t,e){if(!a(t))return t;const n=o(t),r=[];for(const s of n){const t=[];for(let n=0,r=1;r<s.length;n=r++){const a=u(s[n]);0===n&&t.push(a);q(t,a,s[r],{maxSegmentLength:e.maxSegmentLength??g.maxSegmentLength,maxSegmentsPerCurve:e.maxSegmentsPerCurve??g.maxSegmentsPerCurve,minSegmentsPerCurve:Math.max(e.minSegmentsPerCurve??g.minSegmentsPerCurve,1)})}r.push(t)}return"curvePaths"in t?{paths:r,spatialReference:t.spatialReference}:{rings:r,spatialReference:t.spatialReference}}export{U as densifyCurvedGeometry};