@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
3 lines (2 loc) • 2.12 kB
JavaScript
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.19/LICENSE.txt */
import{PathTransformationCursor as t}from"../CIMCursor.js";import{CurveHelper as e}from"../CurveHelper.js";const n=.001;class i{static{this.instance=null}static local(){return null===i.instance&&(i.instance=new i),i.instance}execute(t,e,n){return new s(t,e,n)}}class s extends t{constructor(t,i,s){super(t),this._curveHelper=new e,this._angleToLine=void 0===i.angleToLine||i.angleToLine,this._keepUpright=i.keepUpright??!1,this._offset=void 0!==i.offset?i.offset*s:0,this._relativeTo=i.relativeTo??"LineMiddle",this._position=void 0!==i.startPointOffset?i.startPointOffset*s:0,this._epsilon=n*s}processPath(t){const e=this._position;if("SegmentMidpoint"===this._relativeTo){if(this.iteratePath||(this.iteratePath=!0),t.nextPoint()){let[e,n]=[t.x,t.y],[i,s]=[0,0];const r=[0,0];for(;t.nextPoint();){i=t.x,s=t.y;const o=this._curveHelper.getLength(e,n,i,s);if(o<this._epsilon){e=i,n=s;continue}const a=.5+this._position/o,[l,h]=this._curveHelper.getAngleCS(r,e,n,i,s,a),c=this._curveHelper.getCoord2D(e,n,i,s,a);return this.internalPlacement.setTranslate(c[0]-this._offset*h,c[1]+this._offset*l),this._angleToLine&&this.internalPlacement.setRotateCS(l,h),this.internalPlacement}}return this.iteratePath=!1,null}const n="LineEnd"===this._relativeTo;return this.onLine(t,e,n)}onLine(t,e,n){let i,s=!1;switch(this._relativeTo){case"LineMiddle":default:t.seekPathStart(),i=t.pathLength()/2+e;break;case"LineBeginning":i=e;break;case"LineEnd":i=e,s=!0}n?t.seekPathEnd():t.seekPathStart();let r=0;if(n?t.prevPoint():t.nextPoint()){let[e,o]=[t.x,t.y],[a,l]=[0,0];const h=[0,0];for(;n?t.prevPoint():t.nextPoint();){a=t.x,l=t.y;const n=this._curveHelper.getLength(e,o,a,l);if(r+n>i){const t=(i-r)/n,[c,f]=this._curveHelper.getAngleCS(h,e,o,a,l,t),p=this._curveHelper.getCoord2D(e,o,a,l,t),u=s?-this._offset:this._offset;return this.internalPlacement.setTranslate(p[0]-u*f,p[1]+u*c),this._angleToLine&&(s?this.internalPlacement.setRotateCS(-c,-f):this.internalPlacement.setRotateCS(c,f)),this.internalPlacement}e=a,o=l,r+=n}}return null}}export{i as PlacementOnLine};