UNPKG

@arcgis/core

Version:

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

6 lines (5 loc) 1.9 kB
/* All material copyright ESRI, All Rights Reserved, unless otherwise specified. See https://js.arcgis.com/4.32/esri/copyright.txt for details. */ import{clamp as t}from"../../../../../core/mathUtils.js";import{StaticBitSet as s}from"../../../layers/features/support/StaticBitSet.js";const i=1,e=0,h=1,o=2;class r{constructor(t,e,h){this._width=t*h,this._height=e*h,this._pixelRatio=h;const o=Math.ceil(this._width/i),r=Math.ceil(this._height/i);this._cols=o,this._rows=r,this._cells=s.create(o*r)}insertMetrics(t){this._markMetrics(t)}hasCollision(t){let s=0;for(const{transformedX:i,transformedY:e,width:r,height:l}of t.bounds){const t=r*this._pixelRatio,a=l*this._pixelRatio,c=i*this._pixelRatio,_=e*this._pixelRatio;switch(this._collide(c,_,t,a)){case o:return o;case h:s++}}return s===t.bounds.length?h:e}getCellId(t,s){return t+s*this._cols}has(t){return this._cells.has(t)}hasRange(t,s){return this._cells.hasRange(t,s)}set(t){this._cells.set(t)}setRange(t,s){this._cells.setRange(t,s)}_collide(s,r,l,a){const c=s-l/2,_=r-a/2,n=c+l,f=_+a;if(n<0||f<0||c>this._width||_>this._height)return h;const d=t(Math.floor(c/i),0,this._cols),u=t(Math.floor(_/i),0,this._rows),p=t(Math.ceil(n/i),0,this._cols),g=t(Math.ceil(f/i),0,this._rows);for(let t=u;t<=g;t++)for(let s=d;s<=p;s++){const i=this.getCellId(s,t);if(this.has(i))return o}return e}_mark(s,e,h,o){const r=s-h/2,l=e-o/2,a=r+h,c=l+o,_=t(Math.floor(r/i),0,this._cols),n=t(Math.floor(l/i),0,this._rows),f=t(Math.ceil(a/i),0,this._cols),d=t(Math.ceil(c/i),0,this._rows);for(let t=n;t<=d;t++)for(let s=_;s<=f;s++){const i=this.getCellId(s,t);this.set(i)}return!1}_markMetrics(t){for(const{transformedX:s,transformedY:i,width:e,height:h}of t.bounds){const t=e*this._pixelRatio,o=h*this._pixelRatio,r=s*this._pixelRatio,l=i*this._pixelRatio;this._mark(r,l,t,o)}}}export{r as CollisionBitsetGrid,o as hasCollision,e as none,h as outsideExtent};