rm-graphical-computing-node 1.0.7 → 1.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.mjs +1 -1
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var vs=Object.create;var mo=Object.defineProperty;var Hs=Object.getOwnPropertyDescriptor;var Bs=Object.getOwnPropertyNames;var _s=Object.getPrototypeOf,ks=Object.prototype.hasOwnProperty;var Ce=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Cs=(e,t,n,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Bs(t))!ks.call(e,o)&&o!==n&&mo(e,o,{get:()=>t[o],enumerable:!(s=Hs(t,o))||s.enumerable});return e};var Ds=(e,t,n)=>(n=e!=null?vs(_s(e)):{},Cs(t||!e||!e.__esModule?mo(n,"default",{value:e,enumerable:!0}):n,e));var jo=Ce((Qn,to)=>{(function(e,t){typeof Qn=="object"&&typeof to<"u"?to.exports=t():typeof define=="function"&&define.amd?define(t):(e=e||self,e.RBush=t())})(Qn,function(){"use strict";function e(h,p,E,w,R){t(h,p,E||0,w||h.length-1,R||s)}function t(h,p,E,w,R){for(;w>E;){if(w-E>600){var b=w-E+1,S=p-E+1,z=Math.log(b),V=.5*Math.exp(2*z/3),M=.5*Math.sqrt(z*V*(b-V)/b)*(S-b/2<0?-1:1),v=Math.max(E,Math.floor(p-S*V/b+M)),B=Math.min(w,Math.floor(p+(b-S)*V/b+M));t(h,p,v,B,R)}var I=h[p],_=E,k=w;for(n(h,E,p),R(h[w],I)>0&&n(h,E,w);_<k;){for(n(h,_,k),_++,k--;R(h[_],I)<0;)_++;for(;R(h[k],I)>0;)k--}R(h[E],I)===0?n(h,E,k):(k++,n(h,k,w)),k<=p&&(E=k+1),p<=k&&(w=k-1)}}function n(h,p,E){var w=h[p];h[p]=h[E],h[E]=w}function s(h,p){return h<p?-1:h>p?1:0}var o=function(p){p===void 0&&(p=9),this._maxEntries=Math.max(4,p),this._minEntries=Math.max(2,Math.ceil(this._maxEntries*.4)),this.clear()};o.prototype.all=function(){return this._all(this.data,[])},o.prototype.search=function(p){var E=this.data,w=[];if(!T(p,E))return w;for(var R=this.toBBox,b=[];E;){for(var S=0;S<E.children.length;S++){var z=E.children[S],V=E.leaf?R(z):z;T(p,V)&&(E.leaf?w.push(z):y(p,V)?this._all(z,w):b.push(z))}E=b.pop()}return w},o.prototype.collides=function(p){var E=this.data;if(!T(p,E))return!1;for(var w=[];E;){for(var R=0;R<E.children.length;R++){var b=E.children[R],S=E.leaf?this.toBBox(b):b;if(T(p,S)){if(E.leaf||y(p,S))return!0;w.push(b)}}E=w.pop()}return!1},o.prototype.load=function(p){if(!(p&&p.length))return this;if(p.length<this._minEntries){for(var E=0;E<p.length;E++)this.insert(p[E]);return this}var w=this._build(p.slice(),0,p.length-1,0);if(!this.data.children.length)this.data=w;else if(this.data.height===w.height)this._splitRoot(this.data,w);else{if(this.data.height<w.height){var R=this.data;this.data=w,w=R}this._insert(w,this.data.height-w.height-1,!0)}return this},o.prototype.insert=function(p){return p&&this._insert(p,this.data.height-1),this},o.prototype.clear=function(){return this.data=P([]),this},o.prototype.remove=function(p,E){if(!p)return this;for(var w=this.data,R=this.toBBox(p),b=[],S=[],z,V,M;w||b.length;){if(w||(w=b.pop(),V=b[b.length-1],z=S.pop(),M=!0),w.leaf){var v=r(p,w.children,E);if(v!==-1)return w.children.splice(v,1),b.push(w),this._condense(b),this}!M&&!w.leaf&&y(w,R)?(b.push(w),S.push(z),z=0,V=w,w=w.children[0]):V?(z++,w=V.children[z],M=!1):w=null}return this},o.prototype.toBBox=function(p){return p},o.prototype.compareMinX=function(p,E){return p.minX-E.minX},o.prototype.compareMinY=function(p,E){return p.minY-E.minY},o.prototype.toJSON=function(){return this.data},o.prototype.fromJSON=function(p){return this.data=p,this},o.prototype._all=function(p,E){for(var w=[];p;)p.leaf?E.push.apply(E,p.children):w.push.apply(w,p.children),p=w.pop();return E},o.prototype._build=function(p,E,w,R){var b=w-E+1,S=this._maxEntries,z;if(b<=S)return z=P(p.slice(E,w+1)),i(z,this.toBBox),z;R||(R=Math.ceil(Math.log(b)/Math.log(S)),S=Math.ceil(b/Math.pow(S,R-1))),z=P([]),z.leaf=!1,z.height=R;var V=Math.ceil(b/S),M=V*Math.ceil(Math.sqrt(S));x(p,E,w,M,this.compareMinX);for(var v=E;v<=w;v+=M){var B=Math.min(v+M-1,w);x(p,v,B,V,this.compareMinY);for(var I=v;I<=B;I+=V){var _=Math.min(I+V-1,B);z.children.push(this._build(p,I,_,R-1))}}return i(z,this.toBBox),z},o.prototype._chooseSubtree=function(p,E,w,R){for(;R.push(E),!(E.leaf||R.length-1===w);){for(var b=1/0,S=1/0,z=void 0,V=0;V<E.children.length;V++){var M=E.children[V],v=a(M),B=m(p,M)-v;B<S?(S=B,b=v<b?v:b,z=M):B===S&&v<b&&(b=v,z=M)}E=z||E.children[0]}return E},o.prototype._insert=function(p,E,w){var R=w?p:this.toBBox(p),b=[],S=this._chooseSubtree(R,this.data,E,b);for(S.children.push(p),f(S,R);E>=0&&b[E].children.length>this._maxEntries;)this._split(b,E),E--;this._adjustParentBBoxes(R,b,E)},o.prototype._split=function(p,E){var w=p[E],R=w.children.length,b=this._minEntries;this._chooseSplitAxis(w,b,R);var S=this._chooseSplitIndex(w,b,R),z=P(w.children.splice(S,w.children.length-S));z.height=w.height,z.leaf=w.leaf,i(w,this.toBBox),i(z,this.toBBox),E?p[E-1].children.push(z):this._splitRoot(w,z)},o.prototype._splitRoot=function(p,E){this.data=P([p,E]),this.data.height=p.height+1,this.data.leaf=!1,i(this.data,this.toBBox)},o.prototype._chooseSplitIndex=function(p,E,w){for(var R,b=1/0,S=1/0,z=E;z<=w-E;z++){var V=l(p,0,z,this.toBBox),M=l(p,z,w,this.toBBox),v=d(V,M),B=a(V)+a(M);v<b?(b=v,R=z,S=B<S?B:S):v===b&&B<S&&(S=B,R=z)}return R||w-E},o.prototype._chooseSplitAxis=function(p,E,w){var R=p.leaf?this.compareMinX:u,b=p.leaf?this.compareMinY:g,S=this._allDistMargin(p,E,w,R),z=this._allDistMargin(p,E,w,b);S<z&&p.children.sort(R)},o.prototype._allDistMargin=function(p,E,w,R){p.children.sort(R);for(var b=this.toBBox,S=l(p,0,E,b),z=l(p,w-E,w,b),V=c(S)+c(z),M=E;M<w-E;M++){var v=p.children[M];f(S,p.leaf?b(v):v),V+=c(S)}for(var B=w-E-1;B>=E;B--){var I=p.children[B];f(z,p.leaf?b(I):I),V+=c(z)}return V},o.prototype._adjustParentBBoxes=function(p,E,w){for(var R=w;R>=0;R--)f(E[R],p)},o.prototype._condense=function(p){for(var E=p.length-1,w=void 0;E>=0;E--)p[E].children.length===0?E>0?(w=p[E-1].children,w.splice(w.indexOf(p[E]),1)):this.clear():i(p[E],this.toBBox)};function r(h,p,E){if(!E)return p.indexOf(h);for(var w=0;w<p.length;w++)if(E(h,p[w]))return w;return-1}function i(h,p){l(h,0,h.children.length,p,h)}function l(h,p,E,w,R){R||(R=P(null)),R.minX=1/0,R.minY=1/0,R.maxX=-1/0,R.maxY=-1/0;for(var b=p;b<E;b++){var S=h.children[b];f(R,h.leaf?w(S):S)}return R}function f(h,p){return h.minX=Math.min(h.minX,p.minX),h.minY=Math.min(h.minY,p.minY),h.maxX=Math.max(h.maxX,p.maxX),h.maxY=Math.max(h.maxY,p.maxY),h}function u(h,p){return h.minX-p.minX}function g(h,p){return h.minY-p.minY}function a(h){return(h.maxX-h.minX)*(h.maxY-h.minY)}function c(h){return h.maxX-h.minX+(h.maxY-h.minY)}function m(h,p){return(Math.max(p.maxX,h.maxX)-Math.min(p.minX,h.minX))*(Math.max(p.maxY,h.maxY)-Math.min(p.minY,h.minY))}function d(h,p){var E=Math.max(h.minX,p.minX),w=Math.max(h.minY,p.minY),R=Math.min(h.maxX,p.maxX),b=Math.min(h.maxY,p.maxY);return Math.max(0,R-E)*Math.max(0,b-w)}function y(h,p){return h.minX<=p.minX&&h.minY<=p.minY&&p.maxX<=h.maxX&&p.maxY<=h.maxY}function T(h,p){return p.minX<=h.maxX&&p.minY<=h.maxY&&p.maxX>=h.minX&&p.maxY>=h.minY}function P(h){return{children:h,height:1,leaf:!0,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0}}function x(h,p,E,w,R){for(var b=[p,E];b.length;)if(E=b.pop(),p=b.pop(),!(E-p<=w)){var S=p+Math.ceil((E-p)/w/2)*w;e(h,S,p,E,R),b.push(p,S,S,E)}}return o})});var $o=Ce((eo,no)=>{(function(e,t){typeof eo=="object"&&typeof no<"u"?no.exports=t():typeof define=="function"&&define.amd?define(t):(e=e||self,e.TinyQueue=t())})(eo,function(){"use strict";var e=function(s,o){if(s===void 0&&(s=[]),o===void 0&&(o=t),this.data=s,this.length=this.data.length,this.compare=o,this.length>0)for(var r=(this.length>>1)-1;r>=0;r--)this._down(r)};e.prototype.push=function(s){this.data.push(s),this.length++,this._up(this.length-1)},e.prototype.pop=function(){if(this.length!==0){var s=this.data[0],o=this.data.pop();return this.length--,this.length>0&&(this.data[0]=o,this._down(0)),s}},e.prototype.peek=function(){return this.data[0]},e.prototype._up=function(s){for(var o=this,r=o.data,i=o.compare,l=r[s];s>0;){var f=s-1>>1,u=r[f];if(i(l,u)>=0)break;r[s]=u,s=f}r[s]=l},e.prototype._down=function(s){for(var o=this,r=o.data,i=o.compare,l=this.length>>1,f=r[s];s<l;){var u=(s<<1)+1,g=r[u],a=u+1;if(a<this.length&&i(r[a],g)<0&&(u=a,g=r[a]),i(g,f)>=0)break;r[s]=g,s=u}r[s]=f};function t(n,s){return n<s?-1:n>s?1:0}return e})});var Yo=Ce((Mu,Xo)=>{Xo.exports=function(t,n,s,o){var r=t[0],i=t[1],l=!1;s===void 0&&(s=0),o===void 0&&(o=n.length);for(var f=(o-s)/2,u=0,g=f-1;u<f;g=u++){var a=n[s+u*2+0],c=n[s+u*2+1],m=n[s+g*2+0],d=n[s+g*2+1],y=c>i!=d>i&&r<(m-a)*(i-c)/(d-c)+a;y&&(l=!l)}return l}});var Zo=Ce((vu,Go)=>{Go.exports=function(t,n,s,o){var r=t[0],i=t[1],l=!1;s===void 0&&(s=0),o===void 0&&(o=n.length);for(var f=o-s,u=0,g=f-1;u<f;g=u++){var a=n[u+s][0],c=n[u+s][1],m=n[g+s][0],d=n[g+s][1],y=c>i!=d>i&&r<(m-a)*(i-c)/(d-c)+a;y&&(l=!l)}return l}});var Jo=Ce((Hu,Vn)=>{var Ko=Yo(),Uo=Zo();Vn.exports=function(t,n,s,o){return n.length>0&&Array.isArray(n[0])?Uo(t,n,s,o):Ko(t,n,s,o)};Vn.exports.nested=Uo;Vn.exports.flat=Ko});var ts=Ce((Mn,Qo)=>{(function(e,t){typeof Mn=="object"&&typeof Qo<"u"?t(Mn):typeof define=="function"&&define.amd?define(["exports"],t):t((e=e||self).predicates={})})(Mn,function(e){"use strict";let n=33306690738754706e-32;function s(m,d,y,T,P){let x,h,p,E,w=d[0],R=T[0],b=0,S=0;R>w==R>-w?(x=w,w=d[++b]):(x=R,R=T[++S]);let z=0;if(b<m&&S<y)for(R>w==R>-w?(p=x-((h=w+x)-w),w=d[++b]):(p=x-((h=R+x)-R),R=T[++S]),x=h,p!==0&&(P[z++]=p);b<m&&S<y;)R>w==R>-w?(p=x-((h=x+w)-(E=h-x))+(w-E),w=d[++b]):(p=x-((h=x+R)-(E=h-x))+(R-E),R=T[++S]),x=h,p!==0&&(P[z++]=p);for(;b<m;)p=x-((h=x+w)-(E=h-x))+(w-E),w=d[++b],x=h,p!==0&&(P[z++]=p);for(;S<y;)p=x-((h=x+R)-(E=h-x))+(R-E),R=T[++S],x=h,p!==0&&(P[z++]=p);return x===0&&z!==0||(P[z++]=x),z}function o(m){return new Float64Array(m)}let r=33306690738754716e-32,i=22204460492503146e-32,l=11093356479670487e-47,f=o(4),u=o(8),g=o(12),a=o(16),c=o(4);e.orient2d=function(m,d,y,T,P,x){let h=(d-x)*(y-P),p=(m-P)*(T-x),E=h-p;if(h===0||p===0||h>0!=p>0)return E;let w=Math.abs(h+p);return Math.abs(E)>=r*w?E:-(function(R,b,S,z,V,M,v){let B,I,_,k,C,H,F,W,Y,X,Q,U,lt,ot,ut,Z,et,q,K=R-V,Vt=S-V,Nt=b-M,$t=z-M;C=(ut=(W=K-(F=(H=134217729*K)-(H-K)))*(X=$t-(Y=(H=134217729*$t)-(H-$t)))-((ot=K*$t)-F*Y-W*Y-F*X))-(Q=ut-(et=(W=Nt-(F=(H=134217729*Nt)-(H-Nt)))*(X=Vt-(Y=(H=134217729*Vt)-(H-Vt)))-((Z=Nt*Vt)-F*Y-W*Y-F*X))),f[0]=ut-(Q+C)+(C-et),C=(lt=ot-((U=ot+Q)-(C=U-ot))+(Q-C))-(Q=lt-Z),f[1]=lt-(Q+C)+(C-Z),C=(q=U+Q)-U,f[2]=U-(q-C)+(Q-C),f[3]=q;let Gt=(function(Dt,_t){let J=_t[0];for(let ht=1;ht<Dt;ht++)J+=_t[ht];return J})(4,f),wt=i*v;if(Gt>=wt||-Gt>=wt||(B=R-(K+(C=R-K))+(C-V),_=S-(Vt+(C=S-Vt))+(C-V),I=b-(Nt+(C=b-Nt))+(C-M),k=z-($t+(C=z-$t))+(C-M),B===0&&I===0&&_===0&&k===0)||(wt=l*v+n*Math.abs(Gt),(Gt+=K*k+$t*B-(Nt*_+Vt*I))>=wt||-Gt>=wt))return Gt;C=(ut=(W=B-(F=(H=134217729*B)-(H-B)))*(X=$t-(Y=(H=134217729*$t)-(H-$t)))-((ot=B*$t)-F*Y-W*Y-F*X))-(Q=ut-(et=(W=I-(F=(H=134217729*I)-(H-I)))*(X=Vt-(Y=(H=134217729*Vt)-(H-Vt)))-((Z=I*Vt)-F*Y-W*Y-F*X))),c[0]=ut-(Q+C)+(C-et),C=(lt=ot-((U=ot+Q)-(C=U-ot))+(Q-C))-(Q=lt-Z),c[1]=lt-(Q+C)+(C-Z),C=(q=U+Q)-U,c[2]=U-(q-C)+(Q-C),c[3]=q;let At=s(4,f,4,c,u);C=(ut=(W=K-(F=(H=134217729*K)-(H-K)))*(X=k-(Y=(H=134217729*k)-(H-k)))-((ot=K*k)-F*Y-W*Y-F*X))-(Q=ut-(et=(W=Nt-(F=(H=134217729*Nt)-(H-Nt)))*(X=_-(Y=(H=134217729*_)-(H-_)))-((Z=Nt*_)-F*Y-W*Y-F*X))),c[0]=ut-(Q+C)+(C-et),C=(lt=ot-((U=ot+Q)-(C=U-ot))+(Q-C))-(Q=lt-Z),c[1]=lt-(Q+C)+(C-Z),C=(q=U+Q)-U,c[2]=U-(q-C)+(Q-C),c[3]=q;let Ft=s(At,u,4,c,g);C=(ut=(W=B-(F=(H=134217729*B)-(H-B)))*(X=k-(Y=(H=134217729*k)-(H-k)))-((ot=B*k)-F*Y-W*Y-F*X))-(Q=ut-(et=(W=I-(F=(H=134217729*I)-(H-I)))*(X=_-(Y=(H=134217729*_)-(H-_)))-((Z=I*_)-F*Y-W*Y-F*X))),c[0]=ut-(Q+C)+(C-et),C=(lt=ot-((U=ot+Q)-(C=U-ot))+(Q-C))-(Q=lt-Z),c[1]=lt-(Q+C)+(C-Z),C=(q=U+Q)-U,c[2]=U-(q-C)+(Q-C),c[3]=q;let Pt=s(Ft,g,4,c,a);return a[Pt-1]})(m,d,y,T,P,x,w)},e.orient2dfast=function(m,d,y,T,P,x){return(d-x)*(y-P)-(m-P)*(T-x)},Object.defineProperty(e,"__esModule",{value:!0})})});var is=Ce((Bu,io)=>{"use strict";var es=jo(),Hn=$o(),Ar=Jo(),Fr=ts().orient2d;Hn.default&&(Hn=Hn.default);io.exports=rs;io.exports.default=rs;function rs(e,t,n){t=Math.max(0,t===void 0?2:t),n=n||0;var s=jr(e),o=new es(16);o.toBBox=function(x){return{minX:x[0],minY:x[1],maxX:x[0],maxY:x[1]}},o.compareMinX=function(x,h){return x[0]-h[0]},o.compareMinY=function(x,h){return x[1]-h[1]},o.load(e);for(var r=[],i=0,l;i<s.length;i++){var f=s[i];o.remove(f),l=ss(f,l),r.push(l)}var u=new es(16);for(i=0;i<r.length;i++)u.insert(oo(r[i]));for(var g=t*t,a=n*n;r.length;){var c=r.shift(),m=c.p,d=c.next.p,y=so(m,d);if(!(y<a)){var T=y/g;f=Or(o,c.prev.p,m,d,c.next.next.p,T,u),f&&Math.min(so(f,m),so(f,d))<=T&&(r.push(c),r.push(ss(f,c)),o.remove(f),u.remove(c),u.insert(oo(c)),u.insert(oo(c.next)))}}c=l;var P=[];do P.push(c.p),c=c.next;while(c!==l);return P.push(c.p),P}function Or(e,t,n,s,o,r,i){for(var l=new Hn([],Nr),f=e.data;f;){for(var u=0;u<f.children.length;u++){var g=f.children[u],a=f.leaf?ro(g,n,s):qr(n,s,g);a>r||l.push({node:g,dist:a})}for(;l.length&&!l.peek().node.children;){var c=l.pop(),m=c.node,d=ro(m,t,n),y=ro(m,s,o);if(c.dist<d&&c.dist<y&&os(n,m,i)&&os(s,m,i))return m}f=l.pop(),f&&(f=f.node)}return null}function Nr(e,t){return e.dist-t.dist}function qr(e,t,n){if(ns(e,n)||ns(t,n))return 0;var s=vn(e[0],e[1],t[0],t[1],n.minX,n.minY,n.maxX,n.minY);if(s===0)return 0;var o=vn(e[0],e[1],t[0],t[1],n.minX,n.minY,n.minX,n.maxY);if(o===0)return 0;var r=vn(e[0],e[1],t[0],t[1],n.maxX,n.minY,n.maxX,n.maxY);if(r===0)return 0;var i=vn(e[0],e[1],t[0],t[1],n.minX,n.maxY,n.maxX,n.maxY);return i===0?0:Math.min(s,o,r,i)}function ns(e,t){return e[0]>=t.minX&&e[0]<=t.maxX&&e[1]>=t.minY&&e[1]<=t.maxY}function os(e,t,n){for(var s=Math.min(e[0],t[0]),o=Math.min(e[1],t[1]),r=Math.max(e[0],t[0]),i=Math.max(e[1],t[1]),l=n.search({minX:s,minY:o,maxX:r,maxY:i}),f=0;f<l.length;f++)if(Wr(l[f].p,l[f].next.p,e,t))return!1;return!0}function Ze(e,t,n){return Fr(e[0],e[1],t[0],t[1],n[0],n[1])}function Wr(e,t,n,s){return e!==s&&t!==n&&Ze(e,t,n)>0!=Ze(e,t,s)>0&&Ze(n,s,e)>0!=Ze(n,s,t)>0}function oo(e){var t=e.p,n=e.next.p;return e.minX=Math.min(t[0],n[0]),e.minY=Math.min(t[1],n[1]),e.maxX=Math.max(t[0],n[0]),e.maxY=Math.max(t[1],n[1]),e}function jr(e){for(var t=e[0],n=e[0],s=e[0],o=e[0],r=0;r<e.length;r++){var i=e[r];i[0]<t[0]&&(t=i),i[0]>s[0]&&(s=i),i[1]<n[1]&&(n=i),i[1]>o[1]&&(o=i)}var l=[t,n,s,o],f=l.slice();for(r=0;r<e.length;r++)Ar(e[r],l)||f.push(e[r]);return Xr(f)}function ss(e,t){var n={p:e,prev:null,next:null,minX:0,minY:0,maxX:0,maxY:0};return t?(n.next=t.next,n.prev=t,t.next.prev=n,t.next=n):(n.prev=n,n.next=n),n}function so(e,t){var n=e[0]-t[0],s=e[1]-t[1];return n*n+s*s}function ro(e,t,n){var s=t[0],o=t[1],r=n[0]-s,i=n[1]-o;if(r!==0||i!==0){var l=((e[0]-s)*r+(e[1]-o)*i)/(r*r+i*i);l>1?(s=n[0],o=n[1]):l>0&&(s+=r*l,o+=i*l)}return r=e[0]-s,i=e[1]-o,r*r+i*i}function vn(e,t,n,s,o,r,i,l){var f=n-e,u=s-t,g=i-o,a=l-r,c=e-o,m=t-r,d=f*f+u*u,y=f*g+u*a,T=g*g+a*a,P=f*c+u*m,x=g*c+a*m,h=d*T-y*y,p,E,w,R,b=h,S=h;h===0?(E=0,b=1,R=x,S=T):(E=y*x-T*P,R=d*x-y*P,E<0?(E=0,R=x,S=T):E>b&&(E=b,R=x+y,S=T)),R<0?(R=0,-P<0?E=0:-P>d?E=b:(E=-P,b=d)):R>S&&(R=S,-P+y<0?E=0:-P+y>d?E=b:(E=-P+y,b=d)),p=E===0?0:E/b,w=R===0?0:R/S;var z=(1-p)*e+p*n,V=(1-p)*t+p*s,M=(1-w)*o+w*i,v=(1-w)*r+w*l,B=M-z,I=v-V;return B*B+I*I}function $r(e,t){return e[0]===t[0]?e[1]-t[1]:e[0]-t[0]}function Xr(e){e.sort($r);for(var t=[],n=0;n<e.length;n++){for(;t.length>=2&&Ze(t[t.length-2],t[t.length-1],e[n])<=0;)t.pop();t.push(e[n])}for(var s=[],o=e.length-1;o>=0;o--){for(;s.length>=2&&Ze(s[s.length-2],s[s.length-1],e[o])<=0;)s.pop();s.push(e[o])}return s.pop(),t.pop(),t.concat(s)}});import*as Ie from"three";import*as De from"three";var Bt=class e{constructor(t=0,n=0,s=0){this.x=t,this.y=n,this.z=s}set(t,n,s){return this.x=t,this.y=n,this.z=s,this}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}clone(){return new e(this.x,this.y,this.z)}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this}subVectors(t,n){return this.x=t.x-n.x,this.y=t.y-n.y,this.z=t.z-n.z,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}crossVectors(t,n){let s=t.x,o=t.y,r=t.z,i=n.x,l=n.y,f=n.z;return this.x=o*f-r*l,this.y=r*i-s*f,this.z=s*l-o*i,this}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.lengthSq())}normalize(){let t=this.length();return t>0&&(this.x/=t,this.y/=t,this.z/=t),this}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){let n=this.x-t.x,s=this.y-t.y,o=this.z-t.z;return n*n+s*s+o*o}toArray(){return[this.x,this.y,this.z]}fromArray(t,n=0){return this.x=t[n],this.y=t[n+1],this.z=t[n+2],this}applyAxisAngle(t,n){let s=this.x,o=this.y,r=this.z,i=t.x,l=t.y,f=t.z,u=Math.cos(n),g=Math.sin(n),a=i*s+l*o+f*r;return this.x=i*a*(1-u)+s*u+(-f*o+l*r)*g,this.y=l*a*(1-u)+o*u+(f*s-i*r)*g,this.z=f*a*(1-u)+r*u+(-l*s+i*o)*g,this}},dn=class{constructor(t=new Bt(1,0,0),n=0){this.normal=t,this.constant=n}set(t,n){return this.normal.copy(t),this.constant=n,this}setFromNormalAndCoplanarPoint(t,n){return this.normal.copy(t),this.constant=-n.dot(this.normal),this}setFromCoplanarPoints(t,n,s){let o=new Bt().subVectors(n,t),r=new Bt().subVectors(s,t),i=new Bt().crossVectors(o,r).normalize();return this.normal.copy(i),this.constant=-t.dot(this.normal),this}distanceToPoint(t){return this.normal.dot(t)+this.constant}projectPoint(t,n=new Bt){let s=this.distanceToPoint(t);return n.copy(t),n.x-=this.normal.x*s,n.y-=this.normal.y*s,n.z-=this.normal.z*s,n}},hn=()=>typeof performance<"u"&&performance.now?performance.now():Date.now(),An=class{constructor(){this.results=null,this.clusterResults=null}initLimits1(t,n){let s,o;return t<.3?s=5:t<.5?s=8:t<.8?s=10:t<1?s=15:t<2?s=30:t<3?s=35:t<4?s=40:t<5?s=45:t<6?s=50:t<7?s=60:t<8.5?s=70:t<10?s=80:t<15?s=100:t<20?s=120:t<25?s=140:t<30?s=160:t<35?s=180:t<40?s=200:t<45?s=230:t<50?s=250:s=350,n<1?o=30:n<2?o=40:n<2.5?o=45:n<3?o=60:n<3.6?o=70:o=80,{horizontalSubdivisions:s,verticalSubdivisions:o}}initLimits2(t,n){let r=Math.round(Math.max(5,Math.min(350,t/.08))),i=Math.round(Math.max(30,Math.min(80,n/.06)));return{horizontalSubdivisions:r,verticalSubdivisions:i}}initLimits3(t,n){let s;t<2?s=.06:t<10?s=.1:s=.15;let o=Math.round(Math.max(5,Math.min(350,t/s))),r=Math.round(Math.max(30,Math.min(80,n/.06)));return{horizontalSubdivisions:o,verticalSubdivisions:r}}initLimits4(t,n){let s=Math.round(Math.max(5,Math.min(350,20*Math.sqrt(t)))),o=Math.round(Math.max(30,Math.min(80,20*Math.sqrt(n))));return{horizontalSubdivisions:s,verticalSubdivisions:o}}createSubdividedWallPlane(t,n,s,o=null){let r=[];if(!t||!t.start||!t.end||isNaN(t.rooftopPz))return r;let i=new Bt(t.start.x,t.start.y,t.start.z),l=new Bt(t.end.x,t.end.y,t.end.z),f=new Bt(t.end.x,t.end.y,t.rooftopPz),u=new Bt(t.start.x,t.start.y,t.rooftopPz),g=[i,l,f,u];for(let R=0;R<g.length;R++)if(!this.isValidVector3(g[R]))return console.error(`\u5899\u4F53\u57FA\u7840\u70B9${R}\u65E0\u6548:`,g[R]),r;let a=i.distanceTo(l),c=Math.abs(t.rooftopPz-t.start.z);if(a===0||c===0)return console.error("\u5899\u4F53\u5BBD\u5EA6\u6216\u9AD8\u5EA6\u4E3A0"),console.log("line.rooftopPz",t.rooftopPz),console.log("bottomLeft",i),console.log("bottomRight",l),console.log(t.length),r;let m=a/s,d=c/n,y=new Bt().subVectors(l,i).normalize(),T=i.x,P=i.y,x=i.z,h=y.x,p=y.y,E=y.z,w=(R,b)=>new Bt(T+h*R,P+p*R,x+E*R+b);for(let R=0;R<n;R++){let b=R*d,S=(R+1)*d;for(let z=0;z<s;z++){let V=z*m,M=(z+1)*m;r.push({points:[w(V,b),w(M,b),w(M,S),w(V,S)],userData:{type:"wallSegment",row:R,col:z,width:m,height:d}})}}return r}analyzePointDistribution(t,n,s=.01,o={}){let r=o.projectPlane||null;this.results={totalSegments:0,segmentsWithPoints:0,segmentsWithoutPoints:0,missingSegments:[],existSegments:[],pointsInSegments:new Map,segmentsByPoint:new Map,segmentDetails:new Map,tolerance:s,analysisTime:null};let i=hn(),l=[],f=new Map,u=1/0,g=-1/0,a=1/0,c=-1/0;for(let V=0;V<t.length;V++){let M=t[V];if(M.userData&&M.userData.type==="wallSegment"){let v=this.getWorldVerticesNew(M.points);if(v.length<4)continue;let B=new Bt().add(v[0]).add(v[1]).add(v[2]).add(v[3]).multiplyScalar(.25);M.userData.center=B,M.vertices=v;let I=M.userData.row,_=M.userData.col,k=`row${I}_col${_}`;l.push(M),f.set(k,M),I<u&&(u=I),I>g&&(g=I),_<a&&(a=_),_>c&&(c=_)}}if(this.results.totalSegments=l.length,l.length===0)return this.results.analysisTime=hn()-i,this.printAnalysisResults(),this.results;let m=`row${u}_col${a}`,d=f.get(m)||l[0];if(!d||!d.vertices||d.vertices.length<4)return this.results.analysisTime=hn()-i,this.printAnalysisResults(),this.results;let y=d.vertices[0],T=d.vertices[1],P=d.vertices[3],x=new Bt().subVectors(T,y).normalize(),h=new Bt().subVectors(P,y).normalize(),p=d.userData.width,E=d.userData.height,w=g-u+1,R=c-a+1,b=new dn;b.setFromCoplanarPoints(y,T,P);let S=new Bt,z=new Bt;for(let V=0;V<n.length;V+=3){let M=new Bt(n[V],n[V+1],n[V+2]),v=r?r.projectPoint(M,z):M;if(Math.abs(b.distanceToPoint(v))>s)continue;S.subVectors(v,y);let I=S.dot(x),_=S.dot(h),k=Math.ceil((I-s)/p-1),C=Math.floor((I+s)/p),H=Math.ceil((_-s)/E-1),F=Math.floor((_+s)/E);if(C<0||k>R-1||F<0||H>w-1)continue;let W=Math.max(0,k),Y=Math.min(R-1,C),X=Math.max(0,H),Q=Math.min(w-1,F);for(let U=X;U<=Q;U++){let lt=u+U;for(let ot=W;ot<=Y;ot++){let ut=a+ot,Z=`row${lt}_col${ut}`;f.has(Z)&&(this.results.pointsInSegments.has(Z)||this.results.pointsInSegments.set(Z,[V]))}}}for(let V of l){let M=`row${V.userData.row}_col${V.userData.col}`,v=this.results.pointsInSegments.has(M)?this.results.pointsInSegments.get(M).length:0,B=v>=1,I={row:V.userData.row,col:V.userData.col,width:V.userData.width,height:V.userData.height,segmentKey:M,vertices:V.vertices,center:V.userData.center,mesh:V,pointCount:v,hasPointsButNotEnough:v>0&&v<1};B?(this.results.segmentsWithPoints++,this.results.existSegments.push(I)):(this.results.segmentsWithoutPoints++,this.results.missingSegments.push(I))}return this.results.analysisTime=hn()-i,this.printAnalysisResults(),this.results}isPointInWallSegmentOptimized(t,n,s,o,r,i,l,f,u,g,a){if(Math.abs(s.distanceToPoint(t))>a)return!1;let m=new Bt().subVectors(t,n),d=Math.abs(m.dot(r)),y=Math.abs(m.dot(i));if(d>u&&y>g)return!1;let T=new Bt().subVectors(t,o),P=T.dot(r),x=T.dot(i),h=P>=-a&&P<=l+a,p=x>=-a&&x<=f+a;return h&&p}getWorldVerticesNew(t){return t}highlightEmptySegments(t,n=null,s=null,o=1){if(!this.results)return console.warn("\u8BF7\u5148\u8FD0\u884C\u5206\u6790\u51FD\u6570"),null;let r=new Map,i=new Map;for(let u of this.results.missingSegments)r.set(u.segmentKey,u),i.has(u.row)||i.set(u.row,new Map),i.get(u.row).set(u.col,{segmentKey:u.segmentKey,isEmpty:!0,visited:!1});for(let u of t)if(u.userData&&u.userData.type==="wallSegment"){let g=`row${u.userData.row}_col${u.userData.col}`,a=r.has(g);i.has(u.userData.row)||i.set(u.userData.row,new Map),i.get(u.userData.row).has(u.userData.col)||i.get(u.userData.row).set(u.userData.col,{segmentKey:g,isEmpty:a,visited:!1})}let l=[],f=[[0,1],[1,0],[0,-1],[-1,0]];for(let[u,g]of r){let a=i.get(g.row)?.get(g.col);if(a&&!a.visited){let c=[],m=[[g.row,g.col]],d=0;for(a.visited=!0;d<m.length;){let y=m[d++],T=y[0],P=y[1],x=`row${T}_col${P}`;r.has(x)&&c.push(r.get(x));for(let h of f){let p=T+h[0],E=P+h[1];if(i.has(p)&&i.get(p).has(E)){let w=i.get(p).get(E);!w.visited&&w.isEmpty&&(w.visited=!0,m.push([p,E]))}}}c.length>=o&&l.push(c)}}return this.clusterResults={clusters:l.sort((u,g)=>g.length-u.length),totalClusters:l.length},this.clusterResults}getClusterInfo(){if(!this.clusterResults)return null;let t=this.clusterResults.clusters.map(n=>n.length);return{totalClusters:this.clusterResults.totalClusters,clusterSizes:this.clusterResults.clusters.map((n,s)=>({clusterIndex:s,size:n.length,segments:n.map(o=>o.segmentKey)})),largestCluster:t.length?Math.max(...t):0,smallestCluster:t.length?Math.min(...t):0}}printAnalysisResults(){if(!this.results){console.warn("\u6CA1\u6709\u53EF\u7528\u7684\u5206\u6790\u7ED3\u679C");return}}isValidVector3(t){return t&&!isNaN(t.x)&&!isNaN(t.y)&&!isNaN(t.z)&&isFinite(t.x)&&isFinite(t.y)&&isFinite(t.z)}},po=(e,t)=>{let n={},s=[],o=[];if(!e||e.length===0)return n.originalVertices=s,n.allCenterPoints=o,n;if(t=="xyz")for(let r of e){o.push({x:r.center.x,y:r.center.y,z:r.center.z});let i=[];for(let l=0;l<r.vertices.length;l++)i.push({x:r.vertices[l].x,y:r.vertices[l].y,z:r.vertices[l].z});s.push(i)}else if(t=="three")for(let r of e){o.push(new De.Vector3(r.center.x,r.center.y,r.center.z));let i=[];for(let l=0;l<r.vertices.length;l++)i.push(new De.Vector3(r.vertices[l].x,r.vertices[l].y,r.vertices[l].z));s.push(i)}else if(t=="array")for(let r of e){o.push(r.center.x),o.push(r.center.y),o.push(r.center.z);let i=[];for(let l=0;l<r.vertices.length;l++)i.push(r.vertices[l].x,r.vertices[l].y,r.vertices[l].z);s.push(i)}return n.originalVertices=s,n.allCenterPoints=o,n},Is=(e,t)=>{let n=new Bt().copy(e.start).add(e.end).multiplyScalar(.5),s=new Bt().subVectors(new Bt(n.x,n.y,n.z+1),n).normalize(),o=new Bt(e.direction.x,e.direction.y,0);o.applyAxisAngle(s,Math.PI/2);let r=new Bt().copy(n).add(o.clone().multiplyScalar(e.length)),i=new Bt().copy(n).sub(o.clone().multiplyScalar(e.length));if(n.z=e.start.z,r.z=e.start.z,i.z=e.start.z,t=="three")return{start:new De.Vector3(r.x,r.y,r.z),end:new De.Vector3(i.x,i.y,i.z),center:new De.Vector3(n.x,n.y,n.z),direction:new De.Vector3(o.x,o.y,o.z)};if(t=="xyz")return{start:{x:r.x,y:r.y,z:r.z},end:{x:i.x,y:i.y,z:i.z},center:{x:n.x,y:n.y,z:n.z},direction:{x:o.x,y:o.y,z:o.z}};if(t=="array")return{start:[r.x,r.y,r.z],end:[i.x,i.y,i.z],center:[n.x,n.y,n.z],direction:[o.x,o.y,o.z]}},go=async(e,t=!0,n="three")=>{for(let s=0;s<e.length;s++){let o=e[s];await Fn(o,t,n)}},Fn=(e,t=!0,n="three")=>{if((e.isBayWindow||e.isWindow||e.isBalconyRailing)&&t)return;let s=new dn().setFromCoplanarPoints(new Bt(e.start.x,e.start.y,e.start.z),new Bt(e.end.x,e.end.y,e.end.z),new Bt(e.start.x,e.start.y,e.rooftopPz)),o=new Bt(e.start.x,e.start.y,e.start.z).distanceTo(new Bt(e.end.x,e.end.y,e.end.z)),r=Math.abs(e.rooftopPz-e.start.z),i=new An,{horizontalSubdivisions:l,verticalSubdivisions:f}=i.initLimits4(o,r),u=i.createSubdividedWallPlane(e,f,l,null);i.analyzePointDistribution(u,e.originalPoints,.01,{projectPlane:s});let g=i.highlightEmptySegments(u,null,null),a=[];if(g&&g.clusters)for(let d of g.clusters){let y=po(d,n);y&&a.push(y)}let m=Is(e,n).direction;if(e.checkResults=a,e.verticalDirection=m,e.saveExistSegments){let d=[],y=po(i.results.existSegments,n);y&&d.push(y),e.existSegments=d}};var Ct=class e{constructor(t=0,n=0,s=0){this.x=t,this.y=n,this.z=s}set(t,n,s){return this.x=t,this.y=n,this.z=s,this}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}clone(){return new e(this.x,this.y,this.z)}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this}subVectors(t,n){return this.x=t.x-n.x,this.y=t.y-n.y,this.z=t.z-n.z,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}crossVectors(t,n){let s=t.x,o=t.y,r=t.z,i=n.x,l=n.y,f=n.z;return this.x=o*f-r*l,this.y=r*i-s*f,this.z=s*l-o*i,this}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.lengthSq())}normalize(){let t=this.length();return t>0&&(this.x/=t,this.y/=t,this.z/=t),this}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){let n=this.x-t.x,s=this.y-t.y,o=this.z-t.z;return n*n+s*s+o*o}toArray(){return[this.x,this.y,this.z]}fromArray(t,n=0){return this.x=t[n],this.y=t[n+1],this.z=t[n+2],this}applyAxisAngle(t,n){let s=this.x,o=this.y,r=this.z,i=t.x,l=t.y,f=t.z,u=Math.cos(n),g=Math.sin(n),a=i*s+l*o+f*r;return this.x=i*a*(1-u)+s*u+(-f*o+l*r)*g,this.y=l*a*(1-u)+o*u+(f*s-i*r)*g,this.z=f*a*(1-u)+r*u+(-l*s+i*o)*g,this}},pn=class{constructor(t=new Ct(1,0,0),n=0){this.normal=t,this.constant=n}set(t,n){return this.normal.copy(t),this.constant=n,this}setFromNormalAndCoplanarPoint(t,n){return this.normal.copy(t),this.constant=-n.dot(this.normal),this}setFromCoplanarPoints(t,n,s){let o=new Ct().subVectors(n,t),r=new Ct().subVectors(s,t),i=new Ct().crossVectors(o,r).normalize();return this.normal.copy(i),this.constant=-t.dot(this.normal),this}distanceToPoint(t){return this.normal.dot(t)+this.constant}projectPoint(t,n=new Ct){let s=this.distanceToPoint(t);return n.copy(t),n.x-=this.normal.x*s,n.y-=this.normal.y*s,n.z-=this.normal.z*s,n}},mn=()=>typeof performance<"u"&&performance.now?performance.now():Date.now(),On=class{constructor(){this.results=null,this.clusterResults=null}initLimits1(t,n){let s,o;return t<.3?s=5:t<.5?s=8:t<.8?s=10:t<1?s=15:t<2?s=30:t<3?s=35:t<4?s=40:t<5?s=45:t<6?s=50:t<7?s=60:t<8.5?s=70:t<10?s=80:t<15?s=100:t<20?s=120:t<25?s=140:t<30?s=160:t<35?s=180:t<40?s=200:t<45?s=230:t<50?s=250:s=350,n<1?o=30:n<2?o=40:n<2.5?o=45:n<3?o=60:n<3.6?o=70:o=80,{horizontalSubdivisions:s,verticalSubdivisions:o}}initLimits2(t,n){let r=Math.round(Math.max(5,Math.min(350,t/.08))),i=Math.round(Math.max(30,Math.min(80,n/.06)));return{horizontalSubdivisions:r,verticalSubdivisions:i}}initLimits3(t,n){let s;t<2?s=.06:t<10?s=.1:s=.15;let o=Math.round(Math.max(5,Math.min(350,t/s))),r=Math.round(Math.max(30,Math.min(80,n/.06)));return{horizontalSubdivisions:o,verticalSubdivisions:r}}initLimits4(t,n){let s=Math.round(Math.max(5,Math.min(350,20*Math.sqrt(t)))),o=Math.round(Math.max(30,Math.min(80,20*Math.sqrt(n))));return{horizontalSubdivisions:s,verticalSubdivisions:o}}createSubdividedWallPlane(t,n,s,o=null){let r=[];if(!t||!t.start||!t.end||isNaN(t.rooftopPz))return r;let i=new Ct(t.start.x,t.start.y,t.start.z),l=new Ct(t.end.x,t.end.y,t.end.z),f=new Ct(t.end.x,t.end.y,t.rooftopPz),u=new Ct(t.start.x,t.start.y,t.rooftopPz),g=[i,l,f,u];for(let R=0;R<g.length;R++)if(!this.isValidVector3(g[R]))return console.error(`\u5899\u4F53\u57FA\u7840\u70B9${R}\u65E0\u6548:`,g[R]),r;let a=i.distanceTo(l),c=Math.abs(t.rooftopPz-t.start.z);if(a===0||c===0)return console.error("\u5899\u4F53\u5BBD\u5EA6\u6216\u9AD8\u5EA6\u4E3A0"),console.log("line.rooftopPz",t.rooftopPz),console.log("bottomLeft",i),console.log("bottomRight",l),console.log(t.length),r;let m=a/s,d=c/n,y=new Ct().subVectors(l,i).normalize(),T=i.x,P=i.y,x=i.z,h=y.x,p=y.y,E=y.z,w=(R,b)=>new Ct(T+h*R,P+p*R,x+E*R+b);for(let R=0;R<n;R++){let b=R*d,S=(R+1)*d;for(let z=0;z<s;z++){let V=z*m,M=(z+1)*m;r.push({points:[w(V,b),w(M,b),w(M,S),w(V,S)],userData:{type:"wallSegment",row:R,col:z,width:m,height:d}})}}return r}analyzePointDistribution(t,n,s=.01,o={}){let r=o.projectPlane||null;this.results={totalSegments:0,segmentsWithPoints:0,segmentsWithoutPoints:0,missingSegments:[],existSegments:[],pointsInSegments:new Map,segmentsByPoint:new Map,segmentDetails:new Map,tolerance:s,analysisTime:null};let i=mn(),l=[],f=new Map,u=1/0,g=-1/0,a=1/0,c=-1/0;for(let V=0;V<t.length;V++){let M=t[V];if(M.userData&&M.userData.type==="wallSegment"){let v=this.getWorldVerticesNew(M.points);if(v.length<4)continue;let B=new Ct().add(v[0]).add(v[1]).add(v[2]).add(v[3]).multiplyScalar(.25);M.userData.center=B,M.vertices=v;let I=M.userData.row,_=M.userData.col,k=`row${I}_col${_}`;l.push(M),f.set(k,M),I<u&&(u=I),I>g&&(g=I),_<a&&(a=_),_>c&&(c=_)}}if(this.results.totalSegments=l.length,l.length===0)return this.results.analysisTime=mn()-i,this.printAnalysisResults(),this.results;let m=`row${u}_col${a}`,d=f.get(m)||l[0];if(!d||!d.vertices||d.vertices.length<4)return this.results.analysisTime=mn()-i,this.printAnalysisResults(),this.results;let y=d.vertices[0],T=d.vertices[1],P=d.vertices[3],x=new Ct().subVectors(T,y).normalize(),h=new Ct().subVectors(P,y).normalize(),p=d.userData.width,E=d.userData.height,w=g-u+1,R=c-a+1,b=new pn;b.setFromCoplanarPoints(y,T,P);let S=new Ct,z=new Ct;for(let V=0;V<n.length;V++){let M=n[V],v=r?r.projectPoint(M,z):M;if(Math.abs(b.distanceToPoint(v))>s)continue;S.subVectors(v,y);let I=S.dot(x),_=S.dot(h),k=Math.ceil((I-s)/p-1),C=Math.floor((I+s)/p),H=Math.ceil((_-s)/E-1),F=Math.floor((_+s)/E);if(C<0||k>R-1||F<0||H>w-1)continue;let W=Math.max(0,k),Y=Math.min(R-1,C),X=Math.max(0,H),Q=Math.min(w-1,F);for(let U=X;U<=Q;U++){let lt=u+U;for(let ot=W;ot<=Y;ot++){let ut=a+ot,Z=`row${lt}_col${ut}`;f.has(Z)&&(this.results.pointsInSegments.has(Z)||this.results.pointsInSegments.set(Z,[V]))}}}for(let V of l){let M=`row${V.userData.row}_col${V.userData.col}`,v=this.results.pointsInSegments.has(M)?this.results.pointsInSegments.get(M).length:0,B=v>=1,I={row:V.userData.row,col:V.userData.col,width:V.userData.width,height:V.userData.height,segmentKey:M,vertices:V.vertices,center:V.userData.center,mesh:V,pointCount:v,hasPointsButNotEnough:v>0&&v<1};B?(this.results.segmentsWithPoints++,this.results.existSegments.push(I)):(this.results.segmentsWithoutPoints++,this.results.missingSegments.push(I))}return this.results.analysisTime=mn()-i,this.printAnalysisResults(),this.results}isPointInWallSegmentOptimized(t,n,s,o,r,i,l,f,u,g,a){if(Math.abs(s.distanceToPoint(t))>a)return!1;let m=new Ct().subVectors(t,n),d=Math.abs(m.dot(r)),y=Math.abs(m.dot(i));if(d>u&&y>g)return!1;let T=new Ct().subVectors(t,o),P=T.dot(r),x=T.dot(i),h=P>=-a&&P<=l+a,p=x>=-a&&x<=f+a;return h&&p}getWorldVerticesNew(t){return t}highlightEmptySegments(t,n=null,s=null,o=1){if(!this.results)return console.warn("\u8BF7\u5148\u8FD0\u884C\u5206\u6790\u51FD\u6570"),null;let r=new Map,i=new Map;for(let u of this.results.missingSegments)r.set(u.segmentKey,u),i.has(u.row)||i.set(u.row,new Map),i.get(u.row).set(u.col,{segmentKey:u.segmentKey,isEmpty:!0,visited:!1});for(let u of t)if(u.userData&&u.userData.type==="wallSegment"){let g=`row${u.userData.row}_col${u.userData.col}`,a=r.has(g);i.has(u.userData.row)||i.set(u.userData.row,new Map),i.get(u.userData.row).has(u.userData.col)||i.get(u.userData.row).set(u.userData.col,{segmentKey:g,isEmpty:a,visited:!1})}let l=[],f=[[0,1],[1,0],[0,-1],[-1,0]];for(let[u,g]of r){let a=i.get(g.row)?.get(g.col);if(a&&!a.visited){let c=[],m=[[g.row,g.col]],d=0;for(a.visited=!0;d<m.length;){let y=m[d++],T=y[0],P=y[1],x=`row${T}_col${P}`;r.has(x)&&c.push(r.get(x));for(let h of f){let p=T+h[0],E=P+h[1];if(i.has(p)&&i.get(p).has(E)){let w=i.get(p).get(E);!w.visited&&w.isEmpty&&(w.visited=!0,m.push([p,E]))}}}c.length>=o&&l.push(c)}}return this.clusterResults={clusters:l.sort((u,g)=>g.length-u.length),totalClusters:l.length},this.clusterResults}getClusterInfo(){if(!this.clusterResults)return null;let t=this.clusterResults.clusters.map(n=>n.length);return{totalClusters:this.clusterResults.totalClusters,clusterSizes:this.clusterResults.clusters.map((n,s)=>({clusterIndex:s,size:n.length,segments:n.map(o=>o.segmentKey)})),largestCluster:t.length?Math.max(...t):0,smallestCluster:t.length?Math.min(...t):0}}printAnalysisResults(){if(!this.results){console.warn("\u6CA1\u6709\u53EF\u7528\u7684\u5206\u6790\u7ED3\u679C");return}}isValidVector3(t){return t&&!isNaN(t.x)&&!isNaN(t.y)&&!isNaN(t.z)&&isFinite(t.x)&&isFinite(t.y)&&isFinite(t.z)}},yo=(e,t)=>{let n={},s=[],o=[];if(!e||e.length===0)return n.originalVertices=s,n.allCenterPoints=o,n;if(t=="xyz")for(let r of e){o.push({x:r.center.x,y:r.center.y,z:r.center.z});let i=[];for(let l=0;l<r.vertices.length;l++)i.push({x:r.vertices[l].x,y:r.vertices[l].y,z:r.vertices[l].z});s.push(i)}else if(t=="three")for(let r of e){o.push(new Ie.Vector3(r.center.x,r.center.y,r.center.z));let i=[];for(let l=0;l<r.vertices.length;l++)i.push(new Ie.Vector3(r.vertices[l].x,r.vertices[l].y,r.vertices[l].z));s.push(i)}else if(t=="array")for(let r of e){o.push(r.center.x),o.push(r.center.y),o.push(r.center.z);let i=[];for(let l=0;l<r.vertices.length;l++)i.push(r.vertices[l].x,r.vertices[l].y,r.vertices[l].z);s.push(i)}return n.originalVertices=s,n.allCenterPoints=o,n},Ls=(e,t)=>{let n=new Ct().copy(e.start).add(e.end).multiplyScalar(.5),s=new Ct().subVectors(new Ct(n.x,n.y,n.z+1),n).normalize(),o=new Ct(e.direction.x,e.direction.y,0);o.applyAxisAngle(s,Math.PI/2);let r=new Ct().copy(n).add(o.clone().multiplyScalar(e.length)),i=new Ct().copy(n).sub(o.clone().multiplyScalar(e.length));if(n.z=e.start.z,r.z=e.start.z,i.z=e.start.z,t=="three")return{start:new Ie.Vector3(r.x,r.y,r.z),end:new Ie.Vector3(i.x,i.y,i.z),center:new Ie.Vector3(n.x,n.y,n.z),direction:new Ie.Vector3(o.x,o.y,o.z)};if(t=="xyz")return{start:{x:r.x,y:r.y,z:r.z},end:{x:i.x,y:i.y,z:i.z},center:{x:n.x,y:n.y,z:n.z},direction:{x:o.x,y:o.y,z:o.z}};if(t=="array")return{start:[r.x,r.y,r.z],end:[i.x,i.y,i.z],center:[n.x,n.y,n.z],direction:[o.x,o.y,o.z]}},As=async(e,t=!0,n="three",s="xyz")=>{s=="xyz"?await Eo(e,t,n):s=="array"&&await Fn(e,t,n)},Fs=async(e,t=!0,n="three",s="xyz")=>{s=="xyz"?await Os(e,t,n):s=="array"&&await go(e,t,n)},Os=async(e,t=!0,n="three")=>{for(let s=0;s<e.length;s++){let o=e[s];await Eo(o,t,n)}},Eo=(e,t=!0,n="three")=>{if((e.isBayWindow||e.isWindow||e.isBalconyRailing)&&t)return;let s=new pn().setFromCoplanarPoints(new Ct(e.start.x,e.start.y,e.start.z),new Ct(e.end.x,e.end.y,e.end.z),new Ct(e.start.x,e.start.y,e.rooftopPz)),o=new Ct(e.start.x,e.start.y,e.start.z).distanceTo(new Ct(e.end.x,e.end.y,e.end.z)),r=Math.abs(e.rooftopPz-e.start.z),i=new On,{horizontalSubdivisions:l,verticalSubdivisions:f}=i.initLimits4(o,r),u=i.createSubdividedWallPlane(e,f,l,null);i.analyzePointDistribution(u,e.originalPoints,.01,{projectPlane:s});let g=i.highlightEmptySegments(u,null,null),a=[];if(g&&g.clusters)for(let d of g.clusters){let y=yo(d,n);y&&a.push(y)}let m=Ls(e,n).direction;if(e.checkResults=a,e.verticalDirection=m,e.saveExistSegments){let d=[],y=yo(i.results.existSegments,n);y&&d.push(y),e.existSegments=d}};import*as D from"three";import"three/examples/jsm/utils/BufferGeometryUtils.js";import*as O from"three";import{CSS2DObject as Ni}from"three/examples/jsm/renderers/CSS2DRenderer.js";import"three/examples/jsm/utils/BufferGeometryUtils.js";import*as ct from"fs";import we from"path";import{fileURLToPath as Ws}from"url";import gn from"path";import{fileURLToPath as Ns}from"url";import{Vector3 as Hi}from"three";var qs=Ns(import.meta.url),Nn=gn.dirname(qs),Bi=gn.resolve(Nn,"./data/lines.meta.json"),_i=gn.resolve(Nn,"./data/lines.bin"),ki=gn.resolve(Nn,"./data/checks.bin");function qn(e,t){let n=e.length*4*3+t.length*3,s=Buffer.alloc(n*4),o=new Float32Array(s.buffer,s.byteOffset),r=0;for(let i of e)for(let l of i)o[r++]=l.x,o[r++]=l.y,o[r++]=l.z;for(let i of t)o[r++]=i.x,o[r++]=i.y,o[r++]=i.z;return s}var js=Ws(import.meta.url),Ve=we.dirname(js),tn=we.resolve(Ve,"./data/lines.tmp.bin"),en=we.resolve(Ve,"./data/checks.tmp.bin"),nn=we.resolve(Ve,"./data/lines.new_points.tmp.bin"),yn=we.resolve(Ve,"./data/lines.new_points.bin"),Ai=we.resolve(Ve,"./data/lines.meta.json"),$s=we.resolve(Ve,"./data/lines.bin"),Xs=we.resolve(Ve,"./data/checks.bin"),En=we.resolve(Ve,"./data/lines.exist_segments.bin"),Wn=we.resolve(Ve,"./data/lines.exist_segments.tmp.bin"),xn=class{constructor(t){this.reader=t,this.tmpDataFd=ct.openSync(tn,"w"),this.tmpCheckFd=ct.openSync(en,"w"),ct.existsSync(yn)||ct.writeFileSync(yn,""),this.tmpNewPointsFd=ct.openSync(nn,"w"),ct.existsSync(En)||ct.writeFileSync(En,""),this.tmpExistSegmentsFd=ct.openSync(Wn,"w"),this.tmpExistSegmentsOffset=0,this.tmpDataOffset=0,this.tmpCheckOffset=0,this.tmpNewPointsOffset=0,this.pending=[]}stageReplaceExistSegments(t,n){let s=this.tmpExistSegmentsOffset,o=[];for(let r of n){let i=qn(r.originalVertices,r.allCenterPoints||[]);ct.writeSync(this.tmpExistSegmentsFd,i,0,i.length,s),o.push({offset:s,byteLength:i.length,faceCount:r.originalVertices.length,centerCount:(r.allCenterPoints||[]).length}),s+=i.length}this.pending.push({id:t,type:"existSegments",segmentsMeta:o}),this.tmpExistSegmentsOffset=s}stageReplacePoints(t,n){let s=n.length*12,o=Buffer.alloc(s);new Float32Array(o.buffer,o.byteOffset).set(n),ct.writeSync(this.tmpDataFd,o,0,o.length,this.tmpDataOffset),this.pending.push({id:t,type:"points",offset:this.tmpDataOffset,byteLength:s,pointCount:n.length/3}),this.tmpDataOffset+=s}stageReplaceCheckResults(t,n){let s=this.tmpCheckOffset,o=[];for(let r of n){let i=qn(r.originalVertices,r.allCenterPoints||[]);ct.writeSync(this.tmpCheckFd,i,0,i.length,s),o.push({offset:s,byteLength:i.length,faceCount:r.originalVertices.length,centerCount:r.allCenterPoints?.length||0}),s+=i.length}this.pending.push({id:t,type:"checks",checkResults:o}),this.tmpCheckOffset=s}stageNewOriginalPoints(t,n){let s=n.length*12,o=Buffer.alloc(s);new Float32Array(o.buffer,o.byteOffset).set(n),ct.writeSync(this.tmpNewPointsFd,o,0,o.length,this.tmpNewPointsOffset),this.pending.push({id:t,type:"newPoints",offset:this.tmpNewPointsOffset,byteLength:s,pointCount:n.length/3}),this.tmpNewPointsOffset+=s}commit(){let t=this.reader.meta,n=ct.fstatSync(this.reader.fdWrite).size,s=ct.fstatSync(this.reader.checkFdWrite).size,o=ct.statSync(yn).size,r=ct.statSync(En).size;ct.closeSync(this.tmpDataFd),ct.closeSync(this.tmpCheckFd),ct.closeSync(this.tmpNewPointsFd),this.appendFile(tn,$s),this.appendFile(en,Xs),this.appendFile(Wn,En),this.appendFile(nn,yn),this.tmpDataFd=ct.openSync(tn,"w"),this.tmpCheckFd=ct.openSync(en,"w"),this.tmpNewPointsFd=ct.openSync(nn,"w"),this.tmpDataOffset=0,this.tmpCheckOffset=0,this.tmpNewPointsOffset=0;for(let i of this.pending){let l=t.find(f=>f.id===i.id);l&&(i.type==="points"&&(l.offset=n+i.offset,l.pointCount=i.pointCount),i.type==="checks"&&(l.checkResults=i.checkResults.map(f=>({...f,offset:s+f.offset}))),i.type==="newPoints"&&(l.hasNewOriginalPoints=!0,l.newPointsOffset=o+i.offset,l.newPointsCount=i.pointCount),i.type==="existSegments"&&(l.existSegments=i.segmentsMeta.map(f=>({...f,offset:r+f.offset}))))}this.reader.dataEnd=ct.fstatSync(this.reader.fdWrite).size,this.reader.checkEnd=ct.fstatSync(this.reader.checkFdWrite).size,this.reader.flushMeta(),ct.unlinkSync(tn),ct.unlinkSync(en),ct.unlinkSync(nn),this.close()}rollback(){try{ct.unlinkSync(tn)}catch{}try{ct.unlinkSync(en)}catch{}try{ct.unlinkSync(nn)}catch{}try{ct.unlinkSync(Wn)}catch{}this.close()}appendFile(t,n){let s=ct.openSync(t,"r"),o=ct.openSync(n,"a"),r=ct.fstatSync(s),i=Buffer.alloc(64*1024),l=0;for(;l<r.size;){let f=ct.readSync(s,i,0,i.length,l);ct.writeSync(o,i,0,f),l+=f}ct.closeSync(s),ct.closeSync(o)}close(){ct.closeSync(this.tmpDataFd),ct.closeSync(this.tmpCheckFd),this.tmpNewPointsFd&&ct.closeSync(this.tmpNewPointsFd),ct.closeSync(this.tmpExistSegmentsFd)}};var wo=(e,t,n)=>{let s=new O.LineBasicMaterial({color:"#0011ff"}),o=[];o.push(e),o.push(t);let r=new O.BufferGeometry;r.setFromPoints(o),r.rotateX(-Math.PI/2),n.add(new O.Line(r,s))},be=(e,t,n,s,o=1e-8)=>{let r=t.x-e.x,i=t.y-e.y,l=s.x-n.x,f=s.y-n.y,u=r*f-i*l;if(Math.abs(u)<o)return null;let g=((n.x-e.x)*f-(n.y-e.y)*l)/u,a=((n.x-e.x)*i-(n.y-e.y)*r)/u;return g<-o||g>1+o||a<-o||a>1+o?null:{point:new O.Vector3(e.x+g*r,e.y+g*i,e.z)}},bo=(e,t,n={})=>{let{fontSize:s=36,fontFamily:o="sans-serif",backgroundColor:r="rgba(0,0,0,0)",textColor:i="#ffffff",padding:l=10,maxWidth:f=256}=n,g=document.createElement("canvas").getContext("2d");g.font=`bold ${s}px ${o}`;let c=g.measureText(e).width,m=Math.min(c+l*2,f),d=s+l*2,y=document.createElement("canvas");y.width=m,y.height=d;let T=y.getContext("2d");T.fillStyle=r,T.fillRect(0,0,m,d),T.fillStyle=i,T.font=`bold ${s}px ${o}`,T.textAlign="center",T.textBaseline="middle",c>f-l*2?Ys(T,e,m/2,d/2,f,s):T.fillText(e,m/2,d/2);let P=new O.CanvasTexture(y),x=new O.SpriteMaterial({map:P,depthTest:!1,transparent:!0}),h=new O.Sprite(x);h.position.set(t.x,t.y,t.z);let p=.005;return h.scale.set(m*p,d*p,1),h};function Ys(e,t,n,s,o,r){let i=t.split(""),l="",f=r*1.2,u=s;for(let g=0;g<i.length;g++){let a=l+i[g];e.measureText(a).width>o&&g>0?(e.fillText(l,n,u),l=i[g],u+=f):l=a}e.fillText(l,n,u)}var Qt=(e,t,n=.01)=>{let s=Math.sqrt(e.x*e.x+e.y*e.y+e.z*e.z),o=Math.sqrt(t.x*t.x+t.y*t.y+t.z*t.z);if(s<1e-10||o<1e-10)return{parallel:!1,sameDirection:null,angle:NaN};let r={x:e.x/s,y:e.y/s,z:e.z/s},i={x:t.x/o,y:t.y/o,z:t.z/o},l=r.x*i.x+r.y*i.y+r.z*i.z;l=Math.max(-1,Math.min(1,l));let f=Math.acos(Math.abs(l)),u=f<=n;return{parallel:u,sameDirection:u?l>0:null,angle:f}};var To=(e,t,n,s)=>{if(t<1e-4||n<1e-4)return{};let o=e,r=[];if(s&&s.length&&(r=s.map(w=>w.clone())),!o||o.length<4)return{};let i=new O.Vector3().subVectors(o[1],o[0]).normalize(),l=new O.Vector3().subVectors(o[3],o[0]).normalize(),f=i.clone().cross(l).normalize(),u=1/0,g=-1/0,a=1/0,c=-1/0;for(let w of o){let R=w.dot(i),b=w.dot(l);R<u&&(u=R),R>g&&(g=R),b<a&&(a=b),b>c&&(c=b)}let m=o[0].dot(f),d=i.clone().multiplyScalar(u).add(l.clone().multiplyScalar(a)).add(f.clone().multiplyScalar(m)),y=i.clone().multiplyScalar(g).add(l.clone().multiplyScalar(a)).add(f.clone().multiplyScalar(m)),T=i.clone().multiplyScalar(g).add(l.clone().multiplyScalar(c)).add(f.clone().multiplyScalar(m)),P=i.clone().multiplyScalar(u).add(l.clone().multiplyScalar(c)).add(f.clone().multiplyScalar(m)),x=[d,y,T,P],h=Qt(new O.Vector3().subVectors(d,y),new O.Vector3(0,0,1));h&&h.parallel&&(x=[d,P,T,y]);let p=0;if(s.length>0){let w=new O.Vector3().subVectors(x[1],x[0]).normalize(),R=w.clone().negate(),b=new O.Vector3().subVectors(x[3],x[0]).normalize(),S=b.clone().negate(),z=x[0].distanceTo(x[1]),V=x[0].distanceTo(x[3]),M=z/t,v=V/n,B=.001;for(let I=0;I<M;I++){let _=x[0],k=0;for(let C=0;C<v;C++){let H=_.clone().addScaledVector(w,t),F=H.clone().addScaledVector(b,n),W=_.clone().addScaledVector(b,n),Y=new O.Vector3().add(_).add(H).add(F).add(W).multiplyScalar(.25);for(let X=0;X<r.length;X++)if(r[X].distanceTo(Y)<B){k++;break}_=W}if(k>=v/2)break;p+=k,x[0]=x[0].addScaledVector(w,t),x[3]=x[3].addScaledVector(w,t)}z=x[0].distanceTo(x[1]),M=z/t;for(let I=0;I<M;I++){let _=x[1],k=0;for(let C=0;C<v;C++){let H=_.clone().addScaledVector(R,t),F=H.clone().addScaledVector(b,n),W=_.clone().addScaledVector(b,n),Y=new O.Vector3().add(_).add(H).add(F).add(W).multiplyScalar(.25);for(let X=0;X<r.length;X++)if(r[X].distanceTo(Y)<B){k++;break}_=W}if(k>=v/2)break;p+=k,x[1]=x[1].addScaledVector(R,t),x[2]=x[2].addScaledVector(R,t)}z=x[0].distanceTo(x[1]),M=z/t;for(let I=0;I<v;I++){let _=x[3],k=0;for(let C=0;C<M;C++){let H=_.clone().addScaledVector(w,t),F=H.clone().addScaledVector(S,n),W=_.clone().addScaledVector(S,n),Y=new O.Vector3().add(_).add(H).add(F).add(W).multiplyScalar(.25);for(let X=0;X<r.length;X++)if(r[X].distanceTo(Y)<B){k++;break}_=H}if(k>=M/2)break;p+=k,x[2]=x[2].addScaledVector(S,n),x[3]=x[3].addScaledVector(S,n)}}let E=x[0].distanceTo(x[1])*x[0].distanceTo(x[3]);return{facePoints:x,boxArea:E,totalInPlaneNum:p}},Zt=(e,t,n,s,o=O.MathUtils.degToRad(8))=>{let r=new O.Vector3,i=new O.Vector3;r.subVectors(new O.Vector3(t.x,t.y,0),new O.Vector3(e.x,e.y,0)).normalize(),i.subVectors(new O.Vector3(s.x,s.y,0),new O.Vector3(n.x,n.y,0)).normalize();let l=r.dot(i),f=Math.acos(Math.min(Math.abs(l),1)),u=1-Math.min(f/o,1),g=l>0?"same":"opposite";return{parallelism:u,angle:f,angleDeg:O.MathUtils.radToDeg(f),isParallel:f<o,direction:g,vectors:{v1:r,v2:i}}},le=(e,t,n,s)=>{let o=new O.Vector3().subVectors(t,e),r=new O.Vector3().subVectors(s,n),i=o.length(),l=r.length();if(i===0||l===0)return{rate:NaN,angle:NaN,isPerpendicular:!1,isParallel:!1};o.normalize(),r.normalize();let f=Math.abs(o.dot(r)),u=Math.min(1,Math.max(0,f)),g=Math.acos(u),a=O.MathUtils.radToDeg(g),c=1-u,m=1e-6;return{rate:c,percent:`${(c*100).toFixed(2)}%`,angle:a,isPerpendicular:Math.abs(a-90)<.01,isParallel:a<.01}},jt=(e,t,n=!1)=>new O.Vector3((e.x+t.x)/2,(e.y+t.y)/2,n?0:(e.z+t.z)/2),xe=(e,t,n,s,o={})=>{let{parallelAngleMax:r=O.MathUtils.degToRad(10),collinearAngleMax:i=O.MathUtils.degToRad(7),distanceThreshold:l=2,overlapThreshold:f=.01}=o,u=new O.Vector3().subVectors(t,e),g=new O.Vector3().subVectors(s,n),a=u.clone().normalize(),c=g.clone().normalize(),m=O.MathUtils.clamp(a.dot(c),-1,1),d=Math.acos(Math.abs(m)),y=O.MathUtils.radToDeg(d);if(d>r)return{type:"not_parallel",angleDeg:y,avgPerpendicularDistance:null,maxPerpendicularDistance:null,gap:null,overlap:null,closestDistance:null};m<0&&c.negate();let T=new O.Vector3().addVectors(a,c).normalize(),P=new O.Vector3().addVectors(e,t).multiplyScalar(.5),x=xo(n,P,a),h=xo(s,P,a),p=(x+h)/2,E=Math.max(x,h),w=e.dot(T),R=t.dot(T),b=n.dot(T),S=s.dot(T),z=Math.min(w,R),V=Math.max(w,R),M=Math.min(b,S),v=Math.max(b,S),B=V-z,I=v-M,_=Math.min(B,I),k=Math.min(V,v)-Math.max(z,M),C=k<0?-k:0,H=k>0?k:0,F=_>0?H/_:0,W=Gs(e,t,n,s),Y=d<=i&&p<l,X;return Y?X=F>.5?"collinear_overlap":"collinear_gap":d<=r&&(X="parallel_offset"),{type:X,angleDeg:y,avgPerpendicularDistance:p,maxPerpendicularDistance:E,gap:C,overlap:H,closestDistance:W}};function xo(e,t,n){let s=new O.Vector3().subVectors(e,t),o=s.dot(n),r=n.clone().multiplyScalar(o);return new O.Vector3().subVectors(s,r).length()}function Gs(e,t,n,s){let o=new O.Vector3().subVectors(t,e),r=new O.Vector3().subVectors(s,n),i=new O.Vector3().subVectors(n,e),l=o.dot(o),f=o.dot(r),u=r.dot(r),g=o.dot(i),a=r.dot(i),c=l*u-f*f,m,d;c<1e-10?(m=0,d=u!==0?a/u:0):(m=(f*a-u*g)/c,d=(l*a-f*g)/c),m=O.MathUtils.clamp(m,0,1),d=u!==0?O.MathUtils.clamp((f*m+a)/u,0,1):0,m=l!==0?O.MathUtils.clamp((f*d-g)/l,0,1):0;let y=e.clone().add(o.clone().multiplyScalar(m)),T=n.clone().add(r.clone().multiplyScalar(d));return y.distanceTo(T)}var wn=e=>{let t=999999,n=-999999;for(let s=0;s<e.length;s++)e[s].z>n&&(n=e[s].z),e[s].z<t&&(t=e[s].z);return{minZ:t,maxZ:n}},on=(e,t,n)=>{let s=new O.Plane,o=new O.Vector3(e.x,e.y,e.z),r=new O.Vector3(t.x,t.y,t.z),i=new O.Vector3(t.x,t.y,t.z+5);s.setFromCoplanarPoints(o,r,i);let l=[],f=[];n.forEach(T=>{let P=new O.Vector3;s.projectPoint(T,P),f.push(P.clone()),P.z=o.z,l.push(P)});let u=new O.Vector3,g=new O.Vector3;s.projectPoint(o,u),s.projectPoint(r,g);let a=new O.Line3(u,g),c=[],m=[],d=[],y=new O.Vector3;return l.forEach((T,P)=>{a.closestPointToPoint(T,!0,y).distanceTo(T)<.001?(c.push(n[P]),m.push(f[P])):d.push(T)}),{newOriginalPoints:c,newProjectPoints:d,newOnLinePoints:m}},Po=(e,t)=>{function n(o,r,i,l,f,u,g,a,c){let m=new O.Line3(o,r),d=new Map,y=new O.Vector3,T=o.clone(),P=r.clone(),x=0;for(;;){let h=new Map,p=0;for(let E=0;E<c.checkResults.length;E++)if(!(c.checkResults[E].allCenterPoints.length/a*100<1))for(let R=0;R<c.checkResults[E].allCenterPoints.length;R++){if(d.has(E)&&d.get(E).removePtsIndex.includes(R))continue;let b=c.checkResults[E].allCenterPoints[R];b=new O.Vector3(b.x,b.y,b.z);let S=m.closestPointToPoint(b,!0,y),z=b.distanceTo(S);Math.abs(z-f)<.01&&(p++,h.has(E)?h.get(E).removePtsIndex.push(R):h.set(E,{index:E,removePtsIndex:[R]}))}if(x==g){o=T,r=P;break}if(p<u/20*19||p==0){h.clear(),g-x<5&&(o=T,r=P,d.clear());break}else{x++;for(let[E,w]of h)d.has(E)?d.get(E).removePtsIndex.push(...w.removePtsIndex):d.set(E,w);h.clear(),o=o.addScaledVector(i,l),r=r.addScaledVector(i,l),m.set(o,r)}}if(d.size>0&&x!=g)for(let[h,p]of d){let E=[],w=[];for(let R=0;R<c.checkResults[h].allCenterPoints.length;R++)p.removePtsIndex.includes(R)||(E.push(c.checkResults[h].allCenterPoints[R]),w.push(c.checkResults[h].originalVertices[R]));c.checkResults[h].allCenterPoints=E,c.checkResults[h].originalVertices=w}}let s=new xn(t);for(let o=0;o<e.length;o++){let r=e[o];if(r.length<.5)continue;let i=-1,l=-1,f=t.readLineById(r.id);if(f.checkResults=t.getLineCheckReultsById(r.id),f.originalPoints=t.getLineCheckReultsById(r.id),r.originalPoints=f.originalPoints,r.checkResults=f.checkResults,f=null,!r.checkResults||r.checkResults.length<=0)continue;if(r.checkResults[0].originalVertices&&r.checkResults[0].originalVertices.length>0){let v=r.checkResults[0].originalVertices[0],[B,I,_,k]=v;B=new O.Vector3(B.x,B.y,B.z),I=new O.Vector3(I.x,I.y,I.z),_=new O.Vector3(_.x,_.y,_.z),k=new O.Vector3(k.x,k.y,k.z),i=B.distanceTo(I),l=B.distanceTo(k);let C=new O.Vector3().subVectors(B,I).normalize(),H=Qt(C,new O.Vector3(0,0,1));H&&H.parallel&&([l,i]=[i,l])}if(i<0||l<0)continue;let u=new O.Vector3(r.start.x,r.start.y,r.start.z),g=new O.Vector3(r.end.x,r.end.y,r.end.z),a=u.distanceTo(g),c=r.rooftopPz-r.start.z,m=Math.ceil(a/i),d=Math.ceil(c/l),y=u.clone(),T=g.clone(),P=T.clone().add(new O.Vector3(0,0,c)),x=y.clone().add(new O.Vector3(0,0,c)),h=new O.Vector3().subVectors(T,y).normalize(),p=h.clone().negate(),w=new O.Vector3().subVectors(P,y).normalize().clone().negate(),R=i/2,b=l/2,S=a*c,z=i*l,V=S/z;n(y,x,h,i,R,d,m,V,r),n(T,P,p,i,R,d,m,V,r),r.start=y,r.end=T;let{newOriginalPoints:M}=on(y,T,r.originalPoints);r.originalPoints=M,s.stageReplaceCheckResults(r.id,r.checkResults),s.stageReplacePoints(r.id,r.originalPoints),r.checkResults=null,r.originalPoints=null}s.commit()},Xt=(e,t)=>new O.Vector3(e.x,e.y,0).distanceTo(new O.Vector3(t.x,t.y,0)),jn=(e,t,n=1e-6)=>{let s=new O.Vector3;return e.closestPointToPoint(t,!0,s),s.distanceTo(t)<n},Ne=e=>{let t=0,n=[];for(let s=0;s<e.length;s++)for(let o=s+1;o<e.length;o++){let r=e[s].distanceTo(e[o]);r>t&&(t=r,n=[e[s],e[o]])}return n},rt=(e,t,n=.03)=>Math.abs(e.x-t.x)<n&&Math.abs(e.y-t.y)<n&&Math.abs(e.z-t.z)<n;var Ro=()=>{let e=Math.floor(Math.random()*75+180).toString(16).padStart(2,"0"),t=Math.floor(Math.random()*75+180).toString(16).padStart(2,"0"),n=Math.floor(Math.random()*75+180).toString(16).padStart(2,"0");return`#${e}${t}${n}`};var $n=(e,t=.001)=>{let n=new Map,s=[];for(let o of e){let r=Math.round(o.x/t),i=Math.round(o.y/t),l=Math.round(o.z/t),f=`${r},${i},${l}`;n.has(f)||(n.set(f,!0),s.push(o))}return s},So=e=>{let t=e.center,n=e.halfSize,o=e.rotation.elements,r=new O.Vector3(o[0],o[1],o[2]).multiplyScalar(n.x),i=new O.Vector3(o[3],o[4],o[5]).multiplyScalar(n.y),l=new O.Vector3(o[6],o[7],o[8]).multiplyScalar(n.z);function f(g,a,c){return t.clone().addScaledVector(r,g).addScaledVector(i,a).addScaledVector(l,c)}return[f(-1,-1,-1),f(1,-1,-1),f(1,1,-1),f(-1,1,-1),f(-1,-1,1),f(1,-1,1),f(1,1,1),f(-1,1,1)]},Xn=(e,t)=>{let n=e[0],s=e[1],o=e[2],r=e[3],i=new O.Vector3().subVectors(s,n),l=new O.Vector3().subVectors(r,n),f=i.length(),u=l.length();i.normalize(),l.normalize();let g=new O.Vector3(0,0,1),c=new O.Vector3().add(n).add(s).add(o).add(r).multiplyScalar(.25).clone().addScaledVector(g,t/2),m=new O.BoxGeometry(f,u,t),d=new O.Matrix4;return d.makeBasis(i,l,g),d.setPosition(c),m.applyMatrix4(d),m.computeVertexNormals(),m};import*as Yt from"three";var Zs=(e,t)=>{console.log("lines",e);for(let n=0;n<e.length;n++){let s=e[n],o=[];s.originalPoints.forEach(h=>{let p=new Yt.Vector3(h.x,h.y,0),E=!1;for(let w=0;w<o.length;w++)if(rt(p,o[w],.01)){E=!0;break}E||o.push(p)});let r=Math.round(Math.max(5,Math.min(350,20*Math.sqrt(s.length)))),i=1,l=new Yt.Vector3(s.start.x,s.start.y,s.start.z),f=new Yt.Vector3(s.end.x,s.end.y,s.end.z),u=new Yt.Vector3().subVectors(f,l).normalize(),g=u.clone().cross(new Yt.Vector3(0,0,1)).normalize(),a=g.clone().negate(),c=[],m=[],d=s.length/r;console.log(d);for(let h=0;h<r;h++){let p=[];p.push(l.clone().addScaledVector(g,i)),p.push(p[0].clone().addScaledVector(u,d)),p.push(p[1].clone().addScaledVector(a,i*2)),p.push(l.clone().addScaledVector(a,d));let E=[];for(let w=0;w<o.length;w++)c.includes(w)||Us(o[w],p)&&(c.push(w),E.push(o[w]));E.length>0&&m.push(Js(E)),l=l.addScaledVector(u,d)}let y=new Float32Array(o.length*3);o.forEach((h,p)=>{y[p*3]=h.x,y[p*3+1]=h.y,y[p*3+2]=h.z});let T=new Yt.BufferGeometry;T.setAttribute("position",new Yt.BufferAttribute(y,3)),T.rotateX(-Math.PI/2),t.add(new Yt.Points(T,new Yt.PointsMaterial({color:Ro(),size:.02})));let[P,x]=nr(m,{plane:"xy",trimRatio:0});wo(P,x,t)}};function zo(e,t="xy"){if(t==="xy")return{x:e.x,y:e.y};if(t==="xz")return{x:e.x,y:e.z};if(t==="yz")return{x:e.y,y:e.z};throw new Error(`Unsupported plane: ${t}`)}function Ks(e,t,n){let s=t.x-e.x,o=t.y-e.y,r=n.x-e.x,i=n.y-e.y;return s*i-o*r}function Us(e,t,n="xy"){if(!t||t.length!==4)throw new Error("rectPoints must contain 4 points");let s=zo(e,n),o=t.map(l=>zo(l,n)),r=!1,i=!1;for(let l=0;l<4;l++){let f=o[l],u=o[(l+1)%4],g=Ks(f,u,s);if(g>1e-9&&(r=!0),g<-1e-9&&(i=!0),r&&i)return!1}return!0}function Js(e){if(!e||e.length===0)return null;let t=new Yt.Vector3(0,0,0);for(let n of e)Array.isArray(n)?(t.x+=n[0],t.y+=n[1],t.z+=n[2]):(t.x+=n.x,t.y+=n.y,t.z+=n.z);return t.divideScalar(e.length),t}function Qs(e){return e instanceof Yt.Vector3?e.clone():Array.isArray(e)?new Yt.Vector3(e[0],e[1],e[2]):new Yt.Vector3(e.x,e.y,e.z)}function tr(e,t="xy"){let n=Qs(e);if(t==="xy")return{x:n.x,y:n.y,up:n.z};if(t==="xz")return{x:n.x,y:n.z,up:n.y};if(t==="yz")return{x:n.y,y:n.z,up:n.x};throw new Error(`Unsupported plane: ${t}`)}function Vo(e,t,n,s="xy"){if(s==="xy")return new Yt.Vector3(e,t,n);if(s==="xz")return new Yt.Vector3(e,n,t);if(s==="yz")return new Yt.Vector3(n,e,t);throw new Error(`Unsupported plane: ${s}`)}function er(e,t,n){if(Math.abs(t)<1e-12)return e>=n?{x:1,y:0}:{x:0,y:1};let o=e+n,r=e*n-t*t,i=Math.sqrt(Math.max(0,o*o*.25-r)),l=o*.5+i,f=t,u=l-e,g=Math.hypot(f,u);return g<1e-12?{x:1,y:0}:{x:f/g,y:u/g}}function nr(e,t={}){let{plane:n="xy",trimRatio:s=0}=t;if(!e||e.length<2)return null;let o=e.map(k=>tr(k,n)),r=0,i=0,l=0;for(let k of o)r+=k.x,i+=k.y,l+=k.up;r/=o.length,i/=o.length,l/=o.length;let f=0,u=0,g=0;for(let k of o){let C=k.x-r,H=k.y-i;f+=C*C,u+=C*H,g+=H*H}f/=o.length,u/=o.length,g/=o.length;let a=er(f,u,g),c={x:-a.y,y:a.x},m=[];for(let k of o){let C=k.x-r,H=k.y-i,F=C*a.x+H*a.y,W=C*c.x+H*c.y;m.push({s:F,t:W,up:k.up})}m.sort((k,C)=>k.s-C.s);let d=m.length,y=Math.floor(d*s),T=Math.ceil(d*(1-s))-1;y=Math.max(0,Math.min(d-1,y)),T=Math.max(0,Math.min(d-1,T));let P=m[y],x=m[T],h=(()=>{let k=m.map(H=>H.t).sort((H,F)=>H-F),C=Math.floor(k.length/2);return k.length%2===0?(k[C-1]+k[C])*.5:k[C]})(),p=(()=>{let k=m.map(H=>H.up).sort((H,F)=>H-F),C=Math.floor(k.length/2);return k.length%2===0?(k[C-1]+k[C])*.5:k[C]})(),E=P.s,w=x.s,R=h,b=h,S=p,z=p,V=r+a.x*E+c.x*R,M=i+a.y*E+c.y*R,v=r+a.x*w+c.x*b,B=i+a.y*w+c.y*b,I=Vo(V,M,S,n),_=Vo(v,B,z,n);return[I,_]}import We from"path";import*as at from"fs";import{fileURLToPath as or}from"url";import{Vector3 as qe}from"three";var sr=or(import.meta.url),ln=We.dirname(sr),sn=We.resolve(ln,"./data/lines.meta.json"),Yn=We.resolve(ln,"./data/lines.bin"),Gn=We.resolve(ln,"./data/checks.bin"),Mo=We.resolve(ln,"./data/lines.new_points.bin"),Zn=We.resolve(ln,"./data/lines.exist_segments.bin");function Kn(e){let t=[],n=0,s=0,o=0,r=at.openSync(Yn,"w"),i=at.openSync(Gn,"w"),l=at.openSync(Zn,"w");try{for(let u of e){let g=Buffer.alloc(u.originalPoints.length*12),a=new Float32Array(g.buffer,g.byteOffset);for(let d=0,y=0;d<u.originalPoints.length;d++,y+=3){let T=u.originalPoints[d];a[y]=T.x,a[y+1]=T.y,a[y+2]=T.z}at.writeSync(r,g,0,g.length,n);let c=null;if(Array.isArray(u.checkResults)&&u.checkResults.length>0){let d=[];for(let y of u.checkResults){let T=vo(y);at.writeSync(i,T,0,T.length,s),d.push({offset:s,byteLength:T.length,faceCount:y.originalVertices.length,centerCount:y.allCenterPoints.length}),s+=T.length}c={checkResults:d}}let m=null;if(Array.isArray(u.existSegments)&&u.existSegments.length>0){let d=[];for(let y of u.existSegments){let T=vo(cr);at.writeSync(l,T,0,T.length,o),d.push({offset:o,byteLength:T.length,faceCount:y.originalVertices.length,centerCount:(y.allCenterPoints||[]).length}),o+=T.length}m={existSegments:d}}t.push({id:u.id,pointCount:u.originalPoints.length,offset:n,...c||{},...m||{},hasNewOriginalPoints:!1}),n+=g.length,u.originalPoints=null,u.checkResults=null,u.existSegments=null}at.closeSync(r),at.closeSync(i),at.closeSync(l);let f=sn+".tmp";at.writeFileSync(f,JSON.stringify(t,null,2)),at.renameSync(f,sn),console.log("\u2705 writeFile \u5B8C\u6210\uFF08\u542B existSegments\uFF09")}catch(f){try{at.closeSync(r)}catch{}try{at.closeSync(i)}catch{}try{at.closeSync(l)}catch{}throw f}}var rn=class{constructor(t){this.lineStates=new Map;for(let n of t)this.lineStates.set(n.id,n);this.meta=JSON.parse(at.readFileSync(sn,"utf-8")),this.fdRead=at.openSync(Yn,"r"),this.checkFdRead=at.openSync(Gn,"r"),this.existSegmentsFdRead=at.existsSync(Zn)?at.openSync(Zn,"r"):null,this.newPointsFdRead=at.existsSync(Mo)?at.openSync(Mo,"r"):null,this.fdWrite=at.openSync(Yn,"a"),this.checkFdWrite=at.openSync(Gn,"a"),this.dataEnd=at.fstatSync(this.fdWrite).size,this.checkEnd=at.fstatSync(this.checkFdWrite).size}readLine(t){let n=this.meta[t];if(!n)return null;let s=this.lineStates.get(n.id);if(!s)return null;let o=Buffer.alloc(n.pointCount*12);at.readSync(this.fdRead,o,0,o.length,n.offset);let r=new Float32Array(o.buffer,o.byteOffset,n.pointCount*3),i=n.checkResults?n.checkResults.map(u=>this.createCheckResultView(u,"checkResults")):[],l=n.existSegments&&n.existSegments.length>0?n.existSegments.map(u=>this.createCheckResultView(u)):[],f=null;if(n.hasNewOriginalPoints&&this.newPointsFdRead&&typeof n.newPointsOffset=="number"&&n.newPointsCount>0){let u=Buffer.alloc(n.newPointsCount*12);at.readSync(this.newPointsFdRead,u,0,u.length,n.newPointsOffset),f=new Float32Array(u.buffer,u.byteOffset,n.newPointsCount*3)}return{...s,originalPoints:r,checkResults:i,existSegments:l,new_originalPoints:f}}*iterate(){for(let t=0;t<this.meta.length;t++)yield this.readLine(t)}readLineById(t){let n=this.meta.find(u=>u.id===t);if(!n)return null;let s=this.lineStates.get(n.id);if(!s)return null;let o=Buffer.alloc(n.pointCount*12);at.readSync(this.fdRead,o,0,o.length,n.offset);let r=new Float32Array(o.buffer,o.byteOffset,n.pointCount*3),i=n.checkResults?n.checkResults.map(u=>this.createCheckResultView(u,"checkResults")):[],l=n.existSegments&&n.existSegments.length>0?n.existSegments.map(u=>this.createCheckResultView(u)):[],f=null;if(n.hasNewOriginalPoints&&this.newPointsFdRead&&typeof n.newPointsOffset=="number"&&n.newPointsCount>0){let u=Buffer.alloc(n.newPointsCount*12);at.readSync(this.newPointsFdRead,u,0,u.length,n.newPointsOffset),f=new Float32Array(u.buffer,u.byteOffset,n.newPointsCount*3)}return{...s,originalPoints:r,checkResults:i,existSegments:l,new_originalPoints:f}}getLineCheckReultsById(t){let n=this.meta.find(f=>f.id===t);if(!n)return[];if(!this.lineStates.get(n.id))return[];let o=n.checkResults?n.checkResults.map(f=>this.createCheckResultView(f,"checkResults")):[],r=[],i=[],l=[];for(let f of o){for(let u=0;u<f.faceCount;u++){let g=f.getFace(u);i.push(g);let a=f.getCenter(u);l.push(a)}r.push({originalVertices:i,allCenterPoints:l})}return r}getLineExistSegmentsById(t){let n=this.meta.find(g=>g.id===t);if(!n)return[];if(!this.lineStates.get(n.id))return[];let o=Buffer.alloc(n.pointCount*12);at.readSync(this.fdRead,o,0,o.length,n.offset);let r=new Float32Array(o.buffer,o.byteOffset,n.pointCount*3),i=n.existSegments&&n.existSegments.length>0?n.existSegments.map(g=>this.createCheckResultView(g)):[],l=[],f=[],u=[];for(let g of i){for(let a=0;a<g.faceCount;a++){let c=g.getFace(a);f.push(c);let m=g.getCenter(a);u.push(m)}l.push({originalVertices:f,allCenterPoints:u})}return l}getOriginalPointsById(t){let n=this.meta.find(f=>f.id===t);if(!n||!this.lineStates.get(n.id))return null;let o=Buffer.alloc(n.pointCount*12);at.readSync(this.fdRead,o,0,o.length,n.offset);let r=new Float32Array(o.buffer,o.byteOffset,n.pointCount*3),i=[],l=r;for(let f=0;f<l.length;f+=3)i.push(new qe(l[f],l[f+1],l[f+2]));return i}replaceOriginalPoints(t,n){let s=this.meta.find(l=>l.id===t);if(!s)throw new Error(`line ${t} not found`);let o=Buffer.alloc(n.length*12);new Float32Array(o.buffer,o.byteOffset).set(n);let i=this.dataEnd;at.writeSync(this.fdWrite,o,0,o.length,i),this.dataEnd+=o.length,s.pointCount=n.length/3,s.offset=i}replaceAllCheckResults(t,n){let s=this.meta.find(u=>u.id===t);if(!s)throw new Error(`line ${t} not found`);let o=[],r=0,i=n.map(u=>{let g=rr(u.originalVertices,u.allCenterPoints||[]);return r+=g.length,g}),f=this.checkEnd;for(let u=0;u<i.length;u++){let g=i[u];at.writeSync(this.checkFdWrite,g,0,g.length,f),o.push({offset:f,byteLength:g.length,faceCount:n[u].originalVertices.length,centerCount:(n[u].allCenterPoints||[]).length}),f+=g.length}this.checkEnd+=r,s.checkResults=o}flushMeta(){let t=sn+".tmp";at.writeFileSync(t,JSON.stringify(this.meta,null,2)),at.renameSync(t,sn)}createCheckResultView(t,n){let s=null,o=null,r=()=>{if(s)return;s=Buffer.alloc(t.byteLength);let f=n==="checkResults"?this.checkFdRead:this.existSegmentsFdRead;at.readSync(f,s,0,t.byteLength,t.offset),o=new Float32Array(s.buffer,s.byteOffset)},i=f=>f*12,l=f=>t.faceCount*12+f*3;return{getFace(f){r();let u=i(f);return[new qe(o[u],o[u+1],o[u+2]),new qe(o[u+3],o[u+4],o[u+5]),new qe(o[u+6],o[u+7],o[u+8]),new qe(o[u+9],o[u+10],o[u+11])]},getCenter(f){r();let u=l(f);return new qe(o[u],o[u+1],o[u+2])},faceCount:t.faceCount,centerCount:t.centerCount}}close(){at.closeSync(this.fdRead),at.closeSync(this.checkFdRead),this.existSegmentsFdRead&&at.closeSync(this.existSegmentsFdRead),this.newPointsFdRead&&at.closeSync(this.newPointsFdRead),at.closeSync(this.fdWrite),at.closeSync(this.checkFdWrite),this.lineStates.clear()}};function vo(e){let{originalVertices:t,allCenterPoints:n}=e,s=t.length*4*3+n.length*3,o=Buffer.alloc(s*4),r=new Float32Array(o.buffer,o.byteOffset),i=0;for(let l of t)for(let f of l)r[i++]=f.x,r[i++]=f.y,r[i++]=f.z;for(let l of n)r[i++]=l.x,r[i++]=l.y,r[i++]=l.z;return o}function rr(e,t){let n=e.length*4*3+t.length*3,s=Buffer.alloc(n*4),o=new Float32Array(s.buffer,s.byteOffset),r=0;for(let i of e)for(let l of i)o[r++]=l.x,o[r++]=l.y,o[r++]=l.z;for(let i of t)o[r++]=i.x,o[r++]=i.y,o[r++]=i.z;return s}import{Vector3 as Qi}from"three";import{randomUUID as ir}from"crypto";function Ho(e){for(let t of e)t.id=ir()}var lr=async(e,t,n,s,o)=>{if(s&&s.length>0)for(let x=0;x<s.length;x++){let h=s[x];h.isLine2=!0,e.push(h)}Ho(e),Kn(e);let r=new rn(e);if(Po(e,r,o),e.length<=0||t.length<=0)return e;n||(n=[]);for(let x of e){let h=[],p=r.readLineById(x.id);if(p.checkResults=r.getLineCheckReultsById(x.id),x.checkResults=p.checkResults,!(!x.checkResults||x.checkResults.length<=0)){for(let E=0;E<x.checkResults.length;E++){let z=function(B){for(;S[B]!==B;)S[B]=S[S[B]],B=S[B];return B},w=x.checkResults[E];if(!w.originalVertices||w.originalVertices.length==0)continue;let R=[];w.originalVertices.forEach(B=>{let I=[];B.forEach(_=>{I.push(new D.Vector3(_.x,_.y,_.z))}),R.push(I)});let b=R.length,S=Array.from({length:b},(B,I)=>I);for(let B=0;B<b;B++)for(let I=B+1;I<b;I++){let _=R[B],k=R[I];if(_.some(H=>k.some(F=>H.equals(F)))){let H=z(B),F=z(I);H!==F&&(S[H]=F)}}let V=new Map,M=-1,v=-1;for(let B=0;B<b;B++){let I=z(B);V.has(I)||V.set(I,{points:[],area:0,originalVertices:[],index:-1,gridWidth:-1,gridHeight:-1,centerPts:[]});let _=V.get(I),[k,C,H,F]=R[B],W=new D.Vector3().add(k).add(C).add(H).add(F).multiplyScalar(.25);if(_.points.push(...R[B]),_.area+=k.distanceTo(C)*k.distanceTo(F),_.originalVertices.push(R[B]),_.index=E,_.centerPts.push(W),M==-1||v==-1){let Y=new D.Vector3().subVectors(k,C).normalize();v=k.distanceTo(F),M=k.distanceTo(C);let X=Qt(Y,new D.Vector3(0,0,1));X&&X.parallel&&([v,M]=[M,v])}_.gridWidth=M,_.gridHeight=v}h.push(...V.values())}x.checkResults=null,x.mergeCheckRegion=h}}let i=[];for(let x=0;x<n.length;x++){let h=n[x];if(h.isFindBeam=!1,h.category=="door"){let p=[];h.coordinatesByArea.coordinates.forEach(S=>{p.push(new D.Vector3(S.x,S.y,S.z))}),p[0].equals(p[p.length-1])&&p.pop();let E=p[0].distanceTo(p[1]),w=p[0].distanceTo(p[3]);w>E&&([E,w]=[w,E],p=[p[0],p[3],p[2],p[1]]);let R=jt(p[0],p[3],!0),b=jt(p[1],p[2],!0);i.push({doorStartPt:R,doorEndPt:b,boxPoints:p,minZ:h.coordinatesByArea.heightData.minZ,maxZ:h.coordinatesByArea.heightData.maxZ,index:x,isFind:!1,inWall:!1})}}for(let x=0;x<i.length;x++){let h=i[x];for(let p=0;p<e.length;p++){if(e[p].length<.5)continue;let E=[],w=jt(e[p].start,e[p].end,!0);E.push(w),E.push(jt(w,e[p].start,!0)),E.push(jt(w,e[p].end,!0));let R=!1,b=h.boxPoints.length;for(let S=0;S<E.length;S++){let z=E[S].x,V=E[S].y;for(let M=0,v=b-1;M<b;v=M++){let B=h.boxPoints[M].x,I=h.boxPoints[M].y,_=h.boxPoints[v].x,k=h.boxPoints[v].y;I>V!=k>V&&z<(_-B)*(V-I)/(k-I)+B&&(R=!R)}if(R)break}if(R){let S=new D.Vector3(e[p].start.x,e[p].start.y,0),z=new D.Vector3(e[p].end.x,e[p].end.y,0),V=h.doorStartPt.distanceTo(h.doorEndPt),M=S.distanceTo(z),v=Zt(h.doorStartPt,h.doorEndPt,S,z);if(Math.abs(M-V)<.5&&v&&v.angleDeg<15){h.doorStartPt=new D.Vector3(e[p].start.x,e[p].start.y,0),h.doorEndPt=new D.Vector3(e[p].end.x,e[p].end.y,0);break}else if(Math.abs(M-V)>1.3&&v&&v.angleDeg<15){let B=xe(h.doorStartPt,h.doorEndPt,S,z,{parallelAngleMax:D.MathUtils.degToRad(15)}),I=h.doorStartPt.distanceTo(S),_=h.doorStartPt.distanceTo(z),k=h.doorEndPt.distanceTo(S),C=h.doorEndPt.distanceTo(z),H=I<.2||_<.2||k<.2||C<.2;if(B&&B.type=="collinear_overlap"&&B.maxPerpendicularDistance<.1&&!H){h.inWall=!0;break}else{let F=new D.Line3(S,z),W=F.closestPointToPoint(h.doorStartPt,!0,new D.Vector3),Y=F.closestPointToPoint(h.doorEndPt,!0,new D.Vector3),X=W.distanceTo(h.doorStartPt),Q=Y.distanceTo(h.doorEndPt);if(X<.1||Q<.1){h.inWall=!0;break}}}}else continue}}let l=0,f=[],u=[],g=[],a=[],c=.15;for(let x=0;x<e.length;x++){let h=e[x];if(h.noDetection)continue;let p=r.readLineById(h.id);if(p.originalPoints=r.getOriginalPointsById(h.id),p.checkResults=r.getLineCheckReultsById(h.id),h.originalPoints=p.originalPoints,h.checkResults=p.checkResults,p=null,h.doorAndBeamData=[],h.doorAndBeamIdToCheckResults=[],!h.mergeCheckRegion||h.mergeCheckRegion.length==0)continue;h.completePointAreaPercentage=-1;let E=new D.Box3;E.setFromPoints(h.originalPoints);let w=E.max.z,R=E.min.z,b=new D.Vector3(h.start.x,h.start.y,h.start.z),S=new D.Vector3(h.end.x,h.end.y,h.end.z),z=h.rooftopPz-h.start.z,V=0;for(let v of h.mergeCheckRegion){let{facePoints:B,boxArea:I,totalInPlaneNum:_}=To(v.points,v.gridWidth,v.gridHeight,v.centerPts);if(!B||B.length<=0)continue;let k=B[0].distanceTo(B[1]),C=B[0].distanceTo(B[3]),H=v.gridHeight*(C/v.gridHeight/3*2)+v.gridHeight/2,F=new D.Vector3(B[0].x,B[0].y,B[0].z+H),W=new D.Vector3(B[1].x,B[1].y,B[1].z+H),Y=new D.Line3(F,W),X=[],Q=new D.Vector3;v.points.forEach(et=>{Y.closestPointToPoint(et,!0,Q).distanceTo(et)<v.gridHeight+.01&&X.push(et)});let U=[],lt=[];for(;;){let et=[];for(let q=0;q<X.length;q++)lt.includes(q)||et.length==0&&(et.push(X[q]),lt.push(q));for(let q=0;q<X.length;q++)if(!lt.includes(q)){for(let K=0;K<et.length;K++)if(X[q].distanceTo(et[K])<v.gridWidth+.01){et.push(X[q]),lt.push(q),q=-1;break}}if(et.length==0)break;U.push(et)}let ot=[];for(let et=0;et<U.length;et++){let q={lineSt:new D.Vector3,lineEd:new D.Vector3,facePoints:[]},K=Ne(U[et]);Array.isArray(K)&&K.length==2&&(q.lineSt=K[0],q.lineEd=K[1],q.facePoints.push(new D.Vector3(K[0].x,K[0].y,B[0].z)),q.facePoints.push(new D.Vector3(K[1].x,K[1].y,B[0].z)),q.facePoints.push(new D.Vector3(K[1].x,K[1].y,B[2].z)),q.facePoints.push(new D.Vector3(K[0].x,K[0].y,B[2].z)),ot.push(q))}V+=v.area;let ut=0;if(_!=0&&(ut=v.gridHeight*v.gridWidth*_),(v.area-ut)/I*100>70&&ot.length==1||ot.length>1)for(let et=0;et<ot.length;et++){let q=ot[et],K=q.facePoints[0].distanceTo(q.facePoints[1]),Vt=q.facePoints[0].distanceTo(q.facePoints[3]),Nt=K/h.length*100,$t=h.rooftopPz-q.facePoints[2].z;if(Vt<1.5||w<q.facePoints[2].z||$t>z/3*2)continue;let Gt=!1,wt=!1,At=!1,Ft=new D.Vector3(0,0,0),Pt=new D.Vector3(0,0,0),Dt=!1,_t=[],J=q.facePoints[2].clone(),ht=q.facePoints[3].clone(),$=q.facePoints[0].clone(),dt=q.facePoints[1].clone(),Tt=!1,se=-1;if(Math.abs(q.facePoints[0].z-h.start.z)<.25){let ce=!1;for(let tt=0;tt<t.length;tt++){let Mt=tt+1;if(Mt>=t.length)continue;let qt=new D.Vector3(t[tt].x,t[tt].y,t[tt].z),nt=new D.Vector3(t[Mt].x,t[Mt].y,t[Mt].z);if(be(new D.Vector3(qt.x,qt.y,0),new D.Vector3(nt.x,nt.y,0),new D.Vector3(q.facePoints[0].x,q.facePoints[0].y,0),new D.Vector3(q.facePoints[1].x,q.facePoints[1].y,0),.1)!=null){ce=!0;break}}let{newOriginalPoints:Se}=on($,dt,h.originalPoints),Rt=[],ae=[];if(Se.forEach(tt=>{tt.z>=J.z?Rt.push(tt):tt.z<=$.z&&ae.push(tt)}),Rt.length<20)continue;let G=h.rooftopPz-J.z,ge=J.clone();ge.z+=G;let _e=J.distanceTo(ht),Ke=new D.Vector3().subVectors(ht,J).normalize(),Ue=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(_e)))),ke=_e/Ue,ye=[],Fe=[];for(let tt=0;tt<Ue;tt++)ye.push(new D.Vector3(J.x,J.y,J.z+G/5).addScaledVector(Ke,ke*tt)),ye.push(new D.Vector3(ge.x,ge.y,ge.z-G/5).addScaledVector(Ke,ke*tt));let Oe=ye.length;for(let tt=0;tt<Rt.length;tt++)for(let Mt=0;Mt<ye.length;Mt++)if(new D.Vector3(Rt[tt].x,Rt[tt].y,Rt[tt].z).distanceTo(ye[Mt])<.05){Fe.push(ye[Mt]),ye.splice(Mt,1);break}if(Fe.length/Oe<.5)continue;if(K>.17&&h.length>.5){let tt=Xt(b,$),Mt=Xt(b,dt),qt=Xt(S,$),nt=Xt(S,dt),L=.15,bt=10;if(tt<L||Mt<L)if(Rt.length>10){let Et=new D.Vector3(h.start.x,h.start.y,0),it=new D.Vector3(h.end.x,h.end.y,0),pt=new D.Vector3().subVectors(Et,it).normalize(),It=new D.Vector3,gt=1/0,Ot=-1,yt=!1,ft=!1;for(let j=0;j<e.length;j++){if(j==x)continue;let mt=new D.Vector3(e[j].start.x,e[j].start.y,0),st=new D.Vector3(e[j].end.x,e[j].end.y,0),St=be(Et,it,mt,st,.1),vt=le(Et,it,mt,st);if(St!=null){if(vt&&vt.angle>85){let Ht=St.point.distanceTo(Et),kt=St.point.distanceTo(it);if(Ht<.3){ft=!0,gt=1/0,Ot=-1;break}}continue}if(vt&&vt.angle>85){let kt=new D.Line3(mt,st).closestPointToPoint(Et,!0,It),Lt=Zt(Et,it,kt,Et);if(!Lt||Lt.direction!="same")continue;let re=Et.clone().addScaledVector(pt,bt),Jt=it.clone().addScaledVector(pt.clone().negate(),bt),ie=new D.Vector3().subVectors(st,mt).normalize(),ne=mt.clone().addScaledVector(ie.clone().negate(),.03),ze=st.clone().addScaledVector(ie,.03),ue=be(re,Jt,ne,ze);if(ue==null)continue;let ee=Et.distanceTo(ue.point);ee<gt&&(gt=ee,Ot=j)}else if(vt&&vt.angle<5){let Ht=new D.Vector3($.x,$.y,0),kt=new D.Vector3(dt.x,dt.y,0),Lt=Xt(Ht,mt),re=Xt(Ht,st),Jt=Xt(kt,mt),ie=Xt(kt,st),ne=Zt(Et,it,mt,Ht),ze=!1,ue=r.readLineById(e[j].id);if(ue.checkResults=r.getLineCheckReultsById(e[j].id),e[j].checkResults=ue.checkResults,ue=null,e[j].checkResults){for(let ee=0;ee<e[j].checkResults.length;ee++){let Qe=[];for(let fe=0;fe<e[j].checkResults[ee].allCenterPoints.length;fe++)Qe.push(new D.Vector3(e[j].checkResults[ee].allCenterPoints[fe].x,e[j].checkResults[ee].allCenterPoints[fe].y,0));let Ee=Ne(Qe);if(Ee.length==2){let fe=Xt(Ht,Ee[0]),Dn=Xt(Ht,Ee[1]),In=Xt(kt,Ee[0]),Ln=Xt(kt,Ee[1]);if(fe<.2||Dn<.2||In<.2||Ln<.2){ze=!0;break}}}e[j].checkResults=null}if(ne&&ne.direction=="same"&&!ze&&(Lt<.1||re<.1||Jt<.1||ie<.1)){yt=!0,gt=1/0,Ot=-1;break}}}if(gt!=1/0&><2&&(h.length-K>.2||h.length-K<.02)&><K*2)e[Ot].length>.25&&K+gt>.5&&(Tt=!0,tt<L?(ht=ht.addScaledVector(pt,gt),$=$.addScaledVector(pt,gt)):(J=J.addScaledVector(pt,gt),dt=dt.addScaledVector(pt,gt)));else{if(!yt&&!ft&&h.length-K>.1)continue;if(!yt&&!ft&&h.length-K<.1&&h.length<1.8)continue}}else continue;if(qt<L||nt<L)if(Rt.length>10){let Et=new D.Vector3(h.start.x,h.start.y,0),it=new D.Vector3(h.end.x,h.end.y,0),pt=new D.Vector3().subVectors(it,Et).normalize(),It=new D.Vector3,gt=1/0,Ot=-1,yt=!1,ft=!1;for(let j=0;j<e.length;j++){if(j==x)continue;let mt=new D.Vector3(e[j].start.x,e[j].start.y,0),st=new D.Vector3(e[j].end.x,e[j].end.y,0),St=be(Et,it,mt,st,.03),vt=le(Et,it,mt,st);if(St!=null){if(vt&&vt.angle>85){let Ht=St.point.distanceTo(Et);if(St.point.distanceTo(it)<.3){ft=!0,gt=1/0,Ot=-1;break}}continue}if(vt&&vt.angle>85){let kt=new D.Line3(mt,st).closestPointToPoint(it,!0,It),Lt=Zt(it,Et,kt,it);if(!Lt||Lt.direction!="same")continue;let re=Et.clone().addScaledVector(pt.clone().negate(),bt),Jt=it.clone().addScaledVector(pt,bt),ie=new D.Vector3().subVectors(st,mt).normalize(),ne=mt.clone().addScaledVector(ie.clone().negate(),.03),ze=st.clone().addScaledVector(ie,.03),ue=be(re,Jt,ne,ze);if(ue==null)continue;let ee=it.distanceTo(ue.point);ee<gt&&(gt=ee,Ot=j)}else if(vt&&vt.angle<5){let Ht=new D.Vector3($.x,$.y,0),kt=new D.Vector3(dt.x,dt.y,0),Lt=Xt(Ht,mt),re=Xt(Ht,st),Jt=Xt(kt,mt),ie=Xt(kt,st),ne=Zt(it,Et,mt,Ht),ze=!1,ue=r.readLineById(e[j].id);if(ue.checkResults=r.getLineCheckReultsById(e[j].id),e[j].checkResults=ue.checkResults,ue=null,e[j].checkResults){for(let ee=0;ee<e[j].checkResults.length;ee++){let Qe=[];for(let fe=0;fe<e[j].checkResults[ee].allCenterPoints.length;fe++)Qe.push(new D.Vector3(e[j].checkResults[ee].allCenterPoints[fe].x,e[j].checkResults[ee].allCenterPoints[fe].y,0));let Ee=Ne(Qe);if(Ee.length==2){let fe=Xt(Ht,Ee[0]),Dn=Xt(Ht,Ee[1]),In=Xt(kt,Ee[0]),Ln=Xt(kt,Ee[1]);if(fe<.2||Dn<.2||In<.2||Ln<.2){ze=!0;break}}}e[j].checkResults=null}if(ne&&ne.direction=="same"&&!ze&&(Lt<.1||re<.1||Jt<.1||ie<.1)){yt=!0,gt=1/0,Ot=-1;break}}}if(gt!=1/0&><2&&(h.length-K>.2||h.length-K<.02)&><K*2)e[Ot].length>.25&&K+gt>.5&&(Tt=!0,qt<L?(ht=ht.addScaledVector(pt,gt),$=$.addScaledVector(pt,gt)):(J=J.addScaledVector(pt,gt),dt=dt.addScaledVector(pt,gt)));else{if(!yt&&!ft&&h.length-K>.1)continue;if(!yt&&!ft&&h.length-K<.1&&h.length<1.8)continue}}else continue;K=ht.distanceTo(J)}if(Nt<85&&K>.3||K>.7&&Vt>z-z/2){if(!h.isLine2){if(K<3.5)for(let tt=0;tt<i.length;tt++){let Mt=new D.Vector3(i[tt].doorStartPt.x,i[tt].doorStartPt.y,0),qt=new D.Vector3(i[tt].doorEndPt.x,i[tt].doorEndPt.y,0),nt=new D.Vector3(q.facePoints[0].x,q.facePoints[0].y,0),L=new D.Vector3(q.facePoints[1].x,q.facePoints[1].y,0),bt=q.facePoints[2].z<i[tt].maxZ||Math.abs(q.facePoints[2].z-i[tt].maxZ)<.3,Et=Math.abs(q.facePoints[2].z-i[tt].maxZ)>.2;if(bt){let it=xe(Mt.clone(),qt.clone(),nt.clone(),L.clone(),{distanceThreshold:2});if(it&&it.type=="collinear_gap"){let pt=jt(Mt,qt),It=new D.Line3(new D.Vector3(h.start.x,h.start.y,0),new D.Vector3(h.end.x,h.end.y,0)),gt=new D.Vector3,Ot=It.closestPointToPoint(pt,!0,gt);if(pt.distanceTo(Ot)<.15){let ft=nt.distanceTo(Mt),j=L.distanceTo(Mt);if(ft>.25&&j>.25){let St=nt.distanceTo(qt),vt=L.distanceTo(qt);if(St>.2&&vt>.2)continue}wt=!0,Dt=!0,_t.push(i[tt].index),i[tt].isFind=!0,se=tt,At=n[i[tt].index].isFindBeam,n[i[tt].index].isFindBeam=!0;let mt=new D.Vector3().subVectors(nt,L).normalize(),st=Mt.distanceTo(qt)-it.overlap;j<ft&&mt.negate(),ft>j?(J=q.facePoints[2].clone().addScaledVector(mt,st),ht=q.facePoints[3].clone(),$=ht.clone(),dt=J.clone(),$.z=dt.z=q.facePoints[0].z):(J=q.facePoints[2].clone(),ht=q.facePoints[3].clone().addScaledVector(mt,st),$=ht.clone(),dt=J.clone(),$.z=dt.z=q.facePoints[0].z)}}else if(it&&it.type=="collinear_overlap"&&it.maxPerpendicularDistance<.35){let pt=nt.distanceTo(L),It=qt.distanceTo(Mt);if(Math.abs(pt-it.overlap)<.25||Math.abs(It-it.overlap)<.25){if(It>pt&&Math.abs(It-it.overlap)>1){let gt=nt.distanceTo(Mt),Ot=nt.distanceTo(qt),yt=L.distanceTo(Mt),ft=L.distanceTo(qt),j=gt<Ot?gt:Ot,mt=yt<ft?yt:ft,st=new D.Vector3().subVectors(nt,L).normalize(),St=It-it.overlap;j<mt?(st.negate(),J=q.facePoints[2].clone().addScaledVector(st,St),ht=q.facePoints[3].clone(),$=ht.clone(),dt=J.clone(),$.z=dt.z=q.facePoints[0].z):(J=q.facePoints[2].clone(),ht=q.facePoints[3].clone().addScaledVector(st,St),$=ht.clone(),dt=J.clone(),$.z=dt.z=q.facePoints[0].z)}K>1.5&&(wt=!0,Dt=!0,_t.push(i[tt].index),i[tt].isFind=!0,At=n[i[tt].index].isFindBeam,n[i[tt].index].isFindBeam=!0,se=tt)}}}}if(!Dt&&K<1.5)for(let tt=0;tt<i.length;tt++){if(i[tt].inWall)continue;let Mt=new D.Vector3(i[tt].doorStartPt.x,i[tt].doorStartPt.y,0),qt=new D.Vector3(i[tt].doorEndPt.x,i[tt].doorEndPt.y,0),nt=new D.Vector3(ht.x,ht.y,0),L=new D.Vector3(J.x,J.y,0),bt=new D.Vector3().subVectors(Mt,qt).normalize(),Et=new D.Vector3().subVectors(nt,L).normalize(),it=.25,pt=Mt.clone().addScaledVector(bt,it),It=qt.clone().addScaledVector(bt.clone().negate(),it),gt=nt.clone().addScaledVector(Et,it),Ot=L.clone().addScaledVector(Et.clone().negate(),it);if(Zt(pt,It,gt,Ot).isParallel)continue;let ft=be(pt,It,gt,Ot),j=!0,mt=Mt.distanceTo(nt),st=Mt.distanceTo(L),St=qt.distanceTo(nt),vt=qt.distanceTo(L);if((mt<c||st<c||St<c||vt<c||ft)&&j){let kt=new D.Line3(nt,L);if(mt<c||St<c)if(Ft=nt.clone(),mt<c){let Lt=kt.closestPointToPoint(qt,!1,new D.Vector3);Pt=new D.Vector3().subVectors(qt,Lt).normalize()}else{let Lt=kt.closestPointToPoint(Mt,!1,new D.Vector3);Pt=new D.Vector3().subVectors(Mt,Lt).normalize()}else if(st<c||vt<c)if(Ft=L.clone(),st<c){let Lt=kt.closestPointToPoint(qt,!1,new D.Vector3);Pt=new D.Vector3().subVectors(qt,Lt).normalize()}else{let Lt=kt.closestPointToPoint(Mt,!1,new D.Vector3);Pt=new D.Vector3().subVectors(Mt,Lt).normalize()}else if(ft){let Lt=ft.point.distanceTo(nt),re=ft.point.distanceTo(L),Jt=ft.point.distanceTo(pt),ie=ft.point.distanceTo(It);if(Lt<re?Ft=nt.clone():Ft=L.clone(),Jt<ie){let ne=kt.closestPointToPoint(It,!1,new D.Vector3);Pt=new D.Vector3().subVectors(It,ne).normalize()}else{let ne=kt.closestPointToPoint(pt,!1,new D.Vector3);Pt=new D.Vector3().subVectors(pt,ne).normalize()}}At=n[i[tt].index].isFindBeam,n[i[tt].index].isFindBeam=!0,wt=!0,i[tt].isFind=!0,se=tt}}}(wt||ce||Math.abs(Vt-z)>.1&&Vt>z/3&&K>.3)&&(Gt=!0)}}if(Gt){{let nt=new D.Vector3().subVectors($,dt),L=new D.Vector3().subVectors(dt,$),bt=1/0,Et=1/0,it=$.clone(),pt=dt.clone(),It=[],gt=[],Ot=new D.Line3(J,ht),yt=new D.Vector3,ft=999999;if(h.originalPoints.forEach(j=>{if(j.z-$.z<Vt/2+.1&&j.z-$.z>Vt/2-.1&&It.push(j),j.z>J.z){let mt=Ot.closestPointToPoint(j,!0,yt),st=new D.Vector3().subVectors(mt,J),St=new D.Vector3().subVectors(mt,ht),vt=Qt(nt,St),Ht=Qt(L,st);vt&&vt.parallel&&!vt.sameDirection&&Ht&&Ht.parallel&&!Ht.sameDirection&>.push(j)}}),It.length>0){let{newProjectPoints:j}=on($,dt,It);for(let mt of j)mt.z=$.z;j.forEach(mt=>{let st=new D.Vector3(mt.x,mt.y,$.z),St=new D.Vector3().subVectors(st,dt),vt=new D.Vector3().subVectors(st,$),Ht=Qt(nt,vt),kt=Qt(L,St);if(Ht&&Ht.parallel&&Ht.sameDirection){let Lt=st.distanceTo($);Lt<bt&&(bt=Lt,it=st)}else if(kt&&kt.parallel&&kt.sameDirection){let Lt=st.distanceTo(dt);Lt<Et&&(Et=Lt,pt=st)}})}if(it.equals($)||($=it,ht=new D.Vector3($.x,$.y,ht.z)),pt.equals(dt)||(dt=pt,J=new D.Vector3(dt.x,dt.y,J.z)),gt.length>10){let{newOnLinePoints:j}=on(ht,J,gt);for(let mt=0;mt<j.length;mt++){let St=Ot.closestPointToPoint(j[mt],!0,yt).distanceTo(j[mt]);St>.02&&ft>St&&(ft=St)}J.z+=ft,ht.z+=ft,Vt+=ft}}let ce=!1;for(let nt=0;nt<g.length;nt++){let L=xe(g[nt].start,g[nt].end,$,dt);L&&L.type=="collinear_overlap"&&L.maxPerpendicularDistance<.07&&(ce=!0)}if(ce){se!=-1&&(At||(n[i[se].index].isFindBeam=!1,i[se].isFind=!1));continue}let Se=dt.distanceTo($);if(Se<.4&&!wt||Se<.3&&wt)continue;u.includes(x)||u.push(x);let Rt="",ae=wt?"singleDoor":"";ae=Dt?"pullOutDoor":ae;let G={id:l,beamStart:J,beamEnd:ht,beamHeight:h.rooftopPz-J.z,doorStart:$,doorEnd:dt,doorHeight:Vt,nearId:-1,type:Rt,isExtend:Tt,isDoor:wt,isPullOutDoor:Dt,pcbDoorIndexs:_t,beamNearWallVec:new D.Vector3(0,0,0),doorType:ae,doorOpenEndPoint:Ft,doorOpenVector:Pt,lineIsOnlyBeam:!1};if(G.beamHeight<.1)continue;let ge=1/0,_e=!1,Ke=new D.Vector3,Ue=new D.Vector3,ke=-1,ye=-1,Fe=-1,Oe=!1,Je=!1;if(!_e){let nt=new D.Line3($.clone(),dt.clone()),L=-1;for(let bt=0;bt<e.length;bt++){if(e[bt].length<.5||bt==x)continue;let Et=new D.Vector3(e[bt].start.x,e[bt].start.y,e[bt].start.z),it=new D.Vector3(e[bt].end.x,e[bt].end.y,e[bt].end.z),pt=xe(Et,it,$,dt),It=Zt(Et,it,$,dt);if(pt&&pt.maxPerpendicularDistance<.5){if(It&&It.isParallel){let st=new D.Line3(Et,it),St=new D.Vector3($.x,$.y,Et.z),vt=st.closestPointToPoint(St,!0,new D.Vector3),Ht=le(vt,St,$,dt);Ht&&Ht.angle>85&&(G.beamNearWallVec=new D.Vector3().subVectors(vt,St).normalize(),G.beamStart.z>e[bt].rooftopPz-.03&&K>1?Je=!0:Je=!1)}let gt=[],Ot=r.readLineById(e[bt].id);Ot.originalPoints=r.getOriginalPointsById(e[bt].id),e[bt].originalPoints=Ot.originalPoints,Ot=null,e[bt].originalPoints.forEach(st=>{st.z>$.z+.2&&st.z<$.z+Vt/2&>.push(new D.Vector3(st.x,st.y,$.z))}),e[bt].originalPoints=null;let yt=new D.Vector3,ft=[],j=[];for(let st=0;st<gt.length;st++){let St=nt.closestPointToPoint(gt[st],!0,yt);St.distanceTo(gt[st])<.15&&(ft.push(gt[st]),j.push(St.clone()))}for(let st=0;st<j.length;st++)jn(nt,j[st])&&ft.push(j[st]);if(ft=j,ft=$n(ft),ft.length<150)continue;let mt=Ne(ft);if(mt.length==2){let st=mt[0].distanceTo(mt[1]);if(Math.abs(st-nt.distance())<.3){L=pt.maxPerpendicularDistance;let St=new D.Line3(Et,it),vt=new D.Vector3($.x,$.y,Et.z),Ht=St.closestPointToPoint(vt,!0,new D.Vector3);if(G.beamNearWallVec=new D.Vector3().subVectors(Ht,vt).normalize(),G.beamStart.z>e[bt].rooftopPz-.03&&K>1)Je=!0,Oe=!0;else if(ce=!0,se!=-1&&(At||(n[i[se].index].isFindBeam=!1,i[se].isFind=!1)),ye!=-1&&Fe!=-1){let kt=e[ye].doorAndBeamData[Fe];kt.nearId=-1}break}}if(ce)break}else pt&&pt.type=="collinear_overlap"&&pt.maxPerpendicularDistance>.3&&pt.maxPerpendicularDistance<.7&&(Oe=!0)}if(ce){if(K<1.5||L<.08)continue;Oe=!0}}let tt=!1;if(ke!=-1)for(let nt=0;nt<a.length&&!(a[nt].length==1&&(a[nt][0].id==l?(a[nt].push({id:ke,beamStart:Ke,beamEnd:Ue}),tt=!0):a[nt][0].id==ke&&(a[nt].push({id:l,beamStart:J,beamEnd:ht}),tt=!0),tt));nt++);tt||a.push([{id:l,beamStart:J,beamEnd:ht}]);let Mt=G.doorStart.distanceTo(G.doorEnd),qt=wn(h.originalPoints);if(G.lineIsOnlyBeam=qt.minZ>h.start.z&&qt.minZ-h.start.z>1,wt?Rt="door":Mt>1.5||Tt?Rt="beam":Rt=Oe&&Mt>1?"beam":"hole",Rt!="beam"&&e[x].isLine2)continue;G.type=Rt,G.wallBelowBeam=Je;for(let nt=0;nt<f.length;nt++){let L=e[f[nt].linesIndex].doorAndBeamData[f[nt].doorIndex];if(L.nearId!=-1||G.type=="beam"&&L.type!="beam"||G.type!="beam"&&L.type=="beam")continue;let bt=Zt(J.clone(),ht.clone(),L.beamStart.clone(),L.beamEnd.clone());if(bt&&bt.isParallel){let Et=J.distanceTo(ht),it=L.beamStart.distanceTo(L.beamEnd),pt=new D.Line3(J.clone(),ht.clone());pt.start.z=0,pt.end.z=0;let It=jt(L.beamStart,L.beamEnd,!0);it>Et&&(pt.start=new D.Vector3(L.beamStart.x,L.beamStart.y,0),pt.end=new D.Vector3(L.beamEnd.x,L.beamEnd.y,0),It=jt(J,ht,!0));let gt=new D.Vector3,Ot=pt.closestPointToPoint(It,!0,gt),yt=Ot.distanceTo(It),ft=new D.Vector3().subVectors(It,Ot).normalize(),j=ft.clone().negate(),mt=It.clone().addScaledVector(j,yt+.1),st=be(pt.start,pt.end,It,mt),St=!wt&&!L.isDoor&&(Et>it*2||it>Et*2);if(yt<.4&&st!=null&&!St){let vt=!1;for(let Jt=0;Jt<h.doorAndBeamData.length;Jt++)if(h.doorAndBeamData[Jt].id==L.id){vt=!0;break}if(vt)continue;L.nearId=l,G.nearId=L.id;let Ht=.8;(L.isDoor||G.isDoor)&&(L.isDoor=!0,G.isDoor=!0),L.doorType!=""?G.doorType=L.doorType:G.doorType!=""&&(L.doorType=G.doorType),L.isPullOutDoor?G.isPullOutDoor=!0:G.isPullOutDoor&&(L.isPullOutDoor=!0);let kt=_t.some(Jt=>L.pcbDoorIndexs.includes(Jt)),Lt=!1,re=!1;if(G.type=="beam"&&L.type=="beam"){let Jt=r.readLineById(e[f[nt].linesIndex].id);Jt.originalPoints=r.getOriginalPointsById(e[f[nt].linesIndex].id),e[f[nt].linesIndex].originalPoints=Jt.originalPoints,Jt=null;let ie=wn(e[f[nt].linesIndex].originalPoints),ne=wn(h.originalPoints);e[f[nt].linesIndex].originalPoints=null,ie.minZ>e[f[nt].linesIndex].start.z&&ie.minZ-e[f[nt].linesIndex].start.z>1&&ne.minZ>h.start.z&&ne.minZ-h.start.z>1&&(Lt=Et>it,re=Et<it,it>Et&&(G.isExtend=!0),Et>it&&(e[f[nt].linesIndex].isExtend=!0))}Et<it&&!re||Lt?(Lt&&(j=j.negate(),ft=ft.negate()),Et>Ht&&!L.isPullOutDoor?(L.beamStart=J.clone().addScaledVector(j,yt),L.beamEnd=ht.clone().addScaledVector(j,yt),L.doorStart=$.clone().addScaledVector(j,yt),L.doorEnd=dt.clone().addScaledVector(j,yt),L.doorHeight=G.doorHeight,L.beamStart.z=L.beamEnd.z=L.doorStart.z+L.doorHeight,L.doorOpenEndPoint=G.doorOpenEndPoint.clone(),L.doorOpenVector=G.doorOpenVector.clone()):!Dt||Dt&&L.isPullOutDoor&&kt?(G.beamStart=L.beamStart.clone().addScaledVector(ft,yt),G.beamEnd=L.beamEnd.clone().addScaledVector(ft,yt),G.doorStart=L.doorStart.clone().addScaledVector(ft,yt),G.doorEnd=L.doorEnd.clone().addScaledVector(ft,yt),G.doorHeight=L.doorHeight,G.beamStart.z=G.beamEnd.z=G.doorStart.z+G.doorHeight,G.doorOpenEndPoint=L.doorOpenEndPoint.clone(),G.doorOpenVector=L.doorOpenVector.clone()):(L.beamStart=J.clone().addScaledVector(j,yt),L.beamEnd=ht.clone().addScaledVector(j,yt),L.doorStart=$.clone().addScaledVector(j,yt),L.doorEnd=dt.clone().addScaledVector(j,yt),L.doorHeight=G.doorHeight,L.beamStart.z=L.beamEnd.z=L.doorStart.z+L.doorHeight,L.doorOpenEndPoint=G.doorOpenEndPoint.clone(),L.doorOpenVector=G.doorOpenVector.clone())):(Et>it&&!Lt||re)&&(re&&(j=j.negate(),ft=ft.negate()),it>Ht&&!Dt?(G.beamStart=L.beamStart.clone().addScaledVector(j,yt),G.beamEnd=L.beamEnd.clone().addScaledVector(j,yt),G.doorStart=L.doorStart.clone().addScaledVector(j,yt),G.doorEnd=L.doorEnd.clone().addScaledVector(j,yt),G.doorHeight=L.doorHeight,G.beamStart.z=G.beamEnd.z=G.doorStart.z+G.doorHeight,G.doorOpenEndPoint=L.doorOpenEndPoint.clone(),G.doorOpenVector=L.doorOpenVector.clone()):!L.isPullOutDoor||Dt&&L.isPullOutDoor&&kt?(L.beamStart=J.clone().addScaledVector(ft,yt),L.beamEnd=ht.clone().addScaledVector(ft,yt),L.doorStart=$.clone().addScaledVector(ft,yt),L.doorEnd=dt.clone().addScaledVector(ft,yt),L.doorHeight=G.doorHeight,L.beamStart.z=L.beamEnd.z=L.doorStart.z+L.doorHeight,L.doorOpenEndPoint=G.doorOpenEndPoint.clone(),L.doorOpenVector=G.doorOpenVector.clone()):(G.beamStart=L.beamStart.clone().addScaledVector(j,yt),G.beamEnd=L.beamEnd.clone().addScaledVector(j,yt),G.doorStart=L.doorStart.clone().addScaledVector(j,yt),G.doorEnd=L.doorEnd.clone().addScaledVector(j,yt),G.doorHeight=L.doorHeight,G.beamStart.z=G.beamEnd.z=G.doorStart.z+G.doorHeight,G.doorOpenEndPoint=L.doorOpenEndPoint.clone(),G.doorOpenVector=L.doorOpenVector.clone())),ke=G.nearId,Ke=L.beamStart.clone(),Ue=L.beamEnd.clone(),_e=!0,ye=f[nt].linesIndex,Fe=f[nt].doorIndex;break}}}if(G.nearId!=-1&&Rt=="hole"){let nt=!1;for(let L=0;L<e.length;L++)if(e[L].doorAndBeamData){for(let bt=0;bt<e[L].doorAndBeamData.length;bt++)if(e[L].doorAndBeamData[bt].nearId==l&&e[L].doorAndBeamData[bt].type=="beam"){e[L].doorAndBeamData[bt].type=Rt,nt=!0;break}if(nt)break}}if(h.doorAndBeamIdToCheckResults.push([v.index,l]),h.doorAndBeamData.push(G),f.push({linesIndex:x,doorIndex:h.doorAndBeamData.length-1}),g.push({start:$,end:dt}),l++,Dt&&K<2)break}}}let M=h.length*(h.rooftopPz-h.start.z);h.completePointAreaPercentage=V/M*100,h.checkResults=null,h.originalPoints=null}if(u.length>1)for(let x=0;x<u.length;x++){let h=[];for(let p=0;p<e[u[x]].doorAndBeamData.length;p++){let E=!1;if(e[u[x]].doorAndBeamData[p].type==="beam"&&(e[u[x]].doorAndBeamData[p].beamNearWallVec.x==0&&e[u[x]].doorAndBeamData[p].beamNearWallVec.y==0&&e[u[x]].doorAndBeamData[p].beamNearWallVec.z==0&&e[u[x]].doorAndBeamData[p].nearId==-1||!e[u[x]].doorAndBeamData[p].wallBelowBeam&&e[u[x]].doorAndBeamData[p].nearId==-1)&&(e[u[x]].doorAndBeamData[p].lineIsOnlyBeam?E=!0:e[u[x]].doorAndBeamData[p].type="hole"),!E){let w=e[u[x]].doorAndBeamData[p].doorStart.clone(),R=e[u[x]].doorAndBeamData[p].doorEnd.clone();w.z=R.z=0;let b=w.distanceTo(R);for(let S=0;S<u.length;S++)if(x!=S)for(let z=0;z<e[u[S]].doorAndBeamData.length;z++){let V=e[u[S]].doorAndBeamData[z].doorStart.clone(),M=e[u[S]].doorAndBeamData[z].doorEnd.clone();V.z=M.z=0;let v=V.distanceTo(M),B=xe(w,R,V,M);if(B.type=="collinear_overlap"&&B.maxPerpendicularDistance<.2){let I=new D.Line3(V,M),_=jt(w,R),k=I.closestPointToPoint(_,!0,new D.Vector3),C=_.distanceTo(k);if(Math.abs(b-B.overlap)<.1&&C<.04){e[u[S]].doorAndBeamData[z].nearId==e[u[x]].doorAndBeamData[p].id&&(e[u[S]].doorAndBeamData[z].nearId=-1),E=!0;break}}}}if(E){for(let w=0;w<e[u[x]].doorAndBeamIdToCheckResults.length;w++)if(e[u[x]].doorAndBeamIdToCheckResults[1]==e[u[x]].doorAndBeamData[p].id){e[u[x]].doorAndBeamIdToCheckResults.splice(w,1);break}}E||h.push(e[u[x]].doorAndBeamData[p])}h.length!=e[u[x]].doorAndBeamData.length&&(e[u[x]].doorAndBeamData=h)}let m=.65,d=2,y=[],T=[];for(let x=0;x<i.length;x++){if(i[x].isFind||i[x].inWall)continue;let h=new D.Vector3(i[x].doorStartPt.x,i[x].doorStartPt.y,0),p=new D.Vector3(i[x].doorEndPt.x,i[x].doorEndPt.y,0),E=new D.Vector3().subVectors(h,p).normalize();for(let w=0;w<e.length;w++){if(e[w].length<.7||e[w].completePointAreaPercentage>60)continue;let R=new D.Vector3(e[w].start.x,e[w].start.y,0),b=new D.Vector3(e[w].end.x,e[w].end.y,0),S=new D.Vector3().subVectors(R,b).normalize(),z=.3,V=h.clone().addScaledVector(E,z),M=p.clone().addScaledVector(E.clone().negate(),z),v=R.clone().addScaledVector(S,z),B=b.clone().addScaledVector(S.clone().negate(),z),I=be(V,M,v,B),_=Zt(V,M,v,B),k=h.distanceTo(R)>p.distanceTo(R)?p:h,C=k.distanceTo(R),H=k.distanceTo(b);if((C<c||H<c)&&_&&!_.isParallel){let W=h.distanceTo(R),Y=h.distanceTo(b),X=W<Y?R:b,Q=!1;for(let U=0;U<e.length;U++){if(U==w||y.includes(U)||e[U].length<.7)continue;let lt=new D.Vector3(e[U].start.x,e[U].start.y,0),ot=new D.Vector3(e[U].end.x,e[U].end.y,0),ut=new D.Vector3().subVectors(lt,ot).normalize(),Z=ut.clone().negate(),et=lt.clone().addScaledVector(ut,5),q=ot.clone().addScaledVector(Z,5),K=le(R,b,lt,ot),Vt=xe(R,b,lt,ot),Nt=be(R,b,et,q),$t=!0;if(Nt!=null&&($t=Nt.point.distanceTo(R)<c||Nt.point.distanceTo(b)<c),(K&&K.angle>85||Vt&&Vt.type=="collinear_gap")&&$t){let Gt=new D.Line3(R,b),wt=new D.Vector3,At=Gt.closestPointToPoint(lt,!0,wt),Ft=Gt.closestPointToPoint(ot,!0,wt),Pt=At.distanceTo(lt),Dt=Ft.distanceTo(ot),_t,J;if(Pt>Dt&&Dt>m)_t=ot,J=Ft;else if(Pt<Dt&&Pt>m)_t=lt,J=At;else continue;if(Pt=X.distanceTo(lt),Dt=X.distanceTo(ot),Pt>d&&Dt>d)continue;let ht=Zt(_t,J,lt,ot),$=Zt(_t,J,V,M);if($&&$.isParallel||!ht||!ht.isParallel)continue;let dt=xe(h,p,_t,J);if(dt&&dt.type=="collinear_overlap"&&dt.maxPerpendicularDistance<.2)continue;_t.z=J.z=e[U].start.z;let Tt=!1;for(let Rt=0;Rt<T.length;Rt++){let ae=xe(T[Rt].start,T[Rt].end,_t,J);if(ae&&ae.type=="collinear_overlap"&&ae.maxPerpendicularDistance<.2){Tt=!0;break}}if(Tt)continue;for(let Rt=0;Rt<e.length;Rt++){if(e[Rt].length<.5)continue;let ae=new D.Vector3(e[Rt].start.x,e[Rt].start.y,e[Rt].start.z),G=new D.Vector3(e[Rt].end.x,e[Rt].end.y,e[Rt].end.z),ge=xe(ae,G,_t,J);if(ge&&ge.type=="collinear_overlap"&&ge.maxPerpendicularDistance<.1){Tt=!0;break}}if(Tt)continue;T.push({start:_t,end:J}),y.push(U);let se=e[U].rooftopPz-e[U].start.z,ce=e[w].rooftopPz-e[w].start.z,Se=se<ce?se:ce;e[U].doorAndBeamData||(e[U].doorAndBeamData=[]),e[U].doorAndBeamData.push({id:l,beamStart:_t,beamEnd:J,beamHeight:Se,doorStart:_t,doorEnd:J,doorHeight:Se,nearId:-1,type:"onlyDoor",isDoor:!0,beamNearWallVec:new D.Vector3(0,0,0)}),n[i[x].index].isFindBeam=!0,n[i[x].index].isFindOnlyDoor=!0,a.push([{id:l,beamStart:_t,beamEnd:J}]),l++,Q=!0;break}}if(Q)break}}}let P=[];for(let x=0;x<e.length;x++)e[x].isLine2||P.push(e[x]),e[x].isLine2&&e[x].doorAndBeamData.length!=0&&P.push(e[x]);return e.length=0,e.push(...P),{lines:e,beamGroup:a}},ar=async e=>{Ho(e),Kn(e);let t=new rn(e);for(let n=0;n<e.length;n++){let s=e[n],o=new D.Vector3(s.start.x,s.start.y,s.start.z),r=new D.Vector3(s.end.x,s.end.y,s.end.z),i=new D.Line3(o.clone(),r.clone()),l=-1;for(let f=0;f<s.doorAndBeamData.length;f++){let u=s.doorAndBeamData[f],g=u.doorHeight;u.isRebuild=!1;let a=!1,c=!1;if(!(u.nearId!=-1||u.type!="beam")){for(let m=0;m<e.length;m++){if(e[m].length<.5||m==n)continue;let d=new D.Vector3(e[m].start.x,e[m].start.y,e[m].start.z),y=new D.Vector3(e[m].end.x,e[m].end.y,e[m].end.z),T=xe(d,y,o,r),P=Zt(d,y,o,r);if(T&&T.maxPerpendicularDistance<.5){if(P&&P.isParallel){let b=new D.Line3(d,y),S=new D.Vector3(o.x,o.y,d.z),z=b.closestPointToPoint(S,!0,new D.Vector3),V=le(z,S,o,r);V&&V.angle>85&&(u.beamNearWallVec=new D.Vector3().subVectors(z,S).normalize())}let x=[],h=t.readLineById(e[m].id);h.originalPoints=t.getOriginalPointsById(e[m].id),e[m].originalPoints=h.originalPoints,h=null,e[m].originalPoints.forEach(b=>{b.z>o.z+.2&&b.z<o.z+g/2&&x.push(new D.Vector3(b.x,b.y,o.z))}),e[m].originalPoints=null;let p=new D.Vector3,E=[],w=[];for(let b=0;b<x.length;b++){let S=i.closestPointToPoint(x[b],!0,p);S.distanceTo(x[b])<.15&&(E.push(x[b]),w.push(S.clone()))}for(let b=0;b<w.length;b++)jn(i,w[b])&&E.push(w[b]);if(E=w,E=$n(E),E.length<150)continue;let R=Ne(E);if(R.length==2){let b=R[0].distanceTo(R[1]);if(Math.abs(b-i.distance())<.3){l=T.maxPerpendicularDistance;let S=new D.Line3(d,y),z=new D.Vector3(o.x,o.y,d.z),V=S.closestPointToPoint(z,!0,new D.Vector3);u.beamNearWallVec=new D.Vector3().subVectors(V,z).normalize(),u.beamStart.z>e[m].rooftopPz-.03&&length>1?c=!0:a=!0;break}}if(a)break}else T&&T.type=="collinear_overlap"&&T.maxPerpendicularDistance>.3&&T.maxPerpendicularDistance<.7&&(c=!0)}if(a){if(length<1.8||l<.2)continue;c=!0}c||(u.isRebuild=!0)}}}t.close()};import*as xt from"three";import"three/examples/jsm/utils/BufferGeometryUtils.js";var Bo=(e,t={})=>{let n=t.eps??1e-6,s=t.project??(P=>({x:P.x,y:P.z})),o=t.skipSplit??!1,r=t.insideAreaSign??"positive",i=o?e.map((P,x)=>({start:bn(P.start),end:bn(P.end),uuid:P.uuid,sourceIndex:x,sourceSegment:P})):ur(e,s,n),l=[],f=new Map;function u(P){let x=Math.round(P.x/n),h=Math.round(P.y/n);return`${x},${h}`}function g(P){let x=u(P);if(f.has(x))return f.get(x);let h=l.length;return l.push({id:h,x:P.x,y:P.y}),f.set(x,h),h}let a=[],c=new Map;for(let P of i){let x=s(P.start),h=s(P.end);if(_o(x,h)<n*n)continue;let p=g(x),E=g(h);if(p===E)continue;let w=p<E?`${p}_${E}`:`${E}_${p}`;if(c.has(w))continue;let R=a.length;a.push({id:R,a:p,b:E,uuid:P.uuid,sourceIndex:P.sourceIndex,sourceSegment:P.sourceSegment||P}),c.set(w,R)}let m=[],d=Array.from({length:l.length},()=>[]);function y(P,x,h,p,E){let w=l[P],R=l[x],b=m.length,S=Math.atan2(R.y-w.y,R.x-w.x),z={id:b,from:P,to:x,twin:null,next:null,angle:S,edgeId:h,uuid:p,sourceIndex:E,visited:!1};return m.push(z),d[P].push(b),b}for(let P of a){let x=y(P.a,P.b,P.id,P.uuid,P.sourceIndex),h=y(P.b,P.a,P.id,P.uuid,P.sourceIndex);m[x].twin=h,m[h].twin=x}for(let P of d)P.sort((x,h)=>m[x].angle-m[h].angle);for(let P of m){let x=d[P.to],h=P.twin,p=x.indexOf(h);if(p===-1)continue;let E=(p-1+x.length)%x.length;P.next=x[E]}let T=[];for(let P of m){if(P.visited)continue;let x=[],h=[],p=P.id,E=0,w=m.length+10;for(;;){let M=m[p];if(!M||M.visited)break;if(M.visited=!0,x.push(p),h.push(M.from),p=M.next,E++,E>w){console.warn("\u534A\u8FB9\u904D\u5386\u5F02\u5E38\uFF0C\u53EF\u80FD\u5B58\u5728\u975E\u5E73\u9762\u56FE\u3001\u91CD\u590D\u7EBF\u3001\u60AC\u6302\u7EBF\u6216\u810F\u6570\u636E");break}}if(x.length<3)continue;let R=h.map(M=>l[M]),b=hr(R),S=!1;if(r==="positive"?S=b>n:S=b<-n,!S)continue;let z=x.map(M=>m[M].uuid),V=x.map(M=>m[M].sourceIndex);T.push({uuids:z,area:Math.abs(b),lineIndexes:V})}return T};function ur(e,t,n=1e-6){let s=[];for(let o=0;o<e.length;o++){let r=e[o],i=t(r.start),l=t(r.end),f=[{t:0,point:bn(r.start)},{t:1,point:bn(r.end)}];for(let g=0;g<e.length;g++){if(o===g)continue;let a=e[g],c=t(a.start),m=t(a.end),d=fr(i,l,c,m,n);d&&d.t>n&&d.t<1-n&&f.push({t:d.t,point:dr(r.start,r.end,d.t)})}f.sort((g,a)=>g.t-a.t);let u=[];for(let g of f)(u.length===0||Math.abs(g.t-u[u.length-1].t)>n)&&u.push(g);for(let g=0;g<u.length-1;g++){let a=u[g].point,c=u[g+1].point,m=t(a),d=t(c);_o(m,d)<n*n||s.push({start:a,end:c,uuid:r.uuid,sourceIndex:o,sourceSegment:r})}}return s}function fr(e,t,n,s,o=1e-6){let r={x:t.x-e.x,y:t.y-e.y},i={x:s.x-n.x,y:s.y-n.y},l={x:n.x-e.x,y:n.y-e.y},f=Un(r,i);if(Math.abs(f)<o)return null;let u=Un(l,i)/f,g=Un(l,r)/f;return u>=-o&&u<=1+o&&g>=-o&&g<=1+o?{t:u,u:g,point:{x:e.x+u*r.x,y:e.y+u*r.y}}:null}function Un(e,t){return e.x*t.y-e.y*t.x}function _o(e,t){let n=e.x-t.x,s=e.y-t.y;return n*n+s*s}function hr(e){let t=0;for(let n=0;n<e.length;n++){let s=e[n],o=e[(n+1)%e.length];t+=s.x*o.y-o.x*s.y}return t/2}function dr(e,t,n){return e&&typeof e.clone=="function"&&typeof e.lerp=="function"?e.clone().lerp(t,n):{x:e.x+(t.x-e.x)*n,y:e.y+(t.y-e.y)*n,z:e.z!==void 0&&t.z!==void 0?e.z+(t.z-e.z)*n:void 0}}function bn(e){return e&&typeof e.clone=="function"?e.clone():{x:e.x,y:e.y,z:e.z}}var mr=(e,t)=>{if(!e||e.length<=0)return;let n={rectangles:[],threeEdgeRect:[]},s=new Set,o=.1,r=1.2,i=.15,l=2,f=80,u=95;if(!e[0].uuid){let c=1e4;for(let m=0;m<e.length;m++)e[m].uuid=c++}let g=[];for(let c=0;c<e.length;c++)g.push({start:e[c].start,end:e[c].end,uuid:e[c].uuid});let a=Bo(g,{eps:1e-5,returnDetail:!0,project:c=>({x:c.x,y:c.y})});for(let c=0;c<a.length;c++){if(a[c].uuids.length<4||a[c].area<i||a[c].area>l)continue;let m=!1;for(let d=0;d<a[c].lineIndexes.length;d++){let y=e[a[c].lineIndexes[d]].length;if(y<o||y>r)break;let T=new xt.Vector3(e[a[c].lineIndexes[d]].start.x,e[a[c].lineIndexes[d]].start.y,e[a[c].lineIndexes[d]].start.z),P=new xt.Vector3(e[a[c].lineIndexes[d]].end.x,e[a[c].lineIndexes[d]].end.y,e[a[c].lineIndexes[d]].end.z),x=!1,h=new xt.Vector3(0,0,0);for(let p=d+1;p<a[c].lineIndexes.length;p++){let E=e[a[c].lineIndexes[p]].length;if(E<o||E>r)break;let w=new xt.Vector3(e[a[c].lineIndexes[p]].start.x,e[a[c].lineIndexes[p]].start.y,e[a[c].lineIndexes[p]].start.z),R=new xt.Vector3(e[a[c].lineIndexes[p]].end.x,e[a[c].lineIndexes[p]].end.y,e[a[c].lineIndexes[p]].end.z),b=Zt(T,P,w,R);if(b&&b.isParallel){if(y+E>r){x=!0;break}y+=E;let z=rt(T,w),V=rt(T,R),M=rt(P,w),v=rt(P,R);z?(T=P.clone(),P=R.clone()):V?(T=P.clone(),P=w.clone()):M?P=R.clone():v&&(P=w.clone());continue}let S=le(T,P,w,R);if(!S||S.angle<f||S.angle>u){x=!0;break}for(let z=p+1;z<a[c].lineIndexes.length;z++){let V=e[a[c].lineIndexes[z]].length;if(V<o||V>r)break;let M=new xt.Vector3(e[a[c].lineIndexes[z]].start.x,e[a[c].lineIndexes[z]].start.y,e[a[c].lineIndexes[z]].start.z),v=new xt.Vector3(e[a[c].lineIndexes[z]].end.x,e[a[c].lineIndexes[z]].end.y,e[a[c].lineIndexes[z]].end.z),B=Zt(w,R,M,v);if(B&&B.isParallel){if(E+V>r){x=!0;break}E+=V;let _=rt(w,M),k=rt(w,v),C=rt(R,M),H=rt(R,v);_?(w=R.clone(),R=v.clone()):k?(w=R.clone(),R=M.clone()):C?R=v.clone():H&&(R=M.clone());continue}let I=le(w,R,M,v);if(!I||I.angle<f||I.angle>u){x=!0;break}for(let _=z+1;_<a[c].lineIndexes.length;_++){let k=e[a[c].lineIndexes[_]].length;if(k<o||k>r)break;let C=new xt.Vector3(e[a[c].lineIndexes[_]].start.x,e[a[c].lineIndexes[_]].start.y,e[a[c].lineIndexes[_]].start.z),H=new xt.Vector3(e[a[c].lineIndexes[_]].end.x,e[a[c].lineIndexes[_]].end.y,e[a[c].lineIndexes[_]].end.z),F=Zt(M,v,C,H);if(F&&F.isParallel){if(V+k>r){x=!0;break}V+=k;let lt=rt(M,C),ot=rt(M,H),ut=rt(v,C),Z=rt(v,H);lt?(M=v.clone(),v=H.clone()):ot?(M=v.clone(),v=C.clone()):ut?v=H.clone():Z&&(v=C.clone());continue}let W=le(M,v,C,H);if(!W||W.angle<f||W.angle>u){x=!0;break}let Y=rt(C,T),X=rt(C,P),Q=rt(H,T),U=rt(H,P);if(Y||X||Q||U)m=!0;else for(let lt=_+1;lt<a[c].lineIndexes.length;lt++){let ot=e[a[c].lineIndexes[lt]].length;if(ot<o||ot>r)break;let ut=new xt.Vector3(e[a[c].lineIndexes[lt]].start.x,e[a[c].lineIndexes[lt]].start.y,e[a[c].lineIndexes[lt]].start.z),Z=new xt.Vector3(e[a[c].lineIndexes[lt]].end.x,e[a[c].lineIndexes[lt]].end.y,e[a[c].lineIndexes[lt]].end.z),et=Zt(C,H,ut,Z);if(et&&et.isParallel){if(k+ot>r){x=!0;break}k+=ot;let q=rt(C,ut),K=rt(C,Z),Vt=rt(H,ut),Nt=rt(H,Z);if(q)C=H.clone(),H=Z.clone();else if(K)C=H.clone(),H=ut.clone();else if(Vt)H=Z.clone();else if(Nt)H=ut.clone();else continue;if(Y=rt(C,T),X=rt(C,P),Q=rt(H,T),U=rt(H,P),Y||X||Q||U){m=!0;break}}}break}if(x)break}if(x)break}if(x)break}m&&n.rectangles.push(a[c].uuids)}for(let c=0;c<e.length;c++){let m=e[c].length;if(s.has(e[c].uuid)||m<o||m>r)continue;let d={uuids:[],missingEdge:{start:new xt.Vector3,end:new xt.Vector3}},y=new xt.Vector3(e[c].start.x,e[c].start.y,e[c].start.z),T=new xt.Vector3(e[c].end.x,e[c].end.y,e[c].end.z),P=!0,x=!0;for(let E=0;E<e.length;E++){if(E==c)continue;let w=new xt.Vector3(e[E].start.x,e[E].start.y,e[E].start.z),R=new xt.Vector3(e[E].end.x,e[E].end.y,e[E].end.z),b=rt(w,y),S=rt(R,y),z=rt(w,T),V=rt(R,T);if(b||S?P=!1:(z||V)&&(x=!1),!P&&!x)break}if(!P&&!x)continue;let h=new xt.Vector3;P||([y,T]=[T,y]),h=new xt.Vector3().subVectors(T,y).normalize();let p=h.clone().negate();for(let E=0;E<e.length;E++){let w=e[E].length;if(E==c||s.has(E)||w<o||w>r)continue;let R=new xt.Vector3(e[E].start.x,e[E].start.y,e[E].start.z),b=new xt.Vector3(e[E].end.x,e[E].end.y,e[E].end.z),S=le(y,T,R,b);if(!S||S.angle<85)continue;let z=rt(R,T),V=rt(b,T);if(!z&&!V)continue;let M=new xt.Vector3,v=new xt.Vector3;z?(M=R.clone(),v=b.clone()):(M=b.clone(),v=R.clone());for(let B=0;B<e.length;B++){let I=e[B].length;if(B==c||B==E||s.has(B)||I<o||I>r)continue;let _=new xt.Vector3(e[B].start.x,e[B].start.y,e[B].start.z),k=new xt.Vector3(e[B].end.x,e[B].end.y,e[B].end.z),C=le(R,b,_,k);if(!C||C.angle<85)continue;let H=rt(_,v),F=rt(k,v);if(!H&&!F)continue;let W=new xt.Vector3,Y=new xt.Vector3;H?(W=_.clone(),Y=k.clone()):(W=k.clone(),Y=_.clone());let X=new xt.Vector3().subVectors(Y,W).normalize(),Q=Qt(p,X,.1);if(!Q||!Q.parallel||!Q.sameDirection)continue;let U=!0,lt=!0;for(let ut=0;ut<e.length;ut++){if(ut==B)continue;let Z=new xt.Vector3(e[ut].start.x,e[ut].start.y,e[ut].start.z),et=new xt.Vector3(e[ut].end.x,e[ut].end.y,e[ut].end.z),q=rt(Z,_),K=rt(et,_),Vt=rt(Z,k),Nt=rt(et,k);if(q||K?U=!1:(Vt||Nt)&&(lt=!1),!U&&!lt)break}if(!U&&!lt)continue;let ot=m*w;if(!(ot<i||ot>l)){d.uuids=[e[c].uuid,e[E].uuid,e[B].uuid],d.missingEdge.start=Y,d.missingEdge.end=y;break}}if(d.uuids.length==3)break}d.uuids.length==3&&(d.uuids.forEach(E=>s.add(E)),n.threeEdgeRect.push(d))}return n};import*as A from"three";import"three/examples/jsm/utils/BufferGeometryUtils.js";var zt=11102230246251565e-32,Kt=134217729,cn=(3+8*zt)*zt;function Le(e,t,n,s,o){let r,i,l,f,u=t[0],g=s[0],a=0,c=0;g>u==g>-u?(r=u,u=t[++a]):(r=g,g=s[++c]);let m=0;if(a<e&&c<n)for(g>u==g>-u?(i=u+r,l=r-(i-u),u=t[++a]):(i=g+r,l=r-(i-g),g=s[++c]),r=i,l!==0&&(o[m++]=l);a<e&&c<n;)g>u==g>-u?(i=r+u,f=i-r,l=r-(i-f)+(u-f),u=t[++a]):(i=r+g,f=i-r,l=r-(i-f)+(g-f),g=s[++c]),r=i,l!==0&&(o[m++]=l);for(;a<e;)i=r+u,f=i-r,l=r-(i-f)+(u-f),u=t[++a],r=i,l!==0&&(o[m++]=l);for(;c<n;)i=r+g,f=i-r,l=r-(i-f)+(g-f),g=s[++c],r=i,l!==0&&(o[m++]=l);return(r!==0||m===0)&&(o[m++]=r),m}function an(e,t){let n=t[0];for(let s=1;s<e;s++)n+=t[s];return n}function N(e){return new Float64Array(e)}var pr=(3+16*zt)*zt,gr=(2+12*zt)*zt,yr=(9+64*zt)*zt*zt,je=N(4),ko=N(8),Co=N(12),Do=N(16),oe=N(4);function Er(e,t,n,s,o,r,i){let l,f,u,g,a,c,m,d,y,T,P,x,h,p,E,w,R,b,S=e-o,z=n-o,V=t-r,M=s-r;p=S*M,c=Kt*S,m=c-(c-S),d=S-m,c=Kt*M,y=c-(c-M),T=M-y,E=d*T-(p-m*y-d*y-m*T),w=V*z,c=Kt*V,m=c-(c-V),d=V-m,c=Kt*z,y=c-(c-z),T=z-y,R=d*T-(w-m*y-d*y-m*T),P=E-R,a=E-P,je[0]=E-(P+a)+(a-R),x=p+P,a=x-p,h=p-(x-a)+(P-a),P=h-w,a=h-P,je[1]=h-(P+a)+(a-w),b=x+P,a=b-x,je[2]=x-(b-a)+(P-a),je[3]=b;let v=an(4,je),B=gr*i;if(v>=B||-v>=B||(a=e-S,l=e-(S+a)+(a-o),a=n-z,u=n-(z+a)+(a-o),a=t-V,f=t-(V+a)+(a-r),a=s-M,g=s-(M+a)+(a-r),l===0&&f===0&&u===0&&g===0)||(B=yr*i+cn*Math.abs(v),v+=S*g+M*l-(V*u+z*f),v>=B||-v>=B))return v;p=l*M,c=Kt*l,m=c-(c-l),d=l-m,c=Kt*M,y=c-(c-M),T=M-y,E=d*T-(p-m*y-d*y-m*T),w=f*z,c=Kt*f,m=c-(c-f),d=f-m,c=Kt*z,y=c-(c-z),T=z-y,R=d*T-(w-m*y-d*y-m*T),P=E-R,a=E-P,oe[0]=E-(P+a)+(a-R),x=p+P,a=x-p,h=p-(x-a)+(P-a),P=h-w,a=h-P,oe[1]=h-(P+a)+(a-w),b=x+P,a=b-x,oe[2]=x-(b-a)+(P-a),oe[3]=b;let I=Le(4,je,4,oe,ko);p=S*g,c=Kt*S,m=c-(c-S),d=S-m,c=Kt*g,y=c-(c-g),T=g-y,E=d*T-(p-m*y-d*y-m*T),w=V*u,c=Kt*V,m=c-(c-V),d=V-m,c=Kt*u,y=c-(c-u),T=u-y,R=d*T-(w-m*y-d*y-m*T),P=E-R,a=E-P,oe[0]=E-(P+a)+(a-R),x=p+P,a=x-p,h=p-(x-a)+(P-a),P=h-w,a=h-P,oe[1]=h-(P+a)+(a-w),b=x+P,a=b-x,oe[2]=x-(b-a)+(P-a),oe[3]=b;let _=Le(I,ko,4,oe,Co);p=l*g,c=Kt*l,m=c-(c-l),d=l-m,c=Kt*g,y=c-(c-g),T=g-y,E=d*T-(p-m*y-d*y-m*T),w=f*u,c=Kt*f,m=c-(c-f),d=f-m,c=Kt*u,y=c-(c-u),T=u-y,R=d*T-(w-m*y-d*y-m*T),P=E-R,a=E-P,oe[0]=E-(P+a)+(a-R),x=p+P,a=x-p,h=p-(x-a)+(P-a),P=h-w,a=h-P,oe[1]=h-(P+a)+(a-w),b=x+P,a=b-x,oe[2]=x-(b-a)+(P-a),oe[3]=b;let k=Le(_,Co,4,oe,Do);return Do[k-1]}function $e(e,t,n,s,o,r){let i=(t-r)*(n-o),l=(e-o)*(s-r),f=i-l,u=Math.abs(i+l);return Math.abs(f)>=pr*u?f:-Er(e,t,n,s,o,r,u)}var Kl=(7+56*zt)*zt,Ul=(3+28*zt)*zt,Jl=(26+288*zt)*zt*zt,Ql=N(4),tc=N(4),ec=N(4),nc=N(4),oc=N(4),sc=N(4),rc=N(4),ic=N(4),lc=N(4),cc=N(8),ac=N(8),uc=N(8),fc=N(4),hc=N(8),dc=N(8),mc=N(16),pc=N(12),gc=N(192),yc=N(192);var wc=(10+96*zt)*zt,bc=(4+48*zt)*zt,Tc=(44+576*zt)*zt*zt,Pc=N(4),Rc=N(4),Sc=N(4),zc=N(4),Vc=N(4),Mc=N(4),vc=N(4),Hc=N(4),Bc=N(8),_c=N(8),kc=N(8),Cc=N(8),Dc=N(8),Ic=N(8),Lc=N(8),Ac=N(8),Fc=N(8),Oc=N(4),Nc=N(4),qc=N(4),Wc=N(8),jc=N(16),$c=N(16),Xc=N(16),Yc=N(32),Gc=N(32),Zc=N(48),Kc=N(64),Uc=N(1152),Jc=N(1152);var na=(16+224*zt)*zt,oa=(5+72*zt)*zt,sa=(71+1408*zt)*zt*zt,ra=N(4),ia=N(4),la=N(4),ca=N(4),aa=N(4),ua=N(4),fa=N(4),ha=N(4),da=N(4),ma=N(4),pa=N(24),ga=N(24),ya=N(24),Ea=N(24),xa=N(24),wa=N(24),ba=N(24),Ta=N(24),Pa=N(24),Ra=N(24),Sa=N(1152),za=N(1152),Va=N(1152),Ma=N(1152),va=N(1152),Ha=N(2304),Ba=N(2304),_a=N(3456),ka=N(5760),Ca=N(8),Da=N(8),Ia=N(8),La=N(16),Aa=N(24),Fa=N(48),Oa=N(48),Na=N(96),qa=N(192),Wa=N(384),ja=N(384),$a=N(384),Xa=N(768);var Ya=N(96),Ga=N(96),Za=N(96),Ka=N(1152);var Lo=Math.pow(2,-52),Tn=new Uint32Array(512),Ye=class e{static from(t,n=Rr,s=Sr){let o=t.length,r=new Float64Array(o*2);for(let i=0;i<o;i++){let l=t[i];r[2*i]=n(l),r[2*i+1]=s(l)}return new e(r)}constructor(t){let n=t.length>>1;if(n>0&&typeof t[0]!="number")throw new Error("Expected coords to contain numbers.");this.coords=t;let s=Math.max(2*n-5,0);this._triangles=new Uint32Array(s*3),this._halfedges=new Int32Array(s*3),this._hashSize=Math.ceil(Math.sqrt(n)),this._hullPrev=new Uint32Array(n),this._hullNext=new Uint32Array(n),this._hullTri=new Uint32Array(n),this._hullHash=new Int32Array(this._hashSize),this._ids=new Uint32Array(n),this._dists=new Float64Array(n),this.trianglesLen=0,this._cx=0,this._cy=0,this._hullStart=0,this.hull=this._triangles,this.triangles=this._triangles,this.halfedges=this._halfedges,this.update()}update(){let{coords:t,_hullPrev:n,_hullNext:s,_hullTri:o,_hullHash:r}=this,i=t.length>>1,l=1/0,f=1/0,u=-1/0,g=-1/0;for(let S=0;S<i;S++){let z=t[2*S],V=t[2*S+1];z<l&&(l=z),V<f&&(f=V),z>u&&(u=z),V>g&&(g=V),this._ids[S]=S}let a=(l+u)/2,c=(f+g)/2,m=0,d=0,y=0;for(let S=0,z=1/0;S<i;S++){let V=Jn(a,c,t[2*S],t[2*S+1]);V<z&&(m=S,z=V)}let T=t[2*m],P=t[2*m+1];for(let S=0,z=1/0;S<i;S++){if(S===m)continue;let V=Jn(T,P,t[2*S],t[2*S+1]);V<z&&V>0&&(d=S,z=V)}let x=t[2*d],h=t[2*d+1],p=1/0;for(let S=0;S<i;S++){if(S===m||S===d)continue;let z=Tr(T,P,x,h,t[2*S],t[2*S+1]);z<p&&(y=S,p=z)}let E=t[2*y],w=t[2*y+1];if(p===1/0){for(let V=0;V<i;V++)this._dists[V]=t[2*V]-t[0]||t[2*V+1]-t[1];Xe(this._ids,this._dists,0,i-1);let S=new Uint32Array(i),z=0;for(let V=0,M=-1/0;V<i;V++){let v=this._ids[V],B=this._dists[v];B>M&&(S[z++]=v,M=B)}this.hull=S.subarray(0,z),this.triangles=new Uint32Array(0),this.halfedges=new Int32Array(0);return}if($e(T,P,x,h,E,w)<0){let S=d,z=x,V=h;d=y,x=E,h=w,y=S,E=z,w=V}let R=Pr(T,P,x,h,E,w);this._cx=R.x,this._cy=R.y;for(let S=0;S<i;S++)this._dists[S]=Jn(t[2*S],t[2*S+1],R.x,R.y);Xe(this._ids,this._dists,0,i-1),this._hullStart=m;let b=3;s[m]=n[y]=d,s[d]=n[m]=y,s[y]=n[d]=m,o[m]=0,o[d]=1,o[y]=2,r.fill(-1),r[this._hashKey(T,P)]=m,r[this._hashKey(x,h)]=d,r[this._hashKey(E,w)]=y,this.trianglesLen=0,this._addTriangle(m,d,y,-1,-1,-1);for(let S=0,z=0,V=0;S<this._ids.length;S++){let M=this._ids[S],v=t[2*M],B=t[2*M+1];if(S>0&&Math.abs(v-z)<=Lo&&Math.abs(B-V)<=Lo||(z=v,V=B,M===m||M===d||M===y))continue;let I=0;for(let F=0,W=this._hashKey(v,B);F<this._hashSize&&(I=r[(W+F)%this._hashSize],!(I!==-1&&I!==s[I]));F++);I=n[I];let _=I,k;for(;k=s[_],$e(v,B,t[2*_],t[2*_+1],t[2*k],t[2*k+1])>=0;)if(_=k,_===I){_=-1;break}if(_===-1)continue;let C=this._addTriangle(_,M,s[_],-1,-1,o[_]);o[M]=this._legalize(C+2),o[_]=C,b++;let H=s[_];for(;k=s[H],$e(v,B,t[2*H],t[2*H+1],t[2*k],t[2*k+1])<0;)C=this._addTriangle(H,M,k,o[M],-1,o[H]),o[M]=this._legalize(C+2),s[H]=H,b--,H=k;if(_===I)for(;k=n[_],$e(v,B,t[2*k],t[2*k+1],t[2*_],t[2*_+1])<0;)C=this._addTriangle(k,M,_,-1,o[_],o[k]),this._legalize(C+2),o[k]=C,s[_]=_,b--,_=k;this._hullStart=n[M]=_,s[_]=n[H]=M,s[M]=H,r[this._hashKey(v,B)]=M,r[this._hashKey(t[2*_],t[2*_+1])]=_}this.hull=new Uint32Array(b);for(let S=0,z=this._hullStart;S<b;S++)this.hull[S]=z,z=s[z];this.triangles=this._triangles.subarray(0,this.trianglesLen),this.halfedges=this._halfedges.subarray(0,this.trianglesLen)}_hashKey(t,n){return Math.floor(wr(t-this._cx,n-this._cy)*this._hashSize)%this._hashSize}_legalize(t){let{_triangles:n,_halfedges:s,coords:o}=this,r=0,i=0;for(;;){let l=s[t],f=t-t%3;if(i=f+(t+2)%3,l===-1){if(r===0)break;t=Tn[--r];continue}let u=l-l%3,g=f+(t+1)%3,a=u+(l+2)%3,c=n[i],m=n[t],d=n[g],y=n[a];if(br(o[2*c],o[2*c+1],o[2*m],o[2*m+1],o[2*d],o[2*d+1],o[2*y],o[2*y+1])){n[t]=y,n[l]=c;let P=s[a];if(P===-1){let h=this._hullStart;do{if(this._hullTri[h]===a){this._hullTri[h]=t;break}h=this._hullPrev[h]}while(h!==this._hullStart)}this._link(t,P),this._link(l,s[i]),this._link(i,a);let x=u+(l+1)%3;r<Tn.length&&(Tn[r++]=x)}else{if(r===0)break;t=Tn[--r]}}return i}_link(t,n){this._halfedges[t]=n,n!==-1&&(this._halfedges[n]=t)}_addTriangle(t,n,s,o,r,i){let l=this.trianglesLen;return this._triangles[l]=t,this._triangles[l+1]=n,this._triangles[l+2]=s,this._link(l,o),this._link(l+1,r),this._link(l+2,i),this.trianglesLen+=3,l}};function wr(e,t){let n=e/(Math.abs(e)+Math.abs(t));return(t>0?3-n:1+n)/4}function Jn(e,t,n,s){let o=e-n,r=t-s;return o*o+r*r}function br(e,t,n,s,o,r,i,l){let f=e-i,u=t-l,g=n-i,a=s-l,c=o-i,m=r-l,d=f*f+u*u,y=g*g+a*a,T=c*c+m*m;return f*(a*T-y*m)-u*(g*T-y*c)+d*(g*m-a*c)<0}function Tr(e,t,n,s,o,r){let i=n-e,l=s-t,f=o-e,u=r-t,g=i*i+l*l,a=f*f+u*u,c=.5/(i*u-l*f),m=(u*g-l*a)*c,d=(i*a-f*g)*c;return m*m+d*d}function Pr(e,t,n,s,o,r){let i=n-e,l=s-t,f=o-e,u=r-t,g=i*i+l*l,a=f*f+u*u,c=.5/(i*u-l*f),m=e+(u*g-l*a)*c,d=t+(i*a-f*g)*c;return{x:m,y:d}}function Xe(e,t,n,s){if(s-n<=20)for(let o=n+1;o<=s;o++){let r=e[o],i=t[r],l=o-1;for(;l>=n&&t[e[l]]>i;)e[l+1]=e[l--];e[l+1]=r}else{let o=n+s>>1,r=n+1,i=s;un(e,o,r),t[e[n]]>t[e[s]]&&un(e,n,s),t[e[r]]>t[e[s]]&&un(e,r,s),t[e[n]]>t[e[r]]&&un(e,n,r);let l=e[r],f=t[l];for(;;){do r++;while(t[e[r]]<f);do i--;while(t[e[i]]>f);if(i<r)break;un(e,r,i)}e[n+1]=e[i],e[i]=l,s-r+1>=i-n?(Xe(e,t,r,s),Xe(e,t,n,i-1)):(Xe(e,t,n,i-1),Xe(e,t,r,s))}}function un(e,t,n){let s=e[t];e[t]=e[n],e[n]=s}function Rr(e){return e[0]}function Sr(e){return e[1]}var de=class{constructor(){this._x0=this._y0=this._x1=this._y1=null,this._=""}moveTo(t,n){this._+=`M${this._x0=this._x1=+t},${this._y0=this._y1=+n}`}closePath(){this._x1!==null&&(this._x1=this._x0,this._y1=this._y0,this._+="Z")}lineTo(t,n){this._+=`L${this._x1=+t},${this._y1=+n}`}arc(t,n,s){t=+t,n=+n,s=+s;let o=t+s,r=n;if(s<0)throw new Error("negative radius");this._x1===null?this._+=`M${o},${r}`:(Math.abs(this._x1-o)>1e-6||Math.abs(this._y1-r)>1e-6)&&(this._+="L"+o+","+r),s&&(this._+=`A${s},${s},0,1,1,${t-s},${n}A${s},${s},0,1,1,${this._x1=o},${this._y1=r}`)}rect(t,n,s,o){this._+=`M${this._x0=this._x1=+t},${this._y0=this._y1=+n}h${+s}v${+o}h${-s}Z`}value(){return this._||null}};var Me=class{constructor(){this._=[]}moveTo(t,n){this._.push([t,n])}closePath(){this._.push(this._[0].slice())}lineTo(t,n){this._.push([t,n])}value(){return this._.length?this._:null}};var fn=class{constructor(t,[n,s,o,r]=[0,0,960,500]){if(!((o=+o)>=(n=+n))||!((r=+r)>=(s=+s)))throw new Error("invalid bounds");this.delaunay=t,this._circumcenters=new Float64Array(t.points.length*2),this.vectors=new Float64Array(t.points.length*2),this.xmax=o,this.xmin=n,this.ymax=r,this.ymin=s,this._init()}update(){return this.delaunay.update(),this._init(),this}_init(){let{delaunay:{points:t,hull:n,triangles:s},vectors:o}=this,r,i,l=this.circumcenters=this._circumcenters.subarray(0,s.length/3*2);for(let y=0,T=0,P=s.length,x,h;y<P;y+=3,T+=2){let p=s[y]*2,E=s[y+1]*2,w=s[y+2]*2,R=t[p],b=t[p+1],S=t[E],z=t[E+1],V=t[w],M=t[w+1],v=S-R,B=z-b,I=V-R,_=M-b,k=(v*_-B*I)*2;if(Math.abs(k)<1e-9){if(r===void 0){r=i=0;for(let H of n)r+=t[H*2],i+=t[H*2+1];r/=n.length,i/=n.length}let C=1e9*Math.sign((r-R)*_-(i-b)*I);x=(R+V)/2-C*_,h=(b+M)/2+C*I}else{let C=1/k,H=v*v+B*B,F=I*I+_*_;x=R+(_*H-B*F)*C,h=b+(v*F-I*H)*C}l[T]=x,l[T+1]=h}let f=n[n.length-1],u,g=f*4,a,c=t[2*f],m,d=t[2*f+1];o.fill(0);for(let y=0;y<n.length;++y)f=n[y],u=g,a=c,m=d,g=f*4,c=t[2*f],d=t[2*f+1],o[u+2]=o[g]=m-d,o[u+3]=o[g+1]=c-a}render(t){let n=t==null?t=new de:void 0,{delaunay:{halfedges:s,inedges:o,hull:r},circumcenters:i,vectors:l}=this;if(r.length<=1)return null;for(let g=0,a=s.length;g<a;++g){let c=s[g];if(c<g)continue;let m=Math.floor(g/3)*2,d=Math.floor(c/3)*2,y=i[m],T=i[m+1],P=i[d],x=i[d+1];this._renderSegment(y,T,P,x,t)}let f,u=r[r.length-1];for(let g=0;g<r.length;++g){f=u,u=r[g];let a=Math.floor(o[u]/3)*2,c=i[a],m=i[a+1],d=f*4,y=this._project(c,m,l[d+2],l[d+3]);y&&this._renderSegment(c,m,y[0],y[1],t)}return n&&n.value()}renderBounds(t){let n=t==null?t=new de:void 0;return t.rect(this.xmin,this.ymin,this.xmax-this.xmin,this.ymax-this.ymin),n&&n.value()}renderCell(t,n){let s=n==null?n=new de:void 0,o=this._clip(t);if(o===null||!o.length)return;n.moveTo(o[0],o[1]);let r=o.length;for(;o[0]===o[r-2]&&o[1]===o[r-1]&&r>1;)r-=2;for(let i=2;i<r;i+=2)(o[i]!==o[i-2]||o[i+1]!==o[i-1])&&n.lineTo(o[i],o[i+1]);return n.closePath(),s&&s.value()}*cellPolygons(){let{delaunay:{points:t}}=this;for(let n=0,s=t.length/2;n<s;++n){let o=this.cellPolygon(n);o&&(o.index=n,yield o)}}cellPolygon(t){let n=new Me;return this.renderCell(t,n),n.value()}_renderSegment(t,n,s,o,r){let i,l=this._regioncode(t,n),f=this._regioncode(s,o);l===0&&f===0?(r.moveTo(t,n),r.lineTo(s,o)):(i=this._clipSegment(t,n,s,o,l,f))&&(r.moveTo(i[0],i[1]),r.lineTo(i[2],i[3]))}contains(t,n,s){return n=+n,n!==n||(s=+s,s!==s)?!1:this.delaunay._step(t,n,s)===t}*neighbors(t){let n=this._clip(t);if(n)for(let s of this.delaunay.neighbors(t)){let o=this._clip(s);if(o){t:for(let r=0,i=n.length;r<i;r+=2)for(let l=0,f=o.length;l<f;l+=2)if(n[r]===o[l]&&n[r+1]===o[l+1]&&n[(r+2)%i]===o[(l+f-2)%f]&&n[(r+3)%i]===o[(l+f-1)%f]){yield s;break t}}}}_cell(t){let{circumcenters:n,delaunay:{inedges:s,halfedges:o,triangles:r}}=this,i=s[t];if(i===-1)return null;let l=[],f=i;do{let u=Math.floor(f/3);if(l.push(n[u*2],n[u*2+1]),f=f%3===2?f-2:f+1,r[f]!==t)break;f=o[f]}while(f!==i&&f!==-1);return l}_clip(t){if(t===0&&this.delaunay.hull.length===1)return[this.xmax,this.ymin,this.xmax,this.ymax,this.xmin,this.ymax,this.xmin,this.ymin];let n=this._cell(t);if(n===null)return null;let{vectors:s}=this,o=t*4;return this._simplify(s[o]||s[o+1]?this._clipInfinite(t,n,s[o],s[o+1],s[o+2],s[o+3]):this._clipFinite(t,n))}_clipFinite(t,n){let s=n.length,o=null,r,i,l=n[s-2],f=n[s-1],u,g=this._regioncode(l,f),a,c=0;for(let m=0;m<s;m+=2)if(r=l,i=f,l=n[m],f=n[m+1],u=g,g=this._regioncode(l,f),u===0&&g===0)a=c,c=0,o?o.push(l,f):o=[l,f];else{let d,y,T,P,x;if(u===0){if((d=this._clipSegment(r,i,l,f,u,g))===null)continue;[y,T,P,x]=d}else{if((d=this._clipSegment(l,f,r,i,g,u))===null)continue;[P,x,y,T]=d,a=c,c=this._edgecode(y,T),a&&c&&this._edge(t,a,c,o,o.length),o?o.push(y,T):o=[y,T]}a=c,c=this._edgecode(P,x),a&&c&&this._edge(t,a,c,o,o.length),o?o.push(P,x):o=[P,x]}if(o)a=c,c=this._edgecode(o[0],o[1]),a&&c&&this._edge(t,a,c,o,o.length);else if(this.contains(t,(this.xmin+this.xmax)/2,(this.ymin+this.ymax)/2))return[this.xmax,this.ymin,this.xmax,this.ymax,this.xmin,this.ymax,this.xmin,this.ymin];return o}_clipSegment(t,n,s,o,r,i){let l=r<i;for(l&&([t,n,s,o,r,i]=[s,o,t,n,i,r]);;){if(r===0&&i===0)return l?[s,o,t,n]:[t,n,s,o];if(r&i)return null;let f,u,g=r||i;g&8?(f=t+(s-t)*(this.ymax-n)/(o-n),u=this.ymax):g&4?(f=t+(s-t)*(this.ymin-n)/(o-n),u=this.ymin):g&2?(u=n+(o-n)*(this.xmax-t)/(s-t),f=this.xmax):(u=n+(o-n)*(this.xmin-t)/(s-t),f=this.xmin),r?(t=f,n=u,r=this._regioncode(t,n)):(s=f,o=u,i=this._regioncode(s,o))}}_clipInfinite(t,n,s,o,r,i){let l=Array.from(n),f;if((f=this._project(l[0],l[1],s,o))&&l.unshift(f[0],f[1]),(f=this._project(l[l.length-2],l[l.length-1],r,i))&&l.push(f[0],f[1]),l=this._clipFinite(t,l))for(let u=0,g=l.length,a,c=this._edgecode(l[g-2],l[g-1]);u<g;u+=2)a=c,c=this._edgecode(l[u],l[u+1]),a&&c&&(u=this._edge(t,a,c,l,u),g=l.length);else this.contains(t,(this.xmin+this.xmax)/2,(this.ymin+this.ymax)/2)&&(l=[this.xmin,this.ymin,this.xmax,this.ymin,this.xmax,this.ymax,this.xmin,this.ymax]);return l}_edge(t,n,s,o,r){for(;n!==s;){let i,l;switch(n){case 5:n=4;continue;case 4:n=6,i=this.xmax,l=this.ymin;break;case 6:n=2;continue;case 2:n=10,i=this.xmax,l=this.ymax;break;case 10:n=8;continue;case 8:n=9,i=this.xmin,l=this.ymax;break;case 9:n=1;continue;case 1:n=5,i=this.xmin,l=this.ymin;break}(o[r]!==i||o[r+1]!==l)&&this.contains(t,i,l)&&(o.splice(r,0,i,l),r+=2)}return r}_project(t,n,s,o){let r=1/0,i,l,f;if(o<0){if(n<=this.ymin)return null;(i=(this.ymin-n)/o)<r&&(f=this.ymin,l=t+(r=i)*s)}else if(o>0){if(n>=this.ymax)return null;(i=(this.ymax-n)/o)<r&&(f=this.ymax,l=t+(r=i)*s)}if(s>0){if(t>=this.xmax)return null;(i=(this.xmax-t)/s)<r&&(l=this.xmax,f=n+(r=i)*o)}else if(s<0){if(t<=this.xmin)return null;(i=(this.xmin-t)/s)<r&&(l=this.xmin,f=n+(r=i)*o)}return[l,f]}_edgecode(t,n){return(t===this.xmin?1:t===this.xmax?2:0)|(n===this.ymin?4:n===this.ymax?8:0)}_regioncode(t,n){return(t<this.xmin?1:t>this.xmax?2:0)|(n<this.ymin?4:n>this.ymax?8:0)}_simplify(t){if(t&&t.length>4){for(let n=0;n<t.length;n+=2){let s=(n+2)%t.length,o=(n+4)%t.length;(t[n]===t[s]&&t[s]===t[o]||t[n+1]===t[s+1]&&t[s+1]===t[o+1])&&(t.splice(s,2),n-=2)}t.length||(t=null)}return t}};var zr=2*Math.PI,Ge=Math.pow;function Vr(e){return e[0]}function Mr(e){return e[1]}function vr(e){let{triangles:t,coords:n}=e;for(let s=0;s<t.length;s+=3){let o=2*t[s],r=2*t[s+1],i=2*t[s+2];if((n[i]-n[o])*(n[r+1]-n[o+1])-(n[r]-n[o])*(n[i+1]-n[o+1])>1e-10)return!1}return!0}function Hr(e,t,n){return[e+Math.sin(e+t)*n,t+Math.cos(e-t)*n]}var ve=class e{static from(t,n=Vr,s=Mr,o){return new e("length"in t?Br(t,n,s,o):Float64Array.from(_r(t,n,s,o)))}constructor(t){this._delaunator=new Ye(t),this.inedges=new Int32Array(t.length/2),this._hullIndex=new Int32Array(t.length/2),this.points=this._delaunator.coords,this._init()}update(){return this._delaunator.update(),this._init(),this}_init(){let t=this._delaunator,n=this.points;if(t.hull&&t.hull.length>2&&vr(t)){this.collinear=Int32Array.from({length:n.length/2},(c,m)=>m).sort((c,m)=>n[2*c]-n[2*m]||n[2*c+1]-n[2*m+1]);let f=this.collinear[0],u=this.collinear[this.collinear.length-1],g=[n[2*f],n[2*f+1],n[2*u],n[2*u+1]],a=1e-8*Math.hypot(g[3]-g[1],g[2]-g[0]);for(let c=0,m=n.length/2;c<m;++c){let d=Hr(n[2*c],n[2*c+1],a);n[2*c]=d[0],n[2*c+1]=d[1]}this._delaunator=new Ye(n)}else delete this.collinear;let s=this.halfedges=this._delaunator.halfedges,o=this.hull=this._delaunator.hull,r=this.triangles=this._delaunator.triangles,i=this.inedges.fill(-1),l=this._hullIndex.fill(-1);for(let f=0,u=s.length;f<u;++f){let g=r[f%3===2?f-2:f+1];(s[f]===-1||i[g]===-1)&&(i[g]=f)}for(let f=0,u=o.length;f<u;++f)l[o[f]]=f;o.length<=2&&o.length>0&&(this.triangles=new Int32Array(3).fill(-1),this.halfedges=new Int32Array(3).fill(-1),this.triangles[0]=o[0],i[o[0]]=1,o.length===2&&(i[o[1]]=0,this.triangles[1]=o[1],this.triangles[2]=o[1]))}voronoi(t){return new fn(this,t)}*neighbors(t){let{inedges:n,hull:s,_hullIndex:o,halfedges:r,triangles:i,collinear:l}=this;if(l){let a=l.indexOf(t);a>0&&(yield l[a-1]),a<l.length-1&&(yield l[a+1]);return}let f=n[t];if(f===-1)return;let u=f,g=-1;do{if(yield g=i[u],u=u%3===2?u-2:u+1,i[u]!==t)return;if(u=r[u],u===-1){let a=s[(o[t]+1)%s.length];a!==g&&(yield a);return}}while(u!==f)}find(t,n,s=0){if(t=+t,t!==t||(n=+n,n!==n))return-1;let o=s,r;for(;(r=this._step(s,t,n))>=0&&r!==s&&r!==o;)s=r;return r}_step(t,n,s){let{inedges:o,hull:r,_hullIndex:i,halfedges:l,triangles:f,points:u}=this;if(o[t]===-1||!u.length)return(t+1)%(u.length>>1);let g=t,a=Ge(n-u[t*2],2)+Ge(s-u[t*2+1],2),c=o[t],m=c;do{let d=f[m],y=Ge(n-u[d*2],2)+Ge(s-u[d*2+1],2);if(y<a&&(a=y,g=d),m=m%3===2?m-2:m+1,f[m]!==t)break;if(m=l[m],m===-1){if(m=r[(i[t]+1)%r.length],m!==d&&Ge(n-u[m*2],2)+Ge(s-u[m*2+1],2)<a)return m;break}}while(m!==c);return g}render(t){let n=t==null?t=new de:void 0,{points:s,halfedges:o,triangles:r}=this;for(let i=0,l=o.length;i<l;++i){let f=o[i];if(f<i)continue;let u=r[i]*2,g=r[f]*2;t.moveTo(s[u],s[u+1]),t.lineTo(s[g],s[g+1])}return this.renderHull(t),n&&n.value()}renderPoints(t,n){n===void 0&&(!t||typeof t.moveTo!="function")&&(n=t,t=null),n=n==null?2:+n;let s=t==null?t=new de:void 0,{points:o}=this;for(let r=0,i=o.length;r<i;r+=2){let l=o[r],f=o[r+1];t.moveTo(l+n,f),t.arc(l,f,n,0,zr)}return s&&s.value()}renderHull(t){let n=t==null?t=new de:void 0,{hull:s,points:o}=this,r=s[0]*2,i=s.length;t.moveTo(o[r],o[r+1]);for(let l=1;l<i;++l){let f=2*s[l];t.lineTo(o[f],o[f+1])}return t.closePath(),n&&n.value()}hullPolygon(){let t=new Me;return this.renderHull(t),t.value()}renderTriangle(t,n){let s=n==null?n=new de:void 0,{points:o,triangles:r}=this,i=r[t*=3]*2,l=r[t+1]*2,f=r[t+2]*2;return n.moveTo(o[i],o[i+1]),n.lineTo(o[l],o[l+1]),n.lineTo(o[f],o[f+1]),n.closePath(),s&&s.value()}*trianglePolygons(){let{triangles:t}=this;for(let n=0,s=t.length/3;n<s;++n)yield this.trianglePolygon(n)}trianglePolygon(t){let n=new Me;return this.renderTriangle(t,n),n.value()}};function Br(e,t,n,s){let o=e.length,r=new Float64Array(o*2);for(let i=0;i<o;++i){let l=e[i];r[i*2]=t.call(s,l,i,e),r[i*2+1]=n.call(s,l,i,e)}return r}function*_r(e,t,n,s){let o=0;for(let r of e)yield t.call(s,r,o,e),yield n.call(s,r,o,e),++o}function kr(e,t,n,s){return 1+(e[t][0]===0||e[n][0]===0||e[s][0]===0?1:0)}function Cr(e,t,n,s,o,r){let i=Math.hypot(n-o,s-r),l=Math.hypot(e-o,t-r),f=Math.hypot(e-n,t-s),u=Math.abs((n-e)*(r-t)-(o-e)*(s-t))/2;return u===0?1/0:i*l*f/(4*u)}function Te(e){if(!e||e.length<3)return[];let t=new Set,n=[];for(let d of e){let y=`${d[0]}_${d[1]}`;t.has(y)||(t.add(y),n.push(d))}if(n.length<3)return[];let s=new ve(Float64Array.from(n.flat())),{triangles:o}=s;if(!o.length)return[];let r=new Map,i=(d,y)=>d<y?`${d}_${y}`:`${y}_${d}`;for(let d=0;d<o.length;d+=3){let y=o[d],T=o[d+1],P=o[d+2],[x,h]=n[y],[p,E]=n[T],[w,R]=n[P],b=Cr(x,h,p,E,w,R),S=kr(n,y,T,P);if(b<=1/S)for(let[z,V]of[[y,T],[T,P],[P,y]]){let M=i(z,V);r.set(M,(r.get(M)||0)+1)}}let l=[];for(let[d,y]of r)y===1&&l.push(d.split("_").map(Number));if(!l.length)return[];let f=new Map;for(let[d,y]of l)(f.get(d)||f.set(d,[]).get(d)).push(y),(f.get(y)||f.set(y,[]).get(y)).push(d);let u=l[0][0],g=[],a=new Set,c=u,m=-1;do{g.push(n[c]),a.add(c);let d=f.get(c)||[],y=d.find(T=>T!==m&&!a.has(T));if(y===void 0&&(y=d.find(T=>T!==m)),y===void 0)break;m=c,c=y}while(c!==u&&g.length<=l.length+1);return g.length>0&&g.push(g[0]),g}import*as Wt from"three";import{OBB as Qr}from"three/examples/jsm/math/OBB.js";var Ut=63710088e-1,Fo={centimeters:Ut*100,centimetres:Ut*100,degrees:360/(2*Math.PI),feet:Ut*3.28084,inches:Ut*39.37,kilometers:Ut/1e3,kilometres:Ut/1e3,meters:Ut,metres:Ut,miles:Ut/1609.344,millimeters:Ut*1e3,millimetres:Ut*1e3,nauticalmiles:Ut/1852,radians:1,yards:Ut*1.0936};function Oo(e,t,n={}){let s={type:"Feature"};return(n.id===0||n.id)&&(s.id=n.id),n.bbox&&(s.bbox=n.bbox),s.properties=t||{},s.geometry=e,s}function Pn(e,t,n={}){if(!e)throw new Error("coordinates is required");if(!Array.isArray(e))throw new Error("coordinates must be an Array");if(e.length<2)throw new Error("coordinates must be at least 2 numbers long");if(!Ao(e[0])||!Ao(e[1]))throw new Error("coordinates must contain numbers");return Oo({type:"Point",coordinates:e},t,n)}function Rn(e,t,n={}){for(let o of e){if(o.length<4)throw new Error("Each LinearRing of a Polygon must have 4 or more Positions.");if(o[o.length-1].length!==o[0].length)throw new Error("First and last Position are not equivalent.");for(let r=0;r<o[o.length-1].length;r++)if(o[o.length-1][r]!==o[0][r])throw new Error("First and last Position are not equivalent.")}return Oo({type:"Polygon",coordinates:e},t,n)}function Dr(e,t="kilometers"){let n=Fo[t];if(!n)throw new Error(t+" units is invalid");return e*n}function Ir(e,t="kilometers"){let n=Fo[t];if(!n)throw new Error(t+" units is invalid");return e/n}function Sn(e){return e%(2*Math.PI)*180/Math.PI}function me(e){return e%360*Math.PI/180}function zn(e,t="kilometers",n="kilometers"){if(!(e>=0))throw new Error("length must be a positive number");return Dr(Ir(e,t),n)}function Ao(e){return!isNaN(e)&&e!==null&&!Array.isArray(e)}function No(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Pe(e,t,n){if(e!==null)for(var s,o,r,i,l,f,u,g=0,a=0,c,m=e.type,d=m==="FeatureCollection",y=m==="Feature",T=d?e.features.length:1,P=0;P<T;P++){u=d?e.features[P].geometry:y?e.geometry:e,c=u?u.type==="GeometryCollection":!1,l=c?u.geometries.length:1;for(var x=0;x<l;x++){var h=0,p=0;if(i=c?u.geometries[x]:u,i!==null){f=i.coordinates;var E=i.type;switch(g=n&&(E==="Polygon"||E==="MultiPolygon")?1:0,E){case null:break;case"Point":if(t(f,a,P,h,p)===!1)return!1;a++,h++;break;case"LineString":case"MultiPoint":for(s=0;s<f.length;s++){if(t(f[s],a,P,h,p)===!1)return!1;a++,E==="MultiPoint"&&h++}E==="LineString"&&h++;break;case"Polygon":case"MultiLineString":for(s=0;s<f.length;s++){for(o=0;o<f[s].length-g;o++){if(t(f[s][o],a,P,h,p)===!1)return!1;a++}E==="MultiLineString"&&h++,E==="Polygon"&&p++}E==="Polygon"&&h++;break;case"MultiPolygon":for(s=0;s<f.length;s++){for(p=0,o=0;o<f[s].length;o++){for(r=0;r<f[s][o].length-g;r++){if(t(f[s][o][r],a,P,h,p)===!1)return!1;a++}p++}h++}break;case"GeometryCollection":for(s=0;s<i.geometries.length;s++)if(Pe(i.geometries[s],t,n)===!1)return!1;break;default:throw new Error("Unknown Geometry Type")}}}}}function qo(e){var t=[];return Pe(e,function(n){t.push(n)}),t}function Lr(e,t){var n,s,o,r,i,l,f,u,g,a,c=0,m=e.type==="FeatureCollection",d=e.type==="Feature",y=m?e.features.length:1;for(n=0;n<y;n++){for(l=m?e.features[n].geometry:d?e.geometry:e,u=m?e.features[n].properties:d?e.properties:{},g=m?e.features[n].bbox:d?e.bbox:void 0,a=m?e.features[n].id:d?e.id:void 0,f=l?l.type==="GeometryCollection":!1,i=f?l.geometries.length:1,o=0;o<i;o++){if(r=f?l.geometries[o]:l,r===null){if(t(null,c,u,g,a)===!1)return!1;continue}switch(r.type){case"Point":case"LineString":case"MultiPoint":case"Polygon":case"MultiLineString":case"MultiPolygon":{if(t(r,c,u,g,a)===!1)return!1;break}case"GeometryCollection":{for(s=0;s<r.geometries.length;s++)if(t(r.geometries[s],c,u,g,a)===!1)return!1;break}default:throw new Error("Unknown Geometry Type")}}c++}}function Wo(e,t,n){var s=n;return Lr(e,function(o,r,i,l,f){r===0&&n===void 0?s=o:s=t(s,o,r,i,l,f)}),s}var ls=Ds(is(),1);function cs(e,t={}){t.concavity=t.concavity||1/0;let n=[];if(Pe(e,o=>{n.push([o[0],o[1]])}),!n.length)return null;let s=(0,ls.default)(n,t.concavity);return s.length>3?Rn([s]):null}function Bn(e,t={}){let n=0,s=0,o=0;return Pe(e,function(r){n+=r[0],s+=r[1],o++},!0),Pn([n/o,s/o],t.properties)}function he(e){if(!e)throw new Error("coord is required");if(!Array.isArray(e)){if(e.type==="Feature"&&e.geometry!==null&&e.geometry.type==="Point")return[...e.geometry.coordinates];if(e.type==="Point")return[...e.coordinates]}if(Array.isArray(e)&&e.length>=2&&!Array.isArray(e[0])&&!Array.isArray(e[1]))return[...e];throw new Error("coord must be GeoJSON Point or an Array of numbers")}function as(e){if(Array.isArray(e))return e;if(e.type==="Feature"){if(e.geometry!==null)return e.geometry.coordinates}else if(e.coordinates)return e.coordinates;throw new Error("coords must be GeoJSON Feature, Geometry Object or an Array")}function fs(e,t,n={}){let s;return n.final?s=us(he(t),he(e)):s=us(he(e),he(t)),s>180?-(360-s):s}function us(e,t){let n=me(e[1]),s=me(t[1]),o=me(t[0]-e[0]);o>Math.PI&&(o-=2*Math.PI),o<-Math.PI&&(o+=2*Math.PI);let r=Math.log(Math.tan(s/2+Math.PI/4)/Math.tan(n/2+Math.PI/4)),i=Math.atan2(o,r);return(Sn(i)+360)%360}function hs(e,t,n={}){let s=he(e),o=he(t);o[0]+=o[0]-s[0]>180?-360:s[0]-o[0]>180?360:0;let r=Yr(s,o);return zn(r,"meters",n.units)}function Yr(e,t,n){n=n===void 0?Ut:Number(n);let s=n,o=e[1]*Math.PI/180,r=t[1]*Math.PI/180,i=r-o,l=Math.abs(t[0]-e[0])*Math.PI/180;l>Math.PI&&(l-=2*Math.PI);let f=Math.log(Math.tan(r/2+Math.PI/4)/Math.tan(o/2+Math.PI/4)),u=Math.abs(f)>1e-11?i/f:Math.cos(o);return Math.sqrt(i*i+u*u*l*l)*s}function ds(e,t,n,s={}){let o=t<0,r=zn(Math.abs(t),s.units,"meters");o&&(r=-Math.abs(r));let i=he(e),l=Gr(i,r,n);return l[0]+=l[0]-i[0]>180?-360:i[0]-l[0]>180?360:0,Pn(l,s.properties)}function Gr(e,t,n,s){s=s===void 0?Ut:Number(s);let o=t/s,r=e[0]*Math.PI/180,i=me(e[1]),l=me(n),f=o*Math.cos(l),u=i+f;Math.abs(u)>Math.PI/2&&(u=u>0?Math.PI-u:-Math.PI-u);let g=Math.log(Math.tan(u/2+Math.PI/4)/Math.tan(i/2+Math.PI/4)),a=Math.abs(g)>1e-11?f/g:Math.cos(i),c=o*Math.sin(l)/a;return[((r+c)*180/Math.PI+540)%360-180,u*180/Math.PI]}function ms(e){if(!e)throw new Error("geojson is required");switch(e.type){case"Feature":return ps(e);case"FeatureCollection":return Zr(e);case"Point":case"LineString":case"Polygon":case"MultiPoint":case"MultiLineString":case"MultiPolygon":case"GeometryCollection":return lo(e);default:throw new Error("unknown GeoJSON type")}}function ps(e){let t={type:"Feature"};return Object.keys(e).forEach(n=>{switch(n){case"type":case"properties":case"geometry":return;default:t[n]=e[n]}}),t.properties=gs(e.properties),e.geometry==null?t.geometry=null:t.geometry=lo(e.geometry),t}function gs(e){let t={};return e&&Object.keys(e).forEach(n=>{let s=e[n];typeof s=="object"?s===null?t[n]=null:Array.isArray(s)?t[n]=s.map(o=>o):t[n]=gs(s):t[n]=s}),t}function Zr(e){let t={type:"FeatureCollection"};return Object.keys(e).forEach(n=>{switch(n){case"type":case"features":return;default:t[n]=e[n]}}),t.features=e.features.map(n=>ps(n)),t}function lo(e){let t={type:e.type};return e.bbox&&(t.bbox=e.bbox),e.type==="GeometryCollection"?(t.geometries=e.geometries.map(n=>lo(n)),t):(t.coordinates=ys(e.coordinates),t)}function ys(e){let t=e;return typeof t[0]!="object"?t.slice():t.map(n=>ys(n))}function co(e,t,n){if(n=n||{},!No(n))throw new Error("options is invalid");let s=n.pivot,o=n.mutate;if(!e)throw new Error("geojson is required");if(t==null||isNaN(t))throw new Error("angle is required");if(t===0)return e;let r=s??Bn(e);return(o===!1||o===void 0)&&(e=ms(e)),Pe(e,function(i){let f=fs(r,i)+t,u=hs(r,i),g=as(ds(r,u,f));i[0]=g[0],i[1]=g[1]}),e}function ao(e,t,n={}){if(n.final===!0)return Kr(e,t);let s=he(e),o=he(t),r=me(s[0]),i=me(o[0]),l=me(s[1]),f=me(o[1]),u=Math.sin(i-r)*Math.cos(f),g=Math.cos(l)*Math.sin(f)-Math.sin(l)*Math.cos(f)*Math.cos(i-r);return Sn(Math.atan2(u,g))}function Kr(e,t){let n=ao(t,e);return n=(n+180)%360,n}function Es(e,t={}){if(e.bbox!=null&&t.recompute!==!0)return e.bbox;let n=[1/0,1/0,-1/0,-1/0];return Pe(e,s=>{n[0]>s[0]&&(n[0]=s[0]),n[1]>s[1]&&(n[1]=s[1]),n[2]<s[0]&&(n[2]=s[0]),n[3]<s[1]&&(n[3]=s[1])}),n}function xs(e,t={}){let n=Number(e[0]),s=Number(e[1]),o=Number(e[2]),r=Number(e[3]);if(e.length===6)throw new Error("@turf/bbox-polygon does not support BBox with 6 positions");let i=[n,s];return Rn([[i,[o,s],[o,r],[n,r],i]],t.properties,{bbox:e,id:t.id})}function ws(e){return xs(Es(e))}function Ps(e){return Wo(e,(t,n)=>t+Ur(n),0)}function Ur(e){let t=0,n;switch(e.type){case"Polygon":return bs(e.coordinates);case"MultiPolygon":for(n=0;n<e.coordinates.length;n++)t+=bs(e.coordinates[n]);return t;case"Point":case"MultiPoint":case"LineString":case"MultiLineString":return 0}return 0}function bs(e){let t=0;if(e&&e.length>0){t+=Math.abs(Ts(e[0]));for(let n=1;n<e.length;n++)t-=Math.abs(Ts(e[n]))}return t}var Jr=Ut*Ut/2,uo=Math.PI/180;function Ts(e){let t=e.length-1;if(t<=2)return 0;let n=0,s=0;for(;s<t;){let o=e[s],r=e[s+1===t?0:s+1],i=e[s+2>=t?(s+2)%t:s+2],l=o[0]*uo,f=r[1]*uo,u=i[0]*uo;n+=(u-l)*Math.sin(f),s++}return n*Jr}function Rs(e){let t=cs(e);if(!t)throw new Error("Can't calculate smallestSurroundingRectangleByArea for given geometry");let n=Bn(t),s=qo(t),o=Number.MAX_SAFE_INTEGER,r=null;for(let i=0;i<s.length-1;i++){let l=ao(s[i],s[i+1]),f=co(t,-1*l,{pivot:n}),u=ws(f),g=Ps(u);g<o&&(o=g,r=co(u,l,{pivot:n}))}return r}function Ss(e,t){let n=t[0]-e[0],s=t[1]-e[1];return Math.sqrt(n*n+s*s)}function ti(e){let t=1/0,n=-1/0,s=1/0,o=-1/0;for(let[r,i]of e)r<t&&(t=r),r>n&&(n=r),i<s&&(s=i),i>o&&(o=i);return[(n+t)*.5,(o+s)*.5]}var kn=class e extends Qr{getBoxMesh(){He.identity(),He.setFromMatrix3(this.rotation),He.decompose(_n,Ae,new Wt.Vector3);let t=this.halfSize.clone().multiplyScalar(2),n=new Wt.Mesh(new Wt.BoxGeometry(t.x,t.y,t.z));return n.position.copy(this.center),n.rotation.setFromQuaternion(Ae),n}getBoxEdge(t=16776960){let n=this.getBoxMesh();ni.setFromObject(n);let s=new Wt.EdgesGeometry(n.geometry.clone().applyMatrix4(n.matrixWorld));return new Wt.LineSegments(s,new Wt.LineBasicMaterial({color:t,toneMapped:!1}))}toJson(){return He.identity(),He.setFromMatrix3(this.rotation),He.decompose(_n,Ae,new Wt.Vector3),{size:this.halfSize.toArray(),center:this.center.toArray(),quaternion:Ae.toArray()}}static from(t,n,s,o=new e){if(s instanceof Wt.Euler)Ae.setFromEuler(s);else if(s instanceof Wt.Quaternion)Ae.copy(s);else throw new Error("\u4F20\u5165\u7684\u65CB\u8F6C\u4E0D\u662F\u6B27\u62C9\u89D2\u6216\u8005\u56DB\u5143\u6570");return He.compose(n,Ae,ei),o.center.copy(n),o.halfSize.copy(t.multiplyScalar(.5)),o.rotation.setFromMatrix4(He),o}static fromByPath2D(t,n,s,o=new e){let r=Rs({type:"Polygon",coordinates:[t.map(m=>[m.x,m.y])]});if(!r)throw new Error("2d obb \u83B7\u53D6\u5931\u8D25");let i=r.geometry.coordinates[0],l=Ss(i[0],i[1]),f=Ss(i[1],i[2]),u=Math.atan2(i[1][1]-i[0][1],i[1][0]-i[0][0]);_n.set(l,f,s),zs.set(0,0,u);let[g,a]=ti(i);return n.x=g,n.y=a,this.from(_n,n,zs,o)}},He=new Wt.Matrix4,Ae=new Wt.Quaternion,zs=new Wt.Euler,ei=new Wt.Vector3(1,1,1),_n=new Wt.Vector3,ni=new Wt.Box3;import"three";function oi(e,t,n=.005,s=.2){if(!e.length||!t.length)return 0;let o=Math.max(n,.03),r=n*n,i=new Map,l=(a,c,m)=>`${Math.floor(a/o)},${Math.floor(c/o)},${Math.floor(m/o)}`;for(let a of t){let c=l(a.x,a.y,a.z);i.has(c)||i.set(c,[]),i.get(c).push(a)}let f=0,u=Math.ceil(n/o)+1,g=[];for(let a=-u;a<=u;a++)for(let c=-u;c<=u;c++)for(let m=-u;m<=u;m++)a*a+c*c+m*m<=u*u&&g.push([a,c,m]);for(let a of e){let c=Math.floor(a.x/o),m=Math.floor(a.y/o),d=Math.floor(a.z/o),y=!1;for(let[T,P,x]of g){let h=`${c+T},${m+P},${d+x}`;if(i.has(h)){for(let p of i.get(h))if(a.distanceToSquared(p)<r){y=!0;break}if(y)break}}if(y&&(f++,f/e.length>s))return f/e.length}return f/e.length}function Be(e,t,n=.5){let s=0,o=0;for(let r of e)if(t.containsPoint(r)&&(s++,o=s/e.length,o>n))break;return o}function fo(e,t,n,s){if(e.intersectsOBB(t))return!0;{let r=te(e,s),i=te(t,n);if(r||i)return!0}return!1}function ho(e,t){let n=new A.Vector3,s=new A.Vector3;e.getSize(n),t.getSize(s);let o=n.x*n.y*n.z,r=s.x*s.y*s.z;return o>r?1:o<r?-1:0}function te(e,t){let n=!0;for(let s=0;s<t.length;s++)if(!e.containsPoint(t[s])){n=!1;break}return n}function pe(e){if(e.length===0)return{x:0,y:0,z:0,h:0};let t=0,n=0,s=-1/0,o=1/0;for(let r of e)t+=r.x,n+=r.y,s=Math.max(s,r.z),o=Math.min(o,r.z);return{x:t/e.length,y:n/e.length,z:0,maxz:s,minz:o,h:s-o}}function Re(e,t,n,s){let o=[];for(let i=0;i<e.length;i++)o.push(new A.Vector3(e[i][0],e[i][1],0));if(o.length==0)return null;let r=kn.fromByPath2D(o,t,n);return r.center.z=s,r}var si=(e,t)=>{let n=new A.Group,s=new A.MeshStandardMaterial({color:16737792,side:A.DoubleSide});for(let o=0;o<e.length;o++){let r=[];for(let y=0;y<e[o].path.length;y++)r.push(new A.Vector3(e[o].path[y][0],e[o].path[y][1],0));if(r.length==0)continue;n.add(e[o].obb.getBoxEdge());let i=new A.BufferGeometry;i.setFromPoints(r);let l="green",f=new A.LineBasicMaterial({color:l,depthTest:!1,depthWrite:!1}),u=new A.Line(i,f);u.position.z=e[o].maxz,n.add(u);let g=e[o].obb.center.clone(),a=bo(e[o].type,g),c=e[o].stairBottomPt1.clone(),m=e[o].stairBottomPt2.clone();for(let y=0;y<e[o].stairStepNum;y++){let T=[c,m];T.push(m.clone().addScaledVector(e[o].vecStepWidth,e[o].stairStepWidth)),T.push(c.clone().addScaledVector(e[o].vecStepWidth,e[o].stairStepWidth));let P=Xn(T,e[o].stairStepHeight),x=new A.Mesh(P,s);n.add(x),c=c.addScaledVector(e[o].vecStepWidth,e[o].stairStepWidth),c=c.addScaledVector(new A.Vector3(0,0,1),e[o].stairStepHeight),m=m.addScaledVector(e[o].vecStepWidth,e[o].stairStepWidth),m=m.addScaledVector(new A.Vector3(0,0,1),e[o].stairStepHeight)}if(e[o].rectPt1.x!=0&&e[o].rectPt1.y!=0){let y=[e[o].stairBottomPt1,e[o].stairBottomPt2,e[o].rectPt2,e[o].rectPt1],T=Xn(y,e[o].stairStepHeight),P=new A.Mesh(T,s);n.add(P)}let d=new A.MeshBasicMaterial({color:16776960});for(let y=0;y<e[o].stairBottom1BalconyRailing.length;y++){let T=new A.CylinderGeometry(.03,.03,e[o].balconyRailingHeight,32),P=new A.Mesh(T,d);P.position.set(e[o].stairBottom1BalconyRailing[y].x,e[o].stairBottom1BalconyRailing[y].z+e[o].balconyRailingHeight/2,-e[o].stairBottom1BalconyRailing[y].y),t.add(P)}for(let y=0;y<e[o].stairBottom2BalconyRailing.length;y++){let T=new A.CylinderGeometry(.03,.03,e[o].balconyRailingHeight,32),P=new A.Mesh(T,d);P.position.set(e[o].stairBottom2BalconyRailing[y].x,e[o].stairBottom2BalconyRailing[y].z+e[o].balconyRailingHeight/2,-e[o].stairBottom2BalconyRailing[y].y),t.add(P)}}return n},ri=(e,t)=>{if(e.length==0)return[];t||(t=e[0].averagePz);let n=[],s=new Map;for(let r=0;r<e.length;r++){let i=e[r].points.map(P=>[P.x,P.y]),l=e[r].obj_id;l=l.replace(/calcony railing/g,"balcony railing").replace(/glass balcony railing/g,"balcony railing").replace(/metal balcony railing/g,"balcony railing").replace(/temporary construction guardrail/g,"balcony railing").replace(/the floor of the house/g,"floor").replace(/the outdoor floor/g,"floor").replace(/roof/g,"Ceiling");let f=l.split("_").slice(1,3).join("_").split(".")[0].split("_")[0],u=l.indexOf("_")+1,g=l.lastIndexOf("_"),a=l.substring(u,g);if(a.includes("top")&&(u=a.indexOf("top")+4,a=a.substring(u,g)),a.includes("left")&&(u=a.indexOf("left")+5,a=a.substring(u,g)),a.includes("right")&&(u=a.indexOf("right")+6,a=a.substring(u,g)),a.includes("front")&&(u=a.indexOf("front")+6,a=a.substring(u,g)),a==="wall"||a==="stair guardrail")continue;let c=[];for(let P=0;P<e[r].points.length;P++)c.push(new A.Vector3(e[r].points[P].x,e[r].points[P].y,e[r].points[P].z));let m=-99999;if(a==="floor"){let P=new Map;for(let h=0;h<e[r].points.length;h++){let p=e[r].points[h].z;if(p=Math.floor(p*10)/10,P.has(p)){let E=P.get(p);E.num+=1,E.points.push(e[r].points[h]),P.set(p,E)}else P.set(p,{num:1,points:[e[r].points[h]]})}let x=[...P.entries()].reduce((h,p)=>p[1].num>h[1].num?p:h);i=[],i=x[1].points.map(h=>[h.x,h.y]),c=[],c=x[1].points.map(h=>new A.Vector3(h.x,h.y,h.z)),m=x[0]}let d=pe(c),y={points:c,path:Te(i),h:d.h,minz:d.minz,maxz:d.maxz,center:{x:d.x,y:d.y,z:d.z},obj_id:e[r].obj_id,type:a,averagePz:t,obb:null,isDel:!1,obj_id:l,positionArr:[e[r].position]};if(y.obb=Re(y.path,y.center,y.h,(y.maxz+y.minz)/2),y.obb==null)continue;let T=-1;for(let P=0;P<n.length;P++)if(n[P].type==a){T=P;break}T!=-1?n[T].array.push(y):n.push({type:a,array:[y]})}for(let r=0;r<n.length;r++){let i=n[r].array,l=[],f=[];for(let g=0;g<i.length;g++){if(i[g].obb==null||l.includes(g))continue;let a={...i[g],obb:i[g].obb.clone()};for(let c=g+1;c<i.length;c++){if(i[c].obb==null||l.includes(c))continue;let m=a.obb.intersectsOBB(i[c].obb,.01);if(m||(m=hi(a.obb,i[c].obb)),m){l.push(c);for(let T=0;T<i[c].points.length;T++)(i[c].points[T].z>t&&i[c].points[T].z-t>.1||a.type=="floor"||a.type=="Staircase")&&a.points.push(i[c].points[T]);let d=a.points.map(T=>[T.x,T.y]);a.path=Te(d);let y=pe(a.points);a.h=y.h,a.minz=y.minz,a.maxz=y.maxz,a.center={x:y.x,y:y.y,z:y.z},a.obb=Re(a.path,a.center,a.h,(a.maxz+a.minz)/2),a.positionArr.push(...i[c].positionArr),c=g}}a.path.length>i[g].path.length&&(l.push(g),f.push(a))}let u=[];for(let g=0;g<i.length;g++)l.includes(g)||u.push(i[g]);u.push(...f),n[r].array=u}for(let r=0;r<n.length;r++){let i=n[r].type;if(i==="people"||i==="floor")continue;let l=n[r].array;for(let f=0;f<l.length;f++){let u=l[f].obb,g=l[f].minz,a=l[f].maxz,c=l[f].averagePz;if(i==="window"||i==="door"||i==="tv"||i==="chair"||i==="cabinet"||i==="table"){let m=new A.Vector3;u.getSize(m);let d=[m.x,m.y,m.z],y=0;for(let T of d)if(T<.2&&(y++,y===2)){l[f].isDel=!0;break}}if(!l[f].isDel)for(let m=r+1;m<n.length;m++){let d=n[m].type;if(d==="people")continue;let y=n[m].array;for(let T=0;T<y.length;T++){if(y[T].isDel)continue;let P=y[T].obb,x=y[T].minz,h=y[T].maxz;if(u.intersectsOBB(P)){let p=Be(y[T].points,u),E=Be(l[f].points,P),w=ho(u,P);if(E>=.5&&w==-1&&i!=="Staircase"&&d!=="Staircase"){l[f].isDel=!0;break}if(i!=="wall"&&i!=="floor"&&i!=="roof"){if(i==="window"){if(d==="balcony railing"&&te(u,y[T].points)){y[T].isDel=!0;continue}if(d==="balcony railing"&&te(P,l[f].points)){l[f].isDel=!0;break}if(d==="balcony railing"&&fo(u,P,l[f].points,y[T].points)&&(Math.abs(g-x)<.1||Math.abs(x-c)>.3)){y[T].isDel=!0;continue}if(d==="door"&&te(u,y[T].points)){y[T].isDel=!0;continue}if(d==="door"&&te(P,l[f].points)){y[T].isDel=!0;continue}if(d==="window sill")continue}else if(i==="balcony railing"){if(d==="window"&&te(u,y[T].points)){y[T].isDel=!0;continue}if(d==="window"&&te(P,l[f].points)){l[f].isDel=!0;break}if(d==="window"&&fo(u,P,l[f].points,y[T].points)&&(Math.abs(g-x)<.1||Math.abs(g-c)>.3)){l[f].isDel=!0;break}if(d==="Staircase"&&te(u,y[T].points)){l[f].isDel=!0;break}if(d==="Staircase"&&te(P,l[f].points)){l[f].isDel=!0;break}if(d==="Staircase"&&u.intersectsOBB(P)){l[f].isDel=!0;break}}else if(i==="door"){if(d==="window"&&te(u,y[T].points)){l[f].isDel=!0;break}if(d==="window"&&te(P,l[f].points)){l[f].isDel=!0;break}if(d==="window sill"&&te(u,y[T].points)){l[f].isDel=!0;break}if(d==="window sill"&&te(P,l[f].points)){l[f].isDel=!0;break}}else if(i==="window sill"){if(d==="window")continue;if(d==="floor"&&te(u,y[T].points)){y[T].isDel=!0;continue}if(d==="door"&&te(u,y[T].points)){y[T].isDel=!0;continue}if(d==="door"&&te(P,l[f].points)){y[T].isDel=!0;continue}}else if(i==="Staircase"){if(d==="balcony railing"&&te(u,y[T].points)){y[T].isDel=!0;continue}if(d==="balcony railing"&&te(P,l[f].points)){y[T].isDel=!0;continue}if(d==="balcony railing"&&u.intersectsOBB(P)){y[T].isDel=!0;continue}}let R=!1,b=[],S=[],z=l[f].points,V=y[T].points;if(z.length>V.length?(R=!0,b=z,S=V):(b=V,S=z),oi(S,b,.03,.5)>.5)if(R)y[T].isDel=!0;else{l[f].isDel=!0;break}else if(fo(u,P,l[f].points,y[T].points)){let v=ho(u,P);if(v===1||v===0){if(d==="switch"||d==="Staircase")continue;z.length>V.length?Be(S,u)>=.5&&(y[T].isDel=!0):Be(b,u)>=.5&&(y[T].isDel=!0)}else{if(i==="switch"||i==="Staircase")continue;if(z.length>V.length){if(Be(b,P)>=.5){l[f].isDel=!0;break}}else if(Be(S,P)>=.5){l[f].isDel=!0;break}}}}}}if(l[f].isDel)break}}}for(let r=0;r<n.length;r++){let i=n[r].type,l=n[r].array;for(let f=0;f<l.length;f++){let u=l[f].maxz,g=l[f].minz,a=i==="switch"?.1:.3;if(Math.abs(u-t)<a&&i!="floor"){l[f].isDel=!0;continue}if(i==="window"||i==="door"||i==="tv"){let c=Math.abs(u-t),m=Math.abs(g-t);(i==="tv"&&m<1.6||i!=="window"&&c<1.6)&&(l[f].isDel=!0),i==="window"&&c<1&&(l[f].isDel=!0),i==="door"&&m>1&&(l[f].isDel=!0)}if(i==="chair"){let c=new A.Vector3;l[f].obb.getSize(c),(c.x<.1||c.y<.1||c.z<.2)&&(l[f].isDel=!0)}if(i==="balcony railing"&&(Math.abs(u-g)<.4&&(l[f].isDel=!0),(g<t&&Math.abs(g-t)>1||g>t&&Math.abs(g-t)>1)&&(l[f].isDel=!0),u<t&&(l[f].isDel=!0)),i==="people"&&(Math.abs(u-g)<1&&(l[f].isDel=!0),g>t&&g-t>.3&&(l[f].isDel=!0),u<t&&(l[f].isDel=!0)),i==="floor"){let c=new A.Vector3;l[f].obb.getSize(c),(c.x<.1||c.y<.1)&&(l[f].isDel=!0)}i==="stair guardrail"&&l[f].points.length<100&&(l[f].isDel=!0)}}for(let r=0;r<n.length;r++)n[r].array=n[r].array.filter(i=>!i.isDel);let o=[];for(let r=0;r<n.length;r++){let i=n[r].array;for(let l=0;l<i.length;l++)o.push({obbBox:i[l].obb,box:new A.Box3().setFromPoints(i[l].points),category:i[l].type,center:{x:i[l].center.x,y:i[l].center.y,z:(i[l].minz+i[l].maxz)/2},name:i[l].obj_id,obj_id:i[l].obj_id,pcdPoints:i[l].points,positionArr:i[l].positionArr})}return o},ii=e=>{if(e.length==0)return[];let t=[],n=new Map;for(let o=0;o<e.length;o++){let r=e[o].points.map(T=>[T.x,T.y]),i=e[o].obj_id;i=i.replace(/the floor of the house/g,"floor").replace(/the outdoor floor/g,"floor");let l=i.split("_").slice(1,3).join("_").split(".")[0].split("_")[0],f=i.indexOf("_")+1,u=i.lastIndexOf("_"),g=i.substring(f,u);if(g!=="floor")continue;let a=[];for(let T=0;T<e[o].points.length;T++)a.push(new A.Vector3(e[o].points[T].x,e[o].points[T].y,e[o].points[T].z));let c=-99999;if(g==="floor"){let T=new Map;for(let x=0;x<e[o].points.length;x++){let h=e[o].points[x].z;if(h=Math.floor(h*10)/10,T.has(h)){let p=T.get(h);p.num+=1,p.points.push(e[o].points[x]),T.set(h,p)}else T.set(h,{num:1,points:[e[o].points[x]]})}let P=[...T.entries()].reduce((x,h)=>h[1].num>x[1].num?h:x);r=[],r=P[1].points.map(x=>[x.x,x.y]),a=[],a=P[1].points.map(x=>new A.Vector3(x.x,x.y,x.z)),c=P[0]}let m=pe(a),d={points:a,path:Te(r),h:m.h,minz:m.minz,maxz:m.maxz,center:{x:m.x,y:m.y,z:m.z},obj_id:e[o].obj_id,type:g,obb:null,isDel:!1,obj_id:i,positionArr:[e[o].position]};if(d.obb=Re(d.path,d.center,d.h,(d.maxz+d.minz)/2),d.obb==null)continue;let y=-1;for(let T=0;T<t.length;T++)if(t[T].type==g){y=T;break}if(y!=-1?t[y].array.push(d):t.push({type:g,array:[d]}),g=="floor"&&c!=-99999)if(n.has(c)){let T=n.get(c);T.num+=d.points.length,T.datas.push(d),n.set(c,T)}else n.set(c,{num:d.points.length,datas:[d]})}for(let o=0;o<t.length;o++){let r=t[o].array,i=[],l=[];for(let u=0;u<r.length;u++){if(r[u].obb==null||i.includes(u))continue;let g={...r[u],obb:r[u].obb.clone()};for(let a=u+1;a<r.length;a++){if(r[a].obb==null||i.includes(a))continue;if(g.obb.intersectsOBB(r[a].obb)){i.push(a);for(let y=0;y<r[a].points.length;y++)g.points.push(r[a].points[y]);let m=g.points.map(y=>[y.x,y.y]);g.path=Te(m);let d=pe(g.points);g.h=d.h,g.minz=d.minz,g.maxz=d.maxz,g.center={x:d.x,y:d.y,z:d.z},g.obb=Re(g.path,g.center,g.h,(g.maxz+g.minz)/2),g.positionArr.push(...r[a].positionArr),a=u}}g.path.length>r[u].path.length&&(i.push(u),l.push(g))}let f=[];for(let u=0;u<r.length;u++)i.includes(u)||f.push(r[u]);f.push(...l),t[o].array=f}for(let o=0;o<t.length;o++){let r=t[o].type,i=t[o].array;for(let l=0;l<i.length;l++)r==="floor"&&i[l].points.length<500&&(i[l].isDel=!0)}for(let o=0;o<t.length;o++)t[o].array=t[o].array.filter(r=>!r.isDel);let s=[];for(let o=0;o<t.length;o++){let r=t[o].array;for(let i=0;i<r.length;i++)s.push({obbBox:r[i].obb,box:new A.Box3().setFromPoints(r[i].points),category:r[i].type,center:{x:r[i].center.x,y:r[i].center.y,z:(r[i].minz+r[i].maxz)/2},name:r[i].obj_id,obj_id:r[i].obj_id,pcdPoints:r[i].points,positionArr:r[i].positionArr})}return s},li=(e,t)=>{if(!e||!e.splitFloorProjectsResults||!e.trajectoryResults)return[];let n=e.splitFloorProjectsResults,s=e.trajectoryResults,o=new Map;for(let c=0;c<s.length;c++){let m=s[c].floor;o.has(m)?o.get(m).push(s[c]):o.set(m,[s[c]])}let r=new Map,i=[];for(let c=0;c<n.length;c++){let m=[],d=n[c];for(let y=0;y<d.length;y++){let T=d[y].points.map(S=>[S.x,S.y]),P=d[y].obj_id;P=P.replace(/the floor of the house/g,"floor").replace(/the outdoor floor/g,"floor").replace(/calcony railing/g,"balcony railing").replace(/glass balcony railing/g,"balcony railing").replace(/metal balcony railing/g,"balcony railing").replace(/temporary construction guardrail/g,"balcony railing");let x=P.split("_").slice(1,3).join("_").split(".")[0].split("_")[0],h=P.indexOf("_")+1,p=P.lastIndexOf("_"),E=P.substring(h,p);if(E.includes("top")&&(h=E.indexOf("top")+4,E=E.substring(h,p)),E.includes("left")&&(h=E.indexOf("left")+5,E=E.substring(h,p)),E.includes("right")&&(h=E.indexOf("right")+6,E=E.substring(h,p)),E.includes("front")&&(h=E.indexOf("front")+6,E=E.substring(h,p)),E!=="Staircase"&&E!=="balcony railing")continue;let w=[];for(let S=0;S<d[y].points.length;S++)w.push(new A.Vector3(d[y].points[S].x,d[y].points[S].y,d[y].points[S].z));let R=pe(w),b={points:w,path:Te(T),h:R.h,minz:R.minz,maxz:R.maxz,center:{x:R.x,y:R.y,z:R.z},obj_id:d[y].obj_id,type:E,averagePz:0,obb:null,isDel:!1,obj_id:P,positionArr:[d[y].position],aabbBox:new A.Box3().setFromPoints(w)};b.obb=Re(b.path,b.center,b.h,(b.maxz+b.minz)/2),b.obb!=null&&(E=="Staircase"?m.push(b):E=="balcony railing"&&i.push(b))}r.set(c+1,m)}let l=[];for(let[c,m]of r){let d={floor:c,findTrajectoryResults:[],otherTrajectoryResults:[],lastTrajectoryResults:[]},y=o.get(c);if(!y){d.otherTrajectoryResults=m,l.push(d);continue}let T=[],P=[],x=[];for(let h=0;h<y.length;h++){let p=[];for(let w=0;w<y[h].points.length;w++){let R=[new A.Vector3(y[h].points[w].x,y[h].points[w].y,y[h].points[w].z)];R.push(R[0].clone().addScaledVector(new A.Vector3(0,0,-1),2));let b=new A.Box3().setFromPoints(R);p.push(b)}let E=[];for(let w=0;w<m.length;w++)for(let R=0;R<p.length;R++)!x.includes(w)&&m[w].aabbBox.intersectsBox(p[R])&&(x.push(w),E.push(m[w]));E.length>0&&P.push(E)}for(let h=0;h<m.length;h++)x.includes(h)||T.push(m[h]);d.findTrajectoryResults=P,d.otherTrajectoryResults=T,l.push(d)}function f(c,m){let d=c,y=[],T=[];for(let x=0;x<c.length;x++){if(c[x].obb==null||y.includes(x))continue;let h={...c[x],obb:c[x].obb.clone()};for(let p=x+1;p<c.length;p++){if(c[p].obb==null||y.includes(p))continue;if(h.obb.intersectsOBB(c[p].obb)||m){y.push(p);for(let b=0;b<c[p].points.length;b++)h.points.push(c[p].points[b]);let w=h.points.map(b=>[b.x,b.y]);h.path=Te(w);let R=pe(h.points);h.h=R.h,h.minz=R.minz,h.maxz=R.maxz,h.center={x:R.x,y:R.y,z:R.z},h.obb=Re(h.path,h.center,h.h,(h.maxz+h.minz)/2),h.positionArr.push(...c[p].positionArr),p=x}}h.path.length>c[x].path.length&&(y.push(x),T.push(h))}let P=[];for(let x=0;x<c.length;x++)y.includes(x)||P.push(c[x]);return P.push(...T),c=P,c}for(let c=0;c<l.length;c++){for(let m=0;m<l[c].findTrajectoryResults.length;m++)l[c].findTrajectoryResults[m]=f(l[c].findTrajectoryResults[m],!0);l[c].otherTrajectoryResults=f(l[c].otherTrajectoryResults,!1)}for(let c=0;c<l.length;c++){for(let m=0;m<l[c].findTrajectoryResults.length;m++){for(let d=0;d<l[c].findTrajectoryResults[m].length;d++){let y=Vs(l[c].findTrajectoryResults[m][d].points,{binCount:100,minBinPoints:5,sideK:2.2,zK:2.2,minSideRange:.2,minZRange:.2,lowerZScale:.4,upperZScale:1.8}),T=Ms(y.keep,{radius:.1,minClusterSize:50,lowPercent:.45});if(T.keep.length==0){l[c].findTrajectoryResults[m][d].isDel=!0;continue}l[c].findTrajectoryResults[m][d].points=T.keep;let P=l[c].findTrajectoryResults[m][d].points.map(h=>[h.x,h.y]);l[c].findTrajectoryResults[m][d].path=Te(P);let x=pe(l[c].findTrajectoryResults[m][d].points);l[c].findTrajectoryResults[m][d].h=x.h,l[c].findTrajectoryResults[m][d].minz=x.minz,l[c].findTrajectoryResults[m][d].maxz=x.maxz,l[c].findTrajectoryResults[m][d].center={x:x.x,y:x.y,z:x.z},l[c].findTrajectoryResults[m][d].obb=Re(l[c].findTrajectoryResults[m][d].path,l[c].findTrajectoryResults[m][d].center,l[c].findTrajectoryResults[m][d].h,(l[c].findTrajectoryResults[m][d].maxz+l[c].findTrajectoryResults[m][d].minz)/2)}l[c].findTrajectoryResults[m]=l[c].findTrajectoryResults[m].filter(d=>!d.isDel)}for(let m=0;m<l[c].otherTrajectoryResults.length;m++){let d=Vs(l[c].otherTrajectoryResults[m].points,{binCount:100,minBinPoints:5,sideK:2.2,zK:2.2,minSideRange:.2,minZRange:.2,lowerZScale:.4,upperZScale:1.8}),y=Ms(d.keep,{radius:.1,minClusterSize:50,lowPercent:.45});if(y.keep.length==0){l[c].otherTrajectoryResults[m].isDel=!0;continue}l[c].otherTrajectoryResults[m].points=y.keep;let T=l[c].otherTrajectoryResults[m].points.map(x=>[x.x,x.y]);l[c].otherTrajectoryResults[m].path=Te(T);let P=pe(l[c].otherTrajectoryResults[m].points);l[c].otherTrajectoryResults[m].h=P.h,l[c].otherTrajectoryResults[m].minz=P.minz,l[c].otherTrajectoryResults[m].maxz=P.maxz,l[c].otherTrajectoryResults[m].center={x:P.x,y:P.y,z:P.z},l[c].otherTrajectoryResults[m].obb=Re(l[c].otherTrajectoryResults[m].path,l[c].otherTrajectoryResults[m].center,l[c].otherTrajectoryResults[m].h,(l[c].otherTrajectoryResults[m].maxz+l[c].otherTrajectoryResults[m].minz)/2)}l[c].otherTrajectoryResults.filter(m=>!m.isDel)}function u(c){for(let m=0;m<c.length;m++){let d=c[m].obb;for(let y=m+1;y<c.length;y++){let T=c[y].obb;if(!c[y].isDel){if(d.intersectsOBB(T)){let P=Be(c[y].points,d),x=Be(c[m].points,T),h=ho(d,T);if(P>=.5&&(h==1||h==0)&&(c[y].isDel=!0),x>=.5&&h==-1){c[m].isDel=!0;break}}if(c[m].isDel)break}}}return c=c.filter(m=>!m.isDel),c}for(let c=0;c<l.length;c++){let m=[];for(let d=0;d<l[c].findTrajectoryResults.length;d++)m.push(...l[c].findTrajectoryResults[d]);m.push(...l[c].otherTrajectoryResults),l[c].lastTrajectoryResults=u(m)}function g(c){let m=[];if(c.length>0){let d=.3,y=.5,T=.5,P=.2;for(let x=0;x<c.length;x++){let h=c[x].obb.halfSize.clone().multiplyScalar(2),p=c[x].points,E=h.x,w=h.y,R=h.z;if(E>w&&([E,w]=[w,E]),E<y||w<d||R<T)continue;let b=So(c[x].obb);if(b.length!=8)continue;let S=new A.Line3(b[0],b[1]),z=new A.Line3(b[1],b[2]),V=new A.Line3(b[2],b[3]),M=new A.Line3(b[3],b[0]),v=new A.Line3(b[4],b[5]),B=new A.Line3(b[5],b[6]),I=new A.Line3(b[6],b[7]),_=new A.Line3(b[7],b[4]),k=[],C=[],H=[],F=[],W=[],Y=[],X=[],Q=[];for(let Tt=0;Tt<p.length;Tt++){let se=S.closestPointToPoint(p[Tt],!0,new A.Vector3),ce=z.closestPointToPoint(p[Tt],!0,new A.Vector3),Se=V.closestPointToPoint(p[Tt],!0,new A.Vector3),Rt=M.closestPointToPoint(p[Tt],!0,new A.Vector3),ae=v.closestPointToPoint(p[Tt],!0,new A.Vector3),G=B.closestPointToPoint(p[Tt],!0,new A.Vector3),ge=I.closestPointToPoint(p[Tt],!0,new A.Vector3),_e=_.closestPointToPoint(p[Tt],!0,new A.Vector3);se.distanceTo(p[Tt])<P&&k.push(p[Tt]),ce.distanceTo(p[Tt])<P&&C.push(p[Tt]),Se.distanceTo(p[Tt])<P&&H.push(p[Tt]),Rt.distanceTo(p[Tt])<P&&F.push(p[Tt]),ae.distanceTo(p[Tt])<P&&W.push(p[Tt]),G.distanceTo(p[Tt])<P&&Y.push(p[Tt]),ge.distanceTo(p[Tt])<P&&X.push(p[Tt]),_e.distanceTo(p[Tt])<P&&Q.push(p[Tt])}let U=b[0].distanceTo(b[1]),lt=b[1].distanceTo(b[2]),ot=b[2].distanceTo(b[3]),ut=b[3].distanceTo(b[0]),Z=new A.Vector3,et=new A.Vector3,q=new A.Vector3,K=new A.Vector3;Math.abs(U-E)<.01?k.length>H.length?(Z=b[0].clone(),et=b[1].clone(),q=new A.Vector3().subVectors(et,Z).normalize(),K=new A.Vector3().subVectors(b[2],b[1]).normalize()):(Z=b[2].clone(),et=b[3].clone(),q=new A.Vector3().subVectors(et,Z).normalize(),K=new A.Vector3().subVectors(b[0],b[3]).normalize()):C.length>F.length?(Z=b[1].clone(),et=b[2].clone(),q=new A.Vector3().subVectors(et,Z).normalize(),K=new A.Vector3().subVectors(b[3],b[2]).normalize()):(Z=b[3].clone(),et=b[0].clone(),q=new A.Vector3().subVectors(et,Z).normalize(),K=new A.Vector3().subVectors(b[1],b[0]).normalize());let Vt=b[4].distanceTo(b[5]),Nt=b[5].distanceTo(b[6]),$t=b[6].distanceTo(b[7]),Gt=b[7].distanceTo(b[4]),wt=new A.Vector3,At=new A.Vector3,Ft=new A.Vector3(Z.x,Z.y,b[4].z),Pt=new A.Vector3(et.x,et.y,b[4].z);(rt(b[4],Ft)||rt(b[4],Pt))&&(rt(b[5],Ft)||rt(b[5],Pt))?(wt=b[6].clone(),At=b[7].clone()):(rt(b[5],Ft)||rt(b[5],Pt))&&(rt(b[6],Ft)||rt(b[6],Pt))?(wt=b[7].clone(),At=b[4].clone()):(rt(b[6],Ft)||rt(b[6],Pt))&&(rt(b[7],Ft)||rt(b[7],Pt))?(wt=b[4].clone(),At=b[5].clone()):(rt(b[7],Ft)||rt(b[7],Pt))&&(rt(b[4],Ft)||rt(b[4],Pt))&&(wt=b[5].clone(),At=b[6].clone());let Dt=Z.distanceTo(et),_t=wt.distanceTo(At),J=new A.Vector3().subVectors(new A.Vector3(Z.x,Z.y,wt.z),Z).normalize();if(Math.abs(Dt-_t)>.01||Math.abs(Dt-E)>.01){console.log("\u4E0A\u4E0B\u957F\u5EA6\u4E0D\u4E00\u81F4,\u6216\u4E0E\u5BBD\u4E0D\u4E00\u81F4",Dt,_t,E);continue}let ht=Math.sqrt(Dt*Dt+_t*_t),$=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(ht)))),dt={stairStepHeight:R/$,stairStepWidth:w/$,staitWidth:E,stairLength:w,stairHeigth:R,stairStepNum:$,stairBottomPt1:Z,stairBottomPt2:et,stairTopPt1:wt,stairTopPt2:At,vecStepLength:q,vecStepWidth:K,vecStepHeight:J,path:c[x].path,obb:c[x].obb,maxz:c[x].maxz,points:c[x].points,rectPt1:new A.Vector3(0,0,0),rectPt2:new A.Vector3(0,0,0)};m.push(dt)}}return m}let a=[];for(let c=0;c<l.length;c++)a.push(...g(l[c].lastTrajectoryResults));for(let c=0;c<a.length;c++){let m=a[c].stairTopPt1.clone(),d=a[c].stairTopPt2.clone(),y=a[c].stairBottomPt1.clone(),T=a[c].stairBottomPt2.clone(),P=m.clone(),x=d.clone(),h=y.clone(),p=T.clone();P.z=x.z=h.z=p.z=0;let E=jt(m,d,!0),w=jt(y,T,!0),R=jt(E,w),b=new A.Vector3().subVectors(E,R).normalize(),S=new A.Vector3().subVectors(w,R).normalize(),z=E.distanceTo(w),V=!1,M=!1;for(let v=0;v<a.length;v++){if(c==v)continue;let B=a[v].stairTopPt1.clone(),I=a[v].stairTopPt2.clone(),_=a[v].stairBottomPt1.clone(),k=a[v].stairBottomPt2.clone(),C=new A.Vector3().subVectors(B,I).normalize(),H=new A.Vector3().subVectors(_,k).normalize(),F=B.clone(),W=I.clone(),Y=_.clone(),X=k.clone();F.z=W.z=Y.z=X.z=0;let Q=jt(B,I,!0),U=jt(_,k,!0),lt=Q.distanceTo(U),ot=Zt(E,w,Q,U),ut=!1;if(ot&&ot.isParallel&&B.z<=y.z&&y.z-B.z<.3){ut=!0,M=!0;let Z=F.addScaledVector(C.clone().negate(),100),et=W.addScaledVector(C,100),q=Y.addScaledVector(H.clone().negate(),100),K=X.addScaledVector(H,100),Vt=new A.Line3(Z,et),Nt=new A.Line3(q,K),$t=Vt.closestPointToPoint(R,!0,new A.Vector3),Gt=Nt.closestPointToPoint(R,!0,new A.Vector3),wt=new A.Vector3().subVectors($t,R),At=new A.Vector3().subVectors(Gt,R),Ft=wt.length(),Pt=At.length();At=At.normalize(),wt=wt.normalize();let Dt=Qt(b,wt,.1),_t=Qt(S,wt,.1),J=Qt(S,At,.1),ht=Qt(b,At,.1);if(Dt&&Dt.sameDirection&&Ft>z/2){let $=Ft-z/2;a[c].stairBottomPt1=a[c].stairBottomPt1.addScaledVector(S,$),a[c].stairBottomPt2=a[c].stairBottomPt2.addScaledVector(S,$)}else if(_t&&_t.sameDirection&&Ft>z/2){let $=Ft-z/2;a[c].stairBottomPt1=a[c].stairBottomPt1.addScaledVector(S,$),a[c].stairBottomPt2=a[c].stairBottomPt2.addScaledVector(S,$)}if(J&&J.sameDirection&&Pt>z/2){let $=Pt-z/2;a[c].stairTopPt1=a[c].stairTopPt1.addScaledVector(b,$),a[c].stairTopPt2=a[c].stairTopPt2.addScaledVector(b,$)}else if(ht&&ht.sameDirection&&Pt>z/2){let $=Pt-z/2;a[c].stairTopPt1=a[c].stairTopPt1.addScaledVector(b,$),a[c].stairTopPt2=a[c].stairTopPt2.addScaledVector(b,$)}}else if(ot&&ot.isParallel&&m.z<_.z&&_.z-m.z<.2){ut=!0,V=!0;let Z=F.addScaledVector(C.clone().negate(),100),et=W.addScaledVector(C,100),q=Y.addScaledVector(H.clone().negate(),100),K=X.addScaledVector(H,100),Vt=new A.Line3(Z,et),Nt=new A.Line3(q,K),$t=Vt.closestPointToPoint(R,!1,new A.Vector3),Gt=Nt.closestPointToPoint(R,!1,new A.Vector3),wt=new A.Vector3().subVectors($t,R),At=new A.Vector3().subVectors(Gt,R),Ft=wt.length(),Pt=At.length();At=At.normalize(),wt=wt.normalize();let Dt=Qt(b,wt,.1),_t=Qt(S,wt,.1),J=Qt(S,At,.1),ht=Qt(b,At,.1);if(Dt&&Dt.sameDirection&&Ft>z/2){let $=Ft-z/2;a[c].stairBottomPt1=a[c].stairBottomPt1.addScaledVector(S,$),a[c].stairBottomPt2=a[c].stairBottomPt2.addScaledVector(S,$)}else if(_t&&_t.sameDirection&&Ft>z/2){let $=Ft-z/2;a[c].stairBottomPt1=a[c].stairBottomPt1.addScaledVector(S,$),a[c].stairBottomPt2=a[c].stairBottomPt2.addScaledVector(S,$)}if(J&&J.sameDirection&&Pt>z/2){let $=Pt-z/2;a[c].stairTopPt1=a[c].stairTopPt1.addScaledVector(b,$),a[c].stairTopPt2=a[c].stairTopPt2.addScaledVector(b,$)}else if(ht&&ht.sameDirection&&Pt>z/2){let $=Pt-z/2;a[c].stairTopPt1=a[c].stairTopPt1.addScaledVector(b,$),a[c].stairTopPt2=a[c].stairTopPt2.addScaledVector(b,$)}a[c].stairTopPt1.z=a[c].stairTopPt2.z=_.z}if(ut&&(m=a[c].stairTopPt1.clone(),d=a[c].stairTopPt2.clone(),y=a[c].stairBottomPt1.clone(),T=a[c].stairBottomPt2.clone(),P=m.clone(),x=d.clone(),h=y.clone(),p=T.clone(),P.z=x.z=h.z=p.z=0,E=jt(m,d,!0),w=jt(y,T,!0),R=jt(E,w),b=new A.Vector3().subVectors(E,R).normalize(),S=new A.Vector3().subVectors(w,R).normalize(),z=E.distanceTo(w)),M&&V)break}if(M||V){let v=a[c].stairTopPt1.clone(),B=a[c].stairTopPt2.clone(),I=a[c].stairBottomPt1.clone(),_=a[c].stairBottomPt2.clone(),k=jt(v,B,!0),C=jt(I,_,!0),H=k.distanceTo(C),F=a[c].stairTopPt1.distanceTo(a[c].stairTopPt2),W=a[c].stairBottomPt1.distanceTo(a[c].stairBottomPt2),Y=Math.sqrt(F*F+W*W),X=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(Y))));a[c].stairStepNum=X,a[c].stairHeigth=a[c].stairTopPt1.z-a[c].stairBottomPt1.z,a[c].stairStepHeight=a[c].stairHeigth/a[c].stairStepNum,a[c].stairStepWidth=H/a[c].stairStepNum}}for(let c=0;c<a.length;c++){let m=a[c].stairTopPt1,d=a[c].stairTopPt2,y=a[c].stairBottomPt1.clone(),T=a[c].stairBottomPt2.clone(),P=new A.Vector3(m.x,m.y,y.z),x=a[c].vecStepWidth;for(let h=0;h<a.length;h++){if(c==h)continue;let p=a[h].stairTopPt1,E=a[h].stairTopPt2,w=a[h].stairBottomPt1.clone(),R=a[h].stairBottomPt2.clone(),b=new A.Vector3(p.x,p.y,w.z),S=a[h].vecStepWidth;if(Math.abs(m.z-w.z)<.3&&w.z>y.z&&a[c].obb.intersectsOBB(a[h].obb)){let z=le(P,y,b,w);if(z&&z.angle>75){let V=w.distanceTo(m),M=w.distanceTo(d),v=R.distanceTo(m),B=R.distanceTo(d),I=m.clone(),_=I.clone().addScaledVector(x,a[h].staitWidth),k=new A.Vector3().subVectors(d,m).normalize(),C=m.distanceTo(d),H=I.clone().addScaledVector(k,C),F=_.clone().addScaledVector(k,C),W=I.clone().addScaledVector(k,a[h].stairLength),Y=_.clone().addScaledVector(k,a[h].stairLength),X=V;(X>M||X>B)&&(X=M,I=d.clone(),_=I.clone().addScaledVector(x,a[h].staitWidth),k=new A.Vector3().subVectors(m,d).normalize(),C=m.distanceTo(d),H=I.clone().addScaledVector(k,C),F=_.clone().addScaledVector(k,C),W=I.clone().addScaledVector(k,a[h].stairLength),Y=_.clone().addScaledVector(k,a[h].stairLength));let Q=new A.Vector3().subVectors(W,H).normalize(),U=W.distanceTo(H);W.z=Y.z=a[h].maxz,a[h].stairBottomPt1=H,a[h].stairBottomPt2=F,a[h].stairTopPt1=W,a[h].stairTopPt2=Y,a[h].rectPt1=I,a[h].rectPt2=_;let lt=H.distanceTo(F),ot=W.distanceTo(Y),ut=Math.sqrt(U*U+a[h].stairHeigth*a[h].stairHeigth),Z=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(ut))));a[h].stairStepNum=Z,a[h].stairHeigth=W.z-H.z,a[h].stairStepHeight=a[h].stairHeigth/a[h].stairStepNum,a[h].stairStepWidth=U/a[h].stairStepNum,a[h].vecStepLength=k.clone().negate(),a[h].vecStepWidth=Q;break}}}}return ci(a,i,t),a},ci=(e,t,n)=>{if(!e||e.length<=0||!t||t.length<=0)return;let s=1.5,o=0;for(let r=0;r<e.length;r++){e[r].stairBottom1BalconyRailing=[],e[r].stairBottom2BalconyRailing=[],e[r].balconyRailingHeight=0;let i=e[r].stairBottomPt1.clone(),l=e[r].stairBottomPt2.clone(),f=e[r].stairBottomPt1.clone(),u=e[r].stairBottomPt2.clone(),g=new A.Vector3().subVectors(l,i).normalize();i=i.addScaledVector(g,.05),l=l.addScaledVector(g.clone().negate(),.05);let a=[],c=[];for(let m=0;m<e[r].stairStepNum;m++){let d=[i,f];d.push(d[1].clone().addScaledVector(e[r].vecStepWidth,e[r].stairStepWidth)),d.push(d[0].clone().addScaledVector(e[r].vecStepWidth,e[r].stairStepWidth));let y=d.map(E=>[E.x,E.y]);d.push(new A.Vector3(d[3].x,d[3].y,d[3].z+s)),d.push(new A.Vector3(d[2].x,d[2].y,d[2].z+s)),d.push(new A.Vector3(d[1].x,d[1].y,d[1].z+s)),d.push(new A.Vector3(d[0].x,d[0].y,d[0].z+s));let T=pe(d),P=Re(y,{x:T.x,y:T.y,z:T.z},T.h,(T.maxz+T.minz)/2),x=[],h=!1,p=0;for(let E=0;E<t.length;E++)if(P.intersectsOBB(t[E].obb)){for(let w=0;w<t[E].points.length&&!(P.containsPoint(t[E].points[w])&&(m==0&&x.push(t[E].points[w]),t[E].points[w].z>i.z&&t[E].points[w].z-i.z<1&&(p++,p>10&&m!=0)));w++);if(p>10&&(h=!0),m!=0&&h)break}if(o==0&&(o=pe(x).maxz),h){let E=jt(d[1],d[2]);E.z+=e[r].stairStepHeight,a.push(E)}d=[],d=[l,u],d.push(d[1].clone().addScaledVector(e[r].vecStepWidth,e[r].stairStepWidth)),d.push(d[0].clone().addScaledVector(e[r].vecStepWidth,e[r].stairStepWidth)),y=d.map(E=>[E.x,E.y]),d.push(new A.Vector3(d[3].x,d[3].y,d[3].z+s)),d.push(new A.Vector3(d[2].x,d[2].y,d[2].z+s)),d.push(new A.Vector3(d[1].x,d[1].y,d[1].z+s)),d.push(new A.Vector3(d[0].x,d[0].y,d[0].z+s)),T=pe(d),P=Re(y,{x:T.x,y:T.y,z:T.z},T.h,(T.maxz+T.minz)/2),x=[],h=!1;for(let E=0;E<t.length;E++)if(P.intersectsOBB(t[E].obb)){let w=0;for(let R=0;R<t[E].points.length&&!(P.containsPoint(t[E].points[R])&&(m==0&&x.push(t[E].points[R]),t[E].points[R].z>i.z&&t[E].points[R].z-i.z<1&&(w++,w>10&&m!=0)));R++);if(w>10&&(h=!0),m!=0&&h)break}if(o==0&&(o=pe(x).maxz),h){let E=jt(d[1],d[2]);E.z+=e[r].stairStepHeight,c.push(E)}i=i.addScaledVector(e[r].vecStepWidth,e[r].stairStepWidth),i=i.addScaledVector(e[r].vecStepHeight,e[r].stairStepHeight),l=l.addScaledVector(e[r].vecStepWidth,e[r].stairStepWidth),l=l.addScaledVector(e[r].vecStepHeight,e[r].stairStepHeight),f=f.addScaledVector(e[r].vecStepWidth,e[r].stairStepWidth),f=f.addScaledVector(e[r].vecStepHeight,e[r].stairStepHeight),u=u.addScaledVector(e[r].vecStepWidth,e[r].stairStepWidth),u=u.addScaledVector(e[r].vecStepHeight,e[r].stairStepHeight)}a.length>e[r].stairStepNum-3&&(e[r].stairBottom1BalconyRailing=a),c.length>e[r].stairStepNum-3&&(e[r].stairBottom2BalconyRailing=c),e[r].balconyRailingHeight=o}};function Vs(e,t={}){let{binCount:n=80,minBinPoints:s=5,sideK:o=3,zK:r=3,minSideRange:i=.2,minZRange:l=.2,maxSearchBins:f=3,lowerZScale:u=1,upperZScale:g=1}=t;if(!e||e.length===0)return[];let a=e.map((H,F)=>({index:F,x:H.x,y:H.y,z:H.z,raw:H})),c=0,m=0;for(let H of a)c+=H.x,m+=H.y;c/=a.length,m/=a.length;let d=0,y=0,T=0;for(let H of a){let F=H.x-c,W=H.y-m;d+=F*F,y+=F*W,T+=W*W}d/=a.length,y/=a.length,T/=a.length;let P=d+T,x=Math.sqrt((d-T)*(d-T)+4*y*y),h=(P+x)/2,p,E;Math.abs(y)>1e-8?(p=h-T,E=y):d>=T?(p=1,E=0):(p=0,E=1);let w=Math.sqrt(p*p+E*E)||1;p/=w,E/=w;let R=-E,b=p,S=1/0,z=-1/0,V=a.map(H=>{let F=H.x-c,W=H.y-m,Y=F*p+W*E,X=F*R+W*b;return S=Math.min(S,Y),z=Math.max(z,Y),{...H,t:Y,side:X}}),v=(z-S||1)/n,B=new Map;for(let H of V){let F=Math.floor((H.t-S)/v);F<0&&(F=0),F>=n&&(F=n-1),B.has(F)||B.set(F,[]),B.get(F).push(H)}let I=new Map;for(let[H,F]of B){if(F.length<s)continue;let W=F.map(Z=>Z.side).sort((Z,et)=>Z-et),Y=F.map(Z=>Z.z).sort((Z,et)=>Z-et),X=Cn(W),Q=Cn(Y),U=Cn(W.map(Z=>Math.abs(Z-X)).sort((Z,et)=>Z-et)),lt=Cn(Y.map(Z=>Math.abs(Z-Q)).sort((Z,et)=>Z-et)),ot=Math.max(i,U*1.4826*o),ut=Math.max(l,lt*1.4826*r);I.set(H,{sideMedian:X,zMedian:Q,sideRange:ot,zRange:ut})}function _(H){if(I.has(H))return I.get(H);for(let F=1;F<=f;F++){if(I.has(H-F))return I.get(H-F);if(I.has(H+F))return I.get(H+F)}return null}let k=[],C=[];for(let H of V){let F=Math.floor((H.t-S)/v);F<0&&(F=0),F>=n&&(F=n-1);let W=_(F);if(!W){C.push(H.raw);continue}let Y=Math.abs(H.side-W.sideMedian)<=W.sideRange,X=W.zMedian-W.zRange*u,Q=W.zMedian+W.zRange*g,U=H.z>=X&&H.z<=Q;Y&&U?k.push(H.raw):C.push(H.raw)}return{keep:k,removed:C,debug:{meanX:c,meanY:m,dirX:p,dirY:E,sideX:R,sideY:b,minT:S,maxT:z,binSize:v,stats:I}}}function Cn(e){if(e.length===0)return 0;let t=Math.floor(e.length/2);return e.length%2===0?(e[t-1]+e[t])/2:e[t]}function ai(e,t){let n=new Map;for(let s=0;s<e.length;s++){let o=e[s],r=Math.floor(o.x/t),i=Math.floor(o.y/t),l=Math.floor(o.z/t),f=`${r},${i},${l}`;n.has(f)||n.set(f,[]),n.get(f).push(s)}return n}function ui(e,t,n,s,o){let r=e[n],i=Math.floor(r.x/s),l=Math.floor(r.y/s),f=Math.floor(r.z/s),u=[];for(let g=-1;g<=1;g++)for(let a=-1;a<=1;a++)for(let c=-1;c<=1;c++){let m=`${i+g},${l+a},${f+c}`,d=t.get(m);if(d)for(let y of d){if(y===n)continue;let T=e[y],P=r.x-T.x,x=r.y-T.y,h=r.z-T.z;P*P+x*x+h*h<=o&&u.push(y)}}return u}function Ms(e,t={}){let{radius:n=.35,minClusterSize:s=20,lowPercent:o=.35}=t,r=fi(e,{radius:n}),i=e.map(g=>g.z).sort((g,a)=>g-a),l=i[Math.floor(i.length*o)],f=[],u=[];for(let g of r.clusters){let a=g.map(d=>r.points[d]),c=a.reduce((d,y)=>d+y.z,0)/a.length;a.length<s&&c<=l?u.push(...a.map(d=>d.raw)):f.push(...a.map(d=>d.raw))}return{keep:f,removed:u}}function fi(e,t={}){let{radius:n=.35}=t,s=e.map((f,u)=>({index:u,x:f.x,y:f.y,z:f.z,raw:f})),o=ai(s,n),r=n*n,i=new Array(s.length).fill(!1),l=[];for(let f=0;f<s.length;f++){if(i[f])continue;let u=[],g=[f];for(i[f]=!0;g.length>0;){let a=g.shift();u.push(a);let c=ui(s,o,a,n,r);for(let m of c)i[m]||(i[m]=!0,g.push(m))}l.push(u)}return{points:s,clusters:l}}function hi(e,t,n=1e-6){let s=di(t);for(let o of s)if(!mi(e,o,n))return!1;return!0}function di(e){let t=e.center,n=e.halfSize,s=e.rotation.elements,o=new A.Vector3(s[0],s[1],s[2]).multiplyScalar(n.x),r=new A.Vector3(s[3],s[4],s[5]).multiplyScalar(n.y),i=new A.Vector3(s[6],s[7],s[8]).multiplyScalar(n.z),l=[];for(let f of[-1,1])for(let u of[-1,1])for(let g of[-1,1]){let a=t.clone().addScaledVector(o,f).addScaledVector(r,u).addScaledVector(i,g);l.push(a)}return l}function mi(e,t,n=1e-6){let s=new A.Vector3().subVectors(t,e.center),o=e.rotation.elements,r=e.halfSize,i=new A.Vector3(o[0],o[1],o[2]),l=new A.Vector3(o[3],o[4],o[5]),f=new A.Vector3(o[6],o[7],o[8]),u=s.dot(i),g=s.dot(l),a=s.dot(f);return Math.abs(u)<=r.x+n&&Math.abs(g)<=r.y+n&&Math.abs(a)<=r.z+n}function pi(e,t,n,s){return 1+(e[t][0]===0||e[n][0]===0||e[s][0]===0?1:0)}function gi(e){if(!e.length)return 0;let t=[...e].sort((s,o)=>s-o),n=Math.floor(t.length/2);return t.length%2?t[n]:(t[n-1]+t[n])/2}function yi(e,t,n,s,o,r){let i=Math.hypot(n-o,s-r),l=Math.hypot(e-o,t-r),f=Math.hypot(e-n,t-s),u=Math.abs((n-e)*(r-t)-(o-e)*(s-t))/2,g=Math.max(i,l,f);return u===0?{radius:1/0,maxEdge:g}:{radius:i*l*f/(4*u),maxEdge:g}}function Ei(e,t){let n=[],s=new Set,o=(r,i)=>r<i?`${r}_${i}`:`${i}_${r}`;for(let r=0;r<t.length;r+=3){let i=t[r],l=t[r+1],f=t[r+2],u=[[i,l],[l,f],[f,i]];for(let[g,a]of u){let c=o(g,a);if(s.has(c))continue;s.add(c);let[m,d]=e[g],[y,T]=e[a],P=Math.hypot(y-m,T-d);Number.isFinite(P)&&P>0&&n.push(P)}}return gi(n)}function xi(e){let t=new Set,n=[];for(let s of e){if(!s||s.length<2)continue;let o=s[0],r=s[1];if(!Number.isFinite(o)||!Number.isFinite(r))continue;let i=`${o}_${r}`;t.has(i)||(t.add(i),n.push([o,r]))}return n}function wi(e){let t=new Map;for(let[n,s]of e)t.has(n)||t.set(n,[]),t.has(s)||t.set(s,[]),t.get(n).push(s),t.get(s).push(n);return t}function bi(e,t){if(!t.length)return[];let n=wi(t),s=t[0][0],o=[],r=new Set,i=s,l=-1;do{o.push(e[i]),r.add(i);let f=n.get(i)||[],u=f.find(g=>g!==l&&!r.has(g));if(u===void 0&&(u=f.find(g=>g!==l)),u===void 0)break;l=i,i=u}while(i!==s&&o.length<=t.length+1);return o}function Ti(e,t={}){let{edgeFactor:n=20,alphaScale:s=2}=t;if(!e||e.length<3)return[];let o=xi(e);if(o.length<3)return[];let r=new ve(Float64Array.from(o.flat())),{triangles:i}=r;if(!i.length)return[];let l=Ei(o,i);if(!Number.isFinite(l)||l<=0)return[];let f=l*n,u=new Map,g=(m,d)=>m<d?`${m}_${d}`:`${d}_${m}`;for(let m=0;m<i.length;m+=3){let d=i[m],y=i[m+1],T=i[m+2],[P,x]=o[d],[h,p]=o[y],[E,w]=o[T],{radius:R,maxEdge:b}=yi(P,x,h,p,E,w),S=pi(o,d,y,T)*s;if(R<=1/S&&b<=f){let z=[[d,y],[y,T],[T,d]];for(let[V,M]of z){let v=g(V,M);u.set(v,(u.get(v)||0)+1)}}}let a=[];for(let[m,d]of u)d===1&&a.push(m.split("_").map(Number));return a.length?bi(o,a):[]}export{ar as checkBeamIsReasonable,Te as computeContour,Ti as computeContourNew,si as drawStaircase,lr as getBeamLine,mr as getColLine,Fs as getLineCheckResults,ii as getMergeFloorMeaning,ri as getMergeMeaning,As as getOneLineCheckResults,li as getStaircase,Zs as updateStEdPoint};
|
|
1
|
+
var xs=Object.create;var oo=Object.defineProperty;var ws=Object.getOwnPropertyDescriptor;var bs=Object.getOwnPropertyNames;var Ts=Object.getPrototypeOf,Ps=Object.prototype.hasOwnProperty;var ke=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Ss=(e,t,n,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of bs(t))!Ps.call(e,o)&&o!==n&&oo(e,o,{get:()=>t[o],enumerable:!(s=ws(t,o))||s.enumerable});return e};var Rs=(e,t,n)=>(n=e!=null?xs(Ts(e)):{},Ss(t||!e||!e.__esModule?oo(n,"default",{value:e,enumerable:!0}):n,e));var Co=ke((Wn,jn)=>{(function(e,t){typeof Wn=="object"&&typeof jn<"u"?jn.exports=t():typeof define=="function"&&define.amd?define(t):(e=e||self,e.RBush=t())})(Wn,function(){"use strict";function e(d,y,x,T,S){t(d,y,x||0,T||d.length-1,S||s)}function t(d,y,x,T,S){for(;T>x;){if(T-x>600){var b=T-x+1,R=y-x+1,z=Math.log(b),V=.5*Math.exp(2*z/3),M=.5*Math.sqrt(z*V*(b-V)/b)*(R-b/2<0?-1:1),v=Math.max(x,Math.floor(y-R*V/b+M)),I=Math.min(T,Math.floor(y+(b-R)*V/b+M));t(d,y,v,I,S)}var D=d[y],B=x,_=T;for(n(d,x,y),S(d[T],D)>0&&n(d,x,T);B<_;){for(n(d,B,_),B++,_--;S(d[B],D)<0;)B++;for(;S(d[_],D)>0;)_--}S(d[x],D)===0?n(d,x,_):(_++,n(d,_,T)),_<=y&&(x=_+1),y<=_&&(T=_-1)}}function n(d,y,x){var T=d[y];d[y]=d[x],d[x]=T}function s(d,y){return d<y?-1:d>y?1:0}var o=function(y){y===void 0&&(y=9),this._maxEntries=Math.max(4,y),this._minEntries=Math.max(2,Math.ceil(this._maxEntries*.4)),this.clear()};o.prototype.all=function(){return this._all(this.data,[])},o.prototype.search=function(y){var x=this.data,T=[];if(!P(y,x))return T;for(var S=this.toBBox,b=[];x;){for(var R=0;R<x.children.length;R++){var z=x.children[R],V=x.leaf?S(z):z;P(y,V)&&(x.leaf?T.push(z):E(y,V)?this._all(z,T):b.push(z))}x=b.pop()}return T},o.prototype.collides=function(y){var x=this.data;if(!P(y,x))return!1;for(var T=[];x;){for(var S=0;S<x.children.length;S++){var b=x.children[S],R=x.leaf?this.toBBox(b):b;if(P(y,R)){if(x.leaf||E(y,R))return!0;T.push(b)}}x=T.pop()}return!1},o.prototype.load=function(y){if(!(y&&y.length))return this;if(y.length<this._minEntries){for(var x=0;x<y.length;x++)this.insert(y[x]);return this}var T=this._build(y.slice(),0,y.length-1,0);if(!this.data.children.length)this.data=T;else if(this.data.height===T.height)this._splitRoot(this.data,T);else{if(this.data.height<T.height){var S=this.data;this.data=T,T=S}this._insert(T,this.data.height-T.height-1,!0)}return this},o.prototype.insert=function(y){return y&&this._insert(y,this.data.height-1),this},o.prototype.clear=function(){return this.data=w([]),this},o.prototype.remove=function(y,x){if(!y)return this;for(var T=this.data,S=this.toBBox(y),b=[],R=[],z,V,M;T||b.length;){if(T||(T=b.pop(),V=b[b.length-1],z=R.pop(),M=!0),T.leaf){var v=r(y,T.children,x);if(v!==-1)return T.children.splice(v,1),b.push(T),this._condense(b),this}!M&&!T.leaf&&E(T,S)?(b.push(T),R.push(z),z=0,V=T,T=T.children[0]):V?(z++,T=V.children[z],M=!1):T=null}return this},o.prototype.toBBox=function(y){return y},o.prototype.compareMinX=function(y,x){return y.minX-x.minX},o.prototype.compareMinY=function(y,x){return y.minY-x.minY},o.prototype.toJSON=function(){return this.data},o.prototype.fromJSON=function(y){return this.data=y,this},o.prototype._all=function(y,x){for(var T=[];y;)y.leaf?x.push.apply(x,y.children):T.push.apply(T,y.children),y=T.pop();return x},o.prototype._build=function(y,x,T,S){var b=T-x+1,R=this._maxEntries,z;if(b<=R)return z=w(y.slice(x,T+1)),i(z,this.toBBox),z;S||(S=Math.ceil(Math.log(b)/Math.log(R)),R=Math.ceil(b/Math.pow(R,S-1))),z=w([]),z.leaf=!1,z.height=S;var V=Math.ceil(b/R),M=V*Math.ceil(Math.sqrt(R));g(y,x,T,M,this.compareMinX);for(var v=x;v<=T;v+=M){var I=Math.min(v+M-1,T);g(y,v,I,V,this.compareMinY);for(var D=v;D<=I;D+=V){var B=Math.min(D+V-1,I);z.children.push(this._build(y,D,B,S-1))}}return i(z,this.toBBox),z},o.prototype._chooseSubtree=function(y,x,T,S){for(;S.push(x),!(x.leaf||S.length-1===T);){for(var b=1/0,R=1/0,z=void 0,V=0;V<x.children.length;V++){var M=x.children[V],v=a(M),I=m(y,M)-v;I<R?(R=I,b=v<b?v:b,z=M):I===R&&v<b&&(b=v,z=M)}x=z||x.children[0]}return x},o.prototype._insert=function(y,x,T){var S=T?y:this.toBBox(y),b=[],R=this._chooseSubtree(S,this.data,x,b);for(R.children.push(y),f(R,S);x>=0&&b[x].children.length>this._maxEntries;)this._split(b,x),x--;this._adjustParentBBoxes(S,b,x)},o.prototype._split=function(y,x){var T=y[x],S=T.children.length,b=this._minEntries;this._chooseSplitAxis(T,b,S);var R=this._chooseSplitIndex(T,b,S),z=w(T.children.splice(R,T.children.length-R));z.height=T.height,z.leaf=T.leaf,i(T,this.toBBox),i(z,this.toBBox),x?y[x-1].children.push(z):this._splitRoot(T,z)},o.prototype._splitRoot=function(y,x){this.data=w([y,x]),this.data.height=y.height+1,this.data.leaf=!1,i(this.data,this.toBBox)},o.prototype._chooseSplitIndex=function(y,x,T){for(var S,b=1/0,R=1/0,z=x;z<=T-x;z++){var V=l(y,0,z,this.toBBox),M=l(y,z,T,this.toBBox),v=h(V,M),I=a(V)+a(M);v<b?(b=v,S=z,R=I<R?I:R):v===b&&I<R&&(R=I,S=z)}return S||T-x},o.prototype._chooseSplitAxis=function(y,x,T){var S=y.leaf?this.compareMinX:u,b=y.leaf?this.compareMinY:p,R=this._allDistMargin(y,x,T,S),z=this._allDistMargin(y,x,T,b);R<z&&y.children.sort(S)},o.prototype._allDistMargin=function(y,x,T,S){y.children.sort(S);for(var b=this.toBBox,R=l(y,0,x,b),z=l(y,T-x,T,b),V=c(R)+c(z),M=x;M<T-x;M++){var v=y.children[M];f(R,y.leaf?b(v):v),V+=c(R)}for(var I=T-x-1;I>=x;I--){var D=y.children[I];f(z,y.leaf?b(D):D),V+=c(z)}return V},o.prototype._adjustParentBBoxes=function(y,x,T){for(var S=T;S>=0;S--)f(x[S],y)},o.prototype._condense=function(y){for(var x=y.length-1,T=void 0;x>=0;x--)y[x].children.length===0?x>0?(T=y[x-1].children,T.splice(T.indexOf(y[x]),1)):this.clear():i(y[x],this.toBBox)};function r(d,y,x){if(!x)return y.indexOf(d);for(var T=0;T<y.length;T++)if(x(d,y[T]))return T;return-1}function i(d,y){l(d,0,d.children.length,y,d)}function l(d,y,x,T,S){S||(S=w(null)),S.minX=1/0,S.minY=1/0,S.maxX=-1/0,S.maxY=-1/0;for(var b=y;b<x;b++){var R=d.children[b];f(S,d.leaf?T(R):R)}return S}function f(d,y){return d.minX=Math.min(d.minX,y.minX),d.minY=Math.min(d.minY,y.minY),d.maxX=Math.max(d.maxX,y.maxX),d.maxY=Math.max(d.maxY,y.maxY),d}function u(d,y){return d.minX-y.minX}function p(d,y){return d.minY-y.minY}function a(d){return(d.maxX-d.minX)*(d.maxY-d.minY)}function c(d){return d.maxX-d.minX+(d.maxY-d.minY)}function m(d,y){return(Math.max(y.maxX,d.maxX)-Math.min(y.minX,d.minX))*(Math.max(y.maxY,d.maxY)-Math.min(y.minY,d.minY))}function h(d,y){var x=Math.max(d.minX,y.minX),T=Math.max(d.minY,y.minY),S=Math.min(d.maxX,y.maxX),b=Math.min(d.maxY,y.maxY);return Math.max(0,S-x)*Math.max(0,b-T)}function E(d,y){return d.minX<=y.minX&&d.minY<=y.minY&&y.maxX<=d.maxX&&y.maxY<=d.maxY}function P(d,y){return y.minX<=d.maxX&&y.minY<=d.maxY&&y.maxX>=d.minX&&y.maxY>=d.minY}function w(d){return{children:d,height:1,leaf:!0,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0}}function g(d,y,x,T,S){for(var b=[y,x];b.length;)if(x=b.pop(),y=b.pop(),!(x-y<=T)){var R=y+Math.ceil((x-y)/T/2)*T;e(d,R,y,x,S),b.push(y,R,R,x)}}return o})});var Do=ke(($n,Xn)=>{(function(e,t){typeof $n=="object"&&typeof Xn<"u"?Xn.exports=t():typeof define=="function"&&define.amd?define(t):(e=e||self,e.TinyQueue=t())})($n,function(){"use strict";var e=function(s,o){if(s===void 0&&(s=[]),o===void 0&&(o=t),this.data=s,this.length=this.data.length,this.compare=o,this.length>0)for(var r=(this.length>>1)-1;r>=0;r--)this._down(r)};e.prototype.push=function(s){this.data.push(s),this.length++,this._up(this.length-1)},e.prototype.pop=function(){if(this.length!==0){var s=this.data[0],o=this.data.pop();return this.length--,this.length>0&&(this.data[0]=o,this._down(0)),s}},e.prototype.peek=function(){return this.data[0]},e.prototype._up=function(s){for(var o=this,r=o.data,i=o.compare,l=r[s];s>0;){var f=s-1>>1,u=r[f];if(i(l,u)>=0)break;r[s]=u,s=f}r[s]=l},e.prototype._down=function(s){for(var o=this,r=o.data,i=o.compare,l=this.length>>1,f=r[s];s<l;){var u=(s<<1)+1,p=r[u],a=u+1;if(a<this.length&&i(r[a],p)<0&&(u=a,p=r[a]),i(p,f)>=0)break;r[s]=p,s=u}r[s]=f};function t(n,s){return n<s?-1:n>s?1:0}return e})});var Lo=ke((vf,Io)=>{Io.exports=function(t,n,s,o){var r=t[0],i=t[1],l=!1;s===void 0&&(s=0),o===void 0&&(o=n.length);for(var f=(o-s)/2,u=0,p=f-1;u<f;p=u++){var a=n[s+u*2+0],c=n[s+u*2+1],m=n[s+p*2+0],h=n[s+p*2+1],E=c>i!=h>i&&r<(m-a)*(i-c)/(h-c)+a;E&&(l=!l)}return l}});var Fo=ke((Hf,Ao)=>{Ao.exports=function(t,n,s,o){var r=t[0],i=t[1],l=!1;s===void 0&&(s=0),o===void 0&&(o=n.length);for(var f=o-s,u=0,p=f-1;u<f;p=u++){var a=n[u+s][0],c=n[u+s][1],m=n[p+s][0],h=n[p+s][1],E=c>i!=h>i&&r<(m-a)*(i-c)/(h-c)+a;E&&(l=!l)}return l}});var qo=ke((Bf,wn)=>{var Oo=Lo(),No=Fo();wn.exports=function(t,n,s,o){return n.length>0&&Array.isArray(n[0])?No(t,n,s,o):Oo(t,n,s,o)};wn.exports.nested=No;wn.exports.flat=Oo});var jo=ke((bn,Wo)=>{(function(e,t){typeof bn=="object"&&typeof Wo<"u"?t(bn):typeof define=="function"&&define.amd?define(["exports"],t):t((e=e||self).predicates={})})(bn,function(e){"use strict";let n=33306690738754706e-32;function s(m,h,E,P,w){let g,d,y,x,T=h[0],S=P[0],b=0,R=0;S>T==S>-T?(g=T,T=h[++b]):(g=S,S=P[++R]);let z=0;if(b<m&&R<E)for(S>T==S>-T?(y=g-((d=T+g)-T),T=h[++b]):(y=g-((d=S+g)-S),S=P[++R]),g=d,y!==0&&(w[z++]=y);b<m&&R<E;)S>T==S>-T?(y=g-((d=g+T)-(x=d-g))+(T-x),T=h[++b]):(y=g-((d=g+S)-(x=d-g))+(S-x),S=P[++R]),g=d,y!==0&&(w[z++]=y);for(;b<m;)y=g-((d=g+T)-(x=d-g))+(T-x),T=h[++b],g=d,y!==0&&(w[z++]=y);for(;R<E;)y=g-((d=g+S)-(x=d-g))+(S-x),S=P[++R],g=d,y!==0&&(w[z++]=y);return g===0&&z!==0||(w[z++]=g),z}function o(m){return new Float64Array(m)}let r=33306690738754716e-32,i=22204460492503146e-32,l=11093356479670487e-47,f=o(4),u=o(8),p=o(12),a=o(16),c=o(4);e.orient2d=function(m,h,E,P,w,g){let d=(h-g)*(E-w),y=(m-w)*(P-g),x=d-y;if(d===0||y===0||d>0!=y>0)return x;let T=Math.abs(d+y);return Math.abs(x)>=r*T?x:-(function(S,b,R,z,V,M,v){let I,D,B,_,k,H,F,j,X,K,Y,tt,it,ct,ut,W,q,Z,wt=S-V,Ft=R-V,Nt=b-M,Wt=z-M;k=(ut=(j=wt-(F=(H=134217729*wt)-(H-wt)))*(K=Wt-(X=(H=134217729*Wt)-(H-Wt)))-((ct=wt*Wt)-F*X-j*X-F*K))-(Y=ut-(q=(j=Nt-(F=(H=134217729*Nt)-(H-Nt)))*(K=Ft-(X=(H=134217729*Ft)-(H-Ft)))-((W=Nt*Ft)-F*X-j*X-F*K))),f[0]=ut-(Y+k)+(k-q),k=(it=ct-((tt=ct+Y)-(k=tt-ct))+(Y-k))-(Y=it-W),f[1]=it-(Y+k)+(k-W),k=(Z=tt+Y)-tt,f[2]=tt-(Z-k)+(Y-k),f[3]=Z;let Lt=(function(Bt,J){let ft=J[0];for(let Q=1;Q<Bt;Q++)ft+=J[Q];return ft})(4,f),Tt=i*v;if(Lt>=Tt||-Lt>=Tt||(I=S-(wt+(k=S-wt))+(k-V),B=R-(Ft+(k=R-Ft))+(k-V),D=b-(Nt+(k=b-Nt))+(k-M),_=z-(Wt+(k=z-Wt))+(k-M),I===0&&D===0&&B===0&&_===0)||(Tt=l*v+n*Math.abs(Lt),(Lt+=wt*_+Wt*I-(Nt*B+Ft*D))>=Tt||-Lt>=Tt))return Lt;k=(ut=(j=I-(F=(H=134217729*I)-(H-I)))*(K=Wt-(X=(H=134217729*Wt)-(H-Wt)))-((ct=I*Wt)-F*X-j*X-F*K))-(Y=ut-(q=(j=D-(F=(H=134217729*D)-(H-D)))*(K=Ft-(X=(H=134217729*Ft)-(H-Ft)))-((W=D*Ft)-F*X-j*X-F*K))),c[0]=ut-(Y+k)+(k-q),k=(it=ct-((tt=ct+Y)-(k=tt-ct))+(Y-k))-(Y=it-W),c[1]=it-(Y+k)+(k-W),k=(Z=tt+Y)-tt,c[2]=tt-(Z-k)+(Y-k),c[3]=Z;let It=s(4,f,4,c,u);k=(ut=(j=wt-(F=(H=134217729*wt)-(H-wt)))*(K=_-(X=(H=134217729*_)-(H-_)))-((ct=wt*_)-F*X-j*X-F*K))-(Y=ut-(q=(j=Nt-(F=(H=134217729*Nt)-(H-Nt)))*(K=B-(X=(H=134217729*B)-(H-B)))-((W=Nt*B)-F*X-j*X-F*K))),c[0]=ut-(Y+k)+(k-q),k=(it=ct-((tt=ct+Y)-(k=tt-ct))+(Y-k))-(Y=it-W),c[1]=it-(Y+k)+(k-W),k=(Z=tt+Y)-tt,c[2]=tt-(Z-k)+(Y-k),c[3]=Z;let Pt=s(It,u,4,c,p);k=(ut=(j=I-(F=(H=134217729*I)-(H-I)))*(K=_-(X=(H=134217729*_)-(H-_)))-((ct=I*_)-F*X-j*X-F*K))-(Y=ut-(q=(j=D-(F=(H=134217729*D)-(H-D)))*(K=B-(X=(H=134217729*B)-(H-B)))-((W=D*B)-F*X-j*X-F*K))),c[0]=ut-(Y+k)+(k-q),k=(it=ct-((tt=ct+Y)-(k=tt-ct))+(Y-k))-(Y=it-W),c[1]=it-(Y+k)+(k-W),k=(Z=tt+Y)-tt,c[2]=tt-(Z-k)+(Y-k),c[3]=Z;let bt=s(Pt,p,4,c,a);return a[bt-1]})(m,h,E,P,w,g,T)},e.orient2dfast=function(m,h,E,P,w,g){return(h-g)*(E-w)-(m-w)*(P-g)},Object.defineProperty(e,"__esModule",{value:!0})})});var Uo=ke((_f,Un)=>{"use strict";var $o=Co(),Pn=Do(),Mr=qo(),vr=jo().orient2d;Pn.default&&(Pn=Pn.default);Un.exports=Zo;Un.exports.default=Zo;function Zo(e,t,n){t=Math.max(0,t===void 0?2:t),n=n||0;var s=Cr(e),o=new $o(16);o.toBBox=function(g){return{minX:g[0],minY:g[1],maxX:g[0],maxY:g[1]}},o.compareMinX=function(g,d){return g[0]-d[0]},o.compareMinY=function(g,d){return g[1]-d[1]},o.load(e);for(var r=[],i=0,l;i<s.length;i++){var f=s[i];o.remove(f),l=Go(f,l),r.push(l)}var u=new $o(16);for(i=0;i<r.length;i++)u.insert(Yn(r[i]));for(var p=t*t,a=n*n;r.length;){var c=r.shift(),m=c.p,h=c.next.p,E=Gn(m,h);if(!(E<a)){var P=E/p;f=Hr(o,c.prev.p,m,h,c.next.next.p,P,u),f&&Math.min(Gn(f,m),Gn(f,h))<=P&&(r.push(c),r.push(Go(f,c)),o.remove(f),u.remove(c),u.insert(Yn(c)),u.insert(Yn(c.next)))}}c=l;var w=[];do w.push(c.p),c=c.next;while(c!==l);return w.push(c.p),w}function Hr(e,t,n,s,o,r,i){for(var l=new Pn([],Br),f=e.data;f;){for(var u=0;u<f.children.length;u++){var p=f.children[u],a=f.leaf?Zn(p,n,s):_r(n,s,p);a>r||l.push({node:p,dist:a})}for(;l.length&&!l.peek().node.children;){var c=l.pop(),m=c.node,h=Zn(m,t,n),E=Zn(m,s,o);if(c.dist<h&&c.dist<E&&Yo(n,m,i)&&Yo(s,m,i))return m}f=l.pop(),f&&(f=f.node)}return null}function Br(e,t){return e.dist-t.dist}function _r(e,t,n){if(Xo(e,n)||Xo(t,n))return 0;var s=Tn(e[0],e[1],t[0],t[1],n.minX,n.minY,n.maxX,n.minY);if(s===0)return 0;var o=Tn(e[0],e[1],t[0],t[1],n.minX,n.minY,n.minX,n.maxY);if(o===0)return 0;var r=Tn(e[0],e[1],t[0],t[1],n.maxX,n.minY,n.maxX,n.maxY);if(r===0)return 0;var i=Tn(e[0],e[1],t[0],t[1],n.minX,n.maxY,n.maxX,n.maxY);return i===0?0:Math.min(s,o,r,i)}function Xo(e,t){return e[0]>=t.minX&&e[0]<=t.maxX&&e[1]>=t.minY&&e[1]<=t.maxY}function Yo(e,t,n){for(var s=Math.min(e[0],t[0]),o=Math.min(e[1],t[1]),r=Math.max(e[0],t[0]),i=Math.max(e[1],t[1]),l=n.search({minX:s,minY:o,maxX:r,maxY:i}),f=0;f<l.length;f++)if(kr(l[f].p,l[f].next.p,e,t))return!1;return!0}function Ge(e,t,n){return vr(e[0],e[1],t[0],t[1],n[0],n[1])}function kr(e,t,n,s){return e!==s&&t!==n&&Ge(e,t,n)>0!=Ge(e,t,s)>0&&Ge(n,s,e)>0!=Ge(n,s,t)>0}function Yn(e){var t=e.p,n=e.next.p;return e.minX=Math.min(t[0],n[0]),e.minY=Math.min(t[1],n[1]),e.maxX=Math.max(t[0],n[0]),e.maxY=Math.max(t[1],n[1]),e}function Cr(e){for(var t=e[0],n=e[0],s=e[0],o=e[0],r=0;r<e.length;r++){var i=e[r];i[0]<t[0]&&(t=i),i[0]>s[0]&&(s=i),i[1]<n[1]&&(n=i),i[1]>o[1]&&(o=i)}var l=[t,n,s,o],f=l.slice();for(r=0;r<e.length;r++)Mr(e[r],l)||f.push(e[r]);return Ir(f)}function Go(e,t){var n={p:e,prev:null,next:null,minX:0,minY:0,maxX:0,maxY:0};return t?(n.next=t.next,n.prev=t,t.next.prev=n,t.next=n):(n.prev=n,n.next=n),n}function Gn(e,t){var n=e[0]-t[0],s=e[1]-t[1];return n*n+s*s}function Zn(e,t,n){var s=t[0],o=t[1],r=n[0]-s,i=n[1]-o;if(r!==0||i!==0){var l=((e[0]-s)*r+(e[1]-o)*i)/(r*r+i*i);l>1?(s=n[0],o=n[1]):l>0&&(s+=r*l,o+=i*l)}return r=e[0]-s,i=e[1]-o,r*r+i*i}function Tn(e,t,n,s,o,r,i,l){var f=n-e,u=s-t,p=i-o,a=l-r,c=e-o,m=t-r,h=f*f+u*u,E=f*p+u*a,P=p*p+a*a,w=f*c+u*m,g=p*c+a*m,d=h*P-E*E,y,x,T,S,b=d,R=d;d===0?(x=0,b=1,S=g,R=P):(x=E*g-P*w,S=h*g-E*w,x<0?(x=0,S=g,R=P):x>b&&(x=b,S=g+E,R=P)),S<0?(S=0,-w<0?x=0:-w>h?x=b:(x=-w,b=h)):S>R&&(S=R,-w+E<0?x=0:-w+E>h?x=b:(x=-w+E,b=h)),y=x===0?0:x/b,T=S===0?0:S/R;var z=(1-y)*e+y*n,V=(1-y)*t+y*s,M=(1-T)*o+T*i,v=(1-T)*r+T*l,I=M-z,D=v-V;return I*I+D*D}function Dr(e,t){return e[0]===t[0]?e[1]-t[1]:e[0]-t[0]}function Ir(e){e.sort(Dr);for(var t=[],n=0;n<e.length;n++){for(;t.length>=2&&Ge(t[t.length-2],t[t.length-1],e[n])<=0;)t.pop();t.push(e[n])}for(var s=[],o=e.length-1;o>=0;o--){for(;s.length>=2&&Ge(s[s.length-2],s[s.length-1],e[o])<=0;)s.pop();s.push(e[o])}return s.pop(),t.pop(),t.concat(s)}});import*as De from"three";import*as Ce from"three";var Ht=class e{constructor(t=0,n=0,s=0){this.x=t,this.y=n,this.z=s}set(t,n,s){return this.x=t,this.y=n,this.z=s,this}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}clone(){return new e(this.x,this.y,this.z)}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this}subVectors(t,n){return this.x=t.x-n.x,this.y=t.y-n.y,this.z=t.z-n.z,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}crossVectors(t,n){let s=t.x,o=t.y,r=t.z,i=n.x,l=n.y,f=n.z;return this.x=o*f-r*l,this.y=r*i-s*f,this.z=s*l-o*i,this}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.lengthSq())}normalize(){let t=this.length();return t>0&&(this.x/=t,this.y/=t,this.z/=t),this}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){let n=this.x-t.x,s=this.y-t.y,o=this.z-t.z;return n*n+s*s+o*o}toArray(){return[this.x,this.y,this.z]}fromArray(t,n=0){return this.x=t[n],this.y=t[n+1],this.z=t[n+2],this}applyAxisAngle(t,n){let s=this.x,o=this.y,r=this.z,i=t.x,l=t.y,f=t.z,u=Math.cos(n),p=Math.sin(n),a=i*s+l*o+f*r;return this.x=i*a*(1-u)+s*u+(-f*o+l*r)*p,this.y=l*a*(1-u)+o*u+(f*s-i*r)*p,this.z=f*a*(1-u)+r*u+(-l*s+i*o)*p,this}},ln=class{constructor(t=new Ht(1,0,0),n=0){this.normal=t,this.constant=n}set(t,n){return this.normal.copy(t),this.constant=n,this}setFromNormalAndCoplanarPoint(t,n){return this.normal.copy(t),this.constant=-n.dot(this.normal),this}setFromCoplanarPoints(t,n,s){let o=new Ht().subVectors(n,t),r=new Ht().subVectors(s,t),i=new Ht().crossVectors(o,r).normalize();return this.normal.copy(i),this.constant=-t.dot(this.normal),this}distanceToPoint(t){return this.normal.dot(t)+this.constant}projectPoint(t,n=new Ht){let s=this.distanceToPoint(t);return n.copy(t),n.x-=this.normal.x*s,n.y-=this.normal.y*s,n.z-=this.normal.z*s,n}},rn=()=>typeof performance<"u"&&performance.now?performance.now():Date.now(),Bn=class{constructor(){this.results=null,this.clusterResults=null}initLimits1(t,n){let s,o;return t<.3?s=5:t<.5?s=8:t<.8?s=10:t<1?s=15:t<2?s=30:t<3?s=35:t<4?s=40:t<5?s=45:t<6?s=50:t<7?s=60:t<8.5?s=70:t<10?s=80:t<15?s=100:t<20?s=120:t<25?s=140:t<30?s=160:t<35?s=180:t<40?s=200:t<45?s=230:t<50?s=250:s=350,n<1?o=30:n<2?o=40:n<2.5?o=45:n<3?o=60:n<3.6?o=70:o=80,{horizontalSubdivisions:s,verticalSubdivisions:o}}initLimits2(t,n){let r=Math.round(Math.max(5,Math.min(350,t/.08))),i=Math.round(Math.max(30,Math.min(80,n/.06)));return{horizontalSubdivisions:r,verticalSubdivisions:i}}initLimits3(t,n){let s;t<2?s=.06:t<10?s=.1:s=.15;let o=Math.round(Math.max(5,Math.min(350,t/s))),r=Math.round(Math.max(30,Math.min(80,n/.06)));return{horizontalSubdivisions:o,verticalSubdivisions:r}}initLimits4(t,n){let s=Math.round(Math.max(5,Math.min(350,20*Math.sqrt(t)))),o=Math.round(Math.max(30,Math.min(80,20*Math.sqrt(n))));return{horizontalSubdivisions:s,verticalSubdivisions:o}}createSubdividedWallPlane(t,n,s,o=null){let r=[];if(!t||!t.start||!t.end||isNaN(t.rooftopPz))return r;let i=new Ht(t.start.x,t.start.y,t.start.z),l=new Ht(t.end.x,t.end.y,t.end.z),f=new Ht(t.end.x,t.end.y,t.rooftopPz),u=new Ht(t.start.x,t.start.y,t.rooftopPz),p=[i,l,f,u];for(let S=0;S<p.length;S++)if(!this.isValidVector3(p[S]))return console.error(`\u5899\u4F53\u57FA\u7840\u70B9${S}\u65E0\u6548:`,p[S]),r;let a=i.distanceTo(l),c=Math.abs(t.rooftopPz-t.start.z);if(a===0||c===0)return console.error("\u5899\u4F53\u5BBD\u5EA6\u6216\u9AD8\u5EA6\u4E3A0"),console.log("line.rooftopPz",t.rooftopPz),console.log("bottomLeft",i),console.log("bottomRight",l),console.log(t.length),r;let m=a/s,h=c/n,E=new Ht().subVectors(l,i).normalize(),P=i.x,w=i.y,g=i.z,d=E.x,y=E.y,x=E.z,T=(S,b)=>new Ht(P+d*S,w+y*S,g+x*S+b);for(let S=0;S<n;S++){let b=S*h,R=(S+1)*h;for(let z=0;z<s;z++){let V=z*m,M=(z+1)*m;r.push({points:[T(V,b),T(M,b),T(M,R),T(V,R)],userData:{type:"wallSegment",row:S,col:z,width:m,height:h}})}}return r}analyzePointDistribution(t,n,s=.01,o={}){let r=o.projectPlane||null;this.results={totalSegments:0,segmentsWithPoints:0,segmentsWithoutPoints:0,missingSegments:[],existSegments:[],pointsInSegments:new Map,segmentsByPoint:new Map,segmentDetails:new Map,tolerance:s,analysisTime:null};let i=rn(),l=[],f=new Map,u=1/0,p=-1/0,a=1/0,c=-1/0;for(let V=0;V<t.length;V++){let M=t[V];if(M.userData&&M.userData.type==="wallSegment"){let v=this.getWorldVerticesNew(M.points);if(v.length<4)continue;let I=new Ht().add(v[0]).add(v[1]).add(v[2]).add(v[3]).multiplyScalar(.25);M.userData.center=I,M.vertices=v;let D=M.userData.row,B=M.userData.col,_=`row${D}_col${B}`;l.push(M),f.set(_,M),D<u&&(u=D),D>p&&(p=D),B<a&&(a=B),B>c&&(c=B)}}if(this.results.totalSegments=l.length,l.length===0)return this.results.analysisTime=rn()-i,this.printAnalysisResults(),this.results;let m=`row${u}_col${a}`,h=f.get(m)||l[0];if(!h||!h.vertices||h.vertices.length<4)return this.results.analysisTime=rn()-i,this.printAnalysisResults(),this.results;let E=h.vertices[0],P=h.vertices[1],w=h.vertices[3],g=new Ht().subVectors(P,E).normalize(),d=new Ht().subVectors(w,E).normalize(),y=h.userData.width,x=h.userData.height,T=p-u+1,S=c-a+1,b=new ln;b.setFromCoplanarPoints(E,P,w);let R=new Ht,z=new Ht;for(let V=0;V<n.length;V+=3){let M=new Ht(n[V],n[V+1],n[V+2]),v=r?r.projectPoint(M,z):M;if(Math.abs(b.distanceToPoint(v))>s)continue;R.subVectors(v,E);let D=R.dot(g),B=R.dot(d),_=Math.ceil((D-s)/y-1),k=Math.floor((D+s)/y),H=Math.ceil((B-s)/x-1),F=Math.floor((B+s)/x);if(k<0||_>S-1||F<0||H>T-1)continue;let j=Math.max(0,_),X=Math.min(S-1,k),K=Math.max(0,H),Y=Math.min(T-1,F);for(let tt=K;tt<=Y;tt++){let it=u+tt;for(let ct=j;ct<=X;ct++){let ut=a+ct,W=`row${it}_col${ut}`;f.has(W)&&(this.results.pointsInSegments.has(W)||this.results.pointsInSegments.set(W,[V]))}}}for(let V of l){let M=`row${V.userData.row}_col${V.userData.col}`,v=this.results.pointsInSegments.has(M)?this.results.pointsInSegments.get(M).length:0,I=v>=1,D={row:V.userData.row,col:V.userData.col,width:V.userData.width,height:V.userData.height,segmentKey:M,vertices:V.vertices,center:V.userData.center,mesh:V,pointCount:v,hasPointsButNotEnough:v>0&&v<1};I?(this.results.segmentsWithPoints++,this.results.existSegments.push(D)):(this.results.segmentsWithoutPoints++,this.results.missingSegments.push(D))}return this.results.analysisTime=rn()-i,this.printAnalysisResults(),this.results}isPointInWallSegmentOptimized(t,n,s,o,r,i,l,f,u,p,a){if(Math.abs(s.distanceToPoint(t))>a)return!1;let m=new Ht().subVectors(t,n),h=Math.abs(m.dot(r)),E=Math.abs(m.dot(i));if(h>u&&E>p)return!1;let P=new Ht().subVectors(t,o),w=P.dot(r),g=P.dot(i),d=w>=-a&&w<=l+a,y=g>=-a&&g<=f+a;return d&&y}getWorldVerticesNew(t){return t}highlightEmptySegments(t,n=null,s=null,o=1){if(!this.results)return console.warn("\u8BF7\u5148\u8FD0\u884C\u5206\u6790\u51FD\u6570"),null;let r=new Map,i=new Map;for(let u of this.results.missingSegments)r.set(u.segmentKey,u),i.has(u.row)||i.set(u.row,new Map),i.get(u.row).set(u.col,{segmentKey:u.segmentKey,isEmpty:!0,visited:!1});for(let u of t)if(u.userData&&u.userData.type==="wallSegment"){let p=`row${u.userData.row}_col${u.userData.col}`,a=r.has(p);i.has(u.userData.row)||i.set(u.userData.row,new Map),i.get(u.userData.row).has(u.userData.col)||i.get(u.userData.row).set(u.userData.col,{segmentKey:p,isEmpty:a,visited:!1})}let l=[],f=[[0,1],[1,0],[0,-1],[-1,0]];for(let[u,p]of r){let a=i.get(p.row)?.get(p.col);if(a&&!a.visited){let c=[],m=[[p.row,p.col]],h=0;for(a.visited=!0;h<m.length;){let E=m[h++],P=E[0],w=E[1],g=`row${P}_col${w}`;r.has(g)&&c.push(r.get(g));for(let d of f){let y=P+d[0],x=w+d[1];if(i.has(y)&&i.get(y).has(x)){let T=i.get(y).get(x);!T.visited&&T.isEmpty&&(T.visited=!0,m.push([y,x]))}}}c.length>=o&&l.push(c)}}return this.clusterResults={clusters:l.sort((u,p)=>p.length-u.length),totalClusters:l.length},this.clusterResults}getClusterInfo(){if(!this.clusterResults)return null;let t=this.clusterResults.clusters.map(n=>n.length);return{totalClusters:this.clusterResults.totalClusters,clusterSizes:this.clusterResults.clusters.map((n,s)=>({clusterIndex:s,size:n.length,segments:n.map(o=>o.segmentKey)})),largestCluster:t.length?Math.max(...t):0,smallestCluster:t.length?Math.min(...t):0}}printAnalysisResults(){if(!this.results){console.warn("\u6CA1\u6709\u53EF\u7528\u7684\u5206\u6790\u7ED3\u679C");return}}isValidVector3(t){return t&&!isNaN(t.x)&&!isNaN(t.y)&&!isNaN(t.z)&&isFinite(t.x)&&isFinite(t.y)&&isFinite(t.z)}},so=(e,t)=>{let n={},s=[],o=[];if(!e||e.length===0)return n.originalVertices=s,n.allCenterPoints=o,n;if(t=="xyz")for(let r of e){o.push({x:r.center.x,y:r.center.y,z:r.center.z});let i=[];for(let l=0;l<r.vertices.length;l++)i.push({x:r.vertices[l].x,y:r.vertices[l].y,z:r.vertices[l].z});s.push(i)}else if(t=="three")for(let r of e){o.push(new Ce.Vector3(r.center.x,r.center.y,r.center.z));let i=[];for(let l=0;l<r.vertices.length;l++)i.push(new Ce.Vector3(r.vertices[l].x,r.vertices[l].y,r.vertices[l].z));s.push(i)}else if(t=="array")for(let r of e){o.push(r.center.x),o.push(r.center.y),o.push(r.center.z);let i=[];for(let l=0;l<r.vertices.length;l++)i.push(r.vertices[l].x,r.vertices[l].y,r.vertices[l].z);s.push(i)}return n.originalVertices=s,n.allCenterPoints=o,n},zs=(e,t)=>{let n=new Ht().copy(e.start).add(e.end).multiplyScalar(.5),s=new Ht().subVectors(new Ht(n.x,n.y,n.z+1),n).normalize(),o=new Ht(e.direction.x,e.direction.y,0);o.applyAxisAngle(s,Math.PI/2);let r=new Ht().copy(n).add(o.clone().multiplyScalar(e.length)),i=new Ht().copy(n).sub(o.clone().multiplyScalar(e.length));if(n.z=e.start.z,r.z=e.start.z,i.z=e.start.z,t=="three")return{start:new Ce.Vector3(r.x,r.y,r.z),end:new Ce.Vector3(i.x,i.y,i.z),center:new Ce.Vector3(n.x,n.y,n.z),direction:new Ce.Vector3(o.x,o.y,o.z)};if(t=="xyz")return{start:{x:r.x,y:r.y,z:r.z},end:{x:i.x,y:i.y,z:i.z},center:{x:n.x,y:n.y,z:n.z},direction:{x:o.x,y:o.y,z:o.z}};if(t=="array")return{start:[r.x,r.y,r.z],end:[i.x,i.y,i.z],center:[n.x,n.y,n.z],direction:[o.x,o.y,o.z]}},ro=async(e,t=!0,n="three")=>{for(let s=0;s<e.length;s++){let o=e[s];await _n(o,t,n)}},_n=(e,t=!0,n="three")=>{if((e.isBayWindow||e.isWindow||e.isBalconyRailing)&&t)return;let s=new ln().setFromCoplanarPoints(new Ht(e.start.x,e.start.y,e.start.z),new Ht(e.end.x,e.end.y,e.end.z),new Ht(e.start.x,e.start.y,e.rooftopPz)),o=new Ht(e.start.x,e.start.y,e.start.z).distanceTo(new Ht(e.end.x,e.end.y,e.end.z)),r=Math.abs(e.rooftopPz-e.start.z),i=new Bn,{horizontalSubdivisions:l,verticalSubdivisions:f}=i.initLimits4(o,r),u=i.createSubdividedWallPlane(e,f,l,null);i.analyzePointDistribution(u,e.originalPoints,.01,{projectPlane:s});let p=i.highlightEmptySegments(u,null,null),a=[];if(p&&p.clusters)for(let h of p.clusters){let E=so(h,n);E&&a.push(E)}let m=zs(e,n).direction;if(e.checkResults=a,e.verticalDirection=m,e.saveExistSegments){let h=[],E=so(i.results.existSegments,n);E&&h.push(E),e.existSegments=h}};var kt=class e{constructor(t=0,n=0,s=0){this.x=t,this.y=n,this.z=s}set(t,n,s){return this.x=t,this.y=n,this.z=s,this}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}clone(){return new e(this.x,this.y,this.z)}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this}subVectors(t,n){return this.x=t.x-n.x,this.y=t.y-n.y,this.z=t.z-n.z,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}crossVectors(t,n){let s=t.x,o=t.y,r=t.z,i=n.x,l=n.y,f=n.z;return this.x=o*f-r*l,this.y=r*i-s*f,this.z=s*l-o*i,this}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.lengthSq())}normalize(){let t=this.length();return t>0&&(this.x/=t,this.y/=t,this.z/=t),this}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){let n=this.x-t.x,s=this.y-t.y,o=this.z-t.z;return n*n+s*s+o*o}toArray(){return[this.x,this.y,this.z]}fromArray(t,n=0){return this.x=t[n],this.y=t[n+1],this.z=t[n+2],this}applyAxisAngle(t,n){let s=this.x,o=this.y,r=this.z,i=t.x,l=t.y,f=t.z,u=Math.cos(n),p=Math.sin(n),a=i*s+l*o+f*r;return this.x=i*a*(1-u)+s*u+(-f*o+l*r)*p,this.y=l*a*(1-u)+o*u+(f*s-i*r)*p,this.z=f*a*(1-u)+r*u+(-l*s+i*o)*p,this}},an=class{constructor(t=new kt(1,0,0),n=0){this.normal=t,this.constant=n}set(t,n){return this.normal.copy(t),this.constant=n,this}setFromNormalAndCoplanarPoint(t,n){return this.normal.copy(t),this.constant=-n.dot(this.normal),this}setFromCoplanarPoints(t,n,s){let o=new kt().subVectors(n,t),r=new kt().subVectors(s,t),i=new kt().crossVectors(o,r).normalize();return this.normal.copy(i),this.constant=-t.dot(this.normal),this}distanceToPoint(t){return this.normal.dot(t)+this.constant}projectPoint(t,n=new kt){let s=this.distanceToPoint(t);return n.copy(t),n.x-=this.normal.x*s,n.y-=this.normal.y*s,n.z-=this.normal.z*s,n}},cn=()=>typeof performance<"u"&&performance.now?performance.now():Date.now(),kn=class{constructor(){this.results=null,this.clusterResults=null}initLimits1(t,n){let s,o;return t<.3?s=5:t<.5?s=8:t<.8?s=10:t<1?s=15:t<2?s=30:t<3?s=35:t<4?s=40:t<5?s=45:t<6?s=50:t<7?s=60:t<8.5?s=70:t<10?s=80:t<15?s=100:t<20?s=120:t<25?s=140:t<30?s=160:t<35?s=180:t<40?s=200:t<45?s=230:t<50?s=250:s=350,n<1?o=30:n<2?o=40:n<2.5?o=45:n<3?o=60:n<3.6?o=70:o=80,{horizontalSubdivisions:s,verticalSubdivisions:o}}initLimits2(t,n){let r=Math.round(Math.max(5,Math.min(350,t/.08))),i=Math.round(Math.max(30,Math.min(80,n/.06)));return{horizontalSubdivisions:r,verticalSubdivisions:i}}initLimits3(t,n){let s;t<2?s=.06:t<10?s=.1:s=.15;let o=Math.round(Math.max(5,Math.min(350,t/s))),r=Math.round(Math.max(30,Math.min(80,n/.06)));return{horizontalSubdivisions:o,verticalSubdivisions:r}}initLimits4(t,n){let s=Math.round(Math.max(5,Math.min(350,20*Math.sqrt(t)))),o=Math.round(Math.max(30,Math.min(80,20*Math.sqrt(n))));return{horizontalSubdivisions:s,verticalSubdivisions:o}}createSubdividedWallPlane(t,n,s,o=null){let r=[];if(!t||!t.start||!t.end||isNaN(t.rooftopPz))return r;let i=new kt(t.start.x,t.start.y,t.start.z),l=new kt(t.end.x,t.end.y,t.end.z),f=new kt(t.end.x,t.end.y,t.rooftopPz),u=new kt(t.start.x,t.start.y,t.rooftopPz),p=[i,l,f,u];for(let S=0;S<p.length;S++)if(!this.isValidVector3(p[S]))return console.error(`\u5899\u4F53\u57FA\u7840\u70B9${S}\u65E0\u6548:`,p[S]),r;let a=i.distanceTo(l),c=Math.abs(t.rooftopPz-t.start.z);if(a===0||c===0)return console.error("\u5899\u4F53\u5BBD\u5EA6\u6216\u9AD8\u5EA6\u4E3A0"),console.log("line.rooftopPz",t.rooftopPz),console.log("bottomLeft",i),console.log("bottomRight",l),console.log(t.length),r;let m=a/s,h=c/n,E=new kt().subVectors(l,i).normalize(),P=i.x,w=i.y,g=i.z,d=E.x,y=E.y,x=E.z,T=(S,b)=>new kt(P+d*S,w+y*S,g+x*S+b);for(let S=0;S<n;S++){let b=S*h,R=(S+1)*h;for(let z=0;z<s;z++){let V=z*m,M=(z+1)*m;r.push({points:[T(V,b),T(M,b),T(M,R),T(V,R)],userData:{type:"wallSegment",row:S,col:z,width:m,height:h}})}}return r}analyzePointDistribution(t,n,s=.01,o={}){let r=o.projectPlane||null;this.results={totalSegments:0,segmentsWithPoints:0,segmentsWithoutPoints:0,missingSegments:[],existSegments:[],pointsInSegments:new Map,segmentsByPoint:new Map,segmentDetails:new Map,tolerance:s,analysisTime:null};let i=cn(),l=[],f=new Map,u=1/0,p=-1/0,a=1/0,c=-1/0;for(let V=0;V<t.length;V++){let M=t[V];if(M.userData&&M.userData.type==="wallSegment"){let v=this.getWorldVerticesNew(M.points);if(v.length<4)continue;let I=new kt().add(v[0]).add(v[1]).add(v[2]).add(v[3]).multiplyScalar(.25);M.userData.center=I,M.vertices=v;let D=M.userData.row,B=M.userData.col,_=`row${D}_col${B}`;l.push(M),f.set(_,M),D<u&&(u=D),D>p&&(p=D),B<a&&(a=B),B>c&&(c=B)}}if(this.results.totalSegments=l.length,l.length===0)return this.results.analysisTime=cn()-i,this.printAnalysisResults(),this.results;let m=`row${u}_col${a}`,h=f.get(m)||l[0];if(!h||!h.vertices||h.vertices.length<4)return this.results.analysisTime=cn()-i,this.printAnalysisResults(),this.results;let E=h.vertices[0],P=h.vertices[1],w=h.vertices[3],g=new kt().subVectors(P,E).normalize(),d=new kt().subVectors(w,E).normalize(),y=h.userData.width,x=h.userData.height,T=p-u+1,S=c-a+1,b=new an;b.setFromCoplanarPoints(E,P,w);let R=new kt,z=new kt;for(let V=0;V<n.length;V++){let M=n[V],v=r?r.projectPoint(M,z):M;if(Math.abs(b.distanceToPoint(v))>s)continue;R.subVectors(v,E);let D=R.dot(g),B=R.dot(d),_=Math.ceil((D-s)/y-1),k=Math.floor((D+s)/y),H=Math.ceil((B-s)/x-1),F=Math.floor((B+s)/x);if(k<0||_>S-1||F<0||H>T-1)continue;let j=Math.max(0,_),X=Math.min(S-1,k),K=Math.max(0,H),Y=Math.min(T-1,F);for(let tt=K;tt<=Y;tt++){let it=u+tt;for(let ct=j;ct<=X;ct++){let ut=a+ct,W=`row${it}_col${ut}`;f.has(W)&&(this.results.pointsInSegments.has(W)||this.results.pointsInSegments.set(W,[V]))}}}for(let V of l){let M=`row${V.userData.row}_col${V.userData.col}`,v=this.results.pointsInSegments.has(M)?this.results.pointsInSegments.get(M).length:0,I=v>=1,D={row:V.userData.row,col:V.userData.col,width:V.userData.width,height:V.userData.height,segmentKey:M,vertices:V.vertices,center:V.userData.center,mesh:V,pointCount:v,hasPointsButNotEnough:v>0&&v<1};I?(this.results.segmentsWithPoints++,this.results.existSegments.push(D)):(this.results.segmentsWithoutPoints++,this.results.missingSegments.push(D))}return this.results.analysisTime=cn()-i,this.printAnalysisResults(),this.results}isPointInWallSegmentOptimized(t,n,s,o,r,i,l,f,u,p,a){if(Math.abs(s.distanceToPoint(t))>a)return!1;let m=new kt().subVectors(t,n),h=Math.abs(m.dot(r)),E=Math.abs(m.dot(i));if(h>u&&E>p)return!1;let P=new kt().subVectors(t,o),w=P.dot(r),g=P.dot(i),d=w>=-a&&w<=l+a,y=g>=-a&&g<=f+a;return d&&y}getWorldVerticesNew(t){return t}highlightEmptySegments(t,n=null,s=null,o=1){if(!this.results)return console.warn("\u8BF7\u5148\u8FD0\u884C\u5206\u6790\u51FD\u6570"),null;let r=new Map,i=new Map;for(let u of this.results.missingSegments)r.set(u.segmentKey,u),i.has(u.row)||i.set(u.row,new Map),i.get(u.row).set(u.col,{segmentKey:u.segmentKey,isEmpty:!0,visited:!1});for(let u of t)if(u.userData&&u.userData.type==="wallSegment"){let p=`row${u.userData.row}_col${u.userData.col}`,a=r.has(p);i.has(u.userData.row)||i.set(u.userData.row,new Map),i.get(u.userData.row).has(u.userData.col)||i.get(u.userData.row).set(u.userData.col,{segmentKey:p,isEmpty:a,visited:!1})}let l=[],f=[[0,1],[1,0],[0,-1],[-1,0]];for(let[u,p]of r){let a=i.get(p.row)?.get(p.col);if(a&&!a.visited){let c=[],m=[[p.row,p.col]],h=0;for(a.visited=!0;h<m.length;){let E=m[h++],P=E[0],w=E[1],g=`row${P}_col${w}`;r.has(g)&&c.push(r.get(g));for(let d of f){let y=P+d[0],x=w+d[1];if(i.has(y)&&i.get(y).has(x)){let T=i.get(y).get(x);!T.visited&&T.isEmpty&&(T.visited=!0,m.push([y,x]))}}}c.length>=o&&l.push(c)}}return this.clusterResults={clusters:l.sort((u,p)=>p.length-u.length),totalClusters:l.length},this.clusterResults}getClusterInfo(){if(!this.clusterResults)return null;let t=this.clusterResults.clusters.map(n=>n.length);return{totalClusters:this.clusterResults.totalClusters,clusterSizes:this.clusterResults.clusters.map((n,s)=>({clusterIndex:s,size:n.length,segments:n.map(o=>o.segmentKey)})),largestCluster:t.length?Math.max(...t):0,smallestCluster:t.length?Math.min(...t):0}}printAnalysisResults(){if(!this.results){console.warn("\u6CA1\u6709\u53EF\u7528\u7684\u5206\u6790\u7ED3\u679C");return}}isValidVector3(t){return t&&!isNaN(t.x)&&!isNaN(t.y)&&!isNaN(t.z)&&isFinite(t.x)&&isFinite(t.y)&&isFinite(t.z)}},io=(e,t)=>{let n={},s=[],o=[];if(!e||e.length===0)return n.originalVertices=s,n.allCenterPoints=o,n;if(t=="xyz")for(let r of e){o.push({x:r.center.x,y:r.center.y,z:r.center.z});let i=[];for(let l=0;l<r.vertices.length;l++)i.push({x:r.vertices[l].x,y:r.vertices[l].y,z:r.vertices[l].z});s.push(i)}else if(t=="three")for(let r of e){o.push(new De.Vector3(r.center.x,r.center.y,r.center.z));let i=[];for(let l=0;l<r.vertices.length;l++)i.push(new De.Vector3(r.vertices[l].x,r.vertices[l].y,r.vertices[l].z));s.push(i)}else if(t=="array")for(let r of e){o.push(r.center.x),o.push(r.center.y),o.push(r.center.z);let i=[];for(let l=0;l<r.vertices.length;l++)i.push(r.vertices[l].x,r.vertices[l].y,r.vertices[l].z);s.push(i)}return n.originalVertices=s,n.allCenterPoints=o,n},Vs=(e,t)=>{let n=new kt().copy(e.start).add(e.end).multiplyScalar(.5),s=new kt().subVectors(new kt(n.x,n.y,n.z+1),n).normalize(),o=new kt(e.direction.x,e.direction.y,0);o.applyAxisAngle(s,Math.PI/2);let r=new kt().copy(n).add(o.clone().multiplyScalar(e.length)),i=new kt().copy(n).sub(o.clone().multiplyScalar(e.length));if(n.z=e.start.z,r.z=e.start.z,i.z=e.start.z,t=="three")return{start:new De.Vector3(r.x,r.y,r.z),end:new De.Vector3(i.x,i.y,i.z),center:new De.Vector3(n.x,n.y,n.z),direction:new De.Vector3(o.x,o.y,o.z)};if(t=="xyz")return{start:{x:r.x,y:r.y,z:r.z},end:{x:i.x,y:i.y,z:i.z},center:{x:n.x,y:n.y,z:n.z},direction:{x:o.x,y:o.y,z:o.z}};if(t=="array")return{start:[r.x,r.y,r.z],end:[i.x,i.y,i.z],center:[n.x,n.y,n.z],direction:[o.x,o.y,o.z]}},Ms=async(e,t=!0,n="three",s="xyz")=>{s=="xyz"?await lo(e,t,n):s=="array"&&await _n(e,t,n)},vs=async(e,t=!0,n="three",s="xyz")=>{s=="xyz"?await Hs(e,t,n):s=="array"&&await ro(e,t,n)},Hs=async(e,t=!0,n="three")=>{for(let s=0;s<e.length;s++){let o=e[s];await lo(o,t,n)}},lo=(e,t=!0,n="three")=>{if((e.isBayWindow||e.isWindow||e.isBalconyRailing)&&t)return;let s=new an().setFromCoplanarPoints(new kt(e.start.x,e.start.y,e.start.z),new kt(e.end.x,e.end.y,e.end.z),new kt(e.start.x,e.start.y,e.rooftopPz)),o=new kt(e.start.x,e.start.y,e.start.z).distanceTo(new kt(e.end.x,e.end.y,e.end.z)),r=Math.abs(e.rooftopPz-e.start.z),i=new kn,{horizontalSubdivisions:l,verticalSubdivisions:f}=i.initLimits4(o,r),u=i.createSubdividedWallPlane(e,f,l,null);i.analyzePointDistribution(u,e.originalPoints,.01,{projectPlane:s});let p=i.highlightEmptySegments(u,null,null),a=[];if(p&&p.clusters)for(let h of p.clusters){let E=io(h,n);E&&a.push(E)}let m=Vs(e,n).direction;if(e.checkResults=a,e.verticalDirection=m,e.saveExistSegments){let h=[],E=io(i.results.existSegments,n);E&&h.push(E),e.existSegments=h}};import*as C from"three";import"three/examples/jsm/utils/BufferGeometryUtils.js";import*as O from"three";import{CSS2DObject as qi}from"three/examples/jsm/renderers/CSS2DRenderer.js";import"three/examples/jsm/utils/BufferGeometryUtils.js";import Ee from"path";import{fileURLToPath as ks}from"url";import fn from"path";import{fileURLToPath as Bs}from"url";import{Vector3 as wi}from"three";var _s=Bs(import.meta.url),Cn=fn.dirname(_s),bi=fn.resolve(Cn,"./data/lines.meta.json"),Ti=fn.resolve(Cn,"./data/lines.bin"),Pi=fn.resolve(Cn,"./data/checks.bin");var Cs=ks(import.meta.url),Re=Ee.dirname(Cs),vi=Ee.resolve(Re,"./data/lines.tmp.bin"),Hi=Ee.resolve(Re,"./data/checks.tmp.bin"),Bi=Ee.resolve(Re,"./data/lines.new_points.tmp.bin"),_i=Ee.resolve(Re,"./data/lines.new_points.bin"),ki=Ee.resolve(Re,"./data/lines.meta.json"),Ci=Ee.resolve(Re,"./data/lines.bin"),Di=Ee.resolve(Re,"./data/checks.bin"),Ii=Ee.resolve(Re,"./data/lines.exist_segments.bin"),Li=Ee.resolve(Re,"./data/lines.exist_segments.tmp.bin");import{Vector3 as Ds}from"three";var un=class{points=[];_tempArr=[0,0,0];constructor(t){}initPoints(t){this.points=t}getPointByIndex(t,n){let s=t*3;return n.x=this.points[s],n.y=this.points[s+1],n.z=this.points[s+2],n}getPointArrByIndex(t){let n=t*3;return[this.points[n],this.points[n+1],this.points[n+2]]}getPoint2ArrByIndex(t){let n=t*3;return[this.points[n],this.points[n+1]]}getIndexsByIndex(t,n){n.length=0,n.push(t*3),n.push(t*3+1),n.push(t*3+2)}pointsToVector3Arr(t){let n=[];for(let s=0;s<t.length/3;s++)n.push(new Ds(t[s*3],t[s*3+1],t[s*3+2]));return n}vector3ArrToPoints(t){let n=[];for(let s=0;s<t.length;s++)n.push(t[s].x,t[s].y,t[s].z);return n}vector3ArrToFloat32Array(t){return new Float32Array(t.flatMap(s=>[s.x,s.y,s.z]))}clsoe(){this.points=[]}};var ao=(e,t,n)=>{let s=new O.LineBasicMaterial({color:"#0011ff"}),o=[];o.push(e),o.push(t);let r=new O.BufferGeometry;r.setFromPoints(o),r.rotateX(-Math.PI/2),n.add(new O.Line(r,s))},xe=(e,t,n,s,o=1e-8)=>{let r=t.x-e.x,i=t.y-e.y,l=s.x-n.x,f=s.y-n.y,u=r*f-i*l;if(Math.abs(u)<o)return null;let p=((n.x-e.x)*f-(n.y-e.y)*l)/u,a=((n.x-e.x)*i-(n.y-e.y)*r)/u;return p<-o||p>1+o||a<-o||a>1+o?null:{point:new O.Vector3(e.x+p*r,e.y+p*i,e.z)}},fo=(e,t,n={})=>{let{fontSize:s=36,fontFamily:o="sans-serif",backgroundColor:r="rgba(0,0,0,0)",textColor:i="#ffffff",padding:l=10,maxWidth:f=256}=n,p=document.createElement("canvas").getContext("2d");p.font=`bold ${s}px ${o}`;let c=p.measureText(e).width,m=Math.min(c+l*2,f),h=s+l*2,E=document.createElement("canvas");E.width=m,E.height=h;let P=E.getContext("2d");P.fillStyle=r,P.fillRect(0,0,m,h),P.fillStyle=i,P.font=`bold ${s}px ${o}`,P.textAlign="center",P.textBaseline="middle",c>f-l*2?Is(P,e,m/2,h/2,f,s):P.fillText(e,m/2,h/2);let w=new O.CanvasTexture(E),g=new O.SpriteMaterial({map:w,depthTest:!1,transparent:!0}),d=new O.Sprite(g);d.position.set(t.x,t.y,t.z);let y=.005;return d.scale.set(m*y,h*y,1),d};function Is(e,t,n,s,o,r){let i=t.split(""),l="",f=r*1.2,u=s;for(let p=0;p<i.length;p++){let a=l+i[p];e.measureText(a).width>o&&p>0?(e.fillText(l,n,u),l=i[p],u+=f):l=a}e.fillText(l,n,u)}var Kt=(e,t,n=.01)=>{let s=Math.sqrt(e.x*e.x+e.y*e.y+e.z*e.z),o=Math.sqrt(t.x*t.x+t.y*t.y+t.z*t.z);if(s<1e-10||o<1e-10)return{parallel:!1,sameDirection:null,angle:NaN};let r={x:e.x/s,y:e.y/s,z:e.z/s},i={x:t.x/o,y:t.y/o,z:t.z/o},l=r.x*i.x+r.y*i.y+r.z*i.z;l=Math.max(-1,Math.min(1,l));let f=Math.acos(Math.abs(l)),u=f<=n;return{parallel:u,sameDirection:u?l>0:null,angle:f}};var uo=(e,t,n,s)=>{if(t<1e-4||n<1e-4)return{};let o=e,r=[];if(s&&s.length&&(r=s.map(T=>T.clone())),!o||o.length<4)return{};let i=new O.Vector3().subVectors(o[1],o[0]).normalize(),l=new O.Vector3().subVectors(o[3],o[0]).normalize(),f=i.clone().cross(l).normalize(),u=1/0,p=-1/0,a=1/0,c=-1/0;for(let T of o){let S=T.dot(i),b=T.dot(l);S<u&&(u=S),S>p&&(p=S),b<a&&(a=b),b>c&&(c=b)}let m=o[0].dot(f),h=i.clone().multiplyScalar(u).add(l.clone().multiplyScalar(a)).add(f.clone().multiplyScalar(m)),E=i.clone().multiplyScalar(p).add(l.clone().multiplyScalar(a)).add(f.clone().multiplyScalar(m)),P=i.clone().multiplyScalar(p).add(l.clone().multiplyScalar(c)).add(f.clone().multiplyScalar(m)),w=i.clone().multiplyScalar(u).add(l.clone().multiplyScalar(c)).add(f.clone().multiplyScalar(m)),g=[h,E,P,w],d=Kt(new O.Vector3().subVectors(h,E),new O.Vector3(0,0,1));d&&d.parallel&&(g=[h,w,P,E]);let y=0;if(s.length>0){let T=new O.Vector3().subVectors(g[1],g[0]).normalize(),S=T.clone().negate(),b=new O.Vector3().subVectors(g[3],g[0]).normalize(),R=b.clone().negate(),z=g[0].distanceTo(g[1]),V=g[0].distanceTo(g[3]),M=z/t,v=V/n,I=.001;for(let D=0;D<M;D++){let B=g[0],_=0;for(let k=0;k<v;k++){let H=B.clone().addScaledVector(T,t),F=H.clone().addScaledVector(b,n),j=B.clone().addScaledVector(b,n),X=new O.Vector3().add(B).add(H).add(F).add(j).multiplyScalar(.25);for(let K=0;K<r.length;K++)if(r[K].distanceTo(X)<I){_++;break}B=j}if(_>=v/2)break;y+=_,g[0]=g[0].addScaledVector(T,t),g[3]=g[3].addScaledVector(T,t)}z=g[0].distanceTo(g[1]),M=z/t;for(let D=0;D<M;D++){let B=g[1],_=0;for(let k=0;k<v;k++){let H=B.clone().addScaledVector(S,t),F=H.clone().addScaledVector(b,n),j=B.clone().addScaledVector(b,n),X=new O.Vector3().add(B).add(H).add(F).add(j).multiplyScalar(.25);for(let K=0;K<r.length;K++)if(r[K].distanceTo(X)<I){_++;break}B=j}if(_>=v/2)break;y+=_,g[1]=g[1].addScaledVector(S,t),g[2]=g[2].addScaledVector(S,t)}z=g[0].distanceTo(g[1]),M=z/t;for(let D=0;D<v;D++){let B=g[3],_=0;for(let k=0;k<M;k++){let H=B.clone().addScaledVector(T,t),F=H.clone().addScaledVector(R,n),j=B.clone().addScaledVector(R,n),X=new O.Vector3().add(B).add(H).add(F).add(j).multiplyScalar(.25);for(let K=0;K<r.length;K++)if(r[K].distanceTo(X)<I){_++;break}B=H}if(_>=M/2)break;y+=_,g[2]=g[2].addScaledVector(R,n),g[3]=g[3].addScaledVector(R,n)}}let x=g[0].distanceTo(g[1])*g[0].distanceTo(g[3]);return{facePoints:g,boxArea:x,totalInPlaneNum:y}},Yt=(e,t,n,s,o=O.MathUtils.degToRad(8))=>{let r=new O.Vector3,i=new O.Vector3;r.subVectors(new O.Vector3(t.x,t.y,0),new O.Vector3(e.x,e.y,0)).normalize(),i.subVectors(new O.Vector3(s.x,s.y,0),new O.Vector3(n.x,n.y,0)).normalize();let l=r.dot(i),f=Math.acos(Math.min(Math.abs(l),1)),u=1-Math.min(f/o,1),p=l>0?"same":"opposite";return{parallelism:u,angle:f,angleDeg:O.MathUtils.radToDeg(f),isParallel:f<o,direction:p,vectors:{v1:r,v2:i}}},se=(e,t,n,s)=>{let o=new O.Vector3().subVectors(t,e),r=new O.Vector3().subVectors(s,n),i=o.length(),l=r.length();if(i===0||l===0)return{rate:NaN,angle:NaN,isPerpendicular:!1,isParallel:!1};o.normalize(),r.normalize();let f=Math.abs(o.dot(r)),u=Math.min(1,Math.max(0,f)),p=Math.acos(u),a=O.MathUtils.radToDeg(p),c=1-u,m=1e-6;return{rate:c,percent:`${(c*100).toFixed(2)}%`,angle:a,isPerpendicular:Math.abs(a-90)<.01,isParallel:a<.01}},jt=(e,t,n=!1)=>new O.Vector3((e.x+t.x)/2,(e.y+t.y)/2,n?0:(e.z+t.z)/2),ye=(e,t,n,s,o={})=>{let{parallelAngleMax:r=O.MathUtils.degToRad(10),collinearAngleMax:i=O.MathUtils.degToRad(7),distanceThreshold:l=2,overlapThreshold:f=.01}=o,u=new O.Vector3().subVectors(t,e),p=new O.Vector3().subVectors(s,n),a=u.clone().normalize(),c=p.clone().normalize(),m=O.MathUtils.clamp(a.dot(c),-1,1),h=Math.acos(Math.abs(m)),E=O.MathUtils.radToDeg(h);if(h>r)return{type:"not_parallel",angleDeg:E,avgPerpendicularDistance:null,maxPerpendicularDistance:null,gap:null,overlap:null,closestDistance:null};m<0&&c.negate();let P=new O.Vector3().addVectors(a,c).normalize(),w=new O.Vector3().addVectors(e,t).multiplyScalar(.5),g=co(n,w,a),d=co(s,w,a),y=(g+d)/2,x=Math.max(g,d),T=e.dot(P),S=t.dot(P),b=n.dot(P),R=s.dot(P),z=Math.min(T,S),V=Math.max(T,S),M=Math.min(b,R),v=Math.max(b,R),I=V-z,D=v-M,B=Math.min(I,D),_=Math.min(V,v)-Math.max(z,M),k=_<0?-_:0,H=_>0?_:0,F=B>0?H/B:0,j=Ls(e,t,n,s),X=h<=i&&y<l,K;return X?K=F>.5?"collinear_overlap":"collinear_gap":h<=r&&(K="parallel_offset"),{type:K,angleDeg:E,avgPerpendicularDistance:y,maxPerpendicularDistance:x,gap:k,overlap:H,closestDistance:j}};function co(e,t,n){let s=new O.Vector3().subVectors(e,t),o=s.dot(n),r=n.clone().multiplyScalar(o);return new O.Vector3().subVectors(s,r).length()}function Ls(e,t,n,s){let o=new O.Vector3().subVectors(t,e),r=new O.Vector3().subVectors(s,n),i=new O.Vector3().subVectors(n,e),l=o.dot(o),f=o.dot(r),u=r.dot(r),p=o.dot(i),a=r.dot(i),c=l*u-f*f,m,h;c<1e-10?(m=0,h=u!==0?a/u:0):(m=(f*a-u*p)/c,h=(l*a-f*p)/c),m=O.MathUtils.clamp(m,0,1),h=u!==0?O.MathUtils.clamp((f*m+a)/u,0,1):0,m=l!==0?O.MathUtils.clamp((f*h-p)/l,0,1):0;let E=e.clone().add(o.clone().multiplyScalar(m)),P=n.clone().add(r.clone().multiplyScalar(h));return E.distanceTo(P)}var hn=e=>{let t=999999,n=-999999;for(let s=0;s<e.length;s++)e[s].z>n&&(n=e[s].z),e[s].z<t&&(t=e[s].z);return{minZ:t,maxZ:n}},Je=(e,t,n)=>{let s=new O.Plane,o=new O.Vector3(e.x,e.y,e.z),r=new O.Vector3(t.x,t.y,t.z),i=new O.Vector3(t.x,t.y,t.z+5);s.setFromCoplanarPoints(o,r,i);let l=[],f=[];n.forEach(P=>{let w=new O.Vector3;s.projectPoint(P,w),f.push(w.clone()),w.z=o.z,l.push(w)});let u=new O.Vector3,p=new O.Vector3;s.projectPoint(o,u),s.projectPoint(r,p);let a=new O.Line3(u,p),c=[],m=[],h=[],E=new O.Vector3;return l.forEach((P,w)=>{a.closestPointToPoint(P,!0,E).distanceTo(P)<.001?(c.push(n[w]),m.push(f[w])):h.push(P)}),{newOriginalPoints:c,newProjectPoints:h,newOnLinePoints:m}},ho=(e,t,n)=>{function s(o,r,i,l,f,u,p,a,c){let m=new O.Line3(o,r),h=new Map,E=new O.Vector3,P=o.clone(),w=r.clone(),g=0;for(;;){let d=new Map,y=0;for(let x=0;x<c.checkResults.length;x++)if(!(c.checkResults[x].allCenterPoints.length/a*100<1))for(let S=0;S<c.checkResults[x].allCenterPoints.length;S++){if(h.has(x)&&h.get(x).removePtsIndex.includes(S))continue;let b=c.checkResults[x].allCenterPoints[S];b=new O.Vector3(b.x,b.y,b.z);let R=m.closestPointToPoint(b,!0,E),z=b.distanceTo(R);Math.abs(z-f)<.01&&(y++,d.has(x)?d.get(x).removePtsIndex.push(S):d.set(x,{index:x,removePtsIndex:[S]}))}if(g==p){o=P,r=w;break}if(y<u/20*19||y==0){d.clear(),p-g<5&&(o=P,r=w,h.clear());break}else{g++;for(let[x,T]of d)h.has(x)?h.get(x).removePtsIndex.push(...T.removePtsIndex):h.set(x,T);d.clear(),o=o.addScaledVector(i,l),r=r.addScaledVector(i,l),m.set(o,r)}}if(h.size>0&&g!=p)for(let[d,y]of h){let x=[],T=[];for(let S=0;S<c.checkResults[d].allCenterPoints.length;S++)y.removePtsIndex.includes(S)||(x.push(c.checkResults[d].allCenterPoints[S]),T.push(c.checkResults[d].originalVertices[S]));c.checkResults[d].allCenterPoints=x,c.checkResults[d].originalVertices=T}}for(let o=0;o<e.length;o++){let r=e[o];if(r.length<.5)continue;let i=-1,l=-1,f=t.readLineById(r.id);if(f.checkResults=t.getLineCheckReultsById(r.id),f.originalPoints=t.getOriginalPointsById(r.id),r.originalPoints=f.originalPoints,r.checkResults=f.checkResults,f=null,!r.checkResults||r.checkResults.length<=0)continue;if(r.checkResults[0].originalVertices&&r.checkResults[0].originalVertices.length>0){let D=r.checkResults[0].originalVertices[0],[B,_,k,H]=D;B=new O.Vector3(B.x,B.y,B.z),_=new O.Vector3(_.x,_.y,_.z),k=new O.Vector3(k.x,k.y,k.z),H=new O.Vector3(H.x,H.y,H.z),i=B.distanceTo(_),l=B.distanceTo(H);let F=new O.Vector3().subVectors(B,_).normalize(),j=Kt(F,new O.Vector3(0,0,1));j&&j.parallel&&([l,i]=[i,l])}if(i<0||l<0)continue;let u=new O.Vector3(r.start.x,r.start.y,r.start.z),p=new O.Vector3(r.end.x,r.end.y,r.end.z),a=u.distanceTo(p),c=r.rooftopPz-r.start.z,m=Math.ceil(a/i),h=Math.ceil(c/l),E=u.clone(),P=p.clone(),w=P.clone().add(new O.Vector3(0,0,c)),g=E.clone().add(new O.Vector3(0,0,c)),d=new O.Vector3().subVectors(P,E).normalize(),y=d.clone().negate(),T=new O.Vector3().subVectors(w,E).normalize().clone().negate(),S=i/2,b=l/2,R=a*c,z=i*l,V=R/z;s(E,g,d,i,S,h,m,V,r),s(P,w,y,i,S,h,m,V,r),r.start=E,r.end=P;let{newOriginalPoints:M}=Je(E,P,r.originalPoints);r.originalPoints=M;let I=new un().vector3ArrToFloat32Array(r.originalPoints);n.stageReplacePoints(r.id,I),r.checkResults=null,r.originalPoints=null}n.commit()},$t=(e,t)=>new O.Vector3(e.x,e.y,0).distanceTo(new O.Vector3(t.x,t.y,0)),Dn=(e,t,n=1e-6)=>{let s=new O.Vector3;return e.closestPointToPoint(t,!0,s),s.distanceTo(t)<n},Oe=e=>{let t=0,n=[];for(let s=0;s<e.length;s++)for(let o=s+1;o<e.length;o++){let r=e[s].distanceTo(e[o]);r>t&&(t=r,n=[e[s],e[o]])}return n},st=(e,t,n=.03)=>Math.abs(e.x-t.x)<n&&Math.abs(e.y-t.y)<n&&Math.abs(e.z-t.z)<n;var mo=()=>{let e=Math.floor(Math.random()*75+180).toString(16).padStart(2,"0"),t=Math.floor(Math.random()*75+180).toString(16).padStart(2,"0"),n=Math.floor(Math.random()*75+180).toString(16).padStart(2,"0");return`#${e}${t}${n}`};var In=(e,t=.001)=>{let n=new Map,s=[];for(let o of e){let r=Math.round(o.x/t),i=Math.round(o.y/t),l=Math.round(o.z/t),f=`${r},${i},${l}`;n.has(f)||(n.set(f,!0),s.push(o))}return s},po=e=>{let t=e.center,n=e.halfSize,o=e.rotation.elements,r=new O.Vector3(o[0],o[1],o[2]).multiplyScalar(n.x),i=new O.Vector3(o[3],o[4],o[5]).multiplyScalar(n.y),l=new O.Vector3(o[6],o[7],o[8]).multiplyScalar(n.z);function f(p,a,c){return t.clone().addScaledVector(r,p).addScaledVector(i,a).addScaledVector(l,c)}return[f(-1,-1,-1),f(1,-1,-1),f(1,1,-1),f(-1,1,-1),f(-1,-1,1),f(1,-1,1),f(1,1,1),f(-1,1,1)]},Ln=(e,t)=>{let n=e[0],s=e[1],o=e[2],r=e[3],i=new O.Vector3().subVectors(s,n),l=new O.Vector3().subVectors(r,n),f=i.length(),u=l.length();i.normalize(),l.normalize();let p=new O.Vector3(0,0,1),c=new O.Vector3().add(n).add(s).add(o).add(r).multiplyScalar(.25).clone().addScaledVector(p,t/2),m=new O.BoxGeometry(f,u,t),h=new O.Matrix4;return h.makeBasis(i,l,p),h.setPosition(c),m.applyMatrix4(h),m.computeVertexNormals(),m};import*as Xt from"three";var As=(e,t)=>{console.log("lines",e);for(let n=0;n<e.length;n++){let s=e[n],o=[];s.originalPoints.forEach(d=>{let y=new Xt.Vector3(d.x,d.y,0),x=!1;for(let T=0;T<o.length;T++)if(st(y,o[T],.01)){x=!0;break}x||o.push(y)});let r=Math.round(Math.max(5,Math.min(350,20*Math.sqrt(s.length)))),i=1,l=new Xt.Vector3(s.start.x,s.start.y,s.start.z),f=new Xt.Vector3(s.end.x,s.end.y,s.end.z),u=new Xt.Vector3().subVectors(f,l).normalize(),p=u.clone().cross(new Xt.Vector3(0,0,1)).normalize(),a=p.clone().negate(),c=[],m=[],h=s.length/r;console.log(h);for(let d=0;d<r;d++){let y=[];y.push(l.clone().addScaledVector(p,i)),y.push(y[0].clone().addScaledVector(u,h)),y.push(y[1].clone().addScaledVector(a,i*2)),y.push(l.clone().addScaledVector(a,h));let x=[];for(let T=0;T<o.length;T++)c.includes(T)||Os(o[T],y)&&(c.push(T),x.push(o[T]));x.length>0&&m.push(Ns(x)),l=l.addScaledVector(u,h)}let E=new Float32Array(o.length*3);o.forEach((d,y)=>{E[y*3]=d.x,E[y*3+1]=d.y,E[y*3+2]=d.z});let P=new Xt.BufferGeometry;P.setAttribute("position",new Xt.BufferAttribute(E,3)),P.rotateX(-Math.PI/2),t.add(new Xt.Points(P,new Xt.PointsMaterial({color:mo(),size:.02})));let[w,g]=$s(m,{plane:"xy",trimRatio:0});ao(w,g,t)}};function go(e,t="xy"){if(t==="xy")return{x:e.x,y:e.y};if(t==="xz")return{x:e.x,y:e.z};if(t==="yz")return{x:e.y,y:e.z};throw new Error(`Unsupported plane: ${t}`)}function Fs(e,t,n){let s=t.x-e.x,o=t.y-e.y,r=n.x-e.x,i=n.y-e.y;return s*i-o*r}function Os(e,t,n="xy"){if(!t||t.length!==4)throw new Error("rectPoints must contain 4 points");let s=go(e,n),o=t.map(l=>go(l,n)),r=!1,i=!1;for(let l=0;l<4;l++){let f=o[l],u=o[(l+1)%4],p=Fs(f,u,s);if(p>1e-9&&(r=!0),p<-1e-9&&(i=!0),r&&i)return!1}return!0}function Ns(e){if(!e||e.length===0)return null;let t=new Xt.Vector3(0,0,0);for(let n of e)Array.isArray(n)?(t.x+=n[0],t.y+=n[1],t.z+=n[2]):(t.x+=n.x,t.y+=n.y,t.z+=n.z);return t.divideScalar(e.length),t}function qs(e){return e instanceof Xt.Vector3?e.clone():Array.isArray(e)?new Xt.Vector3(e[0],e[1],e[2]):new Xt.Vector3(e.x,e.y,e.z)}function Ws(e,t="xy"){let n=qs(e);if(t==="xy")return{x:n.x,y:n.y,up:n.z};if(t==="xz")return{x:n.x,y:n.z,up:n.y};if(t==="yz")return{x:n.y,y:n.z,up:n.x};throw new Error(`Unsupported plane: ${t}`)}function yo(e,t,n,s="xy"){if(s==="xy")return new Xt.Vector3(e,t,n);if(s==="xz")return new Xt.Vector3(e,n,t);if(s==="yz")return new Xt.Vector3(n,e,t);throw new Error(`Unsupported plane: ${s}`)}function js(e,t,n){if(Math.abs(t)<1e-12)return e>=n?{x:1,y:0}:{x:0,y:1};let o=e+n,r=e*n-t*t,i=Math.sqrt(Math.max(0,o*o*.25-r)),l=o*.5+i,f=t,u=l-e,p=Math.hypot(f,u);return p<1e-12?{x:1,y:0}:{x:f/p,y:u/p}}function $s(e,t={}){let{plane:n="xy",trimRatio:s=0}=t;if(!e||e.length<2)return null;let o=e.map(_=>Ws(_,n)),r=0,i=0,l=0;for(let _ of o)r+=_.x,i+=_.y,l+=_.up;r/=o.length,i/=o.length,l/=o.length;let f=0,u=0,p=0;for(let _ of o){let k=_.x-r,H=_.y-i;f+=k*k,u+=k*H,p+=H*H}f/=o.length,u/=o.length,p/=o.length;let a=js(f,u,p),c={x:-a.y,y:a.x},m=[];for(let _ of o){let k=_.x-r,H=_.y-i,F=k*a.x+H*a.y,j=k*c.x+H*c.y;m.push({s:F,t:j,up:_.up})}m.sort((_,k)=>_.s-k.s);let h=m.length,E=Math.floor(h*s),P=Math.ceil(h*(1-s))-1;E=Math.max(0,Math.min(h-1,E)),P=Math.max(0,Math.min(h-1,P));let w=m[E],g=m[P],d=(()=>{let _=m.map(H=>H.t).sort((H,F)=>H-F),k=Math.floor(_.length/2);return _.length%2===0?(_[k-1]+_[k])*.5:_[k]})(),y=(()=>{let _=m.map(H=>H.up).sort((H,F)=>H-F),k=Math.floor(_.length/2);return _.length%2===0?(_[k-1]+_[k])*.5:_[k]})(),x=w.s,T=g.s,S=d,b=d,R=y,z=y,V=r+a.x*x+c.x*S,M=i+a.y*x+c.y*S,v=r+a.x*T+c.x*b,I=i+a.y*T+c.y*b,D=yo(V,M,R,n),B=yo(v,I,z,n);return[D,B]}import qe from"path";import*as lt from"fs";import{fileURLToPath as Xs}from"url";import{Vector3 as Ne}from"three";var Ys=Xs(import.meta.url),tn=qe.dirname(Ys),Qe=qe.resolve(tn,"./data/lines.meta.json"),An=qe.resolve(tn,"./data/lines.bin"),Fn=qe.resolve(tn,"./data/checks.bin"),Eo=qe.resolve(tn,"./data/lines.new_points.bin"),On=qe.resolve(tn,"./data/lines.exist_segments.bin");function wo(e){let t=[],n=0,s=0,o=0,r=lt.openSync(An,"w"),i=lt.openSync(Fn,"w"),l=lt.openSync(On,"w");try{for(let u of e){let p=Buffer.alloc(u.originalPoints.length*12),a=new Float32Array(p.buffer,p.byteOffset);for(let h=0,E=0;h<u.originalPoints.length;h++,E+=3){let P=u.originalPoints[h];a[E]=P.x,a[E+1]=P.y,a[E+2]=P.z}lt.writeSync(r,p,0,p.length,n);let c=null;if(Array.isArray(u.checkResults)&&u.checkResults.length>0){let h=[];for(let E of u.checkResults){let P=xo(E);lt.writeSync(i,P,0,P.length,s),h.push({offset:s,byteLength:P.length,faceCount:E.originalVertices.length,centerCount:E.allCenterPoints.length}),s+=P.length}c={checkResults:h}}let m=null;if(Array.isArray(u.existSegments)&&u.existSegments.length>0){let h=[];for(let E of u.existSegments){let P=xo(cr);lt.writeSync(l,P,0,P.length,o),h.push({offset:o,byteLength:P.length,faceCount:E.originalVertices.length,centerCount:(E.allCenterPoints||[]).length}),o+=P.length}m={existSegments:h}}t.push({id:u.id,pointCount:u.originalPoints.length,offset:n,...c||{},...m||{},hasNewOriginalPoints:!1}),n+=p.length,u.originalPoints=null,u.checkResults=null,u.existSegments=null}lt.closeSync(r),lt.closeSync(i),lt.closeSync(l);let f=Qe+".tmp";lt.writeFileSync(f,JSON.stringify(t,null,2)),lt.renameSync(f,Qe),console.log("\u2705 writeFile \u5B8C\u6210\uFF08\u542B existSegments\uFF09")}catch(f){try{lt.closeSync(r)}catch{}try{lt.closeSync(i)}catch{}try{lt.closeSync(l)}catch{}throw f}}var dn=class{constructor(t){this.lineStates=new Map;for(let n of t)this.lineStates.set(n.id,n);this.meta=JSON.parse(lt.readFileSync(Qe,"utf-8")),this.fdRead=lt.openSync(An,"r"),this.checkFdRead=lt.openSync(Fn,"r"),this.existSegmentsFdRead=lt.existsSync(On)?lt.openSync(On,"r"):null,this.newPointsFdRead=lt.existsSync(Eo)?lt.openSync(Eo,"r"):null,this.fdWrite=lt.openSync(An,"a"),this.checkFdWrite=lt.openSync(Fn,"a"),this.dataEnd=lt.fstatSync(this.fdWrite).size,this.checkEnd=lt.fstatSync(this.checkFdWrite).size}readLine(t){let n=this.meta[t];if(!n)return null;let s=this.lineStates.get(n.id);if(!s)return null;let o=Buffer.alloc(n.pointCount*12);lt.readSync(this.fdRead,o,0,o.length,n.offset);let r=new Float32Array(o.buffer,o.byteOffset,n.pointCount*3),i=n.checkResults?n.checkResults.map(u=>this.createCheckResultView(u,"checkResults")):[],l=n.existSegments&&n.existSegments.length>0?n.existSegments.map(u=>this.createCheckResultView(u)):[],f=null;if(n.hasNewOriginalPoints&&this.newPointsFdRead&&typeof n.newPointsOffset=="number"&&n.newPointsCount>0){let u=Buffer.alloc(n.newPointsCount*12);lt.readSync(this.newPointsFdRead,u,0,u.length,n.newPointsOffset),f=new Float32Array(u.buffer,u.byteOffset,n.newPointsCount*3)}return{...s,originalPoints:r,checkResults:i,existSegments:l,new_originalPoints:f}}*iterate(){for(let t=0;t<this.meta.length;t++)yield this.readLine(t)}readLineById(t){let n=this.meta.find(u=>u.id===t);if(!n)return null;let s=this.lineStates.get(n.id);if(!s)return null;let o=Buffer.alloc(n.pointCount*12);lt.readSync(this.fdRead,o,0,o.length,n.offset);let r=new Float32Array(o.buffer,o.byteOffset,n.pointCount*3),i=n.checkResults?n.checkResults.map(u=>this.createCheckResultView(u,"checkResults")):[],l=n.existSegments&&n.existSegments.length>0?n.existSegments.map(u=>this.createCheckResultView(u)):[],f=null;if(n.hasNewOriginalPoints&&this.newPointsFdRead&&typeof n.newPointsOffset=="number"&&n.newPointsCount>0){let u=Buffer.alloc(n.newPointsCount*12);lt.readSync(this.newPointsFdRead,u,0,u.length,n.newPointsOffset),f=new Float32Array(u.buffer,u.byteOffset,n.newPointsCount*3)}return{...s,originalPoints:r,checkResults:i,existSegments:l,new_originalPoints:f}}getLineCheckReultsById(t){let n=this.meta.find(f=>f.id===t);if(!n)return[];if(!this.lineStates.get(n.id))return[];let o=n.checkResults?n.checkResults.map(f=>this.createCheckResultView(f,"checkResults")):[],r=[],i=[],l=[];for(let f of o){for(let u=0;u<f.faceCount;u++){let p=f.getFace(u);i.push(p);let a=f.getCenter(u);l.push(a)}r.push({originalVertices:i,allCenterPoints:l})}return r}getLineExistSegmentsById(t){let n=this.meta.find(p=>p.id===t);if(!n)return[];if(!this.lineStates.get(n.id))return[];let o=Buffer.alloc(n.pointCount*12);lt.readSync(this.fdRead,o,0,o.length,n.offset);let r=new Float32Array(o.buffer,o.byteOffset,n.pointCount*3),i=n.existSegments&&n.existSegments.length>0?n.existSegments.map(p=>this.createCheckResultView(p)):[],l=[],f=[],u=[];for(let p of i){for(let a=0;a<p.faceCount;a++){let c=p.getFace(a);f.push(c);let m=p.getCenter(a);u.push(m)}l.push({originalVertices:f,allCenterPoints:u})}return l}getOriginalPointsById(t){let n=this.meta.find(f=>f.id===t);if(!n||!this.lineStates.get(n.id))return null;let o=Buffer.alloc(n.pointCount*12);lt.readSync(this.fdRead,o,0,o.length,n.offset);let r=new Float32Array(o.buffer,o.byteOffset,n.pointCount*3),i=[],l=r;for(let f=0;f<l.length;f+=3)i.push(new Ne(l[f],l[f+1],l[f+2]));return i}replaceOriginalPoints(t,n){let s=this.meta.find(l=>l.id===t);if(!s)throw new Error(`line ${t} not found`);let o=Buffer.alloc(n.length*12);new Float32Array(o.buffer,o.byteOffset).set(n);let i=this.dataEnd;lt.writeSync(this.fdWrite,o,0,o.length,i),this.dataEnd+=o.length,s.pointCount=n.length/3,s.offset=i}replaceAllCheckResults(t,n){let s=this.meta.find(u=>u.id===t);if(!s)throw new Error(`line ${t} not found`);let o=[],r=0,i=n.map(u=>{let p=Gs(u.originalVertices,u.allCenterPoints||[]);return r+=p.length,p}),f=this.checkEnd;for(let u=0;u<i.length;u++){let p=i[u];lt.writeSync(this.checkFdWrite,p,0,p.length,f),o.push({offset:f,byteLength:p.length,faceCount:n[u].originalVertices.length,centerCount:(n[u].allCenterPoints||[]).length}),f+=p.length}this.checkEnd+=r,s.checkResults=o}flushMeta(){let t=Qe+".tmp";lt.writeFileSync(t,JSON.stringify(this.meta,null,2)),lt.renameSync(t,Qe)}createCheckResultView(t,n){let s=null,o=null,r=()=>{if(s)return;s=Buffer.alloc(t.byteLength);let f=n==="checkResults"?this.checkFdRead:this.existSegmentsFdRead;lt.readSync(f,s,0,t.byteLength,t.offset),o=new Float32Array(s.buffer,s.byteOffset)},i=f=>f*12,l=f=>t.faceCount*12+f*3;return{getFace(f){r();let u=i(f);return[new Ne(o[u],o[u+1],o[u+2]),new Ne(o[u+3],o[u+4],o[u+5]),new Ne(o[u+6],o[u+7],o[u+8]),new Ne(o[u+9],o[u+10],o[u+11])]},getCenter(f){r();let u=l(f);return new Ne(o[u],o[u+1],o[u+2])},faceCount:t.faceCount,centerCount:t.centerCount}}close(){lt.closeSync(this.fdRead),lt.closeSync(this.checkFdRead),this.existSegmentsFdRead&<.closeSync(this.existSegmentsFdRead),this.newPointsFdRead&<.closeSync(this.newPointsFdRead),lt.closeSync(this.fdWrite),lt.closeSync(this.checkFdWrite),this.lineStates.clear()}};function xo(e){let{originalVertices:t,allCenterPoints:n}=e,s=t.length*4*3+n.length*3,o=Buffer.alloc(s*4),r=new Float32Array(o.buffer,o.byteOffset),i=0;for(let l of t)for(let f of l)r[i++]=f.x,r[i++]=f.y,r[i++]=f.z;for(let l of n)r[i++]=l.x,r[i++]=l.y,r[i++]=l.z;return o}function Gs(e,t){let n=e.length*4*3+t.length*3,s=Buffer.alloc(n*4),o=new Float32Array(s.buffer,s.byteOffset),r=0;for(let i of e)for(let l of i)o[r++]=l.x,o[r++]=l.y,o[r++]=l.z;for(let i of t)o[r++]=i.x,o[r++]=i.y,o[r++]=i.z;return s}import{randomUUID as Zs}from"crypto";function Us(e){for(let t of e)t.id=Zs()}var Ks=async(e,t,n,s,o)=>{if(ho(e,s,o),e.length<=0||t.length<=0)return e;n||(n=[]);for(let w of e){let g=[],d=s.readLineById(w.id);if(d.checkResults=s.getLineCheckReultsById(w.id),w.checkResults=d.checkResults,!(!w.checkResults||w.checkResults.length<=0)){for(let y=0;y<w.checkResults.length;y++){let R=function(v){for(;b[v]!==v;)b[v]=b[b[v]],v=b[v];return v},x=w.checkResults[y];if(!x.originalVertices||x.originalVertices.length==0)continue;let T=[];x.originalVertices.forEach(v=>{let I=[];v.forEach(D=>{I.push(new C.Vector3(D.x,D.y,D.z))}),T.push(I)});let S=T.length,b=Array.from({length:S},(v,I)=>I);for(let v=0;v<S;v++)for(let I=v+1;I<S;I++){let D=T[v],B=T[I];if(D.some(k=>B.some(H=>k.equals(H)))){let k=R(v),H=R(I);k!==H&&(b[k]=H)}}let z=new Map,V=-1,M=-1;for(let v=0;v<S;v++){let I=R(v);z.has(I)||z.set(I,{points:[],area:0,originalVertices:[],index:-1,gridWidth:-1,gridHeight:-1,centerPts:[]});let D=z.get(I),[B,_,k,H]=T[v],F=new C.Vector3().add(B).add(_).add(k).add(H).multiplyScalar(.25);if(D.points.push(...T[v]),D.area+=B.distanceTo(_)*B.distanceTo(H),D.originalVertices.push(T[v]),D.index=y,D.centerPts.push(F),V==-1||M==-1){let j=new C.Vector3().subVectors(B,_).normalize();M=B.distanceTo(H),V=B.distanceTo(_);let X=Kt(j,new C.Vector3(0,0,1));X&&X.parallel&&([M,V]=[V,M])}D.gridWidth=V,D.gridHeight=M}g.push(...z.values())}w.checkResults=null,w.mergeCheckRegion=g}}let r=[];for(let w=0;w<n.length;w++){let g=n[w];if(g.isFindBeam=!1,g.category=="door"){let d=[];g.coordinatesByArea.coordinates.forEach(b=>{d.push(new C.Vector3(b.x,b.y,b.z))}),d[0].equals(d[d.length-1])&&d.pop();let y=d[0].distanceTo(d[1]),x=d[0].distanceTo(d[3]);x>y&&([y,x]=[x,y],d=[d[0],d[3],d[2],d[1]]);let T=jt(d[0],d[3],!0),S=jt(d[1],d[2],!0);r.push({doorStartPt:T,doorEndPt:S,boxPoints:d,minZ:g.coordinatesByArea.heightData.minZ,maxZ:g.coordinatesByArea.heightData.maxZ,index:w,isFind:!1,inWall:!1})}}for(let w=0;w<r.length;w++){let g=r[w];for(let d=0;d<e.length;d++){if(e[d].length<.5)continue;let y=[],x=jt(e[d].start,e[d].end,!0);y.push(x),y.push(jt(x,e[d].start,!0)),y.push(jt(x,e[d].end,!0));let T=!1,S=g.boxPoints.length;for(let b=0;b<y.length;b++){let R=y[b].x,z=y[b].y;for(let V=0,M=S-1;V<S;M=V++){let v=g.boxPoints[V].x,I=g.boxPoints[V].y,D=g.boxPoints[M].x,B=g.boxPoints[M].y;I>z!=B>z&&R<(D-v)*(z-I)/(B-I)+v&&(T=!T)}if(T)break}if(T){let b=new C.Vector3(e[d].start.x,e[d].start.y,0),R=new C.Vector3(e[d].end.x,e[d].end.y,0),z=g.doorStartPt.distanceTo(g.doorEndPt),V=b.distanceTo(R),M=Yt(g.doorStartPt,g.doorEndPt,b,R);if(Math.abs(V-z)<.5&&M&&M.angleDeg<15){g.doorStartPt=new C.Vector3(e[d].start.x,e[d].start.y,0),g.doorEndPt=new C.Vector3(e[d].end.x,e[d].end.y,0);break}else if(Math.abs(V-z)>1.3&&M&&M.angleDeg<15){let v=ye(g.doorStartPt,g.doorEndPt,b,R,{parallelAngleMax:C.MathUtils.degToRad(15)}),I=g.doorStartPt.distanceTo(b),D=g.doorStartPt.distanceTo(R),B=g.doorEndPt.distanceTo(b),_=g.doorEndPt.distanceTo(R),k=I<.2||D<.2||B<.2||_<.2;if(v&&v.type=="collinear_overlap"&&v.maxPerpendicularDistance<.1&&!k){g.inWall=!0;break}else{let H=new C.Line3(b,R),F=H.closestPointToPoint(g.doorStartPt,!0,new C.Vector3),j=H.closestPointToPoint(g.doorEndPt,!0,new C.Vector3),X=F.distanceTo(g.doorStartPt),K=j.distanceTo(g.doorEndPt);if(X<.1||K<.1){g.inWall=!0;break}}}}else continue}}let i=0,l=[],f=[],u=[],p=[],a=.15;for(let w=0;w<e.length;w++){let g=e[w];if(g.noDetection)continue;let d=s.readLineById(g.id);if(d.originalPoints=s.getOriginalPointsById(g.id),d.checkResults=s.getLineCheckReultsById(g.id),g.originalPoints=d.originalPoints,g.checkResults=d.checkResults,d=null,g.doorAndBeamData=[],g.doorAndBeamIdToCheckResults=[],!g.mergeCheckRegion||g.mergeCheckRegion.length==0)continue;g.completePointAreaPercentage=-1;let y=new C.Box3;y.setFromPoints(g.originalPoints);let x=y.max.z,T=y.min.z,S=new C.Vector3(g.start.x,g.start.y,g.start.z),b=new C.Vector3(g.end.x,g.end.y,g.end.z),R=g.rooftopPz-g.start.z,z=0;for(let M of g.mergeCheckRegion){let{facePoints:v,boxArea:I,totalInPlaneNum:D}=uo(M.points,M.gridWidth,M.gridHeight,M.centerPts);if(!v||v.length<=0)continue;let B=v[0].distanceTo(v[1]),_=v[0].distanceTo(v[3]),k=M.gridHeight*(_/M.gridHeight/3*2)+M.gridHeight/2,H=new C.Vector3(v[0].x,v[0].y,v[0].z+k),F=new C.Vector3(v[1].x,v[1].y,v[1].z+k),j=new C.Line3(H,F),X=[],K=new C.Vector3;M.points.forEach(W=>{j.closestPointToPoint(W,!0,K).distanceTo(W)<M.gridHeight+.01&&X.push(W)});let Y=[],tt=[];for(;;){let W=[];for(let q=0;q<X.length;q++)tt.includes(q)||W.length==0&&(W.push(X[q]),tt.push(q));for(let q=0;q<X.length;q++)if(!tt.includes(q)){for(let Z=0;Z<W.length;Z++)if(X[q].distanceTo(W[Z])<M.gridWidth+.01){W.push(X[q]),tt.push(q),q=-1;break}}if(W.length==0)break;Y.push(W)}let it=[];for(let W=0;W<Y.length;W++){let q={lineSt:new C.Vector3,lineEd:new C.Vector3,facePoints:[]},Z=Oe(Y[W]);Array.isArray(Z)&&Z.length==2&&(q.lineSt=Z[0],q.lineEd=Z[1],q.facePoints.push(new C.Vector3(Z[0].x,Z[0].y,v[0].z)),q.facePoints.push(new C.Vector3(Z[1].x,Z[1].y,v[0].z)),q.facePoints.push(new C.Vector3(Z[1].x,Z[1].y,v[2].z)),q.facePoints.push(new C.Vector3(Z[0].x,Z[0].y,v[2].z)),it.push(q))}z+=M.area;let ct=0;if(D!=0&&(ct=M.gridHeight*M.gridWidth*D),(M.area-ct)/I*100>70&&it.length==1||it.length>1)for(let W=0;W<it.length;W++){let q=it[W],Z=q.facePoints[0].distanceTo(q.facePoints[1]),wt=q.facePoints[0].distanceTo(q.facePoints[3]),Ft=Z/g.length*100,Nt=g.rooftopPz-q.facePoints[2].z;if(wt<1.5||x<q.facePoints[2].z||Nt>R/3*2)continue;let Wt=!1,Lt=!1,Tt=!1,It=new C.Vector3(0,0,0),Pt=new C.Vector3(0,0,0),bt=!1,Bt=[],J=q.facePoints[2].clone(),ft=q.facePoints[3].clone(),Q=q.facePoints[0].clone(),U=q.facePoints[1].clone(),de=!1,Et=-1;if(Math.abs(q.facePoints[0].z-g.start.z)<.25){let re=!1;for(let et=0;et<t.length;et++){let Vt=et+1;if(Vt>=t.length)continue;let Ot=new C.Vector3(t[et].x,t[et].y,t[et].z),nt=new C.Vector3(t[Vt].x,t[Vt].y,t[Vt].z);if(xe(new C.Vector3(Ot.x,Ot.y,0),new C.Vector3(nt.x,nt.y,0),new C.Vector3(q.facePoints[0].x,q.facePoints[0].y,0),new C.Vector3(q.facePoints[1].x,q.facePoints[1].y,0),.1)!=null){re=!0;break}}let{newOriginalPoints:Pe}=Je(Q,U,g.originalPoints),St=[],ie=[];if(Pe.forEach(et=>{et.z>=J.z?St.push(et):et.z<=Q.z&&ie.push(et)}),St.length<20)continue;let G=g.rooftopPz-J.z,me=J.clone();me.z+=G;let He=J.distanceTo(ft),Be=new C.Vector3().subVectors(ft,J).normalize(),Ze=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(He)))),_e=He/Ze,pe=[],Ae=[];for(let et=0;et<Ze;et++)pe.push(new C.Vector3(J.x,J.y,J.z+G/5).addScaledVector(Be,_e*et)),pe.push(new C.Vector3(me.x,me.y,me.z-G/5).addScaledVector(Be,_e*et));let Fe=pe.length;for(let et=0;et<St.length;et++)for(let Vt=0;Vt<pe.length;Vt++)if(new C.Vector3(St[et].x,St[et].y,St[et].z).distanceTo(pe[Vt])<.05){Ae.push(pe[Vt]),pe.splice(Vt,1);break}if(Ae.length/Fe<.5)continue;if(Z>.17&&g.length>.5){let et=$t(S,Q),Vt=$t(S,U),Ot=$t(b,Q),nt=$t(b,U),L=.15,xt=10;if(et<L||Vt<L)if(St.length>10){let gt=new C.Vector3(g.start.x,g.start.y,0),rt=new C.Vector3(g.end.x,g.end.y,0),dt=new C.Vector3().subVectors(gt,rt).normalize(),Ct=new C.Vector3,mt=1/0,At=-1,pt=!1,at=!1;for(let $=0;$<e.length;$++){if($==w)continue;let ht=new C.Vector3(e[$].start.x,e[$].start.y,0),ot=new C.Vector3(e[$].end.x,e[$].end.y,0),Rt=xe(gt,rt,ht,ot,.1),Mt=se(gt,rt,ht,ot);if(Rt!=null){if(Mt&&Mt.angle>85){let vt=Rt.point.distanceTo(gt),_t=Rt.point.distanceTo(rt);if(vt<.3){at=!0,mt=1/0,At=-1;break}}continue}if(Mt&&Mt.angle>85){let _t=new C.Line3(ht,ot).closestPointToPoint(gt,!0,Ct),Dt=Yt(gt,rt,_t,gt);if(!Dt||Dt.direction!="same")continue;let ne=gt.clone().addScaledVector(dt,xt),Ut=rt.clone().addScaledVector(dt.clone().negate(),xt),oe=new C.Vector3().subVectors(ot,ht).normalize(),te=ht.clone().addScaledVector(oe.clone().negate(),.03),Se=ot.clone().addScaledVector(oe,.03),le=xe(ne,Ut,te,Se);if(le==null)continue;let Qt=gt.distanceTo(le.point);Qt<mt&&(mt=Qt,At=$)}else if(Mt&&Mt.angle<5){let vt=new C.Vector3(Q.x,Q.y,0),_t=new C.Vector3(U.x,U.y,0),Dt=$t(vt,ht),ne=$t(vt,ot),Ut=$t(_t,ht),oe=$t(_t,ot),te=Yt(gt,rt,ht,vt),Se=!1,le=s.readLineById(e[$].id);if(le.checkResults=s.getLineCheckReultsById(e[$].id),e[$].checkResults=le.checkResults,le=null,e[$].checkResults){for(let Qt=0;Qt<e[$].checkResults.length;Qt++){let Ke=[];for(let ce=0;ce<e[$].checkResults[Qt].allCenterPoints.length;ce++)Ke.push(new C.Vector3(e[$].checkResults[Qt].allCenterPoints[ce].x,e[$].checkResults[Qt].allCenterPoints[ce].y,0));let ge=Oe(Ke);if(ge.length==2){let ce=$t(vt,ge[0]),Mn=$t(vt,ge[1]),vn=$t(_t,ge[0]),Hn=$t(_t,ge[1]);if(ce<.2||Mn<.2||vn<.2||Hn<.2){Se=!0;break}}}e[$].checkResults=null}if(te&&te.direction=="same"&&!Se&&(Dt<.1||ne<.1||Ut<.1||oe<.1)){pt=!0,mt=1/0,At=-1;break}}}if(mt!=1/0&&mt<2&&(g.length-Z>.2||g.length-Z<.02)&&mt<Z*2)e[At].length>.25&&Z+mt>.5&&(de=!0,et<L?(ft=ft.addScaledVector(dt,mt),Q=Q.addScaledVector(dt,mt)):(J=J.addScaledVector(dt,mt),U=U.addScaledVector(dt,mt)));else{if(!pt&&!at&&g.length-Z>.1)continue;if(!pt&&!at&&g.length-Z<.1&&g.length<1.8)continue}}else continue;if(Ot<L||nt<L)if(St.length>10){let gt=new C.Vector3(g.start.x,g.start.y,0),rt=new C.Vector3(g.end.x,g.end.y,0),dt=new C.Vector3().subVectors(rt,gt).normalize(),Ct=new C.Vector3,mt=1/0,At=-1,pt=!1,at=!1;for(let $=0;$<e.length;$++){if($==w)continue;let ht=new C.Vector3(e[$].start.x,e[$].start.y,0),ot=new C.Vector3(e[$].end.x,e[$].end.y,0),Rt=xe(gt,rt,ht,ot,.03),Mt=se(gt,rt,ht,ot);if(Rt!=null){if(Mt&&Mt.angle>85){let vt=Rt.point.distanceTo(gt);if(Rt.point.distanceTo(rt)<.3){at=!0,mt=1/0,At=-1;break}}continue}if(Mt&&Mt.angle>85){let _t=new C.Line3(ht,ot).closestPointToPoint(rt,!0,Ct),Dt=Yt(rt,gt,_t,rt);if(!Dt||Dt.direction!="same")continue;let ne=gt.clone().addScaledVector(dt.clone().negate(),xt),Ut=rt.clone().addScaledVector(dt,xt),oe=new C.Vector3().subVectors(ot,ht).normalize(),te=ht.clone().addScaledVector(oe.clone().negate(),.03),Se=ot.clone().addScaledVector(oe,.03),le=xe(ne,Ut,te,Se);if(le==null)continue;let Qt=rt.distanceTo(le.point);Qt<mt&&(mt=Qt,At=$)}else if(Mt&&Mt.angle<5){let vt=new C.Vector3(Q.x,Q.y,0),_t=new C.Vector3(U.x,U.y,0),Dt=$t(vt,ht),ne=$t(vt,ot),Ut=$t(_t,ht),oe=$t(_t,ot),te=Yt(rt,gt,ht,vt),Se=!1,le=s.readLineById(e[$].id);if(le.checkResults=s.getLineCheckReultsById(e[$].id),e[$].checkResults=le.checkResults,le=null,e[$].checkResults){for(let Qt=0;Qt<e[$].checkResults.length;Qt++){let Ke=[];for(let ce=0;ce<e[$].checkResults[Qt].allCenterPoints.length;ce++)Ke.push(new C.Vector3(e[$].checkResults[Qt].allCenterPoints[ce].x,e[$].checkResults[Qt].allCenterPoints[ce].y,0));let ge=Oe(Ke);if(ge.length==2){let ce=$t(vt,ge[0]),Mn=$t(vt,ge[1]),vn=$t(_t,ge[0]),Hn=$t(_t,ge[1]);if(ce<.2||Mn<.2||vn<.2||Hn<.2){Se=!0;break}}}e[$].checkResults=null}if(te&&te.direction=="same"&&!Se&&(Dt<.1||ne<.1||Ut<.1||oe<.1)){pt=!0,mt=1/0,At=-1;break}}}if(mt!=1/0&&mt<2&&(g.length-Z>.2||g.length-Z<.02)&&mt<Z*2)e[At].length>.25&&Z+mt>.5&&(de=!0,Ot<L?(ft=ft.addScaledVector(dt,mt),Q=Q.addScaledVector(dt,mt)):(J=J.addScaledVector(dt,mt),U=U.addScaledVector(dt,mt)));else{if(!pt&&!at&&g.length-Z>.1)continue;if(!pt&&!at&&g.length-Z<.1&&g.length<1.8)continue}}else continue;Z=ft.distanceTo(J)}if(Ft<85&&Z>.3||Z>.7&&wt>R-R/2){if(!g.isLine2){if(Z<3.5)for(let et=0;et<r.length;et++){let Vt=new C.Vector3(r[et].doorStartPt.x,r[et].doorStartPt.y,0),Ot=new C.Vector3(r[et].doorEndPt.x,r[et].doorEndPt.y,0),nt=new C.Vector3(q.facePoints[0].x,q.facePoints[0].y,0),L=new C.Vector3(q.facePoints[1].x,q.facePoints[1].y,0),xt=q.facePoints[2].z<r[et].maxZ||Math.abs(q.facePoints[2].z-r[et].maxZ)<.3,gt=Math.abs(q.facePoints[2].z-r[et].maxZ)>.2;if(xt){let rt=ye(Vt.clone(),Ot.clone(),nt.clone(),L.clone(),{distanceThreshold:2});if(rt&&rt.type=="collinear_gap"){let dt=jt(Vt,Ot),Ct=new C.Line3(new C.Vector3(g.start.x,g.start.y,0),new C.Vector3(g.end.x,g.end.y,0)),mt=new C.Vector3,At=Ct.closestPointToPoint(dt,!0,mt);if(dt.distanceTo(At)<.15){let at=nt.distanceTo(Vt),$=L.distanceTo(Vt);if(at>.25&&$>.25){let Rt=nt.distanceTo(Ot),Mt=L.distanceTo(Ot);if(Rt>.2&&Mt>.2)continue}Lt=!0,bt=!0,Bt.push(r[et].index),r[et].isFind=!0,Et=et,Tt=n[r[et].index].isFindBeam,n[r[et].index].isFindBeam=!0;let ht=new C.Vector3().subVectors(nt,L).normalize(),ot=Vt.distanceTo(Ot)-rt.overlap;$<at&&ht.negate(),at>$?(J=q.facePoints[2].clone().addScaledVector(ht,ot),ft=q.facePoints[3].clone(),Q=ft.clone(),U=J.clone(),Q.z=U.z=q.facePoints[0].z):(J=q.facePoints[2].clone(),ft=q.facePoints[3].clone().addScaledVector(ht,ot),Q=ft.clone(),U=J.clone(),Q.z=U.z=q.facePoints[0].z)}}else if(rt&&rt.type=="collinear_overlap"&&rt.maxPerpendicularDistance<.35){let dt=nt.distanceTo(L),Ct=Ot.distanceTo(Vt);if(Math.abs(dt-rt.overlap)<.25||Math.abs(Ct-rt.overlap)<.25){if(Ct>dt&&Math.abs(Ct-rt.overlap)>1){let mt=nt.distanceTo(Vt),At=nt.distanceTo(Ot),pt=L.distanceTo(Vt),at=L.distanceTo(Ot),$=mt<At?mt:At,ht=pt<at?pt:at,ot=new C.Vector3().subVectors(nt,L).normalize(),Rt=Ct-rt.overlap;$<ht?(ot.negate(),J=q.facePoints[2].clone().addScaledVector(ot,Rt),ft=q.facePoints[3].clone(),Q=ft.clone(),U=J.clone(),Q.z=U.z=q.facePoints[0].z):(J=q.facePoints[2].clone(),ft=q.facePoints[3].clone().addScaledVector(ot,Rt),Q=ft.clone(),U=J.clone(),Q.z=U.z=q.facePoints[0].z)}Z>1.5&&(Lt=!0,bt=!0,Bt.push(r[et].index),r[et].isFind=!0,Tt=n[r[et].index].isFindBeam,n[r[et].index].isFindBeam=!0,Et=et)}}}}if(!bt&&Z<1.5)for(let et=0;et<r.length;et++){if(r[et].inWall)continue;let Vt=new C.Vector3(r[et].doorStartPt.x,r[et].doorStartPt.y,0),Ot=new C.Vector3(r[et].doorEndPt.x,r[et].doorEndPt.y,0),nt=new C.Vector3(ft.x,ft.y,0),L=new C.Vector3(J.x,J.y,0),xt=new C.Vector3().subVectors(Vt,Ot).normalize(),gt=new C.Vector3().subVectors(nt,L).normalize(),rt=.25,dt=Vt.clone().addScaledVector(xt,rt),Ct=Ot.clone().addScaledVector(xt.clone().negate(),rt),mt=nt.clone().addScaledVector(gt,rt),At=L.clone().addScaledVector(gt.clone().negate(),rt);if(Yt(dt,Ct,mt,At).isParallel)continue;let at=xe(dt,Ct,mt,At),$=!0,ht=Vt.distanceTo(nt),ot=Vt.distanceTo(L),Rt=Ot.distanceTo(nt),Mt=Ot.distanceTo(L);if((ht<a||ot<a||Rt<a||Mt<a||at)&&$){let _t=new C.Line3(nt,L);if(ht<a||Rt<a)if(It=nt.clone(),ht<a){let Dt=_t.closestPointToPoint(Ot,!1,new C.Vector3);Pt=new C.Vector3().subVectors(Ot,Dt).normalize()}else{let Dt=_t.closestPointToPoint(Vt,!1,new C.Vector3);Pt=new C.Vector3().subVectors(Vt,Dt).normalize()}else if(ot<a||Mt<a)if(It=L.clone(),ot<a){let Dt=_t.closestPointToPoint(Ot,!1,new C.Vector3);Pt=new C.Vector3().subVectors(Ot,Dt).normalize()}else{let Dt=_t.closestPointToPoint(Vt,!1,new C.Vector3);Pt=new C.Vector3().subVectors(Vt,Dt).normalize()}else if(at){let Dt=at.point.distanceTo(nt),ne=at.point.distanceTo(L),Ut=at.point.distanceTo(dt),oe=at.point.distanceTo(Ct);if(Dt<ne?It=nt.clone():It=L.clone(),Ut<oe){let te=_t.closestPointToPoint(Ct,!1,new C.Vector3);Pt=new C.Vector3().subVectors(Ct,te).normalize()}else{let te=_t.closestPointToPoint(dt,!1,new C.Vector3);Pt=new C.Vector3().subVectors(dt,te).normalize()}}Tt=n[r[et].index].isFindBeam,n[r[et].index].isFindBeam=!0,Lt=!0,r[et].isFind=!0,Et=et}}}(Lt||re||Math.abs(wt-R)>.1&&wt>R/3&&Z>.3)&&(Wt=!0)}}if(Wt){{let nt=new C.Vector3().subVectors(Q,U),L=new C.Vector3().subVectors(U,Q),xt=1/0,gt=1/0,rt=Q.clone(),dt=U.clone(),Ct=[],mt=[],At=new C.Line3(J,ft),pt=new C.Vector3,at=999999;if(g.originalPoints.forEach($=>{if($.z-Q.z<wt/2+.1&&$.z-Q.z>wt/2-.1&&Ct.push($),$.z>J.z){let ht=At.closestPointToPoint($,!0,pt),ot=new C.Vector3().subVectors(ht,J),Rt=new C.Vector3().subVectors(ht,ft),Mt=Kt(nt,Rt),vt=Kt(L,ot);Mt&&Mt.parallel&&!Mt.sameDirection&&vt&&vt.parallel&&!vt.sameDirection&&mt.push($)}}),Ct.length>0){let{newProjectPoints:$}=Je(Q,U,Ct);for(let ht of $)ht.z=Q.z;$.forEach(ht=>{let ot=new C.Vector3(ht.x,ht.y,Q.z),Rt=new C.Vector3().subVectors(ot,U),Mt=new C.Vector3().subVectors(ot,Q),vt=Kt(nt,Mt),_t=Kt(L,Rt);if(vt&&vt.parallel&&vt.sameDirection){let Dt=ot.distanceTo(Q);Dt<xt&&(xt=Dt,rt=ot)}else if(_t&&_t.parallel&&_t.sameDirection){let Dt=ot.distanceTo(U);Dt<gt&&(gt=Dt,dt=ot)}})}if(rt.equals(Q)||(Q=rt,ft=new C.Vector3(Q.x,Q.y,ft.z)),dt.equals(U)||(U=dt,J=new C.Vector3(U.x,U.y,J.z)),mt.length>10){let{newOnLinePoints:$}=Je(ft,J,mt);for(let ht=0;ht<$.length;ht++){let Rt=At.closestPointToPoint($[ht],!0,pt).distanceTo($[ht]);Rt>.02&&at>Rt&&(at=Rt)}J.z+=at,ft.z+=at,wt+=at}}let re=!1;for(let nt=0;nt<u.length;nt++){let L=ye(u[nt].start,u[nt].end,Q,U);L&&L.type=="collinear_overlap"&&L.maxPerpendicularDistance<.07&&(re=!0)}if(re){Et!=-1&&(Tt||(n[r[Et].index].isFindBeam=!1,r[Et].isFind=!1));continue}let Pe=U.distanceTo(Q);if(Pe<.4&&!Lt||Pe<.3&&Lt)continue;f.includes(w)||f.push(w);let St="",ie=Lt?"singleDoor":"";ie=bt?"pullOutDoor":ie;let G={id:i,beamStart:J,beamEnd:ft,beamHeight:g.rooftopPz-J.z,doorStart:Q,doorEnd:U,doorHeight:wt,nearId:-1,type:St,isExtend:de,isDoor:Lt,isPullOutDoor:bt,pcbDoorIndexs:Bt,beamNearWallVec:new C.Vector3(0,0,0),doorType:ie,doorOpenEndPoint:It,doorOpenVector:Pt,lineIsOnlyBeam:!1};if(G.beamHeight<.1)continue;let me=1/0,He=!1,Be=new C.Vector3,Ze=new C.Vector3,_e=-1,pe=-1,Ae=-1,Fe=!1,Ue=!1;if(!He){let nt=new C.Line3(Q.clone(),U.clone()),L=-1;for(let xt=0;xt<e.length;xt++){if(e[xt].length<.5||xt==w)continue;let gt=new C.Vector3(e[xt].start.x,e[xt].start.y,e[xt].start.z),rt=new C.Vector3(e[xt].end.x,e[xt].end.y,e[xt].end.z),dt=ye(gt,rt,Q,U),Ct=Yt(gt,rt,Q,U);if(dt&&dt.maxPerpendicularDistance<.5){if(Ct&&Ct.isParallel){let ot=new C.Line3(gt,rt),Rt=new C.Vector3(Q.x,Q.y,gt.z),Mt=ot.closestPointToPoint(Rt,!0,new C.Vector3),vt=se(Mt,Rt,Q,U);vt&&vt.angle>85&&(G.beamNearWallVec=new C.Vector3().subVectors(Mt,Rt).normalize(),G.beamStart.z>e[xt].rooftopPz-.03&&Z>1?Ue=!0:Ue=!1)}let mt=[],At=s.readLineById(e[xt].id);At.originalPoints=s.getOriginalPointsById(e[xt].id),e[xt].originalPoints=At.originalPoints,At=null,e[xt].originalPoints.forEach(ot=>{ot.z>Q.z+.2&&ot.z<Q.z+wt/2&&mt.push(new C.Vector3(ot.x,ot.y,Q.z))}),e[xt].originalPoints=null;let pt=new C.Vector3,at=[],$=[];for(let ot=0;ot<mt.length;ot++){let Rt=nt.closestPointToPoint(mt[ot],!0,pt);Rt.distanceTo(mt[ot])<.15&&(at.push(mt[ot]),$.push(Rt.clone()))}for(let ot=0;ot<$.length;ot++)Dn(nt,$[ot])&&at.push($[ot]);if(at=$,at=In(at),at.length<150)continue;let ht=Oe(at);if(ht.length==2){let ot=ht[0].distanceTo(ht[1]);if(Math.abs(ot-nt.distance())<.3){L=dt.maxPerpendicularDistance;let Rt=new C.Line3(gt,rt),Mt=new C.Vector3(Q.x,Q.y,gt.z),vt=Rt.closestPointToPoint(Mt,!0,new C.Vector3);if(G.beamNearWallVec=new C.Vector3().subVectors(vt,Mt).normalize(),G.beamStart.z>e[xt].rooftopPz-.03&&Z>1)Ue=!0,Fe=!0;else if(re=!0,Et!=-1&&(Tt||(n[r[Et].index].isFindBeam=!1,r[Et].isFind=!1)),pe!=-1&&Ae!=-1){let _t=e[pe].doorAndBeamData[Ae];_t.nearId=-1}break}}if(re)break}else dt&&dt.type=="collinear_overlap"&&dt.maxPerpendicularDistance>.3&&dt.maxPerpendicularDistance<.7&&(Fe=!0)}if(re){if(Z<1.5||L<.08)continue;Fe=!0}}let et=!1;if(_e!=-1)for(let nt=0;nt<p.length&&!(p[nt].length==1&&(p[nt][0].id==i?(p[nt].push({id:_e,beamStart:Be,beamEnd:Ze}),et=!0):p[nt][0].id==_e&&(p[nt].push({id:i,beamStart:J,beamEnd:ft}),et=!0),et));nt++);et||p.push([{id:i,beamStart:J,beamEnd:ft}]);let Vt=G.doorStart.distanceTo(G.doorEnd),Ot=hn(g.originalPoints);if(G.lineIsOnlyBeam=Ot.minZ>g.start.z&&Ot.minZ-g.start.z>1,Lt?St="door":Vt>1.5||de?St="beam":St=Fe&&Vt>1?"beam":"hole",St!="beam"&&e[w].isLine2)continue;G.type=St,G.wallBelowBeam=Ue;for(let nt=0;nt<l.length;nt++){let L=e[l[nt].linesIndex].doorAndBeamData[l[nt].doorIndex];if(L.nearId!=-1||G.type=="beam"&&L.type!="beam"||G.type!="beam"&&L.type=="beam")continue;let xt=Yt(J.clone(),ft.clone(),L.beamStart.clone(),L.beamEnd.clone());if(xt&&xt.isParallel){let gt=J.distanceTo(ft),rt=L.beamStart.distanceTo(L.beamEnd),dt=new C.Line3(J.clone(),ft.clone());dt.start.z=0,dt.end.z=0;let Ct=jt(L.beamStart,L.beamEnd,!0);rt>gt&&(dt.start=new C.Vector3(L.beamStart.x,L.beamStart.y,0),dt.end=new C.Vector3(L.beamEnd.x,L.beamEnd.y,0),Ct=jt(J,ft,!0));let mt=new C.Vector3,At=dt.closestPointToPoint(Ct,!0,mt),pt=At.distanceTo(Ct),at=new C.Vector3().subVectors(Ct,At).normalize(),$=at.clone().negate(),ht=Ct.clone().addScaledVector($,pt+.1),ot=xe(dt.start,dt.end,Ct,ht),Rt=!Lt&&!L.isDoor&&(gt>rt*2||rt>gt*2);if(pt<.4&&ot!=null&&!Rt){let Mt=!1;for(let Ut=0;Ut<g.doorAndBeamData.length;Ut++)if(g.doorAndBeamData[Ut].id==L.id){Mt=!0;break}if(Mt)continue;L.nearId=i,G.nearId=L.id;let vt=.8;(L.isDoor||G.isDoor)&&(L.isDoor=!0,G.isDoor=!0),L.doorType!=""?G.doorType=L.doorType:G.doorType!=""&&(L.doorType=G.doorType),L.isPullOutDoor?G.isPullOutDoor=!0:G.isPullOutDoor&&(L.isPullOutDoor=!0);let _t=Bt.some(Ut=>L.pcbDoorIndexs.includes(Ut)),Dt=!1,ne=!1;if(G.type=="beam"&&L.type=="beam"){let Ut=s.readLineById(e[l[nt].linesIndex].id);Ut.originalPoints=s.getOriginalPointsById(e[l[nt].linesIndex].id),e[l[nt].linesIndex].originalPoints=Ut.originalPoints,Ut=null;let oe=hn(e[l[nt].linesIndex].originalPoints),te=hn(g.originalPoints);e[l[nt].linesIndex].originalPoints=null,oe.minZ>e[l[nt].linesIndex].start.z&&oe.minZ-e[l[nt].linesIndex].start.z>1&&te.minZ>g.start.z&&te.minZ-g.start.z>1&&(Dt=gt>rt,ne=gt<rt,rt>gt&&(G.isExtend=!0),gt>rt&&(e[l[nt].linesIndex].isExtend=!0))}gt<rt&&!ne||Dt?(Dt&&($=$.negate(),at=at.negate()),gt>vt&&!L.isPullOutDoor?(L.beamStart=J.clone().addScaledVector($,pt),L.beamEnd=ft.clone().addScaledVector($,pt),L.doorStart=Q.clone().addScaledVector($,pt),L.doorEnd=U.clone().addScaledVector($,pt),L.doorHeight=G.doorHeight,L.beamStart.z=L.beamEnd.z=L.doorStart.z+L.doorHeight,L.doorOpenEndPoint=G.doorOpenEndPoint.clone(),L.doorOpenVector=G.doorOpenVector.clone()):!bt||bt&&L.isPullOutDoor&&_t?(G.beamStart=L.beamStart.clone().addScaledVector(at,pt),G.beamEnd=L.beamEnd.clone().addScaledVector(at,pt),G.doorStart=L.doorStart.clone().addScaledVector(at,pt),G.doorEnd=L.doorEnd.clone().addScaledVector(at,pt),G.doorHeight=L.doorHeight,G.beamStart.z=G.beamEnd.z=G.doorStart.z+G.doorHeight,G.doorOpenEndPoint=L.doorOpenEndPoint.clone(),G.doorOpenVector=L.doorOpenVector.clone()):(L.beamStart=J.clone().addScaledVector($,pt),L.beamEnd=ft.clone().addScaledVector($,pt),L.doorStart=Q.clone().addScaledVector($,pt),L.doorEnd=U.clone().addScaledVector($,pt),L.doorHeight=G.doorHeight,L.beamStart.z=L.beamEnd.z=L.doorStart.z+L.doorHeight,L.doorOpenEndPoint=G.doorOpenEndPoint.clone(),L.doorOpenVector=G.doorOpenVector.clone())):(gt>rt&&!Dt||ne)&&(ne&&($=$.negate(),at=at.negate()),rt>vt&&!bt?(G.beamStart=L.beamStart.clone().addScaledVector($,pt),G.beamEnd=L.beamEnd.clone().addScaledVector($,pt),G.doorStart=L.doorStart.clone().addScaledVector($,pt),G.doorEnd=L.doorEnd.clone().addScaledVector($,pt),G.doorHeight=L.doorHeight,G.beamStart.z=G.beamEnd.z=G.doorStart.z+G.doorHeight,G.doorOpenEndPoint=L.doorOpenEndPoint.clone(),G.doorOpenVector=L.doorOpenVector.clone()):!L.isPullOutDoor||bt&&L.isPullOutDoor&&_t?(L.beamStart=J.clone().addScaledVector(at,pt),L.beamEnd=ft.clone().addScaledVector(at,pt),L.doorStart=Q.clone().addScaledVector(at,pt),L.doorEnd=U.clone().addScaledVector(at,pt),L.doorHeight=G.doorHeight,L.beamStart.z=L.beamEnd.z=L.doorStart.z+L.doorHeight,L.doorOpenEndPoint=G.doorOpenEndPoint.clone(),L.doorOpenVector=G.doorOpenVector.clone()):(G.beamStart=L.beamStart.clone().addScaledVector($,pt),G.beamEnd=L.beamEnd.clone().addScaledVector($,pt),G.doorStart=L.doorStart.clone().addScaledVector($,pt),G.doorEnd=L.doorEnd.clone().addScaledVector($,pt),G.doorHeight=L.doorHeight,G.beamStart.z=G.beamEnd.z=G.doorStart.z+G.doorHeight,G.doorOpenEndPoint=L.doorOpenEndPoint.clone(),G.doorOpenVector=L.doorOpenVector.clone())),_e=G.nearId,Be=L.beamStart.clone(),Ze=L.beamEnd.clone(),He=!0,pe=l[nt].linesIndex,Ae=l[nt].doorIndex;break}}}if(G.nearId!=-1&&St=="hole"){let nt=!1;for(let L=0;L<e.length;L++)if(e[L].doorAndBeamData){for(let xt=0;xt<e[L].doorAndBeamData.length;xt++)if(e[L].doorAndBeamData[xt].nearId==i&&e[L].doorAndBeamData[xt].type=="beam"){e[L].doorAndBeamData[xt].type=St,nt=!0;break}if(nt)break}}if(g.doorAndBeamIdToCheckResults.push([M.index,i]),g.doorAndBeamData.push(G),l.push({linesIndex:w,doorIndex:g.doorAndBeamData.length-1}),u.push({start:Q,end:U}),i++,bt&&Z<2)break}}}let V=g.length*(g.rooftopPz-g.start.z);g.completePointAreaPercentage=z/V*100,g.checkResults=null,g.originalPoints=null}if(f.length>1)for(let w=0;w<f.length;w++){let g=[];for(let d=0;d<e[f[w]].doorAndBeamData.length;d++){let y=!1;if(e[f[w]].doorAndBeamData[d].type==="beam"&&(e[f[w]].doorAndBeamData[d].beamNearWallVec.x==0&&e[f[w]].doorAndBeamData[d].beamNearWallVec.y==0&&e[f[w]].doorAndBeamData[d].beamNearWallVec.z==0&&e[f[w]].doorAndBeamData[d].nearId==-1||!e[f[w]].doorAndBeamData[d].wallBelowBeam&&e[f[w]].doorAndBeamData[d].nearId==-1)&&(e[f[w]].doorAndBeamData[d].lineIsOnlyBeam?y=!0:e[f[w]].doorAndBeamData[d].type="hole"),!y){let x=e[f[w]].doorAndBeamData[d].doorStart.clone(),T=e[f[w]].doorAndBeamData[d].doorEnd.clone();x.z=T.z=0;let S=x.distanceTo(T);for(let b=0;b<f.length;b++)if(w!=b)for(let R=0;R<e[f[b]].doorAndBeamData.length;R++){let z=e[f[b]].doorAndBeamData[R].doorStart.clone(),V=e[f[b]].doorAndBeamData[R].doorEnd.clone();z.z=V.z=0;let M=z.distanceTo(V),v=ye(x,T,z,V);if(v.type=="collinear_overlap"&&v.maxPerpendicularDistance<.2){let I=new C.Line3(z,V),D=jt(x,T),B=I.closestPointToPoint(D,!0,new C.Vector3),_=D.distanceTo(B);if(Math.abs(S-v.overlap)<.1&&_<.04){e[f[b]].doorAndBeamData[R].nearId==e[f[w]].doorAndBeamData[d].id&&(e[f[b]].doorAndBeamData[R].nearId=-1),y=!0;break}}}}if(y){for(let x=0;x<e[f[w]].doorAndBeamIdToCheckResults.length;x++)if(e[f[w]].doorAndBeamIdToCheckResults[1]==e[f[w]].doorAndBeamData[d].id){e[f[w]].doorAndBeamIdToCheckResults.splice(x,1);break}}y||g.push(e[f[w]].doorAndBeamData[d])}g.length!=e[f[w]].doorAndBeamData.length&&(e[f[w]].doorAndBeamData=g)}let c=.65,m=2,h=[],E=[];for(let w=0;w<r.length;w++){if(r[w].isFind||r[w].inWall)continue;let g=new C.Vector3(r[w].doorStartPt.x,r[w].doorStartPt.y,0),d=new C.Vector3(r[w].doorEndPt.x,r[w].doorEndPt.y,0),y=new C.Vector3().subVectors(g,d).normalize();for(let x=0;x<e.length;x++){if(e[x].length<.7||e[x].completePointAreaPercentage>60)continue;let T=new C.Vector3(e[x].start.x,e[x].start.y,0),S=new C.Vector3(e[x].end.x,e[x].end.y,0),b=new C.Vector3().subVectors(T,S).normalize(),R=.3,z=g.clone().addScaledVector(y,R),V=d.clone().addScaledVector(y.clone().negate(),R),M=T.clone().addScaledVector(b,R),v=S.clone().addScaledVector(b.clone().negate(),R),I=xe(z,V,M,v),D=Yt(z,V,M,v),B=g.distanceTo(T)>d.distanceTo(T)?d:g,_=B.distanceTo(T),k=B.distanceTo(S);if((_<a||k<a)&&D&&!D.isParallel){let F=g.distanceTo(T),j=g.distanceTo(S),X=F<j?T:S,K=!1;for(let Y=0;Y<e.length;Y++){if(Y==x||h.includes(Y)||e[Y].length<.7)continue;let tt=new C.Vector3(e[Y].start.x,e[Y].start.y,0),it=new C.Vector3(e[Y].end.x,e[Y].end.y,0),ct=new C.Vector3().subVectors(tt,it).normalize(),ut=ct.clone().negate(),W=tt.clone().addScaledVector(ct,5),q=it.clone().addScaledVector(ut,5),Z=se(T,S,tt,it),wt=ye(T,S,tt,it),Ft=xe(T,S,W,q),Nt=!0;if(Ft!=null&&(Nt=Ft.point.distanceTo(T)<a||Ft.point.distanceTo(S)<a),(Z&&Z.angle>85||wt&&wt.type=="collinear_gap")&&Nt){let Wt=new C.Line3(T,S),Lt=new C.Vector3,Tt=Wt.closestPointToPoint(tt,!0,Lt),It=Wt.closestPointToPoint(it,!0,Lt),Pt=Tt.distanceTo(tt),bt=It.distanceTo(it),Bt,J;if(Pt>bt&&bt>c)Bt=it,J=It;else if(Pt<bt&&Pt>c)Bt=tt,J=Tt;else continue;if(Pt=X.distanceTo(tt),bt=X.distanceTo(it),Pt>m&&bt>m)continue;let ft=Yt(Bt,J,tt,it),Q=Yt(Bt,J,z,V);if(Q&&Q.isParallel||!ft||!ft.isParallel)continue;let U=ye(g,d,Bt,J);if(U&&U.type=="collinear_overlap"&&U.maxPerpendicularDistance<.2)continue;Bt.z=J.z=e[Y].start.z;let de=!1;for(let St=0;St<E.length;St++){let ie=ye(E[St].start,E[St].end,Bt,J);if(ie&&ie.type=="collinear_overlap"&&ie.maxPerpendicularDistance<.2){de=!0;break}}if(de)continue;for(let St=0;St<e.length;St++){if(e[St].length<.5)continue;let ie=new C.Vector3(e[St].start.x,e[St].start.y,e[St].start.z),G=new C.Vector3(e[St].end.x,e[St].end.y,e[St].end.z),me=ye(ie,G,Bt,J);if(me&&me.type=="collinear_overlap"&&me.maxPerpendicularDistance<.1){de=!0;break}}if(de)continue;E.push({start:Bt,end:J}),h.push(Y);let Et=e[Y].rooftopPz-e[Y].start.z,re=e[x].rooftopPz-e[x].start.z,Pe=Et<re?Et:re;e[Y].doorAndBeamData||(e[Y].doorAndBeamData=[]),e[Y].doorAndBeamData.push({id:i,beamStart:Bt,beamEnd:J,beamHeight:Pe,doorStart:Bt,doorEnd:J,doorHeight:Pe,nearId:-1,type:"onlyDoor",isDoor:!0,beamNearWallVec:new C.Vector3(0,0,0)}),n[r[w].index].isFindBeam=!0,n[r[w].index].isFindOnlyDoor=!0,p.push([{id:i,beamStart:Bt,beamEnd:J}]),i++,K=!0;break}}if(K)break}}}let P=[];for(let w=0;w<e.length;w++)e[w].isLine2||P.push(e[w]),e[w].isLine2&&e[w].doorAndBeamData.length!=0&&P.push(e[w]);return e.length=0,e.push(...P),{lines:e,beamGroup:p}},Js=async e=>{Us(e),wo(e);let t=new dn(e);for(let n=0;n<e.length;n++){let s=e[n],o=new C.Vector3(s.start.x,s.start.y,s.start.z),r=new C.Vector3(s.end.x,s.end.y,s.end.z),i=new C.Line3(o.clone(),r.clone()),l=-1;for(let f=0;f<s.doorAndBeamData.length;f++){let u=s.doorAndBeamData[f],p=u.doorHeight;u.isRebuild=!1;let a=!1,c=!1;if(!(u.nearId!=-1||u.type!="beam")){for(let m=0;m<e.length;m++){if(e[m].length<.5||m==n)continue;let h=new C.Vector3(e[m].start.x,e[m].start.y,e[m].start.z),E=new C.Vector3(e[m].end.x,e[m].end.y,e[m].end.z),P=ye(h,E,o,r),w=Yt(h,E,o,r);if(P&&P.maxPerpendicularDistance<.5){if(w&&w.isParallel){let b=new C.Line3(h,E),R=new C.Vector3(o.x,o.y,h.z),z=b.closestPointToPoint(R,!0,new C.Vector3),V=se(z,R,o,r);V&&V.angle>85&&(u.beamNearWallVec=new C.Vector3().subVectors(z,R).normalize())}let g=[],d=t.readLineById(e[m].id);d.originalPoints=t.getOriginalPointsById(e[m].id),e[m].originalPoints=d.originalPoints,d=null,e[m].originalPoints.forEach(b=>{b.z>o.z+.2&&b.z<o.z+p/2&&g.push(new C.Vector3(b.x,b.y,o.z))}),e[m].originalPoints=null;let y=new C.Vector3,x=[],T=[];for(let b=0;b<g.length;b++){let R=i.closestPointToPoint(g[b],!0,y);R.distanceTo(g[b])<.15&&(x.push(g[b]),T.push(R.clone()))}for(let b=0;b<T.length;b++)Dn(i,T[b])&&x.push(T[b]);if(x=T,x=In(x),x.length<150)continue;let S=Oe(x);if(S.length==2){let b=S[0].distanceTo(S[1]);if(Math.abs(b-i.distance())<.3){l=P.maxPerpendicularDistance;let R=new C.Line3(h,E),z=new C.Vector3(o.x,o.y,h.z),V=R.closestPointToPoint(z,!0,new C.Vector3);u.beamNearWallVec=new C.Vector3().subVectors(V,z).normalize(),u.beamStart.z>e[m].rooftopPz-.03&&length>1?c=!0:a=!0;break}}if(a)break}else P&&P.type=="collinear_overlap"&&P.maxPerpendicularDistance>.3&&P.maxPerpendicularDistance<.7&&(c=!0)}if(a){if(length<1.8||l<.2)continue;c=!0}c||(u.isRebuild=!0)}}}t.close()};import*as yt from"three";import"three/examples/jsm/utils/BufferGeometryUtils.js";var bo=(e,t={})=>{let n=t.eps??1e-6,s=t.project??(w=>({x:w.x,y:w.z})),o=t.skipSplit??!1,r=t.insideAreaSign??"positive",i=o?e.map((w,g)=>({start:mn(w.start),end:mn(w.end),uuid:w.uuid,sourceIndex:g,sourceSegment:w})):Qs(e,s,n),l=[],f=new Map;function u(w){let g=Math.round(w.x/n),d=Math.round(w.y/n);return`${g},${d}`}function p(w){let g=u(w);if(f.has(g))return f.get(g);let d=l.length;return l.push({id:d,x:w.x,y:w.y}),f.set(g,d),d}let a=[],c=new Map;for(let w of i){let g=s(w.start),d=s(w.end);if(To(g,d)<n*n)continue;let y=p(g),x=p(d);if(y===x)continue;let T=y<x?`${y}_${x}`:`${x}_${y}`;if(c.has(T))continue;let S=a.length;a.push({id:S,a:y,b:x,uuid:w.uuid,sourceIndex:w.sourceIndex,sourceSegment:w.sourceSegment||w}),c.set(T,S)}let m=[],h=Array.from({length:l.length},()=>[]);function E(w,g,d,y,x){let T=l[w],S=l[g],b=m.length,R=Math.atan2(S.y-T.y,S.x-T.x),z={id:b,from:w,to:g,twin:null,next:null,angle:R,edgeId:d,uuid:y,sourceIndex:x,visited:!1};return m.push(z),h[w].push(b),b}for(let w of a){let g=E(w.a,w.b,w.id,w.uuid,w.sourceIndex),d=E(w.b,w.a,w.id,w.uuid,w.sourceIndex);m[g].twin=d,m[d].twin=g}for(let w of h)w.sort((g,d)=>m[g].angle-m[d].angle);for(let w of m){let g=h[w.to],d=w.twin,y=g.indexOf(d);if(y===-1)continue;let x=(y-1+g.length)%g.length;w.next=g[x]}let P=[];for(let w of m){if(w.visited)continue;let g=[],d=[],y=w.id,x=0,T=m.length+10;for(;;){let M=m[y];if(!M||M.visited)break;if(M.visited=!0,g.push(y),d.push(M.from),y=M.next,x++,x>T){console.warn("\u534A\u8FB9\u904D\u5386\u5F02\u5E38\uFF0C\u53EF\u80FD\u5B58\u5728\u975E\u5E73\u9762\u56FE\u3001\u91CD\u590D\u7EBF\u3001\u60AC\u6302\u7EBF\u6216\u810F\u6570\u636E");break}}if(g.length<3)continue;let S=d.map(M=>l[M]),b=er(S),R=!1;if(r==="positive"?R=b>n:R=b<-n,!R)continue;let z=g.map(M=>m[M].uuid),V=g.map(M=>m[M].sourceIndex);P.push({uuids:z,area:Math.abs(b),lineIndexes:V})}return P};function Qs(e,t,n=1e-6){let s=[];for(let o=0;o<e.length;o++){let r=e[o],i=t(r.start),l=t(r.end),f=[{t:0,point:mn(r.start)},{t:1,point:mn(r.end)}];for(let p=0;p<e.length;p++){if(o===p)continue;let a=e[p],c=t(a.start),m=t(a.end),h=tr(i,l,c,m,n);h&&h.t>n&&h.t<1-n&&f.push({t:h.t,point:nr(r.start,r.end,h.t)})}f.sort((p,a)=>p.t-a.t);let u=[];for(let p of f)(u.length===0||Math.abs(p.t-u[u.length-1].t)>n)&&u.push(p);for(let p=0;p<u.length-1;p++){let a=u[p].point,c=u[p+1].point,m=t(a),h=t(c);To(m,h)<n*n||s.push({start:a,end:c,uuid:r.uuid,sourceIndex:o,sourceSegment:r})}}return s}function tr(e,t,n,s,o=1e-6){let r={x:t.x-e.x,y:t.y-e.y},i={x:s.x-n.x,y:s.y-n.y},l={x:n.x-e.x,y:n.y-e.y},f=Nn(r,i);if(Math.abs(f)<o)return null;let u=Nn(l,i)/f,p=Nn(l,r)/f;return u>=-o&&u<=1+o&&p>=-o&&p<=1+o?{t:u,u:p,point:{x:e.x+u*r.x,y:e.y+u*r.y}}:null}function Nn(e,t){return e.x*t.y-e.y*t.x}function To(e,t){let n=e.x-t.x,s=e.y-t.y;return n*n+s*s}function er(e){let t=0;for(let n=0;n<e.length;n++){let s=e[n],o=e[(n+1)%e.length];t+=s.x*o.y-o.x*s.y}return t/2}function nr(e,t,n){return e&&typeof e.clone=="function"&&typeof e.lerp=="function"?e.clone().lerp(t,n):{x:e.x+(t.x-e.x)*n,y:e.y+(t.y-e.y)*n,z:e.z!==void 0&&t.z!==void 0?e.z+(t.z-e.z)*n:void 0}}function mn(e){return e&&typeof e.clone=="function"?e.clone():{x:e.x,y:e.y,z:e.z}}var or=(e,t)=>{if(!e||e.length<=0)return;let n={rectangles:[],threeEdgeRect:[]},s=new Set,o=.1,r=1.2,i=.15,l=2,f=80,u=95;if(!e[0].uuid){let c=1e4;for(let m=0;m<e.length;m++)e[m].uuid=c++}let p=[];for(let c=0;c<e.length;c++)p.push({start:e[c].start,end:e[c].end,uuid:e[c].uuid});let a=bo(p,{eps:1e-5,returnDetail:!0,project:c=>({x:c.x,y:c.y})});for(let c=0;c<a.length;c++){if(a[c].uuids.length<4||a[c].area<i||a[c].area>l)continue;let m=!1;for(let h=0;h<a[c].lineIndexes.length;h++){let E=e[a[c].lineIndexes[h]].length;if(E<o||E>r)break;let P=new yt.Vector3(e[a[c].lineIndexes[h]].start.x,e[a[c].lineIndexes[h]].start.y,e[a[c].lineIndexes[h]].start.z),w=new yt.Vector3(e[a[c].lineIndexes[h]].end.x,e[a[c].lineIndexes[h]].end.y,e[a[c].lineIndexes[h]].end.z),g=!1,d=new yt.Vector3(0,0,0);for(let y=h+1;y<a[c].lineIndexes.length;y++){let x=e[a[c].lineIndexes[y]].length;if(x<o||x>r)break;let T=new yt.Vector3(e[a[c].lineIndexes[y]].start.x,e[a[c].lineIndexes[y]].start.y,e[a[c].lineIndexes[y]].start.z),S=new yt.Vector3(e[a[c].lineIndexes[y]].end.x,e[a[c].lineIndexes[y]].end.y,e[a[c].lineIndexes[y]].end.z),b=Yt(P,w,T,S);if(b&&b.isParallel){if(E+x>r){g=!0;break}E+=x;let z=st(P,T),V=st(P,S),M=st(w,T),v=st(w,S);z?(P=w.clone(),w=S.clone()):V?(P=w.clone(),w=T.clone()):M?w=S.clone():v&&(w=T.clone());continue}let R=se(P,w,T,S);if(!R||R.angle<f||R.angle>u){g=!0;break}for(let z=y+1;z<a[c].lineIndexes.length;z++){let V=e[a[c].lineIndexes[z]].length;if(V<o||V>r)break;let M=new yt.Vector3(e[a[c].lineIndexes[z]].start.x,e[a[c].lineIndexes[z]].start.y,e[a[c].lineIndexes[z]].start.z),v=new yt.Vector3(e[a[c].lineIndexes[z]].end.x,e[a[c].lineIndexes[z]].end.y,e[a[c].lineIndexes[z]].end.z),I=Yt(T,S,M,v);if(I&&I.isParallel){if(x+V>r){g=!0;break}x+=V;let B=st(T,M),_=st(T,v),k=st(S,M),H=st(S,v);B?(T=S.clone(),S=v.clone()):_?(T=S.clone(),S=M.clone()):k?S=v.clone():H&&(S=M.clone());continue}let D=se(T,S,M,v);if(!D||D.angle<f||D.angle>u){g=!0;break}for(let B=z+1;B<a[c].lineIndexes.length;B++){let _=e[a[c].lineIndexes[B]].length;if(_<o||_>r)break;let k=new yt.Vector3(e[a[c].lineIndexes[B]].start.x,e[a[c].lineIndexes[B]].start.y,e[a[c].lineIndexes[B]].start.z),H=new yt.Vector3(e[a[c].lineIndexes[B]].end.x,e[a[c].lineIndexes[B]].end.y,e[a[c].lineIndexes[B]].end.z),F=Yt(M,v,k,H);if(F&&F.isParallel){if(V+_>r){g=!0;break}V+=_;let it=st(M,k),ct=st(M,H),ut=st(v,k),W=st(v,H);it?(M=v.clone(),v=H.clone()):ct?(M=v.clone(),v=k.clone()):ut?v=H.clone():W&&(v=k.clone());continue}let j=se(M,v,k,H);if(!j||j.angle<f||j.angle>u){g=!0;break}let X=st(k,P),K=st(k,w),Y=st(H,P),tt=st(H,w);if(X||K||Y||tt)m=!0;else for(let it=B+1;it<a[c].lineIndexes.length;it++){let ct=e[a[c].lineIndexes[it]].length;if(ct<o||ct>r)break;let ut=new yt.Vector3(e[a[c].lineIndexes[it]].start.x,e[a[c].lineIndexes[it]].start.y,e[a[c].lineIndexes[it]].start.z),W=new yt.Vector3(e[a[c].lineIndexes[it]].end.x,e[a[c].lineIndexes[it]].end.y,e[a[c].lineIndexes[it]].end.z),q=Yt(k,H,ut,W);if(q&&q.isParallel){if(_+ct>r){g=!0;break}_+=ct;let Z=st(k,ut),wt=st(k,W),Ft=st(H,ut),Nt=st(H,W);if(Z)k=H.clone(),H=W.clone();else if(wt)k=H.clone(),H=ut.clone();else if(Ft)H=W.clone();else if(Nt)H=ut.clone();else continue;if(X=st(k,P),K=st(k,w),Y=st(H,P),tt=st(H,w),X||K||Y||tt){m=!0;break}}}break}if(g)break}if(g)break}if(g)break}m&&n.rectangles.push(a[c].uuids)}for(let c=0;c<e.length;c++){let m=e[c].length;if(s.has(e[c].uuid)||m<o||m>r)continue;let h={uuids:[],missingEdge:{start:new yt.Vector3,end:new yt.Vector3}},E=new yt.Vector3(e[c].start.x,e[c].start.y,e[c].start.z),P=new yt.Vector3(e[c].end.x,e[c].end.y,e[c].end.z),w=!0,g=!0;for(let x=0;x<e.length;x++){if(x==c)continue;let T=new yt.Vector3(e[x].start.x,e[x].start.y,e[x].start.z),S=new yt.Vector3(e[x].end.x,e[x].end.y,e[x].end.z),b=st(T,E),R=st(S,E),z=st(T,P),V=st(S,P);if(b||R?w=!1:(z||V)&&(g=!1),!w&&!g)break}if(!w&&!g)continue;let d=new yt.Vector3;w||([E,P]=[P,E]),d=new yt.Vector3().subVectors(P,E).normalize();let y=d.clone().negate();for(let x=0;x<e.length;x++){let T=e[x].length;if(x==c||s.has(x)||T<o||T>r)continue;let S=new yt.Vector3(e[x].start.x,e[x].start.y,e[x].start.z),b=new yt.Vector3(e[x].end.x,e[x].end.y,e[x].end.z),R=se(E,P,S,b);if(!R||R.angle<85)continue;let z=st(S,P),V=st(b,P);if(!z&&!V)continue;let M=new yt.Vector3,v=new yt.Vector3;z?(M=S.clone(),v=b.clone()):(M=b.clone(),v=S.clone());for(let I=0;I<e.length;I++){let D=e[I].length;if(I==c||I==x||s.has(I)||D<o||D>r)continue;let B=new yt.Vector3(e[I].start.x,e[I].start.y,e[I].start.z),_=new yt.Vector3(e[I].end.x,e[I].end.y,e[I].end.z),k=se(S,b,B,_);if(!k||k.angle<85)continue;let H=st(B,v),F=st(_,v);if(!H&&!F)continue;let j=new yt.Vector3,X=new yt.Vector3;H?(j=B.clone(),X=_.clone()):(j=_.clone(),X=B.clone());let K=new yt.Vector3().subVectors(X,j).normalize(),Y=Kt(y,K,.1);if(!Y||!Y.parallel||!Y.sameDirection)continue;let tt=!0,it=!0;for(let ut=0;ut<e.length;ut++){if(ut==I)continue;let W=new yt.Vector3(e[ut].start.x,e[ut].start.y,e[ut].start.z),q=new yt.Vector3(e[ut].end.x,e[ut].end.y,e[ut].end.z),Z=st(W,B),wt=st(q,B),Ft=st(W,_),Nt=st(q,_);if(Z||wt?tt=!1:(Ft||Nt)&&(it=!1),!tt&&!it)break}if(!tt&&!it)continue;let ct=m*T;if(!(ct<i||ct>l)){h.uuids=[e[c].uuid,e[x].uuid,e[I].uuid],h.missingEdge.start=X,h.missingEdge.end=E;break}}if(h.uuids.length==3)break}h.uuids.length==3&&(h.uuids.forEach(x=>s.add(x)),n.threeEdgeRect.push(h))}return n};import*as A from"three";import"three/examples/jsm/utils/BufferGeometryUtils.js";var zt=11102230246251565e-32,Gt=134217729,en=(3+8*zt)*zt;function Ie(e,t,n,s,o){let r,i,l,f,u=t[0],p=s[0],a=0,c=0;p>u==p>-u?(r=u,u=t[++a]):(r=p,p=s[++c]);let m=0;if(a<e&&c<n)for(p>u==p>-u?(i=u+r,l=r-(i-u),u=t[++a]):(i=p+r,l=r-(i-p),p=s[++c]),r=i,l!==0&&(o[m++]=l);a<e&&c<n;)p>u==p>-u?(i=r+u,f=i-r,l=r-(i-f)+(u-f),u=t[++a]):(i=r+p,f=i-r,l=r-(i-f)+(p-f),p=s[++c]),r=i,l!==0&&(o[m++]=l);for(;a<e;)i=r+u,f=i-r,l=r-(i-f)+(u-f),u=t[++a],r=i,l!==0&&(o[m++]=l);for(;c<n;)i=r+p,f=i-r,l=r-(i-f)+(p-f),p=s[++c],r=i,l!==0&&(o[m++]=l);return(r!==0||m===0)&&(o[m++]=r),m}function nn(e,t){let n=t[0];for(let s=1;s<e;s++)n+=t[s];return n}function N(e){return new Float64Array(e)}var sr=(3+16*zt)*zt,rr=(2+12*zt)*zt,ir=(9+64*zt)*zt*zt,We=N(4),Po=N(8),So=N(12),Ro=N(16),ee=N(4);function lr(e,t,n,s,o,r,i){let l,f,u,p,a,c,m,h,E,P,w,g,d,y,x,T,S,b,R=e-o,z=n-o,V=t-r,M=s-r;y=R*M,c=Gt*R,m=c-(c-R),h=R-m,c=Gt*M,E=c-(c-M),P=M-E,x=h*P-(y-m*E-h*E-m*P),T=V*z,c=Gt*V,m=c-(c-V),h=V-m,c=Gt*z,E=c-(c-z),P=z-E,S=h*P-(T-m*E-h*E-m*P),w=x-S,a=x-w,We[0]=x-(w+a)+(a-S),g=y+w,a=g-y,d=y-(g-a)+(w-a),w=d-T,a=d-w,We[1]=d-(w+a)+(a-T),b=g+w,a=b-g,We[2]=g-(b-a)+(w-a),We[3]=b;let v=nn(4,We),I=rr*i;if(v>=I||-v>=I||(a=e-R,l=e-(R+a)+(a-o),a=n-z,u=n-(z+a)+(a-o),a=t-V,f=t-(V+a)+(a-r),a=s-M,p=s-(M+a)+(a-r),l===0&&f===0&&u===0&&p===0)||(I=ir*i+en*Math.abs(v),v+=R*p+M*l-(V*u+z*f),v>=I||-v>=I))return v;y=l*M,c=Gt*l,m=c-(c-l),h=l-m,c=Gt*M,E=c-(c-M),P=M-E,x=h*P-(y-m*E-h*E-m*P),T=f*z,c=Gt*f,m=c-(c-f),h=f-m,c=Gt*z,E=c-(c-z),P=z-E,S=h*P-(T-m*E-h*E-m*P),w=x-S,a=x-w,ee[0]=x-(w+a)+(a-S),g=y+w,a=g-y,d=y-(g-a)+(w-a),w=d-T,a=d-w,ee[1]=d-(w+a)+(a-T),b=g+w,a=b-g,ee[2]=g-(b-a)+(w-a),ee[3]=b;let D=Ie(4,We,4,ee,Po);y=R*p,c=Gt*R,m=c-(c-R),h=R-m,c=Gt*p,E=c-(c-p),P=p-E,x=h*P-(y-m*E-h*E-m*P),T=V*u,c=Gt*V,m=c-(c-V),h=V-m,c=Gt*u,E=c-(c-u),P=u-E,S=h*P-(T-m*E-h*E-m*P),w=x-S,a=x-w,ee[0]=x-(w+a)+(a-S),g=y+w,a=g-y,d=y-(g-a)+(w-a),w=d-T,a=d-w,ee[1]=d-(w+a)+(a-T),b=g+w,a=b-g,ee[2]=g-(b-a)+(w-a),ee[3]=b;let B=Ie(D,Po,4,ee,So);y=l*p,c=Gt*l,m=c-(c-l),h=l-m,c=Gt*p,E=c-(c-p),P=p-E,x=h*P-(y-m*E-h*E-m*P),T=f*u,c=Gt*f,m=c-(c-f),h=f-m,c=Gt*u,E=c-(c-u),P=u-E,S=h*P-(T-m*E-h*E-m*P),w=x-S,a=x-w,ee[0]=x-(w+a)+(a-S),g=y+w,a=g-y,d=y-(g-a)+(w-a),w=d-T,a=d-w,ee[1]=d-(w+a)+(a-T),b=g+w,a=b-g,ee[2]=g-(b-a)+(w-a),ee[3]=b;let _=Ie(B,So,4,ee,Ro);return Ro[_-1]}function je(e,t,n,s,o,r){let i=(t-r)*(n-o),l=(e-o)*(s-r),f=i-l,u=Math.abs(i+l);return Math.abs(f)>=sr*u?f:-lr(e,t,n,s,o,r,u)}var Ul=(7+56*zt)*zt,Kl=(3+28*zt)*zt,Jl=(26+288*zt)*zt*zt,Ql=N(4),tc=N(4),ec=N(4),nc=N(4),oc=N(4),sc=N(4),rc=N(4),ic=N(4),lc=N(4),cc=N(8),ac=N(8),fc=N(8),uc=N(4),hc=N(8),dc=N(8),mc=N(16),pc=N(12),gc=N(192),yc=N(192);var wc=(10+96*zt)*zt,bc=(4+48*zt)*zt,Tc=(44+576*zt)*zt*zt,Pc=N(4),Sc=N(4),Rc=N(4),zc=N(4),Vc=N(4),Mc=N(4),vc=N(4),Hc=N(4),Bc=N(8),_c=N(8),kc=N(8),Cc=N(8),Dc=N(8),Ic=N(8),Lc=N(8),Ac=N(8),Fc=N(8),Oc=N(4),Nc=N(4),qc=N(4),Wc=N(8),jc=N(16),$c=N(16),Xc=N(16),Yc=N(32),Gc=N(32),Zc=N(48),Uc=N(64),Kc=N(1152),Jc=N(1152);var na=(16+224*zt)*zt,oa=(5+72*zt)*zt,sa=(71+1408*zt)*zt*zt,ra=N(4),ia=N(4),la=N(4),ca=N(4),aa=N(4),fa=N(4),ua=N(4),ha=N(4),da=N(4),ma=N(4),pa=N(24),ga=N(24),ya=N(24),Ea=N(24),xa=N(24),wa=N(24),ba=N(24),Ta=N(24),Pa=N(24),Sa=N(24),Ra=N(1152),za=N(1152),Va=N(1152),Ma=N(1152),va=N(1152),Ha=N(2304),Ba=N(2304),_a=N(3456),ka=N(5760),Ca=N(8),Da=N(8),Ia=N(8),La=N(16),Aa=N(24),Fa=N(48),Oa=N(48),Na=N(96),qa=N(192),Wa=N(384),ja=N(384),$a=N(384),Xa=N(768);var Ya=N(96),Ga=N(96),Za=N(96),Ua=N(1152);var Vo=Math.pow(2,-52),pn=new Uint32Array(512),Xe=class e{static from(t,n=mr,s=pr){let o=t.length,r=new Float64Array(o*2);for(let i=0;i<o;i++){let l=t[i];r[2*i]=n(l),r[2*i+1]=s(l)}return new e(r)}constructor(t){let n=t.length>>1;if(n>0&&typeof t[0]!="number")throw new Error("Expected coords to contain numbers.");this.coords=t;let s=Math.max(2*n-5,0);this._triangles=new Uint32Array(s*3),this._halfedges=new Int32Array(s*3),this._hashSize=Math.ceil(Math.sqrt(n)),this._hullPrev=new Uint32Array(n),this._hullNext=new Uint32Array(n),this._hullTri=new Uint32Array(n),this._hullHash=new Int32Array(this._hashSize),this._ids=new Uint32Array(n),this._dists=new Float64Array(n),this.trianglesLen=0,this._cx=0,this._cy=0,this._hullStart=0,this.hull=this._triangles,this.triangles=this._triangles,this.halfedges=this._halfedges,this.update()}update(){let{coords:t,_hullPrev:n,_hullNext:s,_hullTri:o,_hullHash:r}=this,i=t.length>>1,l=1/0,f=1/0,u=-1/0,p=-1/0;for(let R=0;R<i;R++){let z=t[2*R],V=t[2*R+1];z<l&&(l=z),V<f&&(f=V),z>u&&(u=z),V>p&&(p=V),this._ids[R]=R}let a=(l+u)/2,c=(f+p)/2,m=0,h=0,E=0;for(let R=0,z=1/0;R<i;R++){let V=qn(a,c,t[2*R],t[2*R+1]);V<z&&(m=R,z=V)}let P=t[2*m],w=t[2*m+1];for(let R=0,z=1/0;R<i;R++){if(R===m)continue;let V=qn(P,w,t[2*R],t[2*R+1]);V<z&&V>0&&(h=R,z=V)}let g=t[2*h],d=t[2*h+1],y=1/0;for(let R=0;R<i;R++){if(R===m||R===h)continue;let z=hr(P,w,g,d,t[2*R],t[2*R+1]);z<y&&(E=R,y=z)}let x=t[2*E],T=t[2*E+1];if(y===1/0){for(let V=0;V<i;V++)this._dists[V]=t[2*V]-t[0]||t[2*V+1]-t[1];$e(this._ids,this._dists,0,i-1);let R=new Uint32Array(i),z=0;for(let V=0,M=-1/0;V<i;V++){let v=this._ids[V],I=this._dists[v];I>M&&(R[z++]=v,M=I)}this.hull=R.subarray(0,z),this.triangles=new Uint32Array(0),this.halfedges=new Int32Array(0);return}if(je(P,w,g,d,x,T)<0){let R=h,z=g,V=d;h=E,g=x,d=T,E=R,x=z,T=V}let S=dr(P,w,g,d,x,T);this._cx=S.x,this._cy=S.y;for(let R=0;R<i;R++)this._dists[R]=qn(t[2*R],t[2*R+1],S.x,S.y);$e(this._ids,this._dists,0,i-1),this._hullStart=m;let b=3;s[m]=n[E]=h,s[h]=n[m]=E,s[E]=n[h]=m,o[m]=0,o[h]=1,o[E]=2,r.fill(-1),r[this._hashKey(P,w)]=m,r[this._hashKey(g,d)]=h,r[this._hashKey(x,T)]=E,this.trianglesLen=0,this._addTriangle(m,h,E,-1,-1,-1);for(let R=0,z=0,V=0;R<this._ids.length;R++){let M=this._ids[R],v=t[2*M],I=t[2*M+1];if(R>0&&Math.abs(v-z)<=Vo&&Math.abs(I-V)<=Vo||(z=v,V=I,M===m||M===h||M===E))continue;let D=0;for(let F=0,j=this._hashKey(v,I);F<this._hashSize&&(D=r[(j+F)%this._hashSize],!(D!==-1&&D!==s[D]));F++);D=n[D];let B=D,_;for(;_=s[B],je(v,I,t[2*B],t[2*B+1],t[2*_],t[2*_+1])>=0;)if(B=_,B===D){B=-1;break}if(B===-1)continue;let k=this._addTriangle(B,M,s[B],-1,-1,o[B]);o[M]=this._legalize(k+2),o[B]=k,b++;let H=s[B];for(;_=s[H],je(v,I,t[2*H],t[2*H+1],t[2*_],t[2*_+1])<0;)k=this._addTriangle(H,M,_,o[M],-1,o[H]),o[M]=this._legalize(k+2),s[H]=H,b--,H=_;if(B===D)for(;_=n[B],je(v,I,t[2*_],t[2*_+1],t[2*B],t[2*B+1])<0;)k=this._addTriangle(_,M,B,-1,o[B],o[_]),this._legalize(k+2),o[_]=k,s[B]=B,b--,B=_;this._hullStart=n[M]=B,s[B]=n[H]=M,s[M]=H,r[this._hashKey(v,I)]=M,r[this._hashKey(t[2*B],t[2*B+1])]=B}this.hull=new Uint32Array(b);for(let R=0,z=this._hullStart;R<b;R++)this.hull[R]=z,z=s[z];this.triangles=this._triangles.subarray(0,this.trianglesLen),this.halfedges=this._halfedges.subarray(0,this.trianglesLen)}_hashKey(t,n){return Math.floor(fr(t-this._cx,n-this._cy)*this._hashSize)%this._hashSize}_legalize(t){let{_triangles:n,_halfedges:s,coords:o}=this,r=0,i=0;for(;;){let l=s[t],f=t-t%3;if(i=f+(t+2)%3,l===-1){if(r===0)break;t=pn[--r];continue}let u=l-l%3,p=f+(t+1)%3,a=u+(l+2)%3,c=n[i],m=n[t],h=n[p],E=n[a];if(ur(o[2*c],o[2*c+1],o[2*m],o[2*m+1],o[2*h],o[2*h+1],o[2*E],o[2*E+1])){n[t]=E,n[l]=c;let w=s[a];if(w===-1){let d=this._hullStart;do{if(this._hullTri[d]===a){this._hullTri[d]=t;break}d=this._hullPrev[d]}while(d!==this._hullStart)}this._link(t,w),this._link(l,s[i]),this._link(i,a);let g=u+(l+1)%3;r<pn.length&&(pn[r++]=g)}else{if(r===0)break;t=pn[--r]}}return i}_link(t,n){this._halfedges[t]=n,n!==-1&&(this._halfedges[n]=t)}_addTriangle(t,n,s,o,r,i){let l=this.trianglesLen;return this._triangles[l]=t,this._triangles[l+1]=n,this._triangles[l+2]=s,this._link(l,o),this._link(l+1,r),this._link(l+2,i),this.trianglesLen+=3,l}};function fr(e,t){let n=e/(Math.abs(e)+Math.abs(t));return(t>0?3-n:1+n)/4}function qn(e,t,n,s){let o=e-n,r=t-s;return o*o+r*r}function ur(e,t,n,s,o,r,i,l){let f=e-i,u=t-l,p=n-i,a=s-l,c=o-i,m=r-l,h=f*f+u*u,E=p*p+a*a,P=c*c+m*m;return f*(a*P-E*m)-u*(p*P-E*c)+h*(p*m-a*c)<0}function hr(e,t,n,s,o,r){let i=n-e,l=s-t,f=o-e,u=r-t,p=i*i+l*l,a=f*f+u*u,c=.5/(i*u-l*f),m=(u*p-l*a)*c,h=(i*a-f*p)*c;return m*m+h*h}function dr(e,t,n,s,o,r){let i=n-e,l=s-t,f=o-e,u=r-t,p=i*i+l*l,a=f*f+u*u,c=.5/(i*u-l*f),m=e+(u*p-l*a)*c,h=t+(i*a-f*p)*c;return{x:m,y:h}}function $e(e,t,n,s){if(s-n<=20)for(let o=n+1;o<=s;o++){let r=e[o],i=t[r],l=o-1;for(;l>=n&&t[e[l]]>i;)e[l+1]=e[l--];e[l+1]=r}else{let o=n+s>>1,r=n+1,i=s;on(e,o,r),t[e[n]]>t[e[s]]&&on(e,n,s),t[e[r]]>t[e[s]]&&on(e,r,s),t[e[n]]>t[e[r]]&&on(e,n,r);let l=e[r],f=t[l];for(;;){do r++;while(t[e[r]]<f);do i--;while(t[e[i]]>f);if(i<r)break;on(e,r,i)}e[n+1]=e[i],e[i]=l,s-r+1>=i-n?($e(e,t,r,s),$e(e,t,n,i-1)):($e(e,t,n,i-1),$e(e,t,r,s))}}function on(e,t,n){let s=e[t];e[t]=e[n],e[n]=s}function mr(e){return e[0]}function pr(e){return e[1]}var fe=class{constructor(){this._x0=this._y0=this._x1=this._y1=null,this._=""}moveTo(t,n){this._+=`M${this._x0=this._x1=+t},${this._y0=this._y1=+n}`}closePath(){this._x1!==null&&(this._x1=this._x0,this._y1=this._y0,this._+="Z")}lineTo(t,n){this._+=`L${this._x1=+t},${this._y1=+n}`}arc(t,n,s){t=+t,n=+n,s=+s;let o=t+s,r=n;if(s<0)throw new Error("negative radius");this._x1===null?this._+=`M${o},${r}`:(Math.abs(this._x1-o)>1e-6||Math.abs(this._y1-r)>1e-6)&&(this._+="L"+o+","+r),s&&(this._+=`A${s},${s},0,1,1,${t-s},${n}A${s},${s},0,1,1,${this._x1=o},${this._y1=r}`)}rect(t,n,s,o){this._+=`M${this._x0=this._x1=+t},${this._y0=this._y1=+n}h${+s}v${+o}h${-s}Z`}value(){return this._||null}};var ze=class{constructor(){this._=[]}moveTo(t,n){this._.push([t,n])}closePath(){this._.push(this._[0].slice())}lineTo(t,n){this._.push([t,n])}value(){return this._.length?this._:null}};var sn=class{constructor(t,[n,s,o,r]=[0,0,960,500]){if(!((o=+o)>=(n=+n))||!((r=+r)>=(s=+s)))throw new Error("invalid bounds");this.delaunay=t,this._circumcenters=new Float64Array(t.points.length*2),this.vectors=new Float64Array(t.points.length*2),this.xmax=o,this.xmin=n,this.ymax=r,this.ymin=s,this._init()}update(){return this.delaunay.update(),this._init(),this}_init(){let{delaunay:{points:t,hull:n,triangles:s},vectors:o}=this,r,i,l=this.circumcenters=this._circumcenters.subarray(0,s.length/3*2);for(let E=0,P=0,w=s.length,g,d;E<w;E+=3,P+=2){let y=s[E]*2,x=s[E+1]*2,T=s[E+2]*2,S=t[y],b=t[y+1],R=t[x],z=t[x+1],V=t[T],M=t[T+1],v=R-S,I=z-b,D=V-S,B=M-b,_=(v*B-I*D)*2;if(Math.abs(_)<1e-9){if(r===void 0){r=i=0;for(let H of n)r+=t[H*2],i+=t[H*2+1];r/=n.length,i/=n.length}let k=1e9*Math.sign((r-S)*B-(i-b)*D);g=(S+V)/2-k*B,d=(b+M)/2+k*D}else{let k=1/_,H=v*v+I*I,F=D*D+B*B;g=S+(B*H-I*F)*k,d=b+(v*F-D*H)*k}l[P]=g,l[P+1]=d}let f=n[n.length-1],u,p=f*4,a,c=t[2*f],m,h=t[2*f+1];o.fill(0);for(let E=0;E<n.length;++E)f=n[E],u=p,a=c,m=h,p=f*4,c=t[2*f],h=t[2*f+1],o[u+2]=o[p]=m-h,o[u+3]=o[p+1]=c-a}render(t){let n=t==null?t=new fe:void 0,{delaunay:{halfedges:s,inedges:o,hull:r},circumcenters:i,vectors:l}=this;if(r.length<=1)return null;for(let p=0,a=s.length;p<a;++p){let c=s[p];if(c<p)continue;let m=Math.floor(p/3)*2,h=Math.floor(c/3)*2,E=i[m],P=i[m+1],w=i[h],g=i[h+1];this._renderSegment(E,P,w,g,t)}let f,u=r[r.length-1];for(let p=0;p<r.length;++p){f=u,u=r[p];let a=Math.floor(o[u]/3)*2,c=i[a],m=i[a+1],h=f*4,E=this._project(c,m,l[h+2],l[h+3]);E&&this._renderSegment(c,m,E[0],E[1],t)}return n&&n.value()}renderBounds(t){let n=t==null?t=new fe:void 0;return t.rect(this.xmin,this.ymin,this.xmax-this.xmin,this.ymax-this.ymin),n&&n.value()}renderCell(t,n){let s=n==null?n=new fe:void 0,o=this._clip(t);if(o===null||!o.length)return;n.moveTo(o[0],o[1]);let r=o.length;for(;o[0]===o[r-2]&&o[1]===o[r-1]&&r>1;)r-=2;for(let i=2;i<r;i+=2)(o[i]!==o[i-2]||o[i+1]!==o[i-1])&&n.lineTo(o[i],o[i+1]);return n.closePath(),s&&s.value()}*cellPolygons(){let{delaunay:{points:t}}=this;for(let n=0,s=t.length/2;n<s;++n){let o=this.cellPolygon(n);o&&(o.index=n,yield o)}}cellPolygon(t){let n=new ze;return this.renderCell(t,n),n.value()}_renderSegment(t,n,s,o,r){let i,l=this._regioncode(t,n),f=this._regioncode(s,o);l===0&&f===0?(r.moveTo(t,n),r.lineTo(s,o)):(i=this._clipSegment(t,n,s,o,l,f))&&(r.moveTo(i[0],i[1]),r.lineTo(i[2],i[3]))}contains(t,n,s){return n=+n,n!==n||(s=+s,s!==s)?!1:this.delaunay._step(t,n,s)===t}*neighbors(t){let n=this._clip(t);if(n)for(let s of this.delaunay.neighbors(t)){let o=this._clip(s);if(o){t:for(let r=0,i=n.length;r<i;r+=2)for(let l=0,f=o.length;l<f;l+=2)if(n[r]===o[l]&&n[r+1]===o[l+1]&&n[(r+2)%i]===o[(l+f-2)%f]&&n[(r+3)%i]===o[(l+f-1)%f]){yield s;break t}}}}_cell(t){let{circumcenters:n,delaunay:{inedges:s,halfedges:o,triangles:r}}=this,i=s[t];if(i===-1)return null;let l=[],f=i;do{let u=Math.floor(f/3);if(l.push(n[u*2],n[u*2+1]),f=f%3===2?f-2:f+1,r[f]!==t)break;f=o[f]}while(f!==i&&f!==-1);return l}_clip(t){if(t===0&&this.delaunay.hull.length===1)return[this.xmax,this.ymin,this.xmax,this.ymax,this.xmin,this.ymax,this.xmin,this.ymin];let n=this._cell(t);if(n===null)return null;let{vectors:s}=this,o=t*4;return this._simplify(s[o]||s[o+1]?this._clipInfinite(t,n,s[o],s[o+1],s[o+2],s[o+3]):this._clipFinite(t,n))}_clipFinite(t,n){let s=n.length,o=null,r,i,l=n[s-2],f=n[s-1],u,p=this._regioncode(l,f),a,c=0;for(let m=0;m<s;m+=2)if(r=l,i=f,l=n[m],f=n[m+1],u=p,p=this._regioncode(l,f),u===0&&p===0)a=c,c=0,o?o.push(l,f):o=[l,f];else{let h,E,P,w,g;if(u===0){if((h=this._clipSegment(r,i,l,f,u,p))===null)continue;[E,P,w,g]=h}else{if((h=this._clipSegment(l,f,r,i,p,u))===null)continue;[w,g,E,P]=h,a=c,c=this._edgecode(E,P),a&&c&&this._edge(t,a,c,o,o.length),o?o.push(E,P):o=[E,P]}a=c,c=this._edgecode(w,g),a&&c&&this._edge(t,a,c,o,o.length),o?o.push(w,g):o=[w,g]}if(o)a=c,c=this._edgecode(o[0],o[1]),a&&c&&this._edge(t,a,c,o,o.length);else if(this.contains(t,(this.xmin+this.xmax)/2,(this.ymin+this.ymax)/2))return[this.xmax,this.ymin,this.xmax,this.ymax,this.xmin,this.ymax,this.xmin,this.ymin];return o}_clipSegment(t,n,s,o,r,i){let l=r<i;for(l&&([t,n,s,o,r,i]=[s,o,t,n,i,r]);;){if(r===0&&i===0)return l?[s,o,t,n]:[t,n,s,o];if(r&i)return null;let f,u,p=r||i;p&8?(f=t+(s-t)*(this.ymax-n)/(o-n),u=this.ymax):p&4?(f=t+(s-t)*(this.ymin-n)/(o-n),u=this.ymin):p&2?(u=n+(o-n)*(this.xmax-t)/(s-t),f=this.xmax):(u=n+(o-n)*(this.xmin-t)/(s-t),f=this.xmin),r?(t=f,n=u,r=this._regioncode(t,n)):(s=f,o=u,i=this._regioncode(s,o))}}_clipInfinite(t,n,s,o,r,i){let l=Array.from(n),f;if((f=this._project(l[0],l[1],s,o))&&l.unshift(f[0],f[1]),(f=this._project(l[l.length-2],l[l.length-1],r,i))&&l.push(f[0],f[1]),l=this._clipFinite(t,l))for(let u=0,p=l.length,a,c=this._edgecode(l[p-2],l[p-1]);u<p;u+=2)a=c,c=this._edgecode(l[u],l[u+1]),a&&c&&(u=this._edge(t,a,c,l,u),p=l.length);else this.contains(t,(this.xmin+this.xmax)/2,(this.ymin+this.ymax)/2)&&(l=[this.xmin,this.ymin,this.xmax,this.ymin,this.xmax,this.ymax,this.xmin,this.ymax]);return l}_edge(t,n,s,o,r){for(;n!==s;){let i,l;switch(n){case 5:n=4;continue;case 4:n=6,i=this.xmax,l=this.ymin;break;case 6:n=2;continue;case 2:n=10,i=this.xmax,l=this.ymax;break;case 10:n=8;continue;case 8:n=9,i=this.xmin,l=this.ymax;break;case 9:n=1;continue;case 1:n=5,i=this.xmin,l=this.ymin;break}(o[r]!==i||o[r+1]!==l)&&this.contains(t,i,l)&&(o.splice(r,0,i,l),r+=2)}return r}_project(t,n,s,o){let r=1/0,i,l,f;if(o<0){if(n<=this.ymin)return null;(i=(this.ymin-n)/o)<r&&(f=this.ymin,l=t+(r=i)*s)}else if(o>0){if(n>=this.ymax)return null;(i=(this.ymax-n)/o)<r&&(f=this.ymax,l=t+(r=i)*s)}if(s>0){if(t>=this.xmax)return null;(i=(this.xmax-t)/s)<r&&(l=this.xmax,f=n+(r=i)*o)}else if(s<0){if(t<=this.xmin)return null;(i=(this.xmin-t)/s)<r&&(l=this.xmin,f=n+(r=i)*o)}return[l,f]}_edgecode(t,n){return(t===this.xmin?1:t===this.xmax?2:0)|(n===this.ymin?4:n===this.ymax?8:0)}_regioncode(t,n){return(t<this.xmin?1:t>this.xmax?2:0)|(n<this.ymin?4:n>this.ymax?8:0)}_simplify(t){if(t&&t.length>4){for(let n=0;n<t.length;n+=2){let s=(n+2)%t.length,o=(n+4)%t.length;(t[n]===t[s]&&t[s]===t[o]||t[n+1]===t[s+1]&&t[s+1]===t[o+1])&&(t.splice(s,2),n-=2)}t.length||(t=null)}return t}};var gr=2*Math.PI,Ye=Math.pow;function yr(e){return e[0]}function Er(e){return e[1]}function xr(e){let{triangles:t,coords:n}=e;for(let s=0;s<t.length;s+=3){let o=2*t[s],r=2*t[s+1],i=2*t[s+2];if((n[i]-n[o])*(n[r+1]-n[o+1])-(n[r]-n[o])*(n[i+1]-n[o+1])>1e-10)return!1}return!0}function wr(e,t,n){return[e+Math.sin(e+t)*n,t+Math.cos(e-t)*n]}var Ve=class e{static from(t,n=yr,s=Er,o){return new e("length"in t?br(t,n,s,o):Float64Array.from(Tr(t,n,s,o)))}constructor(t){this._delaunator=new Xe(t),this.inedges=new Int32Array(t.length/2),this._hullIndex=new Int32Array(t.length/2),this.points=this._delaunator.coords,this._init()}update(){return this._delaunator.update(),this._init(),this}_init(){let t=this._delaunator,n=this.points;if(t.hull&&t.hull.length>2&&xr(t)){this.collinear=Int32Array.from({length:n.length/2},(c,m)=>m).sort((c,m)=>n[2*c]-n[2*m]||n[2*c+1]-n[2*m+1]);let f=this.collinear[0],u=this.collinear[this.collinear.length-1],p=[n[2*f],n[2*f+1],n[2*u],n[2*u+1]],a=1e-8*Math.hypot(p[3]-p[1],p[2]-p[0]);for(let c=0,m=n.length/2;c<m;++c){let h=wr(n[2*c],n[2*c+1],a);n[2*c]=h[0],n[2*c+1]=h[1]}this._delaunator=new Xe(n)}else delete this.collinear;let s=this.halfedges=this._delaunator.halfedges,o=this.hull=this._delaunator.hull,r=this.triangles=this._delaunator.triangles,i=this.inedges.fill(-1),l=this._hullIndex.fill(-1);for(let f=0,u=s.length;f<u;++f){let p=r[f%3===2?f-2:f+1];(s[f]===-1||i[p]===-1)&&(i[p]=f)}for(let f=0,u=o.length;f<u;++f)l[o[f]]=f;o.length<=2&&o.length>0&&(this.triangles=new Int32Array(3).fill(-1),this.halfedges=new Int32Array(3).fill(-1),this.triangles[0]=o[0],i[o[0]]=1,o.length===2&&(i[o[1]]=0,this.triangles[1]=o[1],this.triangles[2]=o[1]))}voronoi(t){return new sn(this,t)}*neighbors(t){let{inedges:n,hull:s,_hullIndex:o,halfedges:r,triangles:i,collinear:l}=this;if(l){let a=l.indexOf(t);a>0&&(yield l[a-1]),a<l.length-1&&(yield l[a+1]);return}let f=n[t];if(f===-1)return;let u=f,p=-1;do{if(yield p=i[u],u=u%3===2?u-2:u+1,i[u]!==t)return;if(u=r[u],u===-1){let a=s[(o[t]+1)%s.length];a!==p&&(yield a);return}}while(u!==f)}find(t,n,s=0){if(t=+t,t!==t||(n=+n,n!==n))return-1;let o=s,r;for(;(r=this._step(s,t,n))>=0&&r!==s&&r!==o;)s=r;return r}_step(t,n,s){let{inedges:o,hull:r,_hullIndex:i,halfedges:l,triangles:f,points:u}=this;if(o[t]===-1||!u.length)return(t+1)%(u.length>>1);let p=t,a=Ye(n-u[t*2],2)+Ye(s-u[t*2+1],2),c=o[t],m=c;do{let h=f[m],E=Ye(n-u[h*2],2)+Ye(s-u[h*2+1],2);if(E<a&&(a=E,p=h),m=m%3===2?m-2:m+1,f[m]!==t)break;if(m=l[m],m===-1){if(m=r[(i[t]+1)%r.length],m!==h&&Ye(n-u[m*2],2)+Ye(s-u[m*2+1],2)<a)return m;break}}while(m!==c);return p}render(t){let n=t==null?t=new fe:void 0,{points:s,halfedges:o,triangles:r}=this;for(let i=0,l=o.length;i<l;++i){let f=o[i];if(f<i)continue;let u=r[i]*2,p=r[f]*2;t.moveTo(s[u],s[u+1]),t.lineTo(s[p],s[p+1])}return this.renderHull(t),n&&n.value()}renderPoints(t,n){n===void 0&&(!t||typeof t.moveTo!="function")&&(n=t,t=null),n=n==null?2:+n;let s=t==null?t=new fe:void 0,{points:o}=this;for(let r=0,i=o.length;r<i;r+=2){let l=o[r],f=o[r+1];t.moveTo(l+n,f),t.arc(l,f,n,0,gr)}return s&&s.value()}renderHull(t){let n=t==null?t=new fe:void 0,{hull:s,points:o}=this,r=s[0]*2,i=s.length;t.moveTo(o[r],o[r+1]);for(let l=1;l<i;++l){let f=2*s[l];t.lineTo(o[f],o[f+1])}return t.closePath(),n&&n.value()}hullPolygon(){let t=new ze;return this.renderHull(t),t.value()}renderTriangle(t,n){let s=n==null?n=new fe:void 0,{points:o,triangles:r}=this,i=r[t*=3]*2,l=r[t+1]*2,f=r[t+2]*2;return n.moveTo(o[i],o[i+1]),n.lineTo(o[l],o[l+1]),n.lineTo(o[f],o[f+1]),n.closePath(),s&&s.value()}*trianglePolygons(){let{triangles:t}=this;for(let n=0,s=t.length/3;n<s;++n)yield this.trianglePolygon(n)}trianglePolygon(t){let n=new ze;return this.renderTriangle(t,n),n.value()}};function br(e,t,n,s){let o=e.length,r=new Float64Array(o*2);for(let i=0;i<o;++i){let l=e[i];r[i*2]=t.call(s,l,i,e),r[i*2+1]=n.call(s,l,i,e)}return r}function*Tr(e,t,n,s){let o=0;for(let r of e)yield t.call(s,r,o,e),yield n.call(s,r,o,e),++o}function Pr(e,t,n,s){return 1+(e[t][0]===0||e[n][0]===0||e[s][0]===0?1:0)}function Sr(e,t,n,s,o,r){let i=Math.hypot(n-o,s-r),l=Math.hypot(e-o,t-r),f=Math.hypot(e-n,t-s),u=Math.abs((n-e)*(r-t)-(o-e)*(s-t))/2;return u===0?1/0:i*l*f/(4*u)}function we(e){if(!e||e.length<3)return[];let t=new Set,n=[];for(let h of e){let E=`${h[0]}_${h[1]}`;t.has(E)||(t.add(E),n.push(h))}if(n.length<3)return[];let s=new Ve(Float64Array.from(n.flat())),{triangles:o}=s;if(!o.length)return[];let r=new Map,i=(h,E)=>h<E?`${h}_${E}`:`${E}_${h}`;for(let h=0;h<o.length;h+=3){let E=o[h],P=o[h+1],w=o[h+2],[g,d]=n[E],[y,x]=n[P],[T,S]=n[w],b=Sr(g,d,y,x,T,S),R=Pr(n,E,P,w);if(b<=1/R)for(let[z,V]of[[E,P],[P,w],[w,E]]){let M=i(z,V);r.set(M,(r.get(M)||0)+1)}}let l=[];for(let[h,E]of r)E===1&&l.push(h.split("_").map(Number));if(!l.length)return[];let f=new Map;for(let[h,E]of l)(f.get(h)||f.set(h,[]).get(h)).push(E),(f.get(E)||f.set(E,[]).get(E)).push(h);let u=l[0][0],p=[],a=new Set,c=u,m=-1;do{p.push(n[c]),a.add(c);let h=f.get(c)||[],E=h.find(P=>P!==m&&!a.has(P));if(E===void 0&&(E=h.find(P=>P!==m)),E===void 0)break;m=c,c=E}while(c!==u&&p.length<=l.length+1);return p.length>0&&p.push(p[0]),p}import*as qt from"three";import{OBB as Wr}from"three/examples/jsm/math/OBB.js";var Zt=63710088e-1,vo={centimeters:Zt*100,centimetres:Zt*100,degrees:360/(2*Math.PI),feet:Zt*3.28084,inches:Zt*39.37,kilometers:Zt/1e3,kilometres:Zt/1e3,meters:Zt,metres:Zt,miles:Zt/1609.344,millimeters:Zt*1e3,millimetres:Zt*1e3,nauticalmiles:Zt/1852,radians:1,yards:Zt*1.0936};function Ho(e,t,n={}){let s={type:"Feature"};return(n.id===0||n.id)&&(s.id=n.id),n.bbox&&(s.bbox=n.bbox),s.properties=t||{},s.geometry=e,s}function gn(e,t,n={}){if(!e)throw new Error("coordinates is required");if(!Array.isArray(e))throw new Error("coordinates must be an Array");if(e.length<2)throw new Error("coordinates must be at least 2 numbers long");if(!Mo(e[0])||!Mo(e[1]))throw new Error("coordinates must contain numbers");return Ho({type:"Point",coordinates:e},t,n)}function yn(e,t,n={}){for(let o of e){if(o.length<4)throw new Error("Each LinearRing of a Polygon must have 4 or more Positions.");if(o[o.length-1].length!==o[0].length)throw new Error("First and last Position are not equivalent.");for(let r=0;r<o[o.length-1].length;r++)if(o[o.length-1][r]!==o[0][r])throw new Error("First and last Position are not equivalent.")}return Ho({type:"Polygon",coordinates:e},t,n)}function Rr(e,t="kilometers"){let n=vo[t];if(!n)throw new Error(t+" units is invalid");return e*n}function zr(e,t="kilometers"){let n=vo[t];if(!n)throw new Error(t+" units is invalid");return e/n}function En(e){return e%(2*Math.PI)*180/Math.PI}function ue(e){return e%360*Math.PI/180}function xn(e,t="kilometers",n="kilometers"){if(!(e>=0))throw new Error("length must be a positive number");return Rr(zr(e,t),n)}function Mo(e){return!isNaN(e)&&e!==null&&!Array.isArray(e)}function Bo(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function be(e,t,n){if(e!==null)for(var s,o,r,i,l,f,u,p=0,a=0,c,m=e.type,h=m==="FeatureCollection",E=m==="Feature",P=h?e.features.length:1,w=0;w<P;w++){u=h?e.features[w].geometry:E?e.geometry:e,c=u?u.type==="GeometryCollection":!1,l=c?u.geometries.length:1;for(var g=0;g<l;g++){var d=0,y=0;if(i=c?u.geometries[g]:u,i!==null){f=i.coordinates;var x=i.type;switch(p=n&&(x==="Polygon"||x==="MultiPolygon")?1:0,x){case null:break;case"Point":if(t(f,a,w,d,y)===!1)return!1;a++,d++;break;case"LineString":case"MultiPoint":for(s=0;s<f.length;s++){if(t(f[s],a,w,d,y)===!1)return!1;a++,x==="MultiPoint"&&d++}x==="LineString"&&d++;break;case"Polygon":case"MultiLineString":for(s=0;s<f.length;s++){for(o=0;o<f[s].length-p;o++){if(t(f[s][o],a,w,d,y)===!1)return!1;a++}x==="MultiLineString"&&d++,x==="Polygon"&&y++}x==="Polygon"&&d++;break;case"MultiPolygon":for(s=0;s<f.length;s++){for(y=0,o=0;o<f[s].length;o++){for(r=0;r<f[s][o].length-p;r++){if(t(f[s][o][r],a,w,d,y)===!1)return!1;a++}y++}d++}break;case"GeometryCollection":for(s=0;s<i.geometries.length;s++)if(be(i.geometries[s],t,n)===!1)return!1;break;default:throw new Error("Unknown Geometry Type")}}}}}function _o(e){var t=[];return be(e,function(n){t.push(n)}),t}function Vr(e,t){var n,s,o,r,i,l,f,u,p,a,c=0,m=e.type==="FeatureCollection",h=e.type==="Feature",E=m?e.features.length:1;for(n=0;n<E;n++){for(l=m?e.features[n].geometry:h?e.geometry:e,u=m?e.features[n].properties:h?e.properties:{},p=m?e.features[n].bbox:h?e.bbox:void 0,a=m?e.features[n].id:h?e.id:void 0,f=l?l.type==="GeometryCollection":!1,i=f?l.geometries.length:1,o=0;o<i;o++){if(r=f?l.geometries[o]:l,r===null){if(t(null,c,u,p,a)===!1)return!1;continue}switch(r.type){case"Point":case"LineString":case"MultiPoint":case"Polygon":case"MultiLineString":case"MultiPolygon":{if(t(r,c,u,p,a)===!1)return!1;break}case"GeometryCollection":{for(s=0;s<r.geometries.length;s++)if(t(r.geometries[s],c,u,p,a)===!1)return!1;break}default:throw new Error("Unknown Geometry Type")}}c++}}function ko(e,t,n){var s=n;return Vr(e,function(o,r,i,l,f){r===0&&n===void 0?s=o:s=t(s,o,r,i,l,f)}),s}var Ko=Rs(Uo(),1);function Jo(e,t={}){t.concavity=t.concavity||1/0;let n=[];if(be(e,o=>{n.push([o[0],o[1]])}),!n.length)return null;let s=(0,Ko.default)(n,t.concavity);return s.length>3?yn([s]):null}function Sn(e,t={}){let n=0,s=0,o=0;return be(e,function(r){n+=r[0],s+=r[1],o++},!0),gn([n/o,s/o],t.properties)}function ae(e){if(!e)throw new Error("coord is required");if(!Array.isArray(e)){if(e.type==="Feature"&&e.geometry!==null&&e.geometry.type==="Point")return[...e.geometry.coordinates];if(e.type==="Point")return[...e.coordinates]}if(Array.isArray(e)&&e.length>=2&&!Array.isArray(e[0])&&!Array.isArray(e[1]))return[...e];throw new Error("coord must be GeoJSON Point or an Array of numbers")}function Qo(e){if(Array.isArray(e))return e;if(e.type==="Feature"){if(e.geometry!==null)return e.geometry.coordinates}else if(e.coordinates)return e.coordinates;throw new Error("coords must be GeoJSON Feature, Geometry Object or an Array")}function es(e,t,n={}){let s;return n.final?s=ts(ae(t),ae(e)):s=ts(ae(e),ae(t)),s>180?-(360-s):s}function ts(e,t){let n=ue(e[1]),s=ue(t[1]),o=ue(t[0]-e[0]);o>Math.PI&&(o-=2*Math.PI),o<-Math.PI&&(o+=2*Math.PI);let r=Math.log(Math.tan(s/2+Math.PI/4)/Math.tan(n/2+Math.PI/4)),i=Math.atan2(o,r);return(En(i)+360)%360}function ns(e,t,n={}){let s=ae(e),o=ae(t);o[0]+=o[0]-s[0]>180?-360:s[0]-o[0]>180?360:0;let r=Lr(s,o);return xn(r,"meters",n.units)}function Lr(e,t,n){n=n===void 0?Zt:Number(n);let s=n,o=e[1]*Math.PI/180,r=t[1]*Math.PI/180,i=r-o,l=Math.abs(t[0]-e[0])*Math.PI/180;l>Math.PI&&(l-=2*Math.PI);let f=Math.log(Math.tan(r/2+Math.PI/4)/Math.tan(o/2+Math.PI/4)),u=Math.abs(f)>1e-11?i/f:Math.cos(o);return Math.sqrt(i*i+u*u*l*l)*s}function os(e,t,n,s={}){let o=t<0,r=xn(Math.abs(t),s.units,"meters");o&&(r=-Math.abs(r));let i=ae(e),l=Ar(i,r,n);return l[0]+=l[0]-i[0]>180?-360:i[0]-l[0]>180?360:0,gn(l,s.properties)}function Ar(e,t,n,s){s=s===void 0?Zt:Number(s);let o=t/s,r=e[0]*Math.PI/180,i=ue(e[1]),l=ue(n),f=o*Math.cos(l),u=i+f;Math.abs(u)>Math.PI/2&&(u=u>0?Math.PI-u:-Math.PI-u);let p=Math.log(Math.tan(u/2+Math.PI/4)/Math.tan(i/2+Math.PI/4)),a=Math.abs(p)>1e-11?f/p:Math.cos(i),c=o*Math.sin(l)/a;return[((r+c)*180/Math.PI+540)%360-180,u*180/Math.PI]}function ss(e){if(!e)throw new Error("geojson is required");switch(e.type){case"Feature":return rs(e);case"FeatureCollection":return Fr(e);case"Point":case"LineString":case"Polygon":case"MultiPoint":case"MultiLineString":case"MultiPolygon":case"GeometryCollection":return Kn(e);default:throw new Error("unknown GeoJSON type")}}function rs(e){let t={type:"Feature"};return Object.keys(e).forEach(n=>{switch(n){case"type":case"properties":case"geometry":return;default:t[n]=e[n]}}),t.properties=is(e.properties),e.geometry==null?t.geometry=null:t.geometry=Kn(e.geometry),t}function is(e){let t={};return e&&Object.keys(e).forEach(n=>{let s=e[n];typeof s=="object"?s===null?t[n]=null:Array.isArray(s)?t[n]=s.map(o=>o):t[n]=is(s):t[n]=s}),t}function Fr(e){let t={type:"FeatureCollection"};return Object.keys(e).forEach(n=>{switch(n){case"type":case"features":return;default:t[n]=e[n]}}),t.features=e.features.map(n=>rs(n)),t}function Kn(e){let t={type:e.type};return e.bbox&&(t.bbox=e.bbox),e.type==="GeometryCollection"?(t.geometries=e.geometries.map(n=>Kn(n)),t):(t.coordinates=ls(e.coordinates),t)}function ls(e){let t=e;return typeof t[0]!="object"?t.slice():t.map(n=>ls(n))}function Jn(e,t,n){if(n=n||{},!Bo(n))throw new Error("options is invalid");let s=n.pivot,o=n.mutate;if(!e)throw new Error("geojson is required");if(t==null||isNaN(t))throw new Error("angle is required");if(t===0)return e;let r=s??Sn(e);return(o===!1||o===void 0)&&(e=ss(e)),be(e,function(i){let f=es(r,i)+t,u=ns(r,i),p=Qo(os(r,u,f));i[0]=p[0],i[1]=p[1]}),e}function Qn(e,t,n={}){if(n.final===!0)return Or(e,t);let s=ae(e),o=ae(t),r=ue(s[0]),i=ue(o[0]),l=ue(s[1]),f=ue(o[1]),u=Math.sin(i-r)*Math.cos(f),p=Math.cos(l)*Math.sin(f)-Math.sin(l)*Math.cos(f)*Math.cos(i-r);return En(Math.atan2(u,p))}function Or(e,t){let n=Qn(t,e);return n=(n+180)%360,n}function cs(e,t={}){if(e.bbox!=null&&t.recompute!==!0)return e.bbox;let n=[1/0,1/0,-1/0,-1/0];return be(e,s=>{n[0]>s[0]&&(n[0]=s[0]),n[1]>s[1]&&(n[1]=s[1]),n[2]<s[0]&&(n[2]=s[0]),n[3]<s[1]&&(n[3]=s[1])}),n}function as(e,t={}){let n=Number(e[0]),s=Number(e[1]),o=Number(e[2]),r=Number(e[3]);if(e.length===6)throw new Error("@turf/bbox-polygon does not support BBox with 6 positions");let i=[n,s];return yn([[i,[o,s],[o,r],[n,r],i]],t.properties,{bbox:e,id:t.id})}function fs(e){return as(cs(e))}function ds(e){return ko(e,(t,n)=>t+Nr(n),0)}function Nr(e){let t=0,n;switch(e.type){case"Polygon":return us(e.coordinates);case"MultiPolygon":for(n=0;n<e.coordinates.length;n++)t+=us(e.coordinates[n]);return t;case"Point":case"MultiPoint":case"LineString":case"MultiLineString":return 0}return 0}function us(e){let t=0;if(e&&e.length>0){t+=Math.abs(hs(e[0]));for(let n=1;n<e.length;n++)t-=Math.abs(hs(e[n]))}return t}var qr=Zt*Zt/2,to=Math.PI/180;function hs(e){let t=e.length-1;if(t<=2)return 0;let n=0,s=0;for(;s<t;){let o=e[s],r=e[s+1===t?0:s+1],i=e[s+2>=t?(s+2)%t:s+2],l=o[0]*to,f=r[1]*to,u=i[0]*to;n+=(u-l)*Math.sin(f),s++}return n*qr}function ms(e){let t=Jo(e);if(!t)throw new Error("Can't calculate smallestSurroundingRectangleByArea for given geometry");let n=Sn(t),s=_o(t),o=Number.MAX_SAFE_INTEGER,r=null;for(let i=0;i<s.length-1;i++){let l=Qn(s[i],s[i+1]),f=Jn(t,-1*l,{pivot:n}),u=fs(f),p=ds(u);p<o&&(o=p,r=Jn(u,l,{pivot:n}))}return r}function ps(e,t){let n=t[0]-e[0],s=t[1]-e[1];return Math.sqrt(n*n+s*s)}function jr(e){let t=1/0,n=-1/0,s=1/0,o=-1/0;for(let[r,i]of e)r<t&&(t=r),r>n&&(n=r),i<s&&(s=i),i>o&&(o=i);return[(n+t)*.5,(o+s)*.5]}var zn=class e extends Wr{getBoxMesh(){Me.identity(),Me.setFromMatrix3(this.rotation),Me.decompose(Rn,Le,new qt.Vector3);let t=this.halfSize.clone().multiplyScalar(2),n=new qt.Mesh(new qt.BoxGeometry(t.x,t.y,t.z));return n.position.copy(this.center),n.rotation.setFromQuaternion(Le),n}getBoxEdge(t=16776960){let n=this.getBoxMesh();Xr.setFromObject(n);let s=new qt.EdgesGeometry(n.geometry.clone().applyMatrix4(n.matrixWorld));return new qt.LineSegments(s,new qt.LineBasicMaterial({color:t,toneMapped:!1}))}toJson(){return Me.identity(),Me.setFromMatrix3(this.rotation),Me.decompose(Rn,Le,new qt.Vector3),{size:this.halfSize.toArray(),center:this.center.toArray(),quaternion:Le.toArray()}}static from(t,n,s,o=new e){if(s instanceof qt.Euler)Le.setFromEuler(s);else if(s instanceof qt.Quaternion)Le.copy(s);else throw new Error("\u4F20\u5165\u7684\u65CB\u8F6C\u4E0D\u662F\u6B27\u62C9\u89D2\u6216\u8005\u56DB\u5143\u6570");return Me.compose(n,Le,$r),o.center.copy(n),o.halfSize.copy(t.multiplyScalar(.5)),o.rotation.setFromMatrix4(Me),o}static fromByPath2D(t,n,s,o=new e){let r=ms({type:"Polygon",coordinates:[t.map(m=>[m.x,m.y])]});if(!r)throw new Error("2d obb \u83B7\u53D6\u5931\u8D25");let i=r.geometry.coordinates[0],l=ps(i[0],i[1]),f=ps(i[1],i[2]),u=Math.atan2(i[1][1]-i[0][1],i[1][0]-i[0][0]);Rn.set(l,f,s),gs.set(0,0,u);let[p,a]=jr(i);return n.x=p,n.y=a,this.from(Rn,n,gs,o)}},Me=new qt.Matrix4,Le=new qt.Quaternion,gs=new qt.Euler,$r=new qt.Vector3(1,1,1),Rn=new qt.Vector3,Xr=new qt.Box3;import"three";function Yr(e,t,n=.005,s=.2){if(!e.length||!t.length)return 0;let o=Math.max(n,.03),r=n*n,i=new Map,l=(a,c,m)=>`${Math.floor(a/o)},${Math.floor(c/o)},${Math.floor(m/o)}`;for(let a of t){let c=l(a.x,a.y,a.z);i.has(c)||i.set(c,[]),i.get(c).push(a)}let f=0,u=Math.ceil(n/o)+1,p=[];for(let a=-u;a<=u;a++)for(let c=-u;c<=u;c++)for(let m=-u;m<=u;m++)a*a+c*c+m*m<=u*u&&p.push([a,c,m]);for(let a of e){let c=Math.floor(a.x/o),m=Math.floor(a.y/o),h=Math.floor(a.z/o),E=!1;for(let[P,w,g]of p){let d=`${c+P},${m+w},${h+g}`;if(i.has(d)){for(let y of i.get(d))if(a.distanceToSquared(y)<r){E=!0;break}if(E)break}}if(E&&(f++,f/e.length>s))return f/e.length}return f/e.length}function ve(e,t,n=.5){let s=0,o=0;for(let r of e)if(t.containsPoint(r)&&(s++,o=s/e.length,o>n))break;return o}function eo(e,t,n,s){if(e.intersectsOBB(t))return!0;{let r=Jt(e,s),i=Jt(t,n);if(r||i)return!0}return!1}function no(e,t){let n=new A.Vector3,s=new A.Vector3;e.getSize(n),t.getSize(s);let o=n.x*n.y*n.z,r=s.x*s.y*s.z;return o>r?1:o<r?-1:0}function Jt(e,t){let n=!0;for(let s=0;s<t.length;s++)if(!e.containsPoint(t[s])){n=!1;break}return n}function he(e){if(e.length===0)return{x:0,y:0,z:0,h:0};let t=0,n=0,s=-1/0,o=1/0;for(let r of e)t+=r.x,n+=r.y,s=Math.max(s,r.z),o=Math.min(o,r.z);return{x:t/e.length,y:n/e.length,z:0,maxz:s,minz:o,h:s-o}}function Te(e,t,n,s){let o=[];for(let i=0;i<e.length;i++)o.push(new A.Vector3(e[i][0],e[i][1],0));if(o.length==0)return null;let r=zn.fromByPath2D(o,t,n);return r.center.z=s,r}var Gr=(e,t)=>{let n=new A.Group,s=new A.MeshStandardMaterial({color:16737792,side:A.DoubleSide});for(let o=0;o<e.length;o++){let r=[];for(let E=0;E<e[o].path.length;E++)r.push(new A.Vector3(e[o].path[E][0],e[o].path[E][1],0));if(r.length==0)continue;n.add(e[o].obb.getBoxEdge());let i=new A.BufferGeometry;i.setFromPoints(r);let l="green",f=new A.LineBasicMaterial({color:l,depthTest:!1,depthWrite:!1}),u=new A.Line(i,f);u.position.z=e[o].maxz,n.add(u);let p=e[o].obb.center.clone(),a=fo(e[o].type,p),c=e[o].stairBottomPt1.clone(),m=e[o].stairBottomPt2.clone();for(let E=0;E<e[o].stairStepNum;E++){let P=[c,m];P.push(m.clone().addScaledVector(e[o].vecStepWidth,e[o].stairStepWidth)),P.push(c.clone().addScaledVector(e[o].vecStepWidth,e[o].stairStepWidth));let w=Ln(P,e[o].stairStepHeight),g=new A.Mesh(w,s);n.add(g),c=c.addScaledVector(e[o].vecStepWidth,e[o].stairStepWidth),c=c.addScaledVector(new A.Vector3(0,0,1),e[o].stairStepHeight),m=m.addScaledVector(e[o].vecStepWidth,e[o].stairStepWidth),m=m.addScaledVector(new A.Vector3(0,0,1),e[o].stairStepHeight)}if(e[o].rectPt1.x!=0&&e[o].rectPt1.y!=0){let E=[e[o].stairBottomPt1,e[o].stairBottomPt2,e[o].rectPt2,e[o].rectPt1],P=Ln(E,e[o].stairStepHeight),w=new A.Mesh(P,s);n.add(w)}let h=new A.MeshBasicMaterial({color:16776960});for(let E=0;E<e[o].stairBottom1BalconyRailing.length;E++){let P=new A.CylinderGeometry(.03,.03,e[o].balconyRailingHeight,32),w=new A.Mesh(P,h);w.position.set(e[o].stairBottom1BalconyRailing[E].x,e[o].stairBottom1BalconyRailing[E].z+e[o].balconyRailingHeight/2,-e[o].stairBottom1BalconyRailing[E].y),t.add(w)}for(let E=0;E<e[o].stairBottom2BalconyRailing.length;E++){let P=new A.CylinderGeometry(.03,.03,e[o].balconyRailingHeight,32),w=new A.Mesh(P,h);w.position.set(e[o].stairBottom2BalconyRailing[E].x,e[o].stairBottom2BalconyRailing[E].z+e[o].balconyRailingHeight/2,-e[o].stairBottom2BalconyRailing[E].y),t.add(w)}}return n},Zr=(e,t)=>{if(e.length==0)return[];t||(t=e[0].averagePz);let n=[],s=new Map;for(let r=0;r<e.length;r++){let i=e[r].points.map(w=>[w.x,w.y]),l=e[r].obj_id;l=l.replace(/calcony railing/g,"balcony railing").replace(/glass balcony railing/g,"balcony railing").replace(/metal balcony railing/g,"balcony railing").replace(/temporary construction guardrail/g,"balcony railing").replace(/the floor of the house/g,"floor").replace(/the outdoor floor/g,"floor").replace(/roof/g,"Ceiling");let f=l.split("_").slice(1,3).join("_").split(".")[0].split("_")[0],u=l.indexOf("_")+1,p=l.lastIndexOf("_"),a=l.substring(u,p);if(a.includes("top")&&(u=a.indexOf("top")+4,a=a.substring(u,p)),a.includes("left")&&(u=a.indexOf("left")+5,a=a.substring(u,p)),a.includes("right")&&(u=a.indexOf("right")+6,a=a.substring(u,p)),a.includes("front")&&(u=a.indexOf("front")+6,a=a.substring(u,p)),a==="wall"||a==="stair guardrail")continue;let c=[];for(let w=0;w<e[r].points.length;w++)c.push(new A.Vector3(e[r].points[w].x,e[r].points[w].y,e[r].points[w].z));let m=-99999;if(a==="floor"){let w=new Map;for(let d=0;d<e[r].points.length;d++){let y=e[r].points[d].z;if(y=Math.floor(y*10)/10,w.has(y)){let x=w.get(y);x.num+=1,x.points.push(e[r].points[d]),w.set(y,x)}else w.set(y,{num:1,points:[e[r].points[d]]})}let g=[...w.entries()].reduce((d,y)=>y[1].num>d[1].num?y:d);i=[],i=g[1].points.map(d=>[d.x,d.y]),c=[],c=g[1].points.map(d=>new A.Vector3(d.x,d.y,d.z)),m=g[0]}let h=he(c),E={points:c,path:we(i),h:h.h,minz:h.minz,maxz:h.maxz,center:{x:h.x,y:h.y,z:h.z},obj_id:e[r].obj_id,type:a,averagePz:t,obb:null,isDel:!1,obj_id:l,positionArr:[e[r].position]};if(E.obb=Te(E.path,E.center,E.h,(E.maxz+E.minz)/2),E.obb==null)continue;let P=-1;for(let w=0;w<n.length;w++)if(n[w].type==a){P=w;break}P!=-1?n[P].array.push(E):n.push({type:a,array:[E]})}for(let r=0;r<n.length;r++){let i=n[r].array,l=[],f=[];for(let p=0;p<i.length;p++){if(i[p].obb==null||l.includes(p))continue;let a={...i[p],obb:i[p].obb.clone()};for(let c=p+1;c<i.length;c++){if(i[c].obb==null||l.includes(c))continue;let m=a.obb.intersectsOBB(i[c].obb,.01);if(m||(m=ni(a.obb,i[c].obb)),m){l.push(c);for(let P=0;P<i[c].points.length;P++)(i[c].points[P].z>t&&i[c].points[P].z-t>.1||a.type=="floor"||a.type=="Staircase")&&a.points.push(i[c].points[P]);let h=a.points.map(P=>[P.x,P.y]);a.path=we(h);let E=he(a.points);a.h=E.h,a.minz=E.minz,a.maxz=E.maxz,a.center={x:E.x,y:E.y,z:E.z},a.obb=Te(a.path,a.center,a.h,(a.maxz+a.minz)/2),a.positionArr.push(...i[c].positionArr),c=p}}a.path.length>i[p].path.length&&(l.push(p),f.push(a))}let u=[];for(let p=0;p<i.length;p++)l.includes(p)||u.push(i[p]);u.push(...f),n[r].array=u}for(let r=0;r<n.length;r++){let i=n[r].type;if(i==="people"||i==="floor")continue;let l=n[r].array;for(let f=0;f<l.length;f++){let u=l[f].obb,p=l[f].minz,a=l[f].maxz,c=l[f].averagePz;if(i==="window"||i==="door"||i==="tv"||i==="chair"||i==="cabinet"||i==="table"){let m=new A.Vector3;u.getSize(m);let h=[m.x,m.y,m.z],E=0;for(let P of h)if(P<.2&&(E++,E===2)){l[f].isDel=!0;break}}if(!l[f].isDel)for(let m=r+1;m<n.length;m++){let h=n[m].type;if(h==="people")continue;let E=n[m].array;for(let P=0;P<E.length;P++){if(E[P].isDel)continue;let w=E[P].obb,g=E[P].minz,d=E[P].maxz;if(u.intersectsOBB(w)){let y=ve(E[P].points,u),x=ve(l[f].points,w),T=no(u,w);if(x>=.5&&T==-1&&i!=="Staircase"&&h!=="Staircase"){l[f].isDel=!0;break}if(i!=="wall"&&i!=="floor"&&i!=="roof"){if(i==="window"){if(h==="balcony railing"&&Jt(u,E[P].points)){E[P].isDel=!0;continue}if(h==="balcony railing"&&Jt(w,l[f].points)){l[f].isDel=!0;break}if(h==="balcony railing"&&eo(u,w,l[f].points,E[P].points)&&(Math.abs(p-g)<.1||Math.abs(g-c)>.3)){E[P].isDel=!0;continue}if(h==="door"&&Jt(u,E[P].points)){E[P].isDel=!0;continue}if(h==="door"&&Jt(w,l[f].points)){E[P].isDel=!0;continue}if(h==="window sill")continue}else if(i==="balcony railing"){if(h==="window"&&Jt(u,E[P].points)){E[P].isDel=!0;continue}if(h==="window"&&Jt(w,l[f].points)){l[f].isDel=!0;break}if(h==="window"&&eo(u,w,l[f].points,E[P].points)&&(Math.abs(p-g)<.1||Math.abs(p-c)>.3)){l[f].isDel=!0;break}if(h==="Staircase"&&Jt(u,E[P].points)){l[f].isDel=!0;break}if(h==="Staircase"&&Jt(w,l[f].points)){l[f].isDel=!0;break}if(h==="Staircase"&&u.intersectsOBB(w)){l[f].isDel=!0;break}}else if(i==="door"){if(h==="window"&&Jt(u,E[P].points)){l[f].isDel=!0;break}if(h==="window"&&Jt(w,l[f].points)){l[f].isDel=!0;break}if(h==="window sill"&&Jt(u,E[P].points)){l[f].isDel=!0;break}if(h==="window sill"&&Jt(w,l[f].points)){l[f].isDel=!0;break}}else if(i==="window sill"){if(h==="window")continue;if(h==="floor"&&Jt(u,E[P].points)){E[P].isDel=!0;continue}if(h==="door"&&Jt(u,E[P].points)){E[P].isDel=!0;continue}if(h==="door"&&Jt(w,l[f].points)){E[P].isDel=!0;continue}}else if(i==="Staircase"){if(h==="balcony railing"&&Jt(u,E[P].points)){E[P].isDel=!0;continue}if(h==="balcony railing"&&Jt(w,l[f].points)){E[P].isDel=!0;continue}if(h==="balcony railing"&&u.intersectsOBB(w)){E[P].isDel=!0;continue}}let S=!1,b=[],R=[],z=l[f].points,V=E[P].points;if(z.length>V.length?(S=!0,b=z,R=V):(b=V,R=z),Yr(R,b,.03,.5)>.5)if(S)E[P].isDel=!0;else{l[f].isDel=!0;break}else if(eo(u,w,l[f].points,E[P].points)){let v=no(u,w);if(v===1||v===0){if(h==="switch"||h==="Staircase")continue;z.length>V.length?ve(R,u)>=.5&&(E[P].isDel=!0):ve(b,u)>=.5&&(E[P].isDel=!0)}else{if(i==="switch"||i==="Staircase")continue;if(z.length>V.length){if(ve(b,w)>=.5){l[f].isDel=!0;break}}else if(ve(R,w)>=.5){l[f].isDel=!0;break}}}}}}if(l[f].isDel)break}}}for(let r=0;r<n.length;r++){let i=n[r].type,l=n[r].array;for(let f=0;f<l.length;f++){let u=l[f].maxz,p=l[f].minz,a=i==="switch"?.1:.3;if(Math.abs(u-t)<a&&i!="floor"){l[f].isDel=!0;continue}if(i==="window"||i==="door"||i==="tv"){let c=Math.abs(u-t),m=Math.abs(p-t);(i==="tv"&&m<1.6||i!=="window"&&c<1.6)&&(l[f].isDel=!0),i==="window"&&c<1&&(l[f].isDel=!0),i==="door"&&m>1&&(l[f].isDel=!0)}if(i==="chair"){let c=new A.Vector3;l[f].obb.getSize(c),(c.x<.1||c.y<.1||c.z<.2)&&(l[f].isDel=!0)}if(i==="balcony railing"&&(Math.abs(u-p)<.4&&(l[f].isDel=!0),(p<t&&Math.abs(p-t)>1||p>t&&Math.abs(p-t)>1)&&(l[f].isDel=!0),u<t&&(l[f].isDel=!0)),i==="people"&&(Math.abs(u-p)<1&&(l[f].isDel=!0),p>t&&p-t>.3&&(l[f].isDel=!0),u<t&&(l[f].isDel=!0)),i==="floor"){let c=new A.Vector3;l[f].obb.getSize(c),(c.x<.1||c.y<.1)&&(l[f].isDel=!0)}i==="stair guardrail"&&l[f].points.length<100&&(l[f].isDel=!0)}}for(let r=0;r<n.length;r++)n[r].array=n[r].array.filter(i=>!i.isDel);let o=[];for(let r=0;r<n.length;r++){let i=n[r].array;for(let l=0;l<i.length;l++)o.push({obbBox:i[l].obb,box:new A.Box3().setFromPoints(i[l].points),category:i[l].type,center:{x:i[l].center.x,y:i[l].center.y,z:(i[l].minz+i[l].maxz)/2},name:i[l].obj_id,obj_id:i[l].obj_id,pcdPoints:i[l].points,positionArr:i[l].positionArr})}return o},Ur=e=>{if(e.length==0)return[];let t=[],n=new Map;for(let o=0;o<e.length;o++){let r=e[o].points.map(P=>[P.x,P.y]),i=e[o].obj_id;i=i.replace(/the floor of the house/g,"floor").replace(/the outdoor floor/g,"floor");let l=i.split("_").slice(1,3).join("_").split(".")[0].split("_")[0],f=i.indexOf("_")+1,u=i.lastIndexOf("_"),p=i.substring(f,u);if(p!=="floor")continue;let a=[];for(let P=0;P<e[o].points.length;P++)a.push(new A.Vector3(e[o].points[P].x,e[o].points[P].y,e[o].points[P].z));let c=-99999;if(p==="floor"){let P=new Map;for(let g=0;g<e[o].points.length;g++){let d=e[o].points[g].z;if(d=Math.floor(d*10)/10,P.has(d)){let y=P.get(d);y.num+=1,y.points.push(e[o].points[g]),P.set(d,y)}else P.set(d,{num:1,points:[e[o].points[g]]})}let w=[...P.entries()].reduce((g,d)=>d[1].num>g[1].num?d:g);r=[],r=w[1].points.map(g=>[g.x,g.y]),a=[],a=w[1].points.map(g=>new A.Vector3(g.x,g.y,g.z)),c=w[0]}let m=he(a),h={points:a,path:we(r),h:m.h,minz:m.minz,maxz:m.maxz,center:{x:m.x,y:m.y,z:m.z},obj_id:e[o].obj_id,type:p,obb:null,isDel:!1,obj_id:i,positionArr:[e[o].position]};if(h.obb=Te(h.path,h.center,h.h,(h.maxz+h.minz)/2),h.obb==null)continue;let E=-1;for(let P=0;P<t.length;P++)if(t[P].type==p){E=P;break}if(E!=-1?t[E].array.push(h):t.push({type:p,array:[h]}),p=="floor"&&c!=-99999)if(n.has(c)){let P=n.get(c);P.num+=h.points.length,P.datas.push(h),n.set(c,P)}else n.set(c,{num:h.points.length,datas:[h]})}for(let o=0;o<t.length;o++){let r=t[o].array,i=[],l=[];for(let u=0;u<r.length;u++){if(r[u].obb==null||i.includes(u))continue;let p={...r[u],obb:r[u].obb.clone()};for(let a=u+1;a<r.length;a++){if(r[a].obb==null||i.includes(a))continue;if(p.obb.intersectsOBB(r[a].obb)){i.push(a);for(let E=0;E<r[a].points.length;E++)p.points.push(r[a].points[E]);let m=p.points.map(E=>[E.x,E.y]);p.path=we(m);let h=he(p.points);p.h=h.h,p.minz=h.minz,p.maxz=h.maxz,p.center={x:h.x,y:h.y,z:h.z},p.obb=Te(p.path,p.center,p.h,(p.maxz+p.minz)/2),p.positionArr.push(...r[a].positionArr),a=u}}p.path.length>r[u].path.length&&(i.push(u),l.push(p))}let f=[];for(let u=0;u<r.length;u++)i.includes(u)||f.push(r[u]);f.push(...l),t[o].array=f}for(let o=0;o<t.length;o++){let r=t[o].type,i=t[o].array;for(let l=0;l<i.length;l++)r==="floor"&&i[l].points.length<500&&(i[l].isDel=!0)}for(let o=0;o<t.length;o++)t[o].array=t[o].array.filter(r=>!r.isDel);let s=[];for(let o=0;o<t.length;o++){let r=t[o].array;for(let i=0;i<r.length;i++)s.push({obbBox:r[i].obb,box:new A.Box3().setFromPoints(r[i].points),category:r[i].type,center:{x:r[i].center.x,y:r[i].center.y,z:(r[i].minz+r[i].maxz)/2},name:r[i].obj_id,obj_id:r[i].obj_id,pcdPoints:r[i].points,positionArr:r[i].positionArr})}return s},Kr=(e,t)=>{if(!e||!e.splitFloorProjectsResults||!e.trajectoryResults)return[];let n=e.splitFloorProjectsResults,s=e.trajectoryResults,o=new Map;for(let c=0;c<s.length;c++){let m=s[c].floor;o.has(m)?o.get(m).push(s[c]):o.set(m,[s[c]])}let r=new Map,i=[];for(let c=0;c<n.length;c++){let m=[],h=n[c];for(let E=0;E<h.length;E++){let P=h[E].points.map(R=>[R.x,R.y]),w=h[E].obj_id;w=w.replace(/the floor of the house/g,"floor").replace(/the outdoor floor/g,"floor").replace(/calcony railing/g,"balcony railing").replace(/glass balcony railing/g,"balcony railing").replace(/metal balcony railing/g,"balcony railing").replace(/temporary construction guardrail/g,"balcony railing");let g=w.split("_").slice(1,3).join("_").split(".")[0].split("_")[0],d=w.indexOf("_")+1,y=w.lastIndexOf("_"),x=w.substring(d,y);if(x.includes("top")&&(d=x.indexOf("top")+4,x=x.substring(d,y)),x.includes("left")&&(d=x.indexOf("left")+5,x=x.substring(d,y)),x.includes("right")&&(d=x.indexOf("right")+6,x=x.substring(d,y)),x.includes("front")&&(d=x.indexOf("front")+6,x=x.substring(d,y)),x!=="Staircase"&&x!=="balcony railing")continue;let T=[];for(let R=0;R<h[E].points.length;R++)T.push(new A.Vector3(h[E].points[R].x,h[E].points[R].y,h[E].points[R].z));let S=he(T),b={points:T,path:we(P),h:S.h,minz:S.minz,maxz:S.maxz,center:{x:S.x,y:S.y,z:S.z},obj_id:h[E].obj_id,type:x,averagePz:0,obb:null,isDel:!1,obj_id:w,positionArr:[h[E].position],aabbBox:new A.Box3().setFromPoints(T)};b.obb=Te(b.path,b.center,b.h,(b.maxz+b.minz)/2),b.obb!=null&&(x=="Staircase"?m.push(b):x=="balcony railing"&&i.push(b))}r.set(c+1,m)}let l=[];for(let[c,m]of r){let h={floor:c,findTrajectoryResults:[],otherTrajectoryResults:[],lastTrajectoryResults:[]},E=o.get(c);if(!E){h.otherTrajectoryResults=m,l.push(h);continue}let P=[],w=[],g=[];for(let d=0;d<E.length;d++){let y=[];for(let T=0;T<E[d].points.length;T++){let S=[new A.Vector3(E[d].points[T].x,E[d].points[T].y,E[d].points[T].z)];S.push(S[0].clone().addScaledVector(new A.Vector3(0,0,-1),2));let b=new A.Box3().setFromPoints(S);y.push(b)}let x=[];for(let T=0;T<m.length;T++)for(let S=0;S<y.length;S++)!g.includes(T)&&m[T].aabbBox.intersectsBox(y[S])&&(g.push(T),x.push(m[T]));x.length>0&&w.push(x)}for(let d=0;d<m.length;d++)g.includes(d)||P.push(m[d]);h.findTrajectoryResults=w,h.otherTrajectoryResults=P,l.push(h)}function f(c,m){let h=c,E=[],P=[];for(let g=0;g<c.length;g++){if(c[g].obb==null||E.includes(g))continue;let d={...c[g],obb:c[g].obb.clone()};for(let y=g+1;y<c.length;y++){if(c[y].obb==null||E.includes(y))continue;if(d.obb.intersectsOBB(c[y].obb)||m){E.push(y);for(let b=0;b<c[y].points.length;b++)d.points.push(c[y].points[b]);let T=d.points.map(b=>[b.x,b.y]);d.path=we(T);let S=he(d.points);d.h=S.h,d.minz=S.minz,d.maxz=S.maxz,d.center={x:S.x,y:S.y,z:S.z},d.obb=Te(d.path,d.center,d.h,(d.maxz+d.minz)/2),d.positionArr.push(...c[y].positionArr),y=g}}d.path.length>c[g].path.length&&(E.push(g),P.push(d))}let w=[];for(let g=0;g<c.length;g++)E.includes(g)||w.push(c[g]);return w.push(...P),c=w,c}for(let c=0;c<l.length;c++){for(let m=0;m<l[c].findTrajectoryResults.length;m++)l[c].findTrajectoryResults[m]=f(l[c].findTrajectoryResults[m],!0);l[c].otherTrajectoryResults=f(l[c].otherTrajectoryResults,!1)}for(let c=0;c<l.length;c++){for(let m=0;m<l[c].findTrajectoryResults.length;m++){for(let h=0;h<l[c].findTrajectoryResults[m].length;h++){let E=ys(l[c].findTrajectoryResults[m][h].points,{binCount:100,minBinPoints:5,sideK:2.2,zK:2.2,minSideRange:.2,minZRange:.2,lowerZScale:.4,upperZScale:1.8}),P=Es(E.keep,{radius:.1,minClusterSize:50,lowPercent:.45});if(P.keep.length==0){l[c].findTrajectoryResults[m][h].isDel=!0;continue}l[c].findTrajectoryResults[m][h].points=P.keep;let w=l[c].findTrajectoryResults[m][h].points.map(d=>[d.x,d.y]);l[c].findTrajectoryResults[m][h].path=we(w);let g=he(l[c].findTrajectoryResults[m][h].points);l[c].findTrajectoryResults[m][h].h=g.h,l[c].findTrajectoryResults[m][h].minz=g.minz,l[c].findTrajectoryResults[m][h].maxz=g.maxz,l[c].findTrajectoryResults[m][h].center={x:g.x,y:g.y,z:g.z},l[c].findTrajectoryResults[m][h].obb=Te(l[c].findTrajectoryResults[m][h].path,l[c].findTrajectoryResults[m][h].center,l[c].findTrajectoryResults[m][h].h,(l[c].findTrajectoryResults[m][h].maxz+l[c].findTrajectoryResults[m][h].minz)/2)}l[c].findTrajectoryResults[m]=l[c].findTrajectoryResults[m].filter(h=>!h.isDel)}for(let m=0;m<l[c].otherTrajectoryResults.length;m++){let h=ys(l[c].otherTrajectoryResults[m].points,{binCount:100,minBinPoints:5,sideK:2.2,zK:2.2,minSideRange:.2,minZRange:.2,lowerZScale:.4,upperZScale:1.8}),E=Es(h.keep,{radius:.1,minClusterSize:50,lowPercent:.45});if(E.keep.length==0){l[c].otherTrajectoryResults[m].isDel=!0;continue}l[c].otherTrajectoryResults[m].points=E.keep;let P=l[c].otherTrajectoryResults[m].points.map(g=>[g.x,g.y]);l[c].otherTrajectoryResults[m].path=we(P);let w=he(l[c].otherTrajectoryResults[m].points);l[c].otherTrajectoryResults[m].h=w.h,l[c].otherTrajectoryResults[m].minz=w.minz,l[c].otherTrajectoryResults[m].maxz=w.maxz,l[c].otherTrajectoryResults[m].center={x:w.x,y:w.y,z:w.z},l[c].otherTrajectoryResults[m].obb=Te(l[c].otherTrajectoryResults[m].path,l[c].otherTrajectoryResults[m].center,l[c].otherTrajectoryResults[m].h,(l[c].otherTrajectoryResults[m].maxz+l[c].otherTrajectoryResults[m].minz)/2)}l[c].otherTrajectoryResults.filter(m=>!m.isDel)}function u(c){for(let m=0;m<c.length;m++){let h=c[m].obb;for(let E=m+1;E<c.length;E++){let P=c[E].obb;if(!c[E].isDel){if(h.intersectsOBB(P)){let w=ve(c[E].points,h),g=ve(c[m].points,P),d=no(h,P);if(w>=.5&&(d==1||d==0)&&(c[E].isDel=!0),g>=.5&&d==-1){c[m].isDel=!0;break}}if(c[m].isDel)break}}}return c=c.filter(m=>!m.isDel),c}for(let c=0;c<l.length;c++){let m=[];for(let h=0;h<l[c].findTrajectoryResults.length;h++)m.push(...l[c].findTrajectoryResults[h]);m.push(...l[c].otherTrajectoryResults),l[c].lastTrajectoryResults=u(m)}function p(c){let m=[];if(c.length>0){let h=.3,E=.5,P=.5,w=.2;for(let g=0;g<c.length;g++){let d=c[g].obb.halfSize.clone().multiplyScalar(2),y=c[g].points,x=d.x,T=d.y,S=d.z;if(x>T&&([x,T]=[T,x]),x<E||T<h||S<P)continue;let b=po(c[g].obb);if(b.length!=8)continue;let R=new A.Line3(b[0],b[1]),z=new A.Line3(b[1],b[2]),V=new A.Line3(b[2],b[3]),M=new A.Line3(b[3],b[0]),v=new A.Line3(b[4],b[5]),I=new A.Line3(b[5],b[6]),D=new A.Line3(b[6],b[7]),B=new A.Line3(b[7],b[4]),_=[],k=[],H=[],F=[],j=[],X=[],K=[],Y=[];for(let Et=0;Et<y.length;Et++){let re=R.closestPointToPoint(y[Et],!0,new A.Vector3),Pe=z.closestPointToPoint(y[Et],!0,new A.Vector3),St=V.closestPointToPoint(y[Et],!0,new A.Vector3),ie=M.closestPointToPoint(y[Et],!0,new A.Vector3),G=v.closestPointToPoint(y[Et],!0,new A.Vector3),me=I.closestPointToPoint(y[Et],!0,new A.Vector3),He=D.closestPointToPoint(y[Et],!0,new A.Vector3),Be=B.closestPointToPoint(y[Et],!0,new A.Vector3);re.distanceTo(y[Et])<w&&_.push(y[Et]),Pe.distanceTo(y[Et])<w&&k.push(y[Et]),St.distanceTo(y[Et])<w&&H.push(y[Et]),ie.distanceTo(y[Et])<w&&F.push(y[Et]),G.distanceTo(y[Et])<w&&j.push(y[Et]),me.distanceTo(y[Et])<w&&X.push(y[Et]),He.distanceTo(y[Et])<w&&K.push(y[Et]),Be.distanceTo(y[Et])<w&&Y.push(y[Et])}let tt=b[0].distanceTo(b[1]),it=b[1].distanceTo(b[2]),ct=b[2].distanceTo(b[3]),ut=b[3].distanceTo(b[0]),W=new A.Vector3,q=new A.Vector3,Z=new A.Vector3,wt=new A.Vector3;Math.abs(tt-x)<.01?_.length>H.length?(W=b[0].clone(),q=b[1].clone(),Z=new A.Vector3().subVectors(q,W).normalize(),wt=new A.Vector3().subVectors(b[2],b[1]).normalize()):(W=b[2].clone(),q=b[3].clone(),Z=new A.Vector3().subVectors(q,W).normalize(),wt=new A.Vector3().subVectors(b[0],b[3]).normalize()):k.length>F.length?(W=b[1].clone(),q=b[2].clone(),Z=new A.Vector3().subVectors(q,W).normalize(),wt=new A.Vector3().subVectors(b[3],b[2]).normalize()):(W=b[3].clone(),q=b[0].clone(),Z=new A.Vector3().subVectors(q,W).normalize(),wt=new A.Vector3().subVectors(b[1],b[0]).normalize());let Ft=b[4].distanceTo(b[5]),Nt=b[5].distanceTo(b[6]),Wt=b[6].distanceTo(b[7]),Lt=b[7].distanceTo(b[4]),Tt=new A.Vector3,It=new A.Vector3,Pt=new A.Vector3(W.x,W.y,b[4].z),bt=new A.Vector3(q.x,q.y,b[4].z);(st(b[4],Pt)||st(b[4],bt))&&(st(b[5],Pt)||st(b[5],bt))?(Tt=b[6].clone(),It=b[7].clone()):(st(b[5],Pt)||st(b[5],bt))&&(st(b[6],Pt)||st(b[6],bt))?(Tt=b[7].clone(),It=b[4].clone()):(st(b[6],Pt)||st(b[6],bt))&&(st(b[7],Pt)||st(b[7],bt))?(Tt=b[4].clone(),It=b[5].clone()):(st(b[7],Pt)||st(b[7],bt))&&(st(b[4],Pt)||st(b[4],bt))&&(Tt=b[5].clone(),It=b[6].clone());let Bt=W.distanceTo(q),J=Tt.distanceTo(It),ft=new A.Vector3().subVectors(new A.Vector3(W.x,W.y,Tt.z),W).normalize();if(Math.abs(Bt-J)>.01||Math.abs(Bt-x)>.01){console.log("\u4E0A\u4E0B\u957F\u5EA6\u4E0D\u4E00\u81F4,\u6216\u4E0E\u5BBD\u4E0D\u4E00\u81F4",Bt,J,x);continue}let Q=Math.sqrt(Bt*Bt+J*J),U=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(Q)))),de={stairStepHeight:S/U,stairStepWidth:T/U,staitWidth:x,stairLength:T,stairHeigth:S,stairStepNum:U,stairBottomPt1:W,stairBottomPt2:q,stairTopPt1:Tt,stairTopPt2:It,vecStepLength:Z,vecStepWidth:wt,vecStepHeight:ft,path:c[g].path,obb:c[g].obb,maxz:c[g].maxz,points:c[g].points,rectPt1:new A.Vector3(0,0,0),rectPt2:new A.Vector3(0,0,0)};m.push(de)}}return m}let a=[];for(let c=0;c<l.length;c++)a.push(...p(l[c].lastTrajectoryResults));for(let c=0;c<a.length;c++){let m=a[c].stairTopPt1.clone(),h=a[c].stairTopPt2.clone(),E=a[c].stairBottomPt1.clone(),P=a[c].stairBottomPt2.clone(),w=m.clone(),g=h.clone(),d=E.clone(),y=P.clone();w.z=g.z=d.z=y.z=0;let x=jt(m,h,!0),T=jt(E,P,!0),S=jt(x,T),b=new A.Vector3().subVectors(x,S).normalize(),R=new A.Vector3().subVectors(T,S).normalize(),z=x.distanceTo(T),V=!1,M=!1;for(let v=0;v<a.length;v++){if(c==v)continue;let I=a[v].stairTopPt1.clone(),D=a[v].stairTopPt2.clone(),B=a[v].stairBottomPt1.clone(),_=a[v].stairBottomPt2.clone(),k=new A.Vector3().subVectors(I,D).normalize(),H=new A.Vector3().subVectors(B,_).normalize(),F=I.clone(),j=D.clone(),X=B.clone(),K=_.clone();F.z=j.z=X.z=K.z=0;let Y=jt(I,D,!0),tt=jt(B,_,!0),it=Y.distanceTo(tt),ct=Yt(x,T,Y,tt),ut=!1;if(ct&&ct.isParallel&&I.z<=E.z&&E.z-I.z<.3){ut=!0,M=!0;let W=F.addScaledVector(k.clone().negate(),100),q=j.addScaledVector(k,100),Z=X.addScaledVector(H.clone().negate(),100),wt=K.addScaledVector(H,100),Ft=new A.Line3(W,q),Nt=new A.Line3(Z,wt),Wt=Ft.closestPointToPoint(S,!0,new A.Vector3),Lt=Nt.closestPointToPoint(S,!0,new A.Vector3),Tt=new A.Vector3().subVectors(Wt,S),It=new A.Vector3().subVectors(Lt,S),Pt=Tt.length(),bt=It.length();It=It.normalize(),Tt=Tt.normalize();let Bt=Kt(b,Tt,.1),J=Kt(R,Tt,.1),ft=Kt(R,It,.1),Q=Kt(b,It,.1);if(Bt&&Bt.sameDirection&&Pt>z/2){let U=Pt-z/2;a[c].stairBottomPt1=a[c].stairBottomPt1.addScaledVector(R,U),a[c].stairBottomPt2=a[c].stairBottomPt2.addScaledVector(R,U)}else if(J&&J.sameDirection&&Pt>z/2){let U=Pt-z/2;a[c].stairBottomPt1=a[c].stairBottomPt1.addScaledVector(R,U),a[c].stairBottomPt2=a[c].stairBottomPt2.addScaledVector(R,U)}if(ft&&ft.sameDirection&&bt>z/2){let U=bt-z/2;a[c].stairTopPt1=a[c].stairTopPt1.addScaledVector(b,U),a[c].stairTopPt2=a[c].stairTopPt2.addScaledVector(b,U)}else if(Q&&Q.sameDirection&&bt>z/2){let U=bt-z/2;a[c].stairTopPt1=a[c].stairTopPt1.addScaledVector(b,U),a[c].stairTopPt2=a[c].stairTopPt2.addScaledVector(b,U)}}else if(ct&&ct.isParallel&&m.z<B.z&&B.z-m.z<.2){ut=!0,V=!0;let W=F.addScaledVector(k.clone().negate(),100),q=j.addScaledVector(k,100),Z=X.addScaledVector(H.clone().negate(),100),wt=K.addScaledVector(H,100),Ft=new A.Line3(W,q),Nt=new A.Line3(Z,wt),Wt=Ft.closestPointToPoint(S,!1,new A.Vector3),Lt=Nt.closestPointToPoint(S,!1,new A.Vector3),Tt=new A.Vector3().subVectors(Wt,S),It=new A.Vector3().subVectors(Lt,S),Pt=Tt.length(),bt=It.length();It=It.normalize(),Tt=Tt.normalize();let Bt=Kt(b,Tt,.1),J=Kt(R,Tt,.1),ft=Kt(R,It,.1),Q=Kt(b,It,.1);if(Bt&&Bt.sameDirection&&Pt>z/2){let U=Pt-z/2;a[c].stairBottomPt1=a[c].stairBottomPt1.addScaledVector(R,U),a[c].stairBottomPt2=a[c].stairBottomPt2.addScaledVector(R,U)}else if(J&&J.sameDirection&&Pt>z/2){let U=Pt-z/2;a[c].stairBottomPt1=a[c].stairBottomPt1.addScaledVector(R,U),a[c].stairBottomPt2=a[c].stairBottomPt2.addScaledVector(R,U)}if(ft&&ft.sameDirection&&bt>z/2){let U=bt-z/2;a[c].stairTopPt1=a[c].stairTopPt1.addScaledVector(b,U),a[c].stairTopPt2=a[c].stairTopPt2.addScaledVector(b,U)}else if(Q&&Q.sameDirection&&bt>z/2){let U=bt-z/2;a[c].stairTopPt1=a[c].stairTopPt1.addScaledVector(b,U),a[c].stairTopPt2=a[c].stairTopPt2.addScaledVector(b,U)}a[c].stairTopPt1.z=a[c].stairTopPt2.z=B.z}if(ut&&(m=a[c].stairTopPt1.clone(),h=a[c].stairTopPt2.clone(),E=a[c].stairBottomPt1.clone(),P=a[c].stairBottomPt2.clone(),w=m.clone(),g=h.clone(),d=E.clone(),y=P.clone(),w.z=g.z=d.z=y.z=0,x=jt(m,h,!0),T=jt(E,P,!0),S=jt(x,T),b=new A.Vector3().subVectors(x,S).normalize(),R=new A.Vector3().subVectors(T,S).normalize(),z=x.distanceTo(T)),M&&V)break}if(M||V){let v=a[c].stairTopPt1.clone(),I=a[c].stairTopPt2.clone(),D=a[c].stairBottomPt1.clone(),B=a[c].stairBottomPt2.clone(),_=jt(v,I,!0),k=jt(D,B,!0),H=_.distanceTo(k),F=a[c].stairTopPt1.distanceTo(a[c].stairTopPt2),j=a[c].stairBottomPt1.distanceTo(a[c].stairBottomPt2),X=Math.sqrt(F*F+j*j),K=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(X))));a[c].stairStepNum=K,a[c].stairHeigth=a[c].stairTopPt1.z-a[c].stairBottomPt1.z,a[c].stairStepHeight=a[c].stairHeigth/a[c].stairStepNum,a[c].stairStepWidth=H/a[c].stairStepNum}}for(let c=0;c<a.length;c++){let m=a[c].stairTopPt1,h=a[c].stairTopPt2,E=a[c].stairBottomPt1.clone(),P=a[c].stairBottomPt2.clone(),w=new A.Vector3(m.x,m.y,E.z),g=a[c].vecStepWidth;for(let d=0;d<a.length;d++){if(c==d)continue;let y=a[d].stairTopPt1,x=a[d].stairTopPt2,T=a[d].stairBottomPt1.clone(),S=a[d].stairBottomPt2.clone(),b=new A.Vector3(y.x,y.y,T.z),R=a[d].vecStepWidth;if(Math.abs(m.z-T.z)<.3&&T.z>E.z&&a[c].obb.intersectsOBB(a[d].obb)){let z=se(w,E,b,T);if(z&&z.angle>75){let V=T.distanceTo(m),M=T.distanceTo(h),v=S.distanceTo(m),I=S.distanceTo(h),D=m.clone(),B=D.clone().addScaledVector(g,a[d].staitWidth),_=new A.Vector3().subVectors(h,m).normalize(),k=m.distanceTo(h),H=D.clone().addScaledVector(_,k),F=B.clone().addScaledVector(_,k),j=D.clone().addScaledVector(_,a[d].stairLength),X=B.clone().addScaledVector(_,a[d].stairLength),K=V;(K>M||K>I)&&(K=M,D=h.clone(),B=D.clone().addScaledVector(g,a[d].staitWidth),_=new A.Vector3().subVectors(m,h).normalize(),k=m.distanceTo(h),H=D.clone().addScaledVector(_,k),F=B.clone().addScaledVector(_,k),j=D.clone().addScaledVector(_,a[d].stairLength),X=B.clone().addScaledVector(_,a[d].stairLength));let Y=new A.Vector3().subVectors(j,H).normalize(),tt=j.distanceTo(H);j.z=X.z=a[d].maxz,a[d].stairBottomPt1=H,a[d].stairBottomPt2=F,a[d].stairTopPt1=j,a[d].stairTopPt2=X,a[d].rectPt1=D,a[d].rectPt2=B;let it=H.distanceTo(F),ct=j.distanceTo(X),ut=Math.sqrt(tt*tt+a[d].stairHeigth*a[d].stairHeigth),W=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(ut))));a[d].stairStepNum=W,a[d].stairHeigth=j.z-H.z,a[d].stairStepHeight=a[d].stairHeigth/a[d].stairStepNum,a[d].stairStepWidth=tt/a[d].stairStepNum,a[d].vecStepLength=_.clone().negate(),a[d].vecStepWidth=Y;break}}}}return Jr(a,i,t),a},Jr=(e,t,n)=>{if(!e||e.length<=0||!t||t.length<=0)return;let s=1.5,o=0;for(let r=0;r<e.length;r++){e[r].stairBottom1BalconyRailing=[],e[r].stairBottom2BalconyRailing=[],e[r].balconyRailingHeight=0;let i=e[r].stairBottomPt1.clone(),l=e[r].stairBottomPt2.clone(),f=e[r].stairBottomPt1.clone(),u=e[r].stairBottomPt2.clone(),p=new A.Vector3().subVectors(l,i).normalize();i=i.addScaledVector(p,.05),l=l.addScaledVector(p.clone().negate(),.05);let a=[],c=[];for(let m=0;m<e[r].stairStepNum;m++){let h=[i,f];h.push(h[1].clone().addScaledVector(e[r].vecStepWidth,e[r].stairStepWidth)),h.push(h[0].clone().addScaledVector(e[r].vecStepWidth,e[r].stairStepWidth));let E=h.map(x=>[x.x,x.y]);h.push(new A.Vector3(h[3].x,h[3].y,h[3].z+s)),h.push(new A.Vector3(h[2].x,h[2].y,h[2].z+s)),h.push(new A.Vector3(h[1].x,h[1].y,h[1].z+s)),h.push(new A.Vector3(h[0].x,h[0].y,h[0].z+s));let P=he(h),w=Te(E,{x:P.x,y:P.y,z:P.z},P.h,(P.maxz+P.minz)/2),g=[],d=!1,y=0;for(let x=0;x<t.length;x++)if(w.intersectsOBB(t[x].obb)){for(let T=0;T<t[x].points.length&&!(w.containsPoint(t[x].points[T])&&(m==0&&g.push(t[x].points[T]),t[x].points[T].z>i.z&&t[x].points[T].z-i.z<1&&(y++,y>10&&m!=0)));T++);if(y>10&&(d=!0),m!=0&&d)break}if(o==0&&(o=he(g).maxz),d){let x=jt(h[1],h[2]);x.z+=e[r].stairStepHeight,a.push(x)}h=[],h=[l,u],h.push(h[1].clone().addScaledVector(e[r].vecStepWidth,e[r].stairStepWidth)),h.push(h[0].clone().addScaledVector(e[r].vecStepWidth,e[r].stairStepWidth)),E=h.map(x=>[x.x,x.y]),h.push(new A.Vector3(h[3].x,h[3].y,h[3].z+s)),h.push(new A.Vector3(h[2].x,h[2].y,h[2].z+s)),h.push(new A.Vector3(h[1].x,h[1].y,h[1].z+s)),h.push(new A.Vector3(h[0].x,h[0].y,h[0].z+s)),P=he(h),w=Te(E,{x:P.x,y:P.y,z:P.z},P.h,(P.maxz+P.minz)/2),g=[],d=!1;for(let x=0;x<t.length;x++)if(w.intersectsOBB(t[x].obb)){let T=0;for(let S=0;S<t[x].points.length&&!(w.containsPoint(t[x].points[S])&&(m==0&&g.push(t[x].points[S]),t[x].points[S].z>i.z&&t[x].points[S].z-i.z<1&&(T++,T>10&&m!=0)));S++);if(T>10&&(d=!0),m!=0&&d)break}if(o==0&&(o=he(g).maxz),d){let x=jt(h[1],h[2]);x.z+=e[r].stairStepHeight,c.push(x)}i=i.addScaledVector(e[r].vecStepWidth,e[r].stairStepWidth),i=i.addScaledVector(e[r].vecStepHeight,e[r].stairStepHeight),l=l.addScaledVector(e[r].vecStepWidth,e[r].stairStepWidth),l=l.addScaledVector(e[r].vecStepHeight,e[r].stairStepHeight),f=f.addScaledVector(e[r].vecStepWidth,e[r].stairStepWidth),f=f.addScaledVector(e[r].vecStepHeight,e[r].stairStepHeight),u=u.addScaledVector(e[r].vecStepWidth,e[r].stairStepWidth),u=u.addScaledVector(e[r].vecStepHeight,e[r].stairStepHeight)}a.length>e[r].stairStepNum-3&&(e[r].stairBottom1BalconyRailing=a),c.length>e[r].stairStepNum-3&&(e[r].stairBottom2BalconyRailing=c),e[r].balconyRailingHeight=o}};function ys(e,t={}){let{binCount:n=80,minBinPoints:s=5,sideK:o=3,zK:r=3,minSideRange:i=.2,minZRange:l=.2,maxSearchBins:f=3,lowerZScale:u=1,upperZScale:p=1}=t;if(!e||e.length===0)return[];let a=e.map((H,F)=>({index:F,x:H.x,y:H.y,z:H.z,raw:H})),c=0,m=0;for(let H of a)c+=H.x,m+=H.y;c/=a.length,m/=a.length;let h=0,E=0,P=0;for(let H of a){let F=H.x-c,j=H.y-m;h+=F*F,E+=F*j,P+=j*j}h/=a.length,E/=a.length,P/=a.length;let w=h+P,g=Math.sqrt((h-P)*(h-P)+4*E*E),d=(w+g)/2,y,x;Math.abs(E)>1e-8?(y=d-P,x=E):h>=P?(y=1,x=0):(y=0,x=1);let T=Math.sqrt(y*y+x*x)||1;y/=T,x/=T;let S=-x,b=y,R=1/0,z=-1/0,V=a.map(H=>{let F=H.x-c,j=H.y-m,X=F*y+j*x,K=F*S+j*b;return R=Math.min(R,X),z=Math.max(z,X),{...H,t:X,side:K}}),v=(z-R||1)/n,I=new Map;for(let H of V){let F=Math.floor((H.t-R)/v);F<0&&(F=0),F>=n&&(F=n-1),I.has(F)||I.set(F,[]),I.get(F).push(H)}let D=new Map;for(let[H,F]of I){if(F.length<s)continue;let j=F.map(W=>W.side).sort((W,q)=>W-q),X=F.map(W=>W.z).sort((W,q)=>W-q),K=Vn(j),Y=Vn(X),tt=Vn(j.map(W=>Math.abs(W-K)).sort((W,q)=>W-q)),it=Vn(X.map(W=>Math.abs(W-Y)).sort((W,q)=>W-q)),ct=Math.max(i,tt*1.4826*o),ut=Math.max(l,it*1.4826*r);D.set(H,{sideMedian:K,zMedian:Y,sideRange:ct,zRange:ut})}function B(H){if(D.has(H))return D.get(H);for(let F=1;F<=f;F++){if(D.has(H-F))return D.get(H-F);if(D.has(H+F))return D.get(H+F)}return null}let _=[],k=[];for(let H of V){let F=Math.floor((H.t-R)/v);F<0&&(F=0),F>=n&&(F=n-1);let j=B(F);if(!j){k.push(H.raw);continue}let X=Math.abs(H.side-j.sideMedian)<=j.sideRange,K=j.zMedian-j.zRange*u,Y=j.zMedian+j.zRange*p,tt=H.z>=K&&H.z<=Y;X&&tt?_.push(H.raw):k.push(H.raw)}return{keep:_,removed:k,debug:{meanX:c,meanY:m,dirX:y,dirY:x,sideX:S,sideY:b,minT:R,maxT:z,binSize:v,stats:D}}}function Vn(e){if(e.length===0)return 0;let t=Math.floor(e.length/2);return e.length%2===0?(e[t-1]+e[t])/2:e[t]}function Qr(e,t){let n=new Map;for(let s=0;s<e.length;s++){let o=e[s],r=Math.floor(o.x/t),i=Math.floor(o.y/t),l=Math.floor(o.z/t),f=`${r},${i},${l}`;n.has(f)||n.set(f,[]),n.get(f).push(s)}return n}function ti(e,t,n,s,o){let r=e[n],i=Math.floor(r.x/s),l=Math.floor(r.y/s),f=Math.floor(r.z/s),u=[];for(let p=-1;p<=1;p++)for(let a=-1;a<=1;a++)for(let c=-1;c<=1;c++){let m=`${i+p},${l+a},${f+c}`,h=t.get(m);if(h)for(let E of h){if(E===n)continue;let P=e[E],w=r.x-P.x,g=r.y-P.y,d=r.z-P.z;w*w+g*g+d*d<=o&&u.push(E)}}return u}function Es(e,t={}){let{radius:n=.35,minClusterSize:s=20,lowPercent:o=.35}=t,r=ei(e,{radius:n}),i=e.map(p=>p.z).sort((p,a)=>p-a),l=i[Math.floor(i.length*o)],f=[],u=[];for(let p of r.clusters){let a=p.map(h=>r.points[h]),c=a.reduce((h,E)=>h+E.z,0)/a.length;a.length<s&&c<=l?u.push(...a.map(h=>h.raw)):f.push(...a.map(h=>h.raw))}return{keep:f,removed:u}}function ei(e,t={}){let{radius:n=.35}=t,s=e.map((f,u)=>({index:u,x:f.x,y:f.y,z:f.z,raw:f})),o=Qr(s,n),r=n*n,i=new Array(s.length).fill(!1),l=[];for(let f=0;f<s.length;f++){if(i[f])continue;let u=[],p=[f];for(i[f]=!0;p.length>0;){let a=p.shift();u.push(a);let c=ti(s,o,a,n,r);for(let m of c)i[m]||(i[m]=!0,p.push(m))}l.push(u)}return{points:s,clusters:l}}function ni(e,t,n=1e-6){let s=oi(t);for(let o of s)if(!si(e,o,n))return!1;return!0}function oi(e){let t=e.center,n=e.halfSize,s=e.rotation.elements,o=new A.Vector3(s[0],s[1],s[2]).multiplyScalar(n.x),r=new A.Vector3(s[3],s[4],s[5]).multiplyScalar(n.y),i=new A.Vector3(s[6],s[7],s[8]).multiplyScalar(n.z),l=[];for(let f of[-1,1])for(let u of[-1,1])for(let p of[-1,1]){let a=t.clone().addScaledVector(o,f).addScaledVector(r,u).addScaledVector(i,p);l.push(a)}return l}function si(e,t,n=1e-6){let s=new A.Vector3().subVectors(t,e.center),o=e.rotation.elements,r=e.halfSize,i=new A.Vector3(o[0],o[1],o[2]),l=new A.Vector3(o[3],o[4],o[5]),f=new A.Vector3(o[6],o[7],o[8]),u=s.dot(i),p=s.dot(l),a=s.dot(f);return Math.abs(u)<=r.x+n&&Math.abs(p)<=r.y+n&&Math.abs(a)<=r.z+n}function ri(e,t,n,s){return 1+(e[t][0]===0||e[n][0]===0||e[s][0]===0?1:0)}function ii(e){if(!e.length)return 0;let t=[...e].sort((s,o)=>s-o),n=Math.floor(t.length/2);return t.length%2?t[n]:(t[n-1]+t[n])/2}function li(e,t,n,s,o,r){let i=Math.hypot(n-o,s-r),l=Math.hypot(e-o,t-r),f=Math.hypot(e-n,t-s),u=Math.abs((n-e)*(r-t)-(o-e)*(s-t))/2,p=Math.max(i,l,f);return u===0?{radius:1/0,maxEdge:p}:{radius:i*l*f/(4*u),maxEdge:p}}function ci(e,t){let n=[],s=new Set,o=(r,i)=>r<i?`${r}_${i}`:`${i}_${r}`;for(let r=0;r<t.length;r+=3){let i=t[r],l=t[r+1],f=t[r+2],u=[[i,l],[l,f],[f,i]];for(let[p,a]of u){let c=o(p,a);if(s.has(c))continue;s.add(c);let[m,h]=e[p],[E,P]=e[a],w=Math.hypot(E-m,P-h);Number.isFinite(w)&&w>0&&n.push(w)}}return ii(n)}function ai(e){let t=new Set,n=[];for(let s of e){if(!s||s.length<2)continue;let o=s[0],r=s[1];if(!Number.isFinite(o)||!Number.isFinite(r))continue;let i=`${o}_${r}`;t.has(i)||(t.add(i),n.push([o,r]))}return n}function fi(e){let t=new Map;for(let[n,s]of e)t.has(n)||t.set(n,[]),t.has(s)||t.set(s,[]),t.get(n).push(s),t.get(s).push(n);return t}function ui(e,t){if(!t.length)return[];let n=fi(t),s=t[0][0],o=[],r=new Set,i=s,l=-1;do{o.push(e[i]),r.add(i);let f=n.get(i)||[],u=f.find(p=>p!==l&&!r.has(p));if(u===void 0&&(u=f.find(p=>p!==l)),u===void 0)break;l=i,i=u}while(i!==s&&o.length<=t.length+1);return o}function hi(e,t={}){let{edgeFactor:n=20,alphaScale:s=2}=t;if(!e||e.length<3)return[];let o=ai(e);if(o.length<3)return[];let r=new Ve(Float64Array.from(o.flat())),{triangles:i}=r;if(!i.length)return[];let l=ci(o,i);if(!Number.isFinite(l)||l<=0)return[];let f=l*n,u=new Map,p=(m,h)=>m<h?`${m}_${h}`:`${h}_${m}`;for(let m=0;m<i.length;m+=3){let h=i[m],E=i[m+1],P=i[m+2],[w,g]=o[h],[d,y]=o[E],[x,T]=o[P],{radius:S,maxEdge:b}=li(w,g,d,y,x,T),R=ri(o,h,E,P)*s;if(S<=1/R&&b<=f){let z=[[h,E],[E,P],[P,h]];for(let[V,M]of z){let v=p(V,M);u.set(v,(u.get(v)||0)+1)}}}let a=[];for(let[m,h]of u)h===1&&a.push(m.split("_").map(Number));return a.length?ui(o,a):[]}export{Js as checkBeamIsReasonable,we as computeContour,hi as computeContourNew,Gr as drawStaircase,Ks as getBeamLine,or as getColLine,vs as getLineCheckResults,Ur as getMergeFloorMeaning,Zr as getMergeMeaning,Ms as getOneLineCheckResults,Kr as getStaircase,As as updateStEdPoint};
|