UNPKG

@arcgis/core

Version:

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

3 lines (2 loc) 2.29 kB
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.19/LICENSE.txt */ import{iterableSort as i}from"../../../../core/heapSort.js";import s from"../../../../core/PooledArray.js";import{intersects as t}from"../../../../geometry/support/aaBoundingRect.js";import{drawPoly as n,drawAccelerationStruct as c}from"./deconflictorDebug.js";class e{constructor(i,s,t){this._setVisibility=i,this._canConflict=s,this._compare=t,this.done=!1,this._items=new Array,this._accBinsNumX=15,this._accBinsNumY=20,this._accBinsSizeX=0,this._accBinsSizeY=0,this._accBins=null}destroy(){this._generator=null,this._accBins=null,this._items.length=0}reset(i,s){this._initBins(i,s),this._items.length=0,this.done=!1,this._generator=null}add(i){this._items.push(i)}run(i){this._generator??=this._run(i),this.done=!!this._generator.next(i).done}*_run(i){yield*this._sort(i),yield*this._deconflict(i),c(()=>({bins:this._accBins,numX:this._accBinsNumX,numY:this._accBinsNumY,sizeX:this._accBinsSizeX,sizeY:this._accBinsSizeY,numTests:0,numVisible:this._items.length}))}*_sort(s){for(const t of i(this._items,0,this._items.length,this._compare))s.madeProgress(),s.done&&(s=yield)}_isConflicted(i){let s=!0;return this._forEachBin(i.aabr,n=>(s=!1,n.some(s=>this._canConflict(s,i)&&t(s.aabr,i.aabr))))||s}*_deconflict(i){for(const s of this._items){i.done&&(i=yield);const t=!this._isConflicted(s);this._setVisibility(s,t),n(s.aabr,t),t&&this._addToBins(s),i.madeProgress()}}_initBins(i,t){if(null==this._accBins){this._accBins=[];for(let i=0;i<this._accBinsNumX;i++){this._accBins.push([]);const i=this._accBins[this._accBins.length-1];for(let t=0;t<this._accBinsNumY;t++)i.push(new s)}}else for(let s=0;s<this._accBinsNumX;s++)for(let i=0;i<this._accBinsNumY;i++)this._accBins[s][i].clear();this._accBinsSizeX=i/this._accBinsNumX,this._accBinsSizeY=t/this._accBinsNumY}_addToBins(i){this._forEachBin(i.aabr,s=>s.push(i))}_forEachBin(i,s){if(!this._accBins)return!1;const t=Math.max(Math.floor(i[0]/this._accBinsSizeX),0),n=Math.max(Math.floor(i[1]/this._accBinsSizeY),0),c=Math.min(Math.floor(i[2]/this._accBinsSizeX),this._accBinsNumX-1),e=Math.min(Math.floor(i[3]/this._accBinsSizeY),this._accBinsNumY-1);for(let h=t;h<=c;h++)for(let i=n;i<=e;i++)if(s(this._accBins[h][i]))return!0;return!1}}export{e as DeconflictAABR};