@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
6 lines (5 loc) • 3.41 kB
JavaScript
/*
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 t}from"../../../geometry/GeometryCursor.js";import{GeometricEffectWaveform as e}from"../enums.js";import{DashPattern as i,GeometryWalker as s,Pos as h}from"../GeometryWalker.js";class n{static{this.instance=null}static local(){return null===n.instance&&(n.instance=new n),n.instance}execute(t,e,i,s,h){return new r(t,e,i)}}class r{constructor(t,e,h){this._inputGeometries=t,this._height=(void 0!==e.amplitude?e.amplitude:2)*h,this._period=(void 0!==e.period?e.period:3)*h,this._style=e.waveform,this._height<=0&&(this._height=Math.abs(this._height)),this._period<=0&&(this._period=Math.abs(this._period)),this._pattern=new i,this._pattern.addValue(this._period),this._pattern.addValue(this._period),this._walker=new s,this._walker.updateTolerance(h)}next(){let t=this._inputGeometries.next();for(;t;){if(0===this._height||0===this._period)return t;const e=this._processGeom(t);if(e)return e;t=this._inputGeometries.next()}return null}_processGeom(i){const s=t.createEmptyOptimizedCIM(i.geometryType);for(;i.nextPath();){s.startPath();const t=i.pathLength();if(this._walker.init(i,this._pattern))switch(this._style){case e.Sinus:default:this._constructCurve(s,t,!1);break;case e.Square:this._constructSquare(s,t);break;case e.Triangle:this._constructTriangle(s,t);break;case e.Random:this._constructCurve(s,t,!0)}else for(;i.nextPoint();)s.pushXY(i.x,i.y)}return s}_constructCurve(t,e,i){let s=Math.round(e/this._period);0===s&&(s=1);const n=s*16+1,r=e/s,a=this._period/16,o=1/n,p=2*Math.PI*e/r,_=2*Math.PI*Math.random(),u=2*Math.PI*Math.random(),c=2*Math.PI*Math.random(),l=.75-Math.random()/2,d=.75-Math.random()/2,g=new h;this._walker.curPointAndAngle(g),t.pushPoint(g.pt);let w=0;for(;;){if(!this._walker.nextPointAndAngle(a,g)){t.pushPoint(this._walker.getPathEnd());break}{const e=w;let s;if(w+=o,i){const t=this._height/2*(1+.3*Math.sin(l*p*e+_));s=t*Math.sin(p*e+u),s+=t*Math.sin(d*p*e+c),s/=2}else s=.5*this._height*Math.sin(.5*p*e);t.pushXY(g.pt[0]-s*g.sa,g.pt[1]+s*g.ca)}}}_constructSquare(t,e){Math.round(e/this._period);let i=!0;for(;;){let e=!1;if(this._walker.curPositionIsValid()){const s=new h;this._walker.curPointAndAngle(s);const n=new h;if(this._walker.nextPointAndAngle(this._period,n)){const r=new h;this._walker.nextPointAndAngle(this._period,r)&&(i?(t.pushPoint(s.pt),i=!1):t.pushPoint(s.pt),t.pushXY(s.pt[0]-this._height/2*s.sa,s.pt[1]+this._height/2*s.ca),t.pushXY(n.pt[0]-this._height/2*n.sa,n.pt[1]+this._height/2*n.ca),t.pushXY(n.pt[0]+this._height/2*n.sa,n.pt[1]-this._height/2*n.ca),t.pushXY(r.pt[0]+this._height/2*r.sa,r.pt[1]-this._height/2*r.ca),e=!0)}}if(!e){t.pushPoint(this._walker.getPathEnd());break}}}_constructTriangle(t,e){Math.round(e/this._period);let i=!0;for(;;){let e=!1;if(this._walker.curPositionIsValid()){const s=new h;this._walker.curPointAndAngle(s);const n=new h;if(this._walker.nextPointAndAngle(this._period/2,n)){const r=new h;this._walker.nextPointAndAngle(this._period,r)&&(this._walker.nextPosition(this._period/2)&&(i?(t.pushPoint(s.pt),i=!1):t.pushPoint(s.pt),t.pushXY(n.pt[0]-this._height/2*n.sa,n.pt[1]+this._height/2*n.ca),t.pushXY(r.pt[0]+this._height/2*r.sa,r.pt[1]-this._height/2*r.ca)),e=!0)}}if(!e){t.pushPoint(this._walker.getPathEnd());break}}}}export{n as EffectWave};