UNPKG

@arcgis/core

Version:

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

6 lines (5 loc) 2.25 kB
/* All material copyright ESRI, All Rights Reserved, unless otherwise specified. See https://js.arcgis.com/4.32/esri/copyright.txt for details. */ import{lerp as t,clamp as e}from"../../../core/mathUtils.js";import{getMetersPerUnitForSR as i}from"../../../core/unitUtils.js";import{d as r,n as s,f as n,l as a}from"../../../chunks/vec32.js";import{create as m}from"../../../core/libs/gl-matrix-2/factories/vec3f64.js";import{getReferenceEllipsoid as o}from"../../../geometry/ellipsoidUtils.js";import h from"../../../geometry/Extent.js";import{ViewingMode as l}from"../../ViewingMode.js";import{computeInnerAltitudeFade as x}from"../environment/atmosphereUtils.js";function c(t,e,i){return t===l.Global?new M(i):new u(e,i)}class u{constructor(t,e){this._elevationProvider=t,this._referenceEllipsoid=o(e),this._unitInMeters=i(e,this._referenceEllipsoid.metersPerDegree)}compute(i,a,m,o,l){l||(l={near:0,far:0});let x=i[2]*this._unitInMeters;const c=x,u=x-o,M=this._elevationProvider?.visibleElevationBounds;M&&(x=u>=0?c-this._unitInMeters*M.min:this._unitInMeters*M.max-c);const p={x:(m=null!=m?m:new h({xmin:0,ymin:0,zmin:0,xmax:0,ymax:0,zmax:0})).xmax-m.xmin,y:m.ymax-m.ymin,z:4*Math.max(m.xmax-m.xmin,m.ymax-m.ymin)},_=Math.max(p.x,p.y,p.z);r(g,a,i),j[0]=g[0]>0?m.xmax:m.xmin,j[1]=g[1]>0?m.ymax:m.ymin,j[2]=g[2]>0?_/2:-_/2,r(j,j,i),s(g,g);const y=1.1*n(j,g)*this._unitInMeters,v=Math.sqrt(x*(x+2*this._referenceEllipsoid.radius)),b=Math.max(m.xmax-m.xmin,m.ymax-m.ymin),w=b*E*this._unitInMeters,z=b*I*this._unitInMeters,U=e((x-z)/(w-z),0,1)**3,P=Math.min(t(v,y,U),v)*Math.max(Math.log(Math.abs(u)),1);return f(Math.min(P,Math.max(34064e4,_))/this._unitInMeters,d,this._unitInMeters,l)}}class M{constructor(t){this._referenceEllipsoid=o(t)}compute(i,r,s,n,m){m||(m={near:0,far:0});const o=a(i),h=o-this._referenceEllipsoid.radius,l=this._referenceEllipsoid.radius+Math.min(0,n),c=Math.abs(h-n),u=Math.max(c,Math.abs(h)),M=Math.sqrt(u*(u+2*l)),v=o+this._referenceEllipsoid.radius,E=1.2*t(M,v,x(u)),I=(Math.log(u)-p)/(_-p);return f(E,e(d-I*(d-y),y,d),1,m)}}function f(t,e,i,r){const s=v/i,n=t/e;return n>s?(r.far=t,r.near=n):(r.near=s,r.far=r.near*e),r}const p=7.983,_=16.994,d=2e4,y=100,v=2,E=.001,I=1e-4,j=m(),g=m();export{c as createNearFarHeuristic};