rm-graphical-computing-node 1.0.7

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 ADDED
@@ -0,0 +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&&gt<2&&(h.length-K>.2||h.length-K<.02)&&gt<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&&gt<2&&(h.length-K>.2||h.length-K<.02)&&gt<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&&gt.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&&gt.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};
package/package.json ADDED
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "rm-graphical-computing-node",
3
+ "version": "1.0.7",
4
+ "description": "墙体/梁线/点云语义计算库(依赖 Python 与 three.js)",
5
+ "type": "module",
6
+ "main": "dist/index.mjs",
7
+ "exports": {
8
+ ".": "./dist/index.mjs"
9
+ },
10
+ "files": [
11
+ "dist/",
12
+ "requirements.txt"
13
+ ],
14
+ "scripts": {
15
+ "build": "node build.mjs",
16
+ "prepublishOnly": "node build.mjs",
17
+ "dev": "nodemon server.mjs",
18
+ "start": "node server.mjs"
19
+ },
20
+ "dependencies": {
21
+ "d3-delaunay": "^6.0.4",
22
+ "geojson-minimum-bounding-rectangle": "^2.0.3",
23
+ "rm-point-cloud-calculation": "^1.0.4",
24
+ "three": "^0.184.0"
25
+ },
26
+ "devDependencies": {
27
+ "esbuild": "^0.28.0",
28
+ "express": "^5.2.1",
29
+ "nodemon": "^3.1.14"
30
+ }
31
+ }
@@ -0,0 +1,2 @@
1
+ numpy
2
+ alphashape