@doegis/core
Version:
DOE GIS API
3 lines (1 loc) • 1.41 kB
JavaScript
import t from"../../../../core/PooledArray.js";import{create as e,copy as r,area as s,expand as n,contains as o,containsPoint as i}from"../../../../geometry/support/aaBoundingRect.js";import{noBudget as h}from"../../../support/Scheduler.js";const l=.05;class _{constructor(){this._extents=new t({allocator:t=>t||e()}),this._tmpExtent=e(),this._dirty=!1}get empty(){return 0===this._extents.length}get size(){return this._extents.length}clear(){this._extents.clear()}add(t){this._contains(t)||(this._removeContained(t),r(this._extents.pushNew(),t),this._dirty=!0)}pop(){return this._dirty&&this._mergeTight(),this._extents.pop()}merge(t){return this._mergeTight(t),t.hasProgressed}_mergeTight(t=h){const e=this._extents,o=new Set;let i=0;for(;i!==e.length;){e.sort(((t,e)=>t[0]-e[0])),i=e.length,o.clear();for(let i=0;i<e.length;++i){if(t.done)return;const h=e.getItemAt(i);if(h){for(let t=i+1;t<e.length;++t){const r=e.getItemAt(t);if(null==r||r[0]>=h[2])break;o.add(r)}o.forEach((i=>{if(h===i)return;if(i[2]<=h[0])return void o.delete(i);const _=s(h),a=s(i),c=this._tmpExtent;n(h,i,c);const g=_+a;(s(c)-g)/g<l&&(r(h,c),o.delete(i),e.remove(i),t.madeProgress())})),o.add(h)}}}this._dirty=!1}_contains(t){return this._extents.some((e=>o(e,t)))}_removeContained(t){this._extents.filterInPlace((e=>!o(t,e)))}get test(){const t=this;return{containsPoint:e=>t._extents.some((t=>i(t,e)))}}}export{_ as ExtentSet};