UNPKG

@arcgis/core

Version:

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

3 lines (2 loc) 2.47 kB
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.8/LICENSE.txt */ import{create as e}from"../../../../core/libs/gl-matrix-2/factories/vec3f64.js";import{Octree as n}from"./Octree.js";function t(e){const n={numNodes:0,numObjects:0,numTerminals:0,numResidents:0,numOutsiders:0,numInnerNodes:0,numTerminalNodes:0,maximumDepth:0,maxNumTerminals:0,maxNumResidents:0,maxNumObjects:0};return e.forEachNode((t,r,s)=>{null===t.residents?n.numInnerNodes++:n.numTerminalNodes++,n.numTerminals+=t.terminals.length,n.maxNumTerminals=Math.max(t.terminals.length,n.maxNumTerminals);let i=t.terminals.length;null!==t.residents&&(n.numResidents+=t.residents.length,n.maxNumResidents=Math.max(t.residents.length,n.maxNumResidents),i+=t.residents.length),n.maxNumObjects=Math.max(i,n.maxNumObjects);const m=Math.round(Math.log(2*e.halfSize/s)*Math.LOG2E);return n.maximumDepth=Math.max(n.maximumDepth,m),!0}),n.numObjects=n.numOutsiders+n.numTerminals+n.numResidents,n.numNodes=n.numInnerNodes+n.numTerminalNodes,n}function r(e,t=!1){const s=e instanceof n?e.root:e,i={};return e instanceof n&&t&&(i.center=e.bounds.center,i.size=2*e.halfSize),s.terminals.length>0&&(i.terminals=s.terminals.map(e=>e.id)),null!==s.residents&&s.residents.length>0&&(i.residents=s.residents.map(e=>e.id)),null===s.residents&&s.children.forEach((e,n)=>{e&&(i["child"+n]=r(e))}),i}function s(n,t){return n.forEachNode((r,s,a)=>{const o=m(s.center,-a,e()),l=m(s.center,a,e());if(r.terminals.forAll(e=>i(t(e),o,l,!0)),null!==r.residents){if(r.residents.length>n.maximumObjectsPerNode)throw new Error("[Octree Validation] Number of objects "+r.residents.length+" exceeds maximum allowed ("+n.maximumObjectsPerNode+")");r.residents.forAll(e=>i(t(e),o,l,!1))}let d=!1;if(r.children.forEach(e=>{if(e&&(d=!0,null!==r.residents))throw new Error("[Octree Validation] Node has residents and children")}),!d&&(null===r.residents||0===r.residents.length)&&0===r.terminals.length)throw new Error("[Octree Validation] dangling empty node");return!0}),!0}function i(e,n,t,r){for(let i=0;i<3;i++)if(e.center[i]<n[i]||e.center[i]>t[i])throw new Error("[Octree Validation] Object is not within node bounds");const s=.25*(t[0]-n[0]);if(r&&e.radius<s)throw new Error("[Octree Validation] Object is too small to be a terminal");if(!r&&e.radius>s)throw new Error("[Octree Validation] Object is too large to be a resident")}function m(e,n,t){return t[0]=e[0]+n,t[1]=e[1]+n,t[2]=e[2]+n,t}export{s as assert,r as debugDump,t as stats};