@doegis/core
Version:
DOE GIS API
3 lines (1 loc) • 3.52 kB
JavaScript
import{isPolyline as t,isPolygon as e}from"../../../geometry/support/jsonUtils.js";import{PathHelper as i}from"../CurveHelper.js";import{GeometricEffectWaveform as s}from"../enums.js";import{DashPattern as h,GeometryWalker as n,Pos as r}from"../GeometryWalker.js";class a{static local(){return null===a.instance&&(a.instance=new a),a.instance}execute(t,e,i,s,h){return new o(t,e,i)}}a.instance=null;class o{constructor(t,e,i){this._inputGeometries=t,this._height=(void 0!==e.amplitude?e.amplitude:2)*i,this._period=(void 0!==e.period?e.period:3)*i,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 h,this._pattern.addValue(this._period),this._pattern.addValue(this._period),this._walker=new n,this._walker.updateTolerance(i)}next(){let i=this._inputGeometries.next();for(;i;){if(0===this._height||0===this._period)return i;if(t(i)){const t=this._processGeom(i.paths);if(t.length)return{paths:t}}if(e(i)){const t=this._processGeom(i.rings);if(t.length)return{rings:t}}i=this._inputGeometries.next()}return null}_processGeom(t){const e=[];for(const i of t)if(this._walker.init(i,this._pattern))switch(this._style){case s.Sinus:default:e.push(this._constructCurve(i,!1));break;case s.Square:e.push(this._constructSquare(i));break;case s.Triangle:e.push(this._constructTriangle(i));break;case s.Random:e.push(this._constructCurve(i,!0))}else e.push(i);return e}_constructCurve(t,e){const s=new i,h=this._walker.calculatePathLength(t);let n=Math.round(h/this._period);0===n&&(n=1);const a=n*16+1,o=h/n,l=this._period/16,_=1/a,c=2*Math.PI*h/o,p=2*Math.PI*Math.random(),u=2*Math.PI*Math.random(),d=2*Math.PI*Math.random(),g=.75-Math.random()/2,w=.75-Math.random()/2,f=new r;this._walker.curPointAndAngle(f),s.startPath(f.pt);let k=0;for(;;){if(!this._walker.nextPointAndAngle(l,f)){s.lineTo(t[t.length-1]);break}{const t=k;let i;if(k+=_,e){const e=this._height/2*(1+.3*Math.sin(g*c*t+p));i=e*Math.sin(c*t+u),i+=e*Math.sin(w*c*t+d),i/=2}else i=.5*this._height*Math.sin(.5*c*t);s.lineTo([f.pt[0]-i*f.sa,f.pt[1]+i*f.ca])}}return s.path()}_constructSquare(t){const e=new i,s=this._walker.calculatePathLength(t);Math.round(s/this._period);let h=!0;for(;;){let t=!1;if(this._walker.curPositionIsValid()){const i=new r;this._walker.curPointAndAngle(i);const s=new r;if(this._walker.nextPointAndAngle(this._period,s)){const n=new r;this._walker.nextPointAndAngle(this._period,n)&&(h?(e.startPath(i.pt),h=!1):e.lineTo(i.pt),e.lineTo([i.pt[0]-this._height/2*i.sa,i.pt[1]+this._height/2*i.ca]),e.lineTo([s.pt[0]-this._height/2*s.sa,s.pt[1]+this._height/2*s.ca]),e.lineTo([s.pt[0]+this._height/2*s.sa,s.pt[1]-this._height/2*s.ca]),e.lineTo([n.pt[0]+this._height/2*n.sa,n.pt[1]-this._height/2*n.ca]),t=!0)}}if(!t){e.lineTo(this._walker.getPathEnd());break}}return e.path()}_constructTriangle(t){const e=new i,s=this._walker.calculatePathLength(t);Math.round(s/this._period);let h=!0;for(;;){let t=!1;if(this._walker.curPositionIsValid()){const i=new r;this._walker.curPointAndAngle(i);const s=new r;if(this._walker.nextPointAndAngle(this._period/2,s)){const n=new r;this._walker.nextPointAndAngle(this._period,n)&&(this._walker.nextPosition(this._period/2)&&(h?(e.startPath(i.pt),h=!1):e.lineTo(i.pt),e.lineTo([s.pt[0]-this._height/2*s.sa,s.pt[1]+this._height/2*s.ca]),e.lineTo([n.pt[0]+this._height/2*n.sa,n.pt[1]-this._height/2*n.ca])),t=!0)}}if(!t){e.lineTo(this._walker.getPathEnd());break}}return e.path()}}export{a as EffectWave};