UNPKG

@arcgis/core

Version:

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

6 lines (5 loc) • 21.6 kB
/* All material copyright ESRI, All Rights Reserved, unless otherwise specified. See https://js.arcgis.com/4.33/esri/copyright.txt for details. */ import{GeometryCursor as s}from"../../../geometry/GeometryCursor.js";import{collectMultipath as t}from"../../../geometry/geometryCursorCollectUtils.js";import{getPathLength as i}from"../../../geometry/support/coordsUtils.js";import{setId as h}from"../CIMCursor.js";import{GeometricEffectControlMeasureLineRule as e}from"../enums.js";class r{static{this.instance=null}static local(){return null===r.instance&&(r.instance=new r),r.instance}execute(s,t,i,h,e){return new _(s,t,i)}}class _{constructor(s,t,i){this._defaultPointSize=20,this._inputGeometries=s,this._geomUnitsPerPoint=i,this._rule=t.rule??e.FullGeometry,this._defaultSize=this._defaultPointSize*i}next(){let i;for(;i=this._inputGeometries.next();){const h=this._processGeom(t(i));if(h?.length)return s.fromJSONCIM({paths:h})}return null}_clone(s){return[s[0],s[1]]}_mid(s,t){return[(s[0]+t[0])/2,(s[1]+t[1])/2]}_mix(s,t,i,h){return[s[0]*t+i[0]*h,s[1]*t+i[1]*h]}_add(s,t){return[s[0]+t[0],s[1]+t[1]]}_add2(s,t,i){return[s[0]+t,s[1]+i]}_sub(s,t){return[s[0]-t[0],s[1]-t[1]]}_dist(s,t){return Math.sqrt((s[0]-t[0])*(s[0]-t[0])+(s[1]-t[1])*(s[1]-t[1]))}_norm(s){return Math.sqrt(s[0]*s[0]+s[1]*s[1])}_normalize(s,t=1){const i=t/this._norm(s);s[0]*=i,s[1]*=i}_leftPerpendicular(s){const t=-s[1],i=s[0];s[0]=t,s[1]=i}_leftPerp(s){return[-s[1],s[0]]}_rightPerpendicular(s){const t=s[1],i=-s[0];s[0]=t,s[1]=i}_rightPerp(s){return[s[1],-s[0]]}_dotProduct(s,t){return s[0]*t[0]+s[1]*t[1]}_crossProduct(s,t){return s[0]*t[1]-s[1]*t[0]}_rotateDirect(s,t,i){const h=s[0]*t-s[1]*i,e=s[0]*i+s[1]*t;s[0]=h,s[1]=e}_makeCtrlPt(s){const t=[s[0],s[1]];return h(t,1),t}_addAngledTicks(s,t,i,h){const e=this._sub(i,t);this._normalize(e);const r=this._crossProduct(e,this._sub(h,t));let _;_=r>0?this._rightPerp(e):this._leftPerp(e);const c=Math.abs(r)/2,u=[];u.push([t[0]+(_[0]-e[0])*c,t[1]+(_[1]-e[1])*c]),u.push(t),u.push(i),u.push([i[0]+(_[0]+e[0])*c,i[1]+(_[1]+e[1])*c]),s.push(u)}_addBezier2(s,t,i,h,e){if(0===e--)return void s.push(h);const r=this._mid(t,i),_=this._mid(i,h),c=this._mid(r,_);this._addBezier2(s,t,r,c,e),this._addBezier2(s,c,_,h,e)}_addBezier3(s,t,i,h,e,r){if(0===r--)return void s.push(e);const _=this._mid(t,i),c=this._mid(i,h),u=this._mid(h,e),o=this._mid(_,c),a=this._mid(c,u),n=this._mid(o,a);this._addBezier3(s,t,_,o,n,r),this._addBezier3(s,n,a,u,e,r)}_add90DegArc(s,t,i,h,e){const r=e??this._crossProduct(this._sub(i,t),this._sub(h,t))>0,_=this._mid(t,i),c=this._sub(_,t);r?this._leftPerpendicular(c):this._rightPerpendicular(c),_[0]+=c[0],_[1]+=c[1],this._addBezier3(s,t,this._mix(t,.33333,_,.66667),this._mix(i,.33333,_,.66667),i,4)}_addArrow(s,t,i){const h=t[0],e=t[1],r=t[t.length-1],_=this._sub(h,e),c=this._norm(_);this._normalize(_);const u=Math.abs(this._crossProduct(_,this._sub(r,e)));let o=this._dotProduct(_,this._sub(r,e));o<.05*c?o=.05*c:o>.95*c&&(o=.95*c);const a=.5*u,n=this._leftPerp(_),p=[e[0]+_[0]*o,e[1]+_[1]*o],d=t.length-1,l=[];l.push(i?[-n[0],-n[1]]:n);let b=[-_[0],-_[1]];for(let P=1;P<d-1;P++){const s=this._sub(t[P+1],t[P]);this._normalize(s);const i=this._dotProduct(s,b),h=this._crossProduct(s,b),e=Math.sqrt((1+i)/2),r=this._sub(s,b);this._normalize(r),r[0]/=e,r[1]/=e,l.push(h<0?[-r[0],-r[1]]:r),b=s}l.push(this._rightPerp(b));for(let P=l.length-1;P>0;P--)s.push([t[P][0]+l[P][0]*a,t[P][1]+l[P][1]*a]);s.push([p[0]+l[0][0]*a,p[1]+l[0][1]*a]),s.push([p[0]+l[0][0]*u,p[1]+l[0][1]*u]),s.push(h),s.push([p[0]-l[0][0]*u,p[1]-l[0][1]*u]),s.push([p[0]-l[0][0]*a,p[1]-l[0][1]*a]);for(let P=1;P<l.length;P++)s.push([t[P][0]-l[P][0]*a,t[P][1]-l[P][1]*a])}_addDash(s,t,i){const h=this._norm(i)/7;this._normalize(i);let e=[];for(let r=0;r<=7;r++)e.push([t[0]+i[0]*r*h,t[1]+i[1]*r*h]),1&r&&(s.push(e),e=[])}_cp2(s,t,i){return s.length>=2?s[1]:this._add2(s[0],t*this._defaultSize,i*this._defaultSize)}_cp3(s,t,i,h){if(s.length>=3)return s[2];const e=this._mix(s[0],1-i,t,i),r=this._sub(t,s[0]);return this._normalize(r),this._rightPerpendicular(r),[e[0]+r[0]*h*this._defaultSize,e[1]+r[1]*h*this._defaultSize]}_arrowPath(s){if(s.length>2)return s;const t=s[0],i=this._cp2(s,-4,0),h=this._sub(t,i);this._normalize(h);const e=this._rightPerp(h);return[t,i,[t[0]+(e[0]-h[0])*this._defaultSize,t[1]+(e[1]-h[1])*this._defaultSize]]}_arrowLastSeg(s){const t=s[0],i=this._cp2(s,-4,0);let h;if(s.length>=3)h=s[s.length-1];else{const s=this._sub(t,i);this._normalize(s);const e=this._rightPerp(s);h=[t[0]+(e[0]-s[0])*this._defaultSize,t[1]+(e[1]-s[1])*this._defaultSize]}return[i,h]}_processGeom(s){if(!s)return null;const t=[];for(const r of s){const s=r.length>1&&i(r)<this._defaultSize;if(!r||0===r.length||s)continue;const _=r.length;let c=r[0];switch(this._rule){case e.PerpendicularFromFirstSegment:{const s=this._cp2(r,0,-1),i=this._cp3(r,s,.5,4),h=[];h.push(i),h.push(this._mid(c,s)),t.push(h);break}case e.ReversedFirstSegment:{const s=this._cp2(r,0,-1);t.push([s,c]);break}case e.PerpendicularToSecondSegment:{if(r.length<3)return[];const s=this._cp2(r,-4,1),i=this._cp3(r,s,.882353,-1.94),h=[];h.push(this._mid(s,i)),h.push(c),t.push(h);break}case e.SecondSegmentWithTicks:{if(r.length<3)return[];const s=this._cp2(r,-4,1),i=this._cp3(r,s,.882353,-1.94),h=this._sub(i,s);let e;e=this._crossProduct(h,this._sub(c,s))>0?this._rightPerp(h):this._leftPerp(h);const _=[];_.push([s[0]+(e[0]-h[0])/3,s[1]+(e[1]-h[1])/3]),_.push(s),_.push(i),_.push([i[0]+(e[0]+h[0])/3,i[1]+(e[1]+h[1])/3]),t.push(_);break}case e.DoublePerpendicular:{const s=this._cp2(r,0,-1),i=this._cp3(r,s,.5,3),h=this._mid(c,s),e=this._sub(h,i);this._normalize(e);const _=this._crossProduct(e,this._sub(c,i));this._leftPerpendicular(e);const u=[];u.push(c),u.push([i[0]+e[0]*_,i[1]+e[1]*_]),t.push(u);const o=[];o.push([i[0]-e[0]*_,i[1]-e[1]*_]),o.push(s),t.push(o);break}case e.OppositeToFirstSegment:{const s=this._cp2(r,0,-1),i=this._cp3(r,s,.5,3),h=this._mid(c,s),e=this._sub(h,i);this._normalize(e);const _=this._crossProduct(e,this._sub(c,i));this._leftPerpendicular(e);const u=[];u.push([i[0]+e[0]*_,i[1]+e[1]*_]),u.push([i[0]-e[0]*_,i[1]-e[1]*_]),t.push(u);break}case e.TriplePerpendicular:{const s=this._cp2(r,0,-1),i=this._cp3(r,s,.5,4),h=this._mid(c,s),e=this._sub(h,i);this._normalize(e);const _=this._crossProduct(e,this._sub(c,i));this._leftPerpendicular(e);const u=[];u.push([i[0]+e[0]*_*.8,i[1]+e[1]*_*.8]),u.push([h[0]+.8*(c[0]-h[0]),h[1]+.8*(c[1]-h[1])]),t.push(u),t.push([i,h]);const o=[];o.push([i[0]-e[0]*_*.8,i[1]-e[1]*_*.8]),o.push([h[0]+.8*(s[0]-h[0]),h[1]+.8*(s[1]-h[1])]),t.push(o);break}case e.HalfCircleFirstSegment:{const s=this._cp2(r,0,-1),i=this._cp3(r,s,.5,4),h=this._mid(c,s);let e=this._sub(s,c);const _=Math.cos(Math.PI/18),u=Math.sin(Math.PI/18),o=Math.sqrt((1+_)/2),a=Math.sqrt((1-_)/2),n=[];let p;this._crossProduct(e,this._sub(i,c))>0?(n.push(c),e=this._sub(c,h),p=s):(n.push(s),e=this._sub(s,h),p=c),this._rotateDirect(e,o,a),e[0]/=o,e[1]/=o;for(let t=1;t<=18;t++)n.push(this._add(h,e)),this._rotateDirect(e,_,u);n.push(p),t.push(n);break}case e.HalfCircleSecondSegment:{const s=this._cp2(r,0,-1),i=this._cp3(r,s,1,-1);let h=this._sub(c,s);this._normalize(h);const e=this._crossProduct(h,this._sub(i,s))/2;this._leftPerpendicular(h);const _=[s[0]+h[0]*e,s[1]+h[1]*e];h=this._sub(s,_);const u=Math.cos(Math.PI/18);let o=Math.sin(Math.PI/18);e>0&&(o=-o);const a=[s];for(let t=1;t<=18;t++)this._rotateDirect(h,u,o),a.push(this._add(_,h));t.push(a);break}case e.HalfCircleExtended:{const s=this._cp2(r,0,-2),i=this._cp3(r,s,1,-1);let h;if(_>=4)h=r[3];else{const t=this._sub(c,s);h=this._add(i,t)}const e=this._dist(s,i)/2/.75,u=this._sub(s,c);this._normalize(u,e);const o=this._sub(i,h);this._normalize(o,e);const a=[h,i];t.push(a);const n=[this._clone(i)];this._addBezier3(n,i,this._add(i,o),this._add(s,u),s,4),n.push(c),t.push(n);break}case e.OpenCircle:{const s=this._cp2(r,-2,0),i=this._sub(s,c),h=Math.cos(Math.PI/18),e=-Math.sin(Math.PI/18),_=[s];for(let t=1;t<=33;t++)this._rotateDirect(i,h,e),_.push(this._add(c,i));t.push(_);break}case e.CoverageEdgesWithTicks:{const s=this._cp2(r,0,-1);let i,h;if(_>=3)i=r[2];else{const t=this._sub(s,c),h=this._leftPerp(t);i=[c[0]+h[0]-.25*t[0],c[1]+h[1]-.25*t[1]]}if(_>=4)h=r[3];else{const t=this._mid(c,s),e=this._sub(c,s);this._normalize(e),this._leftPerpendicular(e);const r=this._crossProduct(e,this._sub(i,t));this._rightPerpendicular(e),h=[i[0]+e[0]*r*2,i[1]+e[1]*r*2]}const e=this._sub(s,c);let u,o;u=this._crossProduct(e,this._sub(i,c))>0?this._rightPerp(e):this._leftPerp(e),o=[],o.push(i),o.push(c),o.push([c[0]+(u[0]-e[0])/3,c[1]+(u[1]-e[1])/3]),t.push(o),u=this._crossProduct(e,this._sub(h,s))>0?this._rightPerp(e):this._leftPerp(e),o=[],o.push([s[0]+(u[0]+e[0])/3,s[1]+(u[1]+e[1])/3]),o.push(s),o.push(h),t.push(o);break}case e.GapExtentWithDoubleTicks:{const s=this._cp2(r,0,2),i=this._cp3(r,s,0,1);let h;if(_>=4)h=r[3];else{const t=this._sub(s,c);h=this._add(i,t)}this._addAngledTicks(t,c,s,this._mid(i,h)),this._addAngledTicks(t,i,h,this._mid(c,s));break}case e.GapExtentMidline:{const s=this._cp2(r,2,0),i=this._cp3(r,s,0,1);let h;if(_>=4)h=r[3];else{const t=this._sub(s,c);h=this._add(i,t)}const e=[];e.push(this._mid(c,i)),e.push(this._mid(s,h)),t.push(e);break}case e.Chevron:{const s=this._cp2(r,-1,-1);let i;if(_>=3)i=r[2];else{const t=this._sub(s,c);this._leftPerpendicular(t),i=this._add(c,t)}t.push([s,this._makeCtrlPt(c),i]);break}case e.PerpendicularWithArc:{const s=this._cp2(r,0,-2),i=this._cp3(r,s,.5,-1),h=this._sub(s,c),e=this._norm(h);h[0]/=e,h[1]/=e;const u=this._crossProduct(h,this._sub(i,c));let o=this._dotProduct(h,this._sub(i,c));o<.05*e?o=.05*e:o>.95*e&&(o=.95*e);const a=[c[0]+h[0]*o,c[1]+h[1]*o];let n=this._leftPerp(h),p=[];if(p.push([a[0]-n[0]*u,a[1]-n[1]*u]),p.push([a[0]+n[0]*u,a[1]+n[1]*u]),t.push(p),_>=4){const s=r[3];let i=this._dotProduct(h,this._sub(s,c));i<.1*e?i=.1*e:i>.9*e&&(i=.9*e);const _=[c[0]+h[0]*i,c[1]+h[1]*i],u=this._crossProduct(h,this._sub(s,c)),o=[];o.push([_[0]-n[0]*u,_[1]-n[1]*u]),o.push([_[0]+n[0]*u,_[1]+n[1]*u]),t.push(o)}const d=[s[0]+n[0]*u,s[1]+n[1]*u];n=this._sub(s,d);const l=Math.cos(Math.PI/18);let b=Math.sin(Math.PI/18);u<0&&(b=-b),p=[c,s];for(let t=1;t<=9;t++)this._rotateDirect(n,l,b),p.push(this._add(d,n));t.push(p);break}case e.ClosedHalfCircle:{const s=this._cp2(r,2,0),i=this._mid(c,s),h=this._sub(s,i),e=Math.cos(Math.PI/18),_=Math.sin(Math.PI/18),u=[c,s];for(let t=1;t<=18;t++)this._rotateDirect(h,e,_),u.push(this._add(i,h));t.push(u);break}case e.TripleParallelExtended:{const s=this._cp2(r,0,-2),i=this._cp3(r,s,1,-2),e=this._mid(c,s),_=this._sub(i,s);this._normalize(_);const u=Math.abs(this._crossProduct(_,this._sub(e,s)))/2,o=this._dist(s,i),a=[s,c];a.push([c[0]+_[0]*o*.5,c[1]+_[1]*o*.5]),t.push(a);const n=[];n.push([e[0]-_[0]*u,e[1]-_[1]*u]),n.push([e[0]+_[0]*o*.375,e[1]+_[1]*o*.375]),h(n[n.length-1],1),n.push([e[0]+_[0]*o*.75,e[1]+_[1]*o*.75]),t.push(n);const p=[s,i];t.push(p);break}case e.ParallelWithTicks:{const s=this._cp2(r,3,0),i=this._cp3(r,s,.5,-1),h=this._sub(i,s);this._normalize(h);const e=this._crossProduct(h,this._sub(i,c));this._leftPerpendicular(h),this._addAngledTicks(t,c,s,i),this._addAngledTicks(t,this._mix(c,1,h,e),this._mix(s,1,h,e),this._mid(c,s));break}case e.Parallel:{const s=this._cp2(r,3,0),i=this._cp3(r,s,.5,-1),h=this._sub(s,c);this._normalize(h);const e=this._leftPerp(h),_=this._crossProduct(h,this._sub(i,c));let u=[c,s];t.push(u),u=[],u.push([c[0]+e[0]*_,c[1]+e[1]*_]),u.push([s[0]+e[0]*_,s[1]+e[1]*_]),t.push(u);break}case e.PerpendicularToFirstSegment:{const s=this._cp2(r,3,0),i=this._cp3(r,s,.5,-1),h=this._mid(c,s),e=this._sub(s,c);this._normalize(e);const _=this._crossProduct(e,this._sub(i,c));this._leftPerpendicular(e);const u=[];u.push([h[0]-e[0]*_*.25,h[1]-e[1]*_*.25]),u.push([h[0]+e[0]*_*1.25,h[1]+e[1]*_*1.25]),t.push(u);break}case e.ParallelOffset:{const s=this._cp2(r,3,0),i=this._cp3(r,s,.5,-1),h=this._sub(s,c);this._normalize(h);const e=this._crossProduct(h,this._sub(i,c));this._leftPerpendicular(h);const _=[];_.push([c[0]-h[0]*e,c[1]-h[1]*e]),_.push([s[0]-h[0]*e,s[1]-h[1]*e]),t.push(_);const u=[];u.push([c[0]+h[0]*e,c[1]+h[1]*e]),u.push([s[0]+h[0]*e,s[1]+h[1]*e]),t.push(u);break}case e.OffsetOpposite:{const s=this._cp2(r,3,0),i=this._cp3(r,s,.5,-1),h=this._sub(s,c);this._normalize(h);const e=this._crossProduct(h,this._sub(i,c));this._leftPerpendicular(h);const _=[];_.push([c[0]-h[0]*e,c[1]-h[1]*e]),_.push([s[0]-h[0]*e,s[1]-h[1]*e]),t.push(_);break}case e.OffsetSame:{const s=this._cp2(r,3,0),i=this._cp3(r,s,.5,-1),h=this._sub(s,c);this._normalize(h);const e=this._crossProduct(h,this._sub(i,c));this._leftPerpendicular(h);const _=[];_.push([c[0]+h[0]*e,c[1]+h[1]*e]),_.push([s[0]+h[0]*e,s[1]+h[1]*e]),t.push(_);break}case e.CircleWithArc:{let s=this._cp2(r,3,0);const i=this._cp3(r,s,.5,-1);let e,u;if(_>=4)e=r[3],u=this._crossProduct(this._sub(e,s),this._sub(i,s))>0;else{e=s,u=this._crossProduct(this._sub(e,c),this._sub(i,c))>0;const t=24*this._geomUnitsPerPoint,h=this._sub(e,c);this._normalize(h,t);const r=Math.sqrt(2)/2;this._rotateDirect(h,r,u?r:-r),s=this._add(c,h)}const o=this._sub(s,c),a=Math.cos(Math.PI/18),n=Math.sin(Math.PI/18),p=[s];for(let t=1;t<=36;t++)this._rotateDirect(o,a,n),p.push(this._add(c,o));this._add90DegArc(p,s,e,i,u),h(p[p.length-8],1),t.push(p);break}case e.DoubleJog:{let s,i=this._cp2(r,-3,1),h=this._cp3(r,i,-1,-.5);if(_>=4)s=r[3];else{const t=c;c=i,s=h;const e=this._dist(c,t),r=this._dist(s,t);let _=30*this._geomUnitsPerPoint;.5*e<_&&(_=.5*e),.5*r<_&&(_=.5*r),i=this._mix(c,_/e,t,(e-_)/e),h=this._mix(s,_/r,t,(r-_)/r)}const e=this._mid(c,i),u=this._mid(s,h),o=this._dist(c,i),a=this._dist(h,s);let n=Math.min(o,a)/8;n=Math.min(n,24*this._geomUnitsPerPoint);const p=Math.cos(Math.PI/4);let d=this._sub(c,i);this._normalize(d,n),this._crossProduct(d,this._sub(s,i))>0?this._rotateDirect(d,p,-p):this._rotateDirect(d,p,p);let l=[];l.push(i),l.push(this._add(e,d)),l.push(this._sub(e,d)),l.push(c),t.push(l),d=this._sub(s,h),this._normalize(d,n),this._crossProduct(d,this._sub(c,h))<0?this._rotateDirect(d,p,p):this._rotateDirect(d,p,-p),l=[],l.push(h),l.push(this._add(u,d)),l.push(this._sub(u,d)),l.push(s),t.push(l);break}case e.PerpendicularOffset:{const s=this._cp2(r,-4,1),i=this._cp3(r,s,.882353,-1.94),h=this._sub(i,s);this._crossProduct(h,this._sub(c,s))>0?this._rightPerpendicular(h):this._leftPerpendicular(h);const e=[h[0]/8,h[1]/8],_=this._sub(this._mid(s,i),e);t.push([_,c]);break}case e.LineExcludingLastSegment:{const s=this._arrowPath(r),i=[];let h=s.length-2;for(;h--;)i.push(s[h]);t.push(i);break}case e.MultivertexArrow:{const s=this._arrowPath(r),i=[];this._addArrow(i,s,!1),t.push(i);break}case e.CrossedArrow:{const s=this._arrowPath(r),i=[];this._addArrow(i,s,!0),t.push(i);break}case e.ChevronArrow:{const[s,i]=this._arrowLastSeg(r),h=10*this._geomUnitsPerPoint,e=this._sub(c,s),_=this._norm(e);this._normalize(e);const u=this._crossProduct(e,this._sub(i,s));let o=this._dotProduct(e,this._sub(i,s));o<.05*_?o=.05*_:o>.95*_-h&&(o=.95*_-h);const a=[s[0]+e[0]*o,s[1]+e[1]*o],n=this._leftPerp(e),p=[];p.push([a[0]+n[0]*u+e[0]*h,a[1]+n[1]*u+e[1]*h]),p.push(c),p.push([a[0]-n[0]*u+e[0]*h,a[1]-n[1]*u+e[1]*h]),t.push(p);break}case e.ChevronArrowOffset:{const[s,i]=this._arrowLastSeg(r),h=this._sub(c,s),e=this._norm(h);this._normalize(h);const _=this._crossProduct(h,this._sub(i,s));let u=this._dotProduct(h,this._sub(i,s));u<.05*e?u=.05*e:u>.95*e&&(u=.95*e);const o=[s[0]+h[0]*u,s[1]+h[1]*u];this._leftPerpendicular(h);const a=[];a.push([o[0]+h[0]*_*.5,o[1]+h[1]*_*.5]),a.push(this._mid(o,c)),a.push([o[0]-h[0]*_*.5,o[1]-h[1]*_*.5]),t.push(a);break}case e.PartialFirstSegment:{const[s,i]=this._arrowLastSeg(r),h=this._sub(c,s),e=this._norm(h);this._normalize(h);let _=this._dotProduct(h,this._sub(i,s));_<.05*e?_=.05*e:_>.95*e&&(_=.95*e);const u=[s[0]+h[0]*_,s[1]+h[1]*_];t.push([s,u]);break}case e.Arch:{const s=this._cp2(r,0,-1),i=this._cp3(r,s,.5,1),h=this._sub(c,s),e=this._mix(i,1,h,.55),_=this._mix(i,1,h,-.55),u=[c];this._addBezier2(u,c,e,i,4),this._addBezier2(u,i,_,s,4),t.push(u);break}case e.CurvedParallelTicks:{const s=this._cp2(r,-4,1),i=this._cp3(r,s,.882353,-1.94),h=this._sub(i,s);this._crossProduct(h,this._sub(c,s))>0?this._rightPerpendicular(h):this._leftPerpendicular(h);const e=[h[0]/8,h[1]/8],_=this._sub(this._mid(s,i),e),u=this._sub(this._mix(s,.75,i,.25),e),o=this._sub(this._mix(s,.25,i,.75),e),a=[s];this._addBezier2(a,s,u,_,3),this._addBezier2(a,_,o,i,3),t.push(a);for(let r=0;r<8;r++){const s=a[2*r+1],i=[this._clone(s)];i.push(this._add(s,[h[0]/4,h[1]/4])),t.push(i)}break}case e.Arc90Degrees:{const s=this._cp2(r,0,-1),i=this._cp3(r,s,.5,1),h=[s];this._add90DegArc(h,s,c,i),t.push(h);break}case e.TipWithPerpendicularAndTicks:{const[s,i]=this._arrowLastSeg(r),h=10*this._geomUnitsPerPoint,e=this._sub(c,s),_=this._norm(e);this._normalize(e);let u=this._crossProduct(e,this._sub(i,s)),o=this._dotProduct(e,this._sub(i,s));o<.05*_?o=.05*_:o>.95*_-h&&(o=.95*_-h);const a=this._leftPerp(e),n=[c[0]-e[0]*h,c[1]-e[1]*h],p=.5*Math.max(_-o-h,h);u=Math.abs(u);const d=[];d.push([n[0]+a[0]*(u+p)-e[0]*p,n[1]+a[1]*(u+p)-e[1]*p]),d.push([n[0]+a[0]*u,n[1]+a[1]*u]),d.push([n[0]-a[0]*u,n[1]-a[1]*u]),d.push([n[0]-a[0]*(u+p)-e[0]*p,n[1]-a[1]*(u+p)-e[1]*p]),t.push(d),t.push([n,c]);break}case e.ConcentricCircles:{const s=this._cp2(r,1,0),i=this._cp3(r,s,2,0),e=Math.cos(Math.PI/18),u=Math.sin(Math.PI/18);let o=this._dist(s,c),a=[o,0],n=[];for(let t=0;t<=36;t++)n.push(this._add(c,a)),this._rotateDirect(a,e,u);if(t.push(n),_>=4){n=[];const s=r[3];o=this._dist(s,c),a=[o,0];for(let t=0;t<=36;t++)n.push(this._add(c,a)),0===t&&(n.push(this._add(c,a)),h(n[1],1)),this._rotateDirect(a,e,u);t.push(n)}n=[],o=this._dist(i,c),a=[o,0];for(let t=0;t<=36;t++)n.push(this._add(c,a)),this._rotateDirect(a,e,u);t.push(n);break}case e.DoubleJogArrow:{c=this._arrowPath(r)[0];const[s,i]=this._arrowLastSeg(r),h=this._sub(c,s),e=this._norm(h);this._normalize(h);const _=Math.abs(this._crossProduct(h,this._sub(i,c)));let u=Math.abs(this._dotProduct(h,this._sub(i,c)));u<.05*e?u=.05*e:u>.95*e&&(u=.95*e);const o=Math.max(_,u),a=this._leftPerp(h);let n=[];const p=[c[0]-h[0]*u*.5+a[0]*_*.5,c[1]-h[1]*u*.5+a[1]*_*.5];n.push([p[0],p[1]]),p[0]+=h[0]*o*.5+a[0]*o*.4,p[1]+=h[1]*o*.5+a[1]*o*.4,n.push([p[0],p[1]]),p[0]-=a[0]*o*.25,p[1]-=a[1]*o*.25,n.push([p[0],p[1]]),p[0]+=h[0]*o*.5+a[0]*o*.4,p[1]+=h[1]*o*.5+a[1]*o*.4,n.push([p[0],p[1]]),t.push(n),n=[],p[0]=c[0]-h[0]*u*.5-a[0]*_*.5,p[1]=c[1]-h[1]*u*.5-a[1]*_*.5,n.push([p[0],p[1]]),p[0]+=h[0]*o*.5-a[0]*o*.4,p[1]+=h[1]*o*.5-a[1]*o*.4,n.push([p[0],p[1]]),p[0]+=a[0]*o*.25,p[1]+=a[1]*o*.25,n.push([p[0],p[1]]),p[0]+=h[0]*o*.5-a[0]*o*.4,p[1]+=h[1]*o*.5-a[1]*o*.4,n.push([p[0],p[1]]),t.push(n);break}case e.LinkedChevrons:{const s=this._cp2(r,-5,0),i=this._cp3(r,s,-.2,1),h=this._sub(c,s);this._normalize(h);const e=this._leftPerp(h),_=Math.abs(this._crossProduct(h,this._sub(i,s)));t.push([s,c]);const u=[];u.push([c[0]-h[0]*_+e[0]*_,c[1]-h[1]*_+e[1]*_]),u.push(c),u.push([c[0]-h[0]*_-e[0]*_,c[1]-h[1]*_-e[1]*_]),t.push(u),this._addDash(t,s,[-h[0]*_+e[0]*_,-h[1]*_+e[1]*_]),this._addDash(t,s,[-h[0]*_-e[0]*_,-h[1]*_-e[1]*_]);break}case e.SegmentThenHalfCircle:{const s=this._cp2(r,2,0),i=this._cp3(r,s,1.5,0);let h;h=_>=4?r[3]:this._cp3(r,s,1.25,-.5);const e=this._sub(s,c);this._normalize(e);const u=.5*this._dist(s,i),o=this._crossProduct(e,this._sub(h,c))>0,a=Math.cos(Math.PI/18);let n=Math.sin(Math.PI/18);o&&(n=-n);const p=[c,s];e[0]*=u,e[1]*=u;const d=this._add(s,e);e[0]=-e[0],e[1]=-e[1];for(let t=1;t<=18;t++)this._rotateDirect(e,a,n),p.push(this._add(d,e));t.push(p);break}case e.LineWithStraightTicks:{const s=this._cp2(r,-2,1),i=this._cp3(r,s,-1,-.5),h=this._sub(i,s);this._normalize(h);const e=this._dotProduct(h,this._sub(s,c)),_=this._dotProduct(h,this._sub(i,c));let u=[c];u.push([c[0]+h[0]*e,c[1]+h[1]*e]),u.push(s),t.push(u),u=[c],u.push([c[0]+h[0]*_,c[1]+h[1]*_]),u.push(i),t.push(u);break}case e.DoubleCurve:{const s=this._cp2(r,-5,-1),i=this._cp3(r,s,2,0),e=Math.atan2(1,5),_=Math.cos(e),u=Math.sin(e),o=this._sub(s,c),a=this._dist(c,s);this._normalize(o),this._rotateDirect(o,_,-u);const n=[c];n.push([c[0]+o[0]*a*.5,c[1]+o[1]*a*.5]),h(n[1],1),n.push([c[0]+o[0]*a*.8,c[1]+o[1]*a*.8]),this._addBezier2(n,n[2],[c[0]+o[0]*a,c[1]+o[1]*a],s,3);const p=this._sub(i,s),d=this._dist(s,i);this._normalize(p),this._rotateDirect(p,_,-u),this._addBezier2(n,s,[i[0]-p[0]*d,i[1]-p[1]*d],[i[0]-p[0]*d*.8,i[1]-p[1]*d*.8],3),n.push(i),t.push(n);break}case e.ParallelWithTicksByWidth:{const s=this._cp2(r,0,-1),i=this._cp3(r,s,.5,3),h=this._sub(s,c);this._normalize(h);const e=this._crossProduct(h,this._sub(i,c));this._leftPerpendicular(h),e>0?(this._addAngledTicks(t,c,[c[0]+h[0]*e,c[1]+h[1]*e],s),this._addAngledTicks(t,s,[s[0]+h[0]*e,s[1]+h[1]*e],c)):(this._addAngledTicks(t,[c[0]+h[0]*e,c[1]+h[1]*e],c,s),this._addAngledTicks(t,[s[0]+h[0]*e,s[1]+h[1]*e],c,s));break}case e.EnclosingRoundedRectangle:{const s=this._cp2(r,3,-2),t=[Math.min(c[0],s[0]),Math.max(c[1],s[1])],i=[Math.max(c[0],s[0]),Math.min(c[1],s[1])],h=i[0]-t[0],e=t[1]-i[1],_=Math.min(h,e)/10,u=[];u.push([t[0]+_+.75*(h-2*_),t[1]]),u.push([i[0]-_,t[1]]),this._add90DegArc(u,[i[0]-_,t[1]],[i[0],t[1]-_],[i[0],t[1]]),u.push([i[0],i[1]+_]),this._add90DegArc(u,[i[0],i[1]+_],[i[0]-_,i[1]],i),u.push([t[0]+_,i[1]]),this._add90DegArc(u,[t[0]+_,i[1]],[t[0],i[1]+_],[t[0],i[1]]),u.push([t[0],t[1]-_]),this._add90DegArc(u,[t[0],t[1]-_],[t[0]+_,t[1]],t),u.push([t[0]+_+.75*(h-2*_),t[1]]);break}case e.FullGeometry:default:t.push(r)}}return t}}export{r as EffectControlMeasureLine};