UNPKG

@doegis/core

Version:

DOE GIS API

3 lines (1 loc) 6.11 kB
import{Attribute as t}from"../webgl-engine/lib/Attribute.js";const n=1e-6,r=[0,0,0],i=[0,0,0];function o(n,o){const{data:s,size:a}=n,c=s.length/a;if(c<=0)return;const h=new J(n);Q(r,h.minProj,h.maxProj),U(r,r,.5),R(i,h.maxProj,h.minProj);const u=L(i),m=new K;m.quality=u,c<14&&(n=new t(new Float64Array(h.buffer,112,42),3));const f=[0,0,0],l=[0,0,0],j=[0,0,0],b=[0,0,0],x=[0,0,0],I=[0,0,0],N=[0,0,0];switch(e(h,n,N,f,l,j,b,x,I,m)){case 1:return void g(r,i,o);case 2:return void p(n,b,o)}P(n,N,f,l,j,b,x,I,m),O(n,m.b0,m.b1,m.b2,_,S);const V=[0,0,0];R(V,S,_),m.quality=L(V),m.quality<u?D(m.b0,m.b1,m.b2,_,S,V,o):g(r,i,o)}function e(t,r,i,o,e,s,a,c,h,u){if(j(t,o,e),tt(o,e)<n)return 1;R(a,o,e),Z(a,a);return x(r,o,a,s)<n?2:(R(c,e,s),Z(c,c),R(h,s,o),Z(h,h),X(i,c,a),Z(i,i),M(r,i,a,c,h,u),0)}const s=[0,0,0],a=[0,0,0],c=[0,0,0],h=[0,0,0],u=[0,0,0],m=[0,0,0],f=[0,0,0],l=[0,0,0];function P(t,n,r,i,o,e,P,j,b){N(t,n,r,s,a),void 0!==s[0]&&(R(c,s,r),Z(c,c),R(h,s,i),Z(h,h),R(u,s,o),Z(u,u),X(m,h,e),Z(m,m),X(f,u,P),Z(f,f),X(l,c,j),Z(l,l),M(t,m,e,h,c,b),M(t,f,P,u,h,b),M(t,l,j,c,u,b)),void 0!==a[0]&&(R(c,a,r),Z(c,c),R(h,a,i),Z(h,h),R(u,a,o),Z(u,u),X(m,h,e),Z(m,m),X(f,u,P),Z(f,f),X(l,c,j),Z(l,l),M(t,m,e,h,c,b),M(t,f,P,u,h,b),M(t,l,j,c,u,b))}function j(t,n,r){let i=tt(t.maxVert[0],t.minVert[0]),o=0;for(let e=1;e<7;++e){const n=tt(t.maxVert[e],t.minVert[e]);n>i&&(i=n,o=e)}W(n,t.minVert[o]),W(r,t.maxVert[o])}const b=[0,0,0];function x(t,n,r,i){const{data:o,size:e}=t;let s=Number.NEGATIVE_INFINITY,a=0;for(let c=0;c<o.length;c+=e){b[0]=o[c]-n[0],b[1]=o[c+1]-n[1],b[2]=o[c+2]-n[2];const t=r[0]*b[0]+r[1]*b[1]+r[2]*b[2],i=r[0]*r[0]+r[1]*r[1]+r[2]*r[2],e=b[0]*b[0]+b[1]*b[1]+b[2]*b[2]-t*t/i;e>s&&(s=e,a=c)}return W(i,o,a),s}const I=[0,0];function N(t,r,i,o,e){E(t,r,I,e,o);const s=nt(i,r);I[1]-n<=s&&(o[0]=void 0),I[0]+n>=s&&(e[0]=void 0)}const V=[0,0,0],y=[0,0,0],w=[0,0,0],q=[0,0,0],A=[0,0,0],d=[0,0,0];function M(t,r,i,o,e,s){if($(r)<n)return;X(V,i,r),X(y,o,r),X(w,e,r),T(t,r,I),A[1]=I[0],q[1]=I[1],d[1]=q[1]-A[1];const a=[i,o,e],c=[V,y,w];for(let n=0;n<3;++n){T(t,a[n],I),A[0]=I[0],q[0]=I[1],T(t,c[n],I),A[2]=I[0],q[2]=I[1],d[0]=q[0]-A[0],d[2]=q[2]-A[2];const i=L(d);i<s.quality&&(W(s.b0,a[n]),W(s.b1,r),W(s.b2,c[n]),s.quality=i)}}const F=[0,0,0];function T(t,n,r){const{data:i,size:o}=t;r[0]=Number.POSITIVE_INFINITY,r[1]=Number.NEGATIVE_INFINITY;for(let e=0;e<i.length;e+=o){const t=i[e]*n[0]+i[e+1]*n[1]+i[e+2]*n[2];r[0]=Math.min(r[0],t),r[1]=Math.max(r[1],t)}}function E(t,n,r,i,o){const{data:e,size:s}=t;W(i,e),W(o,i),r[0]=nt(F,n),r[1]=r[0];for(let a=s;a<e.length;a+=s){const t=e[a]*n[0]+e[a+1]*n[1]+e[a+2]*n[2];t<r[0]&&(r[0]=t,W(i,e,a)),t>r[1]&&(r[1]=t,W(o,e,a))}}function g(t,n,r){W(r.center,t),U(r.halfSize,n,.5),r.quaternion[0]=0,r.quaternion[1]=0,r.quaternion[2]=0,r.quaternion[3]=1}const z=[0,0,0],v=[0,0,0],Y=[0,0,0],_=[0,0,0],S=[0,0,0],G=[0,0,0];function p(t,r,i){W(z,r),Math.abs(r[0])>Math.abs(r[1])&&Math.abs(r[0])>Math.abs(r[2])?z[0]=0:Math.abs(r[1])>Math.abs(r[2])?z[1]=0:z[2]=0,$(z)<n&&(z[0]=z[1]=z[2]=1),X(v,r,z),Z(v,v),X(Y,r,v),Z(Y,Y),O(t,r,v,Y,_,S),R(G,S,_),D(r,v,Y,_,S,G,i)}function O(t,n,r,i,o,e){T(t,n,I),o[0]=I[0],e[0]=I[1],T(t,r,I),o[1]=I[0],e[1]=I[1],T(t,i,I),o[2]=I[0],e[2]=I[1]}const B=[0,0,0],k=[1,0,0,0,1,0,0,0,1],C=[0,0,0];function D(t,n,r,i,o,e,s){k[0]=t[0],k[1]=t[1],k[2]=t[2],k[3]=n[0],k[4]=n[1],k[5]=n[2],k[6]=r[0],k[7]=r[1],k[8]=r[2],rt(s.quaternion,k),Q(C,i,o),U(C,C,.5),U(s.center,t,C[0]),U(B,n,C[1]),Q(s.center,s.center,B),U(B,r,C[2]),Q(s.center,s.center,B),U(s.halfSize,e,.5)}const H=7;class J{constructor(t){this.minVert=new Array(H),this.maxVert=new Array(H);const n=64*H;this.buffer=new ArrayBuffer(n);let r=0;this.minProj=new Float64Array(this.buffer,r,H),r+=8*H,this.maxProj=new Float64Array(this.buffer,r,H),r+=8*H;for(let a=0;a<H;++a)this.minVert[a]=new Float64Array(this.buffer,r,3),r+=24;for(let a=0;a<H;++a)this.maxVert[a]=new Float64Array(this.buffer,r,3),r+=24;for(let a=0;a<H;++a)this.minProj[a]=Number.POSITIVE_INFINITY,this.maxProj[a]=Number.NEGATIVE_INFINITY;const i=new Array(H),o=new Array(H),{data:e,size:s}=t;for(let a=0;a<e.length;a+=s){let t=e[a];t<this.minProj[0]&&(this.minProj[0]=t,i[0]=a),t>this.maxProj[0]&&(this.maxProj[0]=t,o[0]=a),t=e[a+1],t<this.minProj[1]&&(this.minProj[1]=t,i[1]=a),t>this.maxProj[1]&&(this.maxProj[1]=t,o[1]=a),t=e[a+2],t<this.minProj[2]&&(this.minProj[2]=t,i[2]=a),t>this.maxProj[2]&&(this.maxProj[2]=t,o[2]=a),t=e[a]+e[a+1]+e[a+2],t<this.minProj[3]&&(this.minProj[3]=t,i[3]=a),t>this.maxProj[3]&&(this.maxProj[3]=t,o[3]=a),t=e[a]+e[a+1]-e[a+2],t<this.minProj[4]&&(this.minProj[4]=t,i[4]=a),t>this.maxProj[4]&&(this.maxProj[4]=t,o[4]=a),t=e[a]-e[a+1]+e[a+2],t<this.minProj[5]&&(this.minProj[5]=t,i[5]=a),t>this.maxProj[5]&&(this.maxProj[5]=t,o[5]=a),t=e[a]-e[a+1]-e[a+2],t<this.minProj[6]&&(this.minProj[6]=t,i[6]=a),t>this.maxProj[6]&&(this.maxProj[6]=t,o[6]=a)}for(let a=0;a<H;++a){let t=i[a];W(this.minVert[a],e,t),t=o[a],W(this.maxVert[a],e,t)}}}class K{constructor(){this.b0=[1,0,0],this.b1=[0,1,0],this.b2=[0,0,1],this.quality=0}}function L(t){return t[0]*t[1]+t[0]*t[2]+t[1]*t[2]}function Q(t,n,r){t[0]=n[0]+r[0],t[1]=n[1]+r[1],t[2]=n[2]+r[2]}function R(t,n,r){t[0]=n[0]-r[0],t[1]=n[1]-r[1],t[2]=n[2]-r[2]}function U(t,n,r){t[0]=n[0]*r,t[1]=n[1]*r,t[2]=n[2]*r}function W(t,n,r=0){t[0]=n[r+0],t[1]=n[r+1],t[2]=n[r+2]}function X(t,n,r){const i=n[0],o=n[1],e=n[2],s=r[0],a=r[1],c=r[2];t[0]=o*c-e*a,t[1]=e*s-i*c,t[2]=i*a-o*s}function Z(t,n){const r=n[0]*n[0]+n[1]*n[1]+n[2]*n[2];if(r>0){const i=1/Math.sqrt(r);t[0]=n[0]*i,t[1]=n[1]*i,t[2]=n[2]*i}}function $(t){return t[0]*t[0]+t[1]*t[1]+t[2]*t[2]}function tt(t,n){const r=n[0]-t[0],i=n[1]-t[1],o=n[2]-t[2];return r*r+i*i+o*o}function nt(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]}function rt(t,n){const r=n[0]+n[4]+n[8];if(r>0){let i=Math.sqrt(r+1);t[3]=.5*i,i=.5/i,t[0]=(n[5]-n[7])*i,t[1]=(n[6]-n[2])*i,t[2]=(n[1]-n[3])*i}else{let r=0;n[4]>n[0]&&(r=1),n[8]>n[3*r+r]&&(r=2);const i=(r+1)%3,o=(r+2)%3;let e=Math.sqrt(n[3*r+r]-n[3*i+i]-n[3*o+o]+1);t[r]=.5*e,e=.5/e,t[3]=(n[3*i+o]-n[3*o+i])*e,t[i]=(n[3*i+r]+n[3*r+i])*e,t[o]=(n[3*o+r]+n[3*r+o])*e}}export{o as computeOBB};