rm-graphical-computing-node 1.0.11 → 1.0.13

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.
Files changed (2) hide show
  1. package/dist/index.mjs +1 -1
  2. package/package.json +1 -1
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- var Ts=Object.create;var ro=Object.defineProperty;var Ps=Object.getOwnPropertyDescriptor;var Rs=Object.getOwnPropertyNames;var Ss=Object.getPrototypeOf,zs=Object.prototype.hasOwnProperty;var Ce=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Vs=(e,t,n,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Rs(t))!zs.call(e,o)&&o!==n&&ro(e,o,{get:()=>t[o],enumerable:!(s=Ps(t,o))||s.enumerable});return e};var Ms=(e,t,n)=>(n=e!=null?Ts(Ss(e)):{},Vs(t||!e||!e.__esModule?ro(n,"default",{value:e,enumerable:!0}):n,e));var Lo=Ce(($n,Xn)=>{(function(e,t){typeof $n=="object"&&typeof Xn<"u"?Xn.exports=t():typeof define=="function"&&define.amd?define(t):(e=e||self,e.RBush=t())})($n,function(){"use strict";function e(d,x,w,P,R){t(d,x,w||0,P||d.length-1,R||s)}function t(d,x,w,P,R){for(;P>w;){if(P-w>600){var b=P-w+1,S=x-w+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),H=Math.max(w,Math.floor(x-S*V/b+M)),C=Math.min(P,Math.floor(x+(b-S)*V/b+M));t(d,x,H,C,R)}var D=d[x],B=w,_=P;for(n(d,w,x),R(d[P],D)>0&&n(d,w,P);B<_;){for(n(d,B,_),B++,_--;R(d[B],D)<0;)B++;for(;R(d[_],D)>0;)_--}R(d[w],D)===0?n(d,w,_):(_++,n(d,_,P)),_<=x&&(w=_+1),x<=_&&(P=_-1)}}function n(d,x,w){var P=d[x];d[x]=d[w],d[w]=P}function s(d,x){return d<x?-1:d>x?1:0}var o=function(x){x===void 0&&(x=9),this._maxEntries=Math.max(4,x),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(x){var w=this.data,P=[];if(!T(x,w))return P;for(var R=this.toBBox,b=[];w;){for(var S=0;S<w.children.length;S++){var z=w.children[S],V=w.leaf?R(z):z;T(x,V)&&(w.leaf?P.push(z):g(x,V)?this._all(z,P):b.push(z))}w=b.pop()}return P},o.prototype.collides=function(x){var w=this.data;if(!T(x,w))return!1;for(var P=[];w;){for(var R=0;R<w.children.length;R++){var b=w.children[R],S=w.leaf?this.toBBox(b):b;if(T(x,S)){if(w.leaf||g(x,S))return!0;P.push(b)}}w=P.pop()}return!1},o.prototype.load=function(x){if(!(x&&x.length))return this;if(x.length<this._minEntries){for(var w=0;w<x.length;w++)this.insert(x[w]);return this}var P=this._build(x.slice(),0,x.length-1,0);if(!this.data.children.length)this.data=P;else if(this.data.height===P.height)this._splitRoot(this.data,P);else{if(this.data.height<P.height){var R=this.data;this.data=P,P=R}this._insert(P,this.data.height-P.height-1,!0)}return this},o.prototype.insert=function(x){return x&&this._insert(x,this.data.height-1),this},o.prototype.clear=function(){return this.data=y([]),this},o.prototype.remove=function(x,w){if(!x)return this;for(var P=this.data,R=this.toBBox(x),b=[],S=[],z,V,M;P||b.length;){if(P||(P=b.pop(),V=b[b.length-1],z=S.pop(),M=!0),P.leaf){var H=r(x,P.children,w);if(H!==-1)return P.children.splice(H,1),b.push(P),this._condense(b),this}!M&&!P.leaf&&g(P,R)?(b.push(P),S.push(z),z=0,V=P,P=P.children[0]):V?(z++,P=V.children[z],M=!1):P=null}return this},o.prototype.toBBox=function(x){return x},o.prototype.compareMinX=function(x,w){return x.minX-w.minX},o.prototype.compareMinY=function(x,w){return x.minY-w.minY},o.prototype.toJSON=function(){return this.data},o.prototype.fromJSON=function(x){return this.data=x,this},o.prototype._all=function(x,w){for(var P=[];x;)x.leaf?w.push.apply(w,x.children):P.push.apply(P,x.children),x=P.pop();return w},o.prototype._build=function(x,w,P,R){var b=P-w+1,S=this._maxEntries,z;if(b<=S)return z=y(x.slice(w,P+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=y([]),z.leaf=!1,z.height=R;var V=Math.ceil(b/S),M=V*Math.ceil(Math.sqrt(S));p(x,w,P,M,this.compareMinX);for(var H=w;H<=P;H+=M){var C=Math.min(H+M-1,P);p(x,H,C,V,this.compareMinY);for(var D=H;D<=C;D+=V){var B=Math.min(D+V-1,C);z.children.push(this._build(x,D,B,R-1))}}return i(z,this.toBBox),z},o.prototype._chooseSubtree=function(x,w,P,R){for(;R.push(w),!(w.leaf||R.length-1===P);){for(var b=1/0,S=1/0,z=void 0,V=0;V<w.children.length;V++){var M=w.children[V],H=a(M),C=m(x,M)-H;C<S?(S=C,b=H<b?H:b,z=M):C===S&&H<b&&(b=H,z=M)}w=z||w.children[0]}return w},o.prototype._insert=function(x,w,P){var R=P?x:this.toBBox(x),b=[],S=this._chooseSubtree(R,this.data,w,b);for(S.children.push(x),f(S,R);w>=0&&b[w].children.length>this._maxEntries;)this._split(b,w),w--;this._adjustParentBBoxes(R,b,w)},o.prototype._split=function(x,w){var P=x[w],R=P.children.length,b=this._minEntries;this._chooseSplitAxis(P,b,R);var S=this._chooseSplitIndex(P,b,R),z=y(P.children.splice(S,P.children.length-S));z.height=P.height,z.leaf=P.leaf,i(P,this.toBBox),i(z,this.toBBox),w?x[w-1].children.push(z):this._splitRoot(P,z)},o.prototype._splitRoot=function(x,w){this.data=y([x,w]),this.data.height=x.height+1,this.data.leaf=!1,i(this.data,this.toBBox)},o.prototype._chooseSplitIndex=function(x,w,P){for(var R,b=1/0,S=1/0,z=w;z<=P-w;z++){var V=l(x,0,z,this.toBBox),M=l(x,z,P,this.toBBox),H=h(V,M),C=a(V)+a(M);H<b?(b=H,R=z,S=C<S?C:S):H===b&&C<S&&(S=C,R=z)}return R||P-w},o.prototype._chooseSplitAxis=function(x,w,P){var R=x.leaf?this.compareMinX:u,b=x.leaf?this.compareMinY:E,S=this._allDistMargin(x,w,P,R),z=this._allDistMargin(x,w,P,b);S<z&&x.children.sort(R)},o.prototype._allDistMargin=function(x,w,P,R){x.children.sort(R);for(var b=this.toBBox,S=l(x,0,w,b),z=l(x,P-w,P,b),V=c(S)+c(z),M=w;M<P-w;M++){var H=x.children[M];f(S,x.leaf?b(H):H),V+=c(S)}for(var C=P-w-1;C>=w;C--){var D=x.children[C];f(z,x.leaf?b(D):D),V+=c(z)}return V},o.prototype._adjustParentBBoxes=function(x,w,P){for(var R=P;R>=0;R--)f(w[R],x)},o.prototype._condense=function(x){for(var w=x.length-1,P=void 0;w>=0;w--)x[w].children.length===0?w>0?(P=x[w-1].children,P.splice(P.indexOf(x[w]),1)):this.clear():i(x[w],this.toBBox)};function r(d,x,w){if(!w)return x.indexOf(d);for(var P=0;P<x.length;P++)if(w(d,x[P]))return P;return-1}function i(d,x){l(d,0,d.children.length,x,d)}function l(d,x,w,P,R){R||(R=y(null)),R.minX=1/0,R.minY=1/0,R.maxX=-1/0,R.maxY=-1/0;for(var b=x;b<w;b++){var S=d.children[b];f(R,d.leaf?P(S):S)}return R}function f(d,x){return d.minX=Math.min(d.minX,x.minX),d.minY=Math.min(d.minY,x.minY),d.maxX=Math.max(d.maxX,x.maxX),d.maxY=Math.max(d.maxY,x.maxY),d}function u(d,x){return d.minX-x.minX}function E(d,x){return d.minY-x.minY}function a(d){return(d.maxX-d.minX)*(d.maxY-d.minY)}function c(d){return d.maxX-d.minX+(d.maxY-d.minY)}function m(d,x){return(Math.max(x.maxX,d.maxX)-Math.min(x.minX,d.minX))*(Math.max(x.maxY,d.maxY)-Math.min(x.minY,d.minY))}function h(d,x){var w=Math.max(d.minX,x.minX),P=Math.max(d.minY,x.minY),R=Math.min(d.maxX,x.maxX),b=Math.min(d.maxY,x.maxY);return Math.max(0,R-w)*Math.max(0,b-P)}function g(d,x){return d.minX<=x.minX&&d.minY<=x.minY&&x.maxX<=d.maxX&&x.maxY<=d.maxY}function T(d,x){return x.minX<=d.maxX&&x.minY<=d.maxY&&x.maxX>=d.minX&&x.maxY>=d.minY}function y(d){return{children:d,height:1,leaf:!0,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0}}function p(d,x,w,P,R){for(var b=[x,w];b.length;)if(w=b.pop(),x=b.pop(),!(w-x<=P)){var S=x+Math.ceil((w-x)/P/2)*P;e(d,S,x,w,R),b.push(x,S,S,w)}}return o})});var Ao=Ce((Yn,Gn)=>{(function(e,t){typeof Yn=="object"&&typeof Gn<"u"?Gn.exports=t():typeof define=="function"&&define.amd?define(t):(e=e||self,e.TinyQueue=t())})(Yn,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,E=r[u],a=u+1;if(a<this.length&&i(r[a],E)<0&&(u=a,E=r[a]),i(E,f)>=0)break;r[s]=E,s=u}r[s]=f};function t(n,s){return n<s?-1:n>s?1:0}return e})});var Oo=Ce((zf,Fo)=>{Fo.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,E=f-1;u<f;E=u++){var a=n[s+u*2+0],c=n[s+u*2+1],m=n[s+E*2+0],h=n[s+E*2+1],g=c>i!=h>i&&r<(m-a)*(i-c)/(h-c)+a;g&&(l=!l)}return l}});var Wo=Ce((Vf,No)=>{No.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,E=f-1;u<f;E=u++){var a=n[u+s][0],c=n[u+s][1],m=n[E+s][0],h=n[E+s][1],g=c>i!=h>i&&r<(m-a)*(i-c)/(h-c)+a;g&&(l=!l)}return l}});var $o=Ce((Mf,Pn)=>{var jo=Oo(),qo=Wo();Pn.exports=function(t,n,s,o){return n.length>0&&Array.isArray(n[0])?qo(t,n,s,o):jo(t,n,s,o)};Pn.exports.nested=qo;Pn.exports.flat=jo});var Yo=Ce((Rn,Xo)=>{(function(e,t){typeof Rn=="object"&&typeof Xo<"u"?t(Rn):typeof define=="function"&&define.amd?define(["exports"],t):t((e=e||self).predicates={})})(Rn,function(e){"use strict";let n=33306690738754706e-32;function s(m,h,g,T,y){let p,d,x,w,P=h[0],R=T[0],b=0,S=0;R>P==R>-P?(p=P,P=h[++b]):(p=R,R=T[++S]);let z=0;if(b<m&&S<g)for(R>P==R>-P?(x=p-((d=P+p)-P),P=h[++b]):(x=p-((d=R+p)-R),R=T[++S]),p=d,x!==0&&(y[z++]=x);b<m&&S<g;)R>P==R>-P?(x=p-((d=p+P)-(w=d-p))+(P-w),P=h[++b]):(x=p-((d=p+R)-(w=d-p))+(R-w),R=T[++S]),p=d,x!==0&&(y[z++]=x);for(;b<m;)x=p-((d=p+P)-(w=d-p))+(P-w),P=h[++b],p=d,x!==0&&(y[z++]=x);for(;S<g;)x=p-((d=p+R)-(w=d-p))+(R-w),R=T[++S],p=d,x!==0&&(y[z++]=x);return p===0&&z!==0||(y[z++]=p),z}function o(m){return new Float64Array(m)}let r=33306690738754716e-32,i=22204460492503146e-32,l=11093356479670487e-47,f=o(4),u=o(8),E=o(12),a=o(16),c=o(4);e.orient2d=function(m,h,g,T,y,p){let d=(h-p)*(g-y),x=(m-y)*(T-p),w=d-x;if(d===0||x===0||d>0!=x>0)return w;let P=Math.abs(d+x);return Math.abs(w)>=r*P?w:-(function(R,b,S,z,V,M,H){let C,D,B,_,k,v,A,j,$,Z,Y,tt,it,ct,ut,q,W,U,wt=R-V,Ft=S-V,Nt=b-M,jt=z-M;k=(ut=(j=wt-(A=(v=134217729*wt)-(v-wt)))*(Z=jt-($=(v=134217729*jt)-(v-jt)))-((ct=wt*jt)-A*$-j*$-A*Z))-(Y=ut-(W=(j=Nt-(A=(v=134217729*Nt)-(v-Nt)))*(Z=Ft-($=(v=134217729*Ft)-(v-Ft)))-((q=Nt*Ft)-A*$-j*$-A*Z))),f[0]=ut-(Y+k)+(k-W),k=(it=ct-((tt=ct+Y)-(k=tt-ct))+(Y-k))-(Y=it-q),f[1]=it-(Y+k)+(k-q),k=(U=tt+Y)-tt,f[2]=tt-(U-k)+(Y-k),f[3]=U;let Lt=(function(_t,J){let ft=J[0];for(let Q=1;Q<_t;Q++)ft+=J[Q];return ft})(4,f),Pt=i*H;if(Lt>=Pt||-Lt>=Pt||(C=R-(wt+(k=R-wt))+(k-V),B=S-(Ft+(k=S-Ft))+(k-V),D=b-(Nt+(k=b-Nt))+(k-M),_=z-(jt+(k=z-jt))+(k-M),C===0&&D===0&&B===0&&_===0)||(Pt=l*H+n*Math.abs(Lt),(Lt+=wt*_+jt*C-(Nt*B+Ft*D))>=Pt||-Lt>=Pt))return Lt;k=(ut=(j=C-(A=(v=134217729*C)-(v-C)))*(Z=jt-($=(v=134217729*jt)-(v-jt)))-((ct=C*jt)-A*$-j*$-A*Z))-(Y=ut-(W=(j=D-(A=(v=134217729*D)-(v-D)))*(Z=Ft-($=(v=134217729*Ft)-(v-Ft)))-((q=D*Ft)-A*$-j*$-A*Z))),c[0]=ut-(Y+k)+(k-W),k=(it=ct-((tt=ct+Y)-(k=tt-ct))+(Y-k))-(Y=it-q),c[1]=it-(Y+k)+(k-q),k=(U=tt+Y)-tt,c[2]=tt-(U-k)+(Y-k),c[3]=U;let It=s(4,f,4,c,u);k=(ut=(j=wt-(A=(v=134217729*wt)-(v-wt)))*(Z=_-($=(v=134217729*_)-(v-_)))-((ct=wt*_)-A*$-j*$-A*Z))-(Y=ut-(W=(j=Nt-(A=(v=134217729*Nt)-(v-Nt)))*(Z=B-($=(v=134217729*B)-(v-B)))-((q=Nt*B)-A*$-j*$-A*Z))),c[0]=ut-(Y+k)+(k-W),k=(it=ct-((tt=ct+Y)-(k=tt-ct))+(Y-k))-(Y=it-q),c[1]=it-(Y+k)+(k-q),k=(U=tt+Y)-tt,c[2]=tt-(U-k)+(Y-k),c[3]=U;let Rt=s(It,u,4,c,E);k=(ut=(j=C-(A=(v=134217729*C)-(v-C)))*(Z=_-($=(v=134217729*_)-(v-_)))-((ct=C*_)-A*$-j*$-A*Z))-(Y=ut-(W=(j=D-(A=(v=134217729*D)-(v-D)))*(Z=B-($=(v=134217729*B)-(v-B)))-((q=D*B)-A*$-j*$-A*Z))),c[0]=ut-(Y+k)+(k-W),k=(it=ct-((tt=ct+Y)-(k=tt-ct))+(Y-k))-(Y=it-q),c[1]=it-(Y+k)+(k-q),k=(U=tt+Y)-tt,c[2]=tt-(U-k)+(Y-k),c[3]=U;let bt=s(Rt,E,4,c,a);return a[bt-1]})(m,h,g,T,y,p,P)},e.orient2dfast=function(m,h,g,T,y,p){return(h-p)*(g-y)-(m-y)*(T-p)},Object.defineProperty(e,"__esModule",{value:!0})})});var Qo=Ce((vf,Jn)=>{"use strict";var Go=Lo(),zn=Ao(),Hr=$o(),Br=Yo().orient2d;zn.default&&(zn=zn.default);Jn.exports=Jo;Jn.exports.default=Jo;function Jo(e,t,n){t=Math.max(0,t===void 0?2:t),n=n||0;var s=Ir(e),o=new Go(16);o.toBBox=function(p){return{minX:p[0],minY:p[1],maxX:p[0],maxY:p[1]}},o.compareMinX=function(p,d){return p[0]-d[0]},o.compareMinY=function(p,d){return p[1]-d[1]},o.load(e);for(var r=[],i=0,l;i<s.length;i++){var f=s[i];o.remove(f),l=Ko(f,l),r.push(l)}var u=new Go(16);for(i=0;i<r.length;i++)u.insert(Zn(r[i]));for(var E=t*t,a=n*n;r.length;){var c=r.shift(),m=c.p,h=c.next.p,g=Un(m,h);if(!(g<a)){var T=g/E;f=_r(o,c.prev.p,m,h,c.next.next.p,T,u),f&&Math.min(Un(f,m),Un(f,h))<=T&&(r.push(c),r.push(Ko(f,c)),o.remove(f),u.remove(c),u.insert(Zn(c)),u.insert(Zn(c.next)))}}c=l;var y=[];do y.push(c.p),c=c.next;while(c!==l);return y.push(c.p),y}function _r(e,t,n,s,o,r,i){for(var l=new zn([],kr),f=e.data;f;){for(var u=0;u<f.children.length;u++){var E=f.children[u],a=f.leaf?Kn(E,n,s):Cr(n,s,E);a>r||l.push({node:E,dist:a})}for(;l.length&&!l.peek().node.children;){var c=l.pop(),m=c.node,h=Kn(m,t,n),g=Kn(m,s,o);if(c.dist<h&&c.dist<g&&Uo(n,m,i)&&Uo(s,m,i))return m}f=l.pop(),f&&(f=f.node)}return null}function kr(e,t){return e.dist-t.dist}function Cr(e,t,n){if(Zo(e,n)||Zo(t,n))return 0;var s=Sn(e[0],e[1],t[0],t[1],n.minX,n.minY,n.maxX,n.minY);if(s===0)return 0;var o=Sn(e[0],e[1],t[0],t[1],n.minX,n.minY,n.minX,n.maxY);if(o===0)return 0;var r=Sn(e[0],e[1],t[0],t[1],n.maxX,n.minY,n.maxX,n.maxY);if(r===0)return 0;var i=Sn(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 Zo(e,t){return e[0]>=t.minX&&e[0]<=t.maxX&&e[1]>=t.minY&&e[1]<=t.maxY}function Uo(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(Dr(l[f].p,l[f].next.p,e,t))return!1;return!0}function Ze(e,t,n){return Br(e[0],e[1],t[0],t[1],n[0],n[1])}function Dr(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 Zn(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 Ir(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++)Hr(e[r],l)||f.push(e[r]);return Ar(f)}function Ko(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 Un(e,t){var n=e[0]-t[0],s=e[1]-t[1];return n*n+s*s}function Kn(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 Sn(e,t,n,s,o,r,i,l){var f=n-e,u=s-t,E=i-o,a=l-r,c=e-o,m=t-r,h=f*f+u*u,g=f*E+u*a,T=E*E+a*a,y=f*c+u*m,p=E*c+a*m,d=h*T-g*g,x,w,P,R,b=d,S=d;d===0?(w=0,b=1,R=p,S=T):(w=g*p-T*y,R=h*p-g*y,w<0?(w=0,R=p,S=T):w>b&&(w=b,R=p+g,S=T)),R<0?(R=0,-y<0?w=0:-y>h?w=b:(w=-y,b=h)):R>S&&(R=S,-y+g<0?w=0:-y+g>h?w=b:(w=-y+g,b=h)),x=w===0?0:w/b,P=R===0?0:R/S;var z=(1-x)*e+x*n,V=(1-x)*t+x*s,M=(1-P)*o+P*i,H=(1-P)*r+P*l,C=M-z,D=H-V;return C*C+D*D}function Lr(e,t){return e[0]===t[0]?e[1]-t[1]:e[0]-t[0]}function Ar(e){e.sort(Lr);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),E=Math.sin(n),a=i*s+l*o+f*r;return this.x=i*a*(1-u)+s*u+(-f*o+l*r)*E,this.y=l*a*(1-u)+o*u+(f*s-i*r)*E,this.z=f*a*(1-u)+r*u+(-l*s+i*o)*E,this}},an=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}},cn=()=>typeof performance<"u"&&performance.now?performance.now():Date.now(),kn=class{constructor(){this.results=null,this.clusterResults=null}initLimits1(t,n){let s,o;return t<.3?s=5:t<.5?s=8:t<.8?s=10:t<1?s=15:t<2?s=30:t<3?s=35:t<4?s=40:t<5?s=45:t<6?s=50:t<7?s=60:t<8.5?s=70:t<10?s=80:t<15?s=100:t<20?s=120:t<25?s=140:t<30?s=160:t<35?s=180:t<40?s=200:t<45?s=230:t<50?s=250:s=350,n<1?o=30:n<2?o=40:n<2.5?o=45:n<3?o=60:n<3.6?o=70:o=80,{horizontalSubdivisions:s,verticalSubdivisions:o}}initLimits2(t,n){let r=Math.round(Math.max(5,Math.min(350,t/.08))),i=Math.round(Math.max(30,Math.min(80,n/.06)));return{horizontalSubdivisions:r,verticalSubdivisions:i}}initLimits3(t,n){let s;t<2?s=.06:t<10?s=.1:s=.15;let o=Math.round(Math.max(5,Math.min(350,t/s))),r=Math.round(Math.max(30,Math.min(80,n/.06)));return{horizontalSubdivisions:o,verticalSubdivisions:r}}initLimits4(t,n){let s=Math.round(Math.max(5,Math.min(350,20*Math.sqrt(t)))),o=Math.round(Math.max(30,Math.min(80,20*Math.sqrt(n))));return{horizontalSubdivisions:s,verticalSubdivisions:o}}createSubdividedWallPlane(t,n,s,o=null){let r=[];if(!t||!t.start||!t.end||isNaN(t.rooftopPz))return r;let i=new 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),E=[i,l,f,u];for(let R=0;R<E.length;R++)if(!this.isValidVector3(E[R]))return console.error(`\u5899\u4F53\u57FA\u7840\u70B9${R}\u65E0\u6548:`,E[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,h=c/n,g=new Bt().subVectors(l,i).normalize(),T=i.x,y=i.y,p=i.z,d=g.x,x=g.y,w=g.z,P=(R,b)=>new Bt(T+d*R,y+x*R,p+w*R+b);for(let R=0;R<n;R++){let b=R*h,S=(R+1)*h;for(let z=0;z<s;z++){let V=z*m,M=(z+1)*m;r.push({points:[P(V,b),P(M,b),P(M,S),P(V,S)],userData:{type:"wallSegment",row:R,col:z,width:m,height:h}})}}return r}analyzePointDistribution(t,n,s=.01,o={}){let r=o.projectPlane||null;this.results={totalSegments:0,segmentsWithPoints:0,segmentsWithoutPoints:0,missingSegments:[],existSegments:[],pointsInSegments:new Map,segmentsByPoint:new Map,segmentDetails:new Map,tolerance:s,analysisTime:null};let i=cn(),l=[],f=new Map,u=1/0,E=-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 H=this.getWorldVerticesNew(M.points);if(H.length<4)continue;let C=new Bt().add(H[0]).add(H[1]).add(H[2]).add(H[3]).multiplyScalar(.25);M.userData.center=C,M.vertices=H;let D=M.userData.row,B=M.userData.col,_=`row${D}_col${B}`;l.push(M),f.set(_,M),D<u&&(u=D),D>E&&(E=D),B<a&&(a=B),B>c&&(c=B)}}if(this.results.totalSegments=l.length,l.length===0)return this.results.analysisTime=cn()-i,this.printAnalysisResults(),this.results;let m=`row${u}_col${a}`,h=f.get(m)||l[0];if(!h||!h.vertices||h.vertices.length<4)return this.results.analysisTime=cn()-i,this.printAnalysisResults(),this.results;let g=h.vertices[0],T=h.vertices[1],y=h.vertices[3],p=new Bt().subVectors(T,g).normalize(),d=new Bt().subVectors(y,g).normalize(),x=h.userData.width,w=h.userData.height,P=E-u+1,R=c-a+1,b=new an;b.setFromCoplanarPoints(g,T,y);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]),H=r?r.projectPoint(M,z):M;if(Math.abs(b.distanceToPoint(H))>s)continue;S.subVectors(H,g);let D=S.dot(p),B=S.dot(d),_=Math.ceil((D-s)/x-1),k=Math.floor((D+s)/x),v=Math.ceil((B-s)/w-1),A=Math.floor((B+s)/w);if(k<0||_>R-1||A<0||v>P-1)continue;let j=Math.max(0,_),$=Math.min(R-1,k),Z=Math.max(0,v),Y=Math.min(P-1,A);for(let tt=Z;tt<=Y;tt++){let it=u+tt;for(let ct=j;ct<=$;ct++){let ut=a+ct,q=`row${it}_col${ut}`;f.has(q)&&(this.results.pointsInSegments.has(q)||this.results.pointsInSegments.set(q,[V]))}}}for(let V of l){let M=`row${V.userData.row}_col${V.userData.col}`,H=this.results.pointsInSegments.has(M)?this.results.pointsInSegments.get(M).length:0,C=H>=1,D={row:V.userData.row,col:V.userData.col,width:V.userData.width,height:V.userData.height,segmentKey:M,vertices:V.vertices,center:V.userData.center,mesh:V,pointCount:H,hasPointsButNotEnough:H>0&&H<1};C?(this.results.segmentsWithPoints++,this.results.existSegments.push(D)):(this.results.segmentsWithoutPoints++,this.results.missingSegments.push(D))}return this.results.analysisTime=cn()-i,this.printAnalysisResults(),this.results}isPointInWallSegmentOptimized(t,n,s,o,r,i,l,f,u,E,a){if(Math.abs(s.distanceToPoint(t))>a)return!1;let m=new Bt().subVectors(t,n),h=Math.abs(m.dot(r)),g=Math.abs(m.dot(i));if(h>u&&g>E)return!1;let T=new Bt().subVectors(t,o),y=T.dot(r),p=T.dot(i),d=y>=-a&&y<=l+a,x=p>=-a&&p<=f+a;return d&&x}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 E=`row${u.userData.row}_col${u.userData.col}`,a=r.has(E);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:E,isEmpty:a,visited:!1})}let l=[],f=[[0,1],[1,0],[0,-1],[-1,0]];for(let[u,E]of r){let a=i.get(E.row)?.get(E.col);if(a&&!a.visited){let c=[],m=[[E.row,E.col]],h=0;for(a.visited=!0;h<m.length;){let g=m[h++],T=g[0],y=g[1],p=`row${T}_col${y}`;r.has(p)&&c.push(r.get(p));for(let d of f){let x=T+d[0],w=y+d[1];if(i.has(x)&&i.get(x).has(w)){let P=i.get(x).get(w);!P.visited&&P.isEmpty&&(P.visited=!0,m.push([x,w]))}}}c.length>=o&&l.push(c)}}return this.clusterResults={clusters:l.sort((u,E)=>E.length-u.length),totalClusters:l.length},this.clusterResults}getClusterInfo(){if(!this.clusterResults)return null;let t=this.clusterResults.clusters.map(n=>n.length);return{totalClusters:this.clusterResults.totalClusters,clusterSizes:this.clusterResults.clusters.map((n,s)=>({clusterIndex:s,size:n.length,segments:n.map(o=>o.segmentKey)})),largestCluster:t.length?Math.max(...t):0,smallestCluster:t.length?Math.min(...t):0}}printAnalysisResults(){if(!this.results){console.warn("\u6CA1\u6709\u53EF\u7528\u7684\u5206\u6790\u7ED3\u679C");return}}isValidVector3(t){return t&&!isNaN(t.x)&&!isNaN(t.y)&&!isNaN(t.z)&&isFinite(t.x)&&isFinite(t.y)&&isFinite(t.z)}},io=(e,t)=>{let n={},s=[],o=[];if(!e||e.length===0)return n.originalVertices=s,n.allCenterPoints=o,n;if(t=="xyz")for(let r of e){o.push({x:r.center.x,y:r.center.y,z:r.center.z});let i=[];for(let l=0;l<r.vertices.length;l++)i.push({x:r.vertices[l].x,y:r.vertices[l].y,z:r.vertices[l].z});s.push(i)}else if(t=="three")for(let r of e){o.push(new De.Vector3(r.center.x,r.center.y,r.center.z));let i=[];for(let l=0;l<r.vertices.length;l++)i.push(new De.Vector3(r.vertices[l].x,r.vertices[l].y,r.vertices[l].z));s.push(i)}else if(t=="array")for(let r of e){o.push(r.center.x),o.push(r.center.y),o.push(r.center.z);let i=[];for(let l=0;l<r.vertices.length;l++)i.push(r.vertices[l].x,r.vertices[l].y,r.vertices[l].z);s.push(i)}return n.originalVertices=s,n.allCenterPoints=o,n},vs=(e,t)=>{let n=new 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]}},lo=async(e,t=!0,n="three")=>{for(let s=0;s<e.length;s++){let o=e[s];await Cn(o,t,n)}},Cn=(e,t=!0,n="three")=>{if((e.isBayWindow||e.isWindow||e.isBalconyRailing)&&t)return;let s=new an().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 kn,{horizontalSubdivisions:l,verticalSubdivisions:f}=i.initLimits4(o,r),u=i.createSubdividedWallPlane(e,f,l,null);i.analyzePointDistribution(u,e.originalPoints,.01,{projectPlane:s});let E=i.highlightEmptySegments(u,null,null),a=[];if(E&&E.clusters)for(let h of E.clusters){let g=io(h,n);g&&a.push(g)}let m=vs(e,n).direction;if(e.checkResults=a,e.verticalDirection=m,e.saveExistSegments){let h=[],g=io(i.results.existSegments,n);g&&h.push(g),e.existSegments=h}};var Tt=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),E=Math.sin(n),a=i*s+l*o+f*r;return this.x=i*a*(1-u)+s*u+(-f*o+l*r)*E,this.y=l*a*(1-u)+o*u+(f*s-i*r)*E,this.z=f*a*(1-u)+r*u+(-l*s+i*o)*E,this}},Qe=class{constructor(t=new Tt(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 Tt().subVectors(n,t),r=new Tt().subVectors(s,t),i=new Tt().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 Tt){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}},fn=()=>typeof performance<"u"&&performance.now?performance.now():Date.now(),un=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 Tt(t.start.x,t.start.y,t.start.z),l=new Tt(t.end.x,t.end.y,t.end.z),f=new Tt(t.end.x,t.end.y,t.rooftopPz),u=new Tt(t.start.x,t.start.y,t.rooftopPz),E=[i,l,f,u];for(let R=0;R<E.length;R++)if(!this.isValidVector3(E[R]))return console.error(`\u5899\u4F53\u57FA\u7840\u70B9${R}\u65E0\u6548:`,E[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,h=c/n,g=new Tt().subVectors(l,i).normalize(),T=i.x,y=i.y,p=i.z,d=g.x,x=g.y,w=g.z,P=(R,b)=>new Tt(T+d*R,y+x*R,p+w*R+b);for(let R=0;R<n;R++){let b=R*h,S=(R+1)*h;for(let z=0;z<s;z++){let V=z*m,M=(z+1)*m;r.push({points:[P(V,b),P(M,b),P(M,S),P(V,S)],userData:{type:"wallSegment",row:R,col:z,width:m,height:h}})}}return r}analyzePointDistribution(t,n,s=.01,o={}){let r=o.projectPlane||null;this.results={totalSegments:0,segmentsWithPoints:0,segmentsWithoutPoints:0,missingSegments:[],existSegments:[],pointsInSegments:new Map,segmentsByPoint:new Map,segmentDetails:new Map,tolerance:s,analysisTime:null};let i=fn(),l=[],f=new Map,u=1/0,E=-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 H=this.getWorldVerticesNew(M.points);if(H.length<4)continue;let C=new Tt().add(H[0]).add(H[1]).add(H[2]).add(H[3]).multiplyScalar(.25);M.userData.center=C,M.vertices=H;let D=M.userData.row,B=M.userData.col,_=`row${D}_col${B}`;l.push(M),f.set(_,M),D<u&&(u=D),D>E&&(E=D),B<a&&(a=B),B>c&&(c=B)}}if(this.results.totalSegments=l.length,l.length===0)return this.results.analysisTime=fn()-i,this.printAnalysisResults(),this.results;let m=`row${u}_col${a}`,h=f.get(m)||l[0];if(!h||!h.vertices||h.vertices.length<4)return this.results.analysisTime=fn()-i,this.printAnalysisResults(),this.results;let g=h.vertices[0],T=h.vertices[1],y=h.vertices[3],p=new Tt().subVectors(T,g).normalize(),d=new Tt().subVectors(y,g).normalize(),x=h.userData.width,w=h.userData.height,P=E-u+1,R=c-a+1,b=new Qe;b.setFromCoplanarPoints(g,T,y);let S=new Tt,z=new Tt;for(let V=0;V<n.length;V++){let M=n[V],H=r?r.projectPoint(M,z):M;if(Math.abs(b.distanceToPoint(H))>s)continue;S.subVectors(H,g);let D=S.dot(p),B=S.dot(d),_=Math.ceil((D-s)/x-1),k=Math.floor((D+s)/x),v=Math.ceil((B-s)/w-1),A=Math.floor((B+s)/w);if(k<0||_>R-1||A<0||v>P-1)continue;let j=Math.max(0,_),$=Math.min(R-1,k),Z=Math.max(0,v),Y=Math.min(P-1,A);for(let tt=Z;tt<=Y;tt++){let it=u+tt;for(let ct=j;ct<=$;ct++){let ut=a+ct,q=`row${it}_col${ut}`;f.has(q)&&(this.results.pointsInSegments.has(q)||this.results.pointsInSegments.set(q,[V]))}}}for(let V of l){let M=`row${V.userData.row}_col${V.userData.col}`,H=this.results.pointsInSegments.has(M)?this.results.pointsInSegments.get(M).length:0,C=H>=1,D={row:V.userData.row,col:V.userData.col,width:V.userData.width,height:V.userData.height,segmentKey:M,vertices:V.vertices,center:V.userData.center,mesh:V,pointCount:H,hasPointsButNotEnough:H>0&&H<1};C?(this.results.segmentsWithPoints++,this.results.existSegments.push(D)):(this.results.segmentsWithoutPoints++,this.results.missingSegments.push(D))}return this.results.analysisTime=fn()-i,this.printAnalysisResults(),this.results}isPointInWallSegmentOptimized(t,n,s,o,r,i,l,f,u,E,a){if(Math.abs(s.distanceToPoint(t))>a)return!1;let m=new Tt().subVectors(t,n),h=Math.abs(m.dot(r)),g=Math.abs(m.dot(i));if(h>u&&g>E)return!1;let T=new Tt().subVectors(t,o),y=T.dot(r),p=T.dot(i),d=y>=-a&&y<=l+a,x=p>=-a&&p<=f+a;return d&&x}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 E=`row${u.userData.row}_col${u.userData.col}`,a=r.has(E);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:E,isEmpty:a,visited:!1})}let l=[],f=[[0,1],[1,0],[0,-1],[-1,0]];for(let[u,E]of r){let a=i.get(E.row)?.get(E.col);if(a&&!a.visited){let c=[],m=[[E.row,E.col]],h=0;for(a.visited=!0;h<m.length;){let g=m[h++],T=g[0],y=g[1],p=`row${T}_col${y}`;r.has(p)&&c.push(r.get(p));for(let d of f){let x=T+d[0],w=y+d[1];if(i.has(x)&&i.get(x).has(w)){let P=i.get(x).get(w);!P.visited&&P.isEmpty&&(P.visited=!0,m.push([x,w]))}}}c.length>=o&&l.push(c)}}return this.clusterResults={clusters:l.sort((u,E)=>E.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)}},co=(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},Hs=(e,t)=>{let n=new Tt().copy(e.start).add(e.end).multiplyScalar(.5),s=new Tt().subVectors(new Tt(n.x,n.y,n.z+1),n).normalize(),o=new Tt(e.direction.x,e.direction.y,0);o.applyAxisAngle(s,Math.PI/2);let r=new Tt().copy(n).add(o.clone().multiplyScalar(e.length)),i=new Tt().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]}},Bs=(e,t=!0,n="three",s="xyz")=>{s=="xyz"?ao(e,t,n):s=="array"&&Cn(e,t,n)},_s=(e,t=!0,n="three",s="xyz")=>{s=="xyz"?ks(e,t,n):s=="array"&&lo(e,t,n)},ks=(e,t=!0,n="three")=>{for(let s=0;s<e.length;s++){let o=e[s];ao(o,t,n)}},ao=(e,t=!0,n="three")=>{if((e.isBayWindow||e.isWindow||e.isBalconyRailing)&&t)return;let s=new Qe().setFromCoplanarPoints(new Tt(e.start.x,e.start.y,e.start.z),new Tt(e.end.x,e.end.y,e.end.z),new Tt(e.start.x,e.start.y,e.rooftopPz)),o=new Tt(e.start.x,e.start.y,e.start.z).distanceTo(new Tt(e.end.x,e.end.y,e.end.z)),r=Math.abs(e.rooftopPz-e.start.z),i=new un,{horizontalSubdivisions:l,verticalSubdivisions:f}=i.initLimits4(o,r),u=i.createSubdividedWallPlane(e,f,l,null);i.analyzePointDistribution(u,e.originalPoints,.01,{projectPlane:s});let E=i.highlightEmptySegments(u,null,null),a=[];if(E&&E.clusters)for(let h of E.clusters){let g=co(h,n);g&&a.push(g)}let m=Hs(e,n).direction;if(e.checkResults=a,e.verticalDirection=m,e.saveExistSegments){let h=[],g=co(i.results.existSegments,n);g&&h.push(g),e.existSegments=h}},Cs=e=>{if((e.isBayWindow||e.isWindow||e.isBalconyRailing)&&limit)return;let t=new Qe().setFromCoplanarPoints(new Tt(e.start.x,e.start.y,e.start.z),new Tt(e.end.x,e.end.y,e.end.z),new Tt(e.start.x,e.start.y,e.rooftopPz)),n=new Tt(e.start.x,e.start.y,e.start.z).distanceTo(new Tt(e.end.x,e.end.y,e.end.z)),s=Math.abs(e.rooftopPz-e.start.z),o=new un,{horizontalSubdivisions:r,verticalSubdivisions:i}=o.initLimits4(n,s),l=o.createSubdividedWallPlane(e,i,r,null);return o.analyzePointDistribution(l,e.originalPoints,.01,{projectPlane:t}),o.highlightEmptySegments(l,null,null)};import*as I from"three";import"three/examples/jsm/utils/BufferGeometryUtils.js";import*as O from"three";import{CSS2DObject as Fi}from"three/examples/jsm/renderers/CSS2DRenderer.js";import"three/examples/jsm/utils/BufferGeometryUtils.js";import Ee from"path";import{fileURLToPath as Ls}from"url";import hn from"path";import{fileURLToPath as Ds}from"url";import{Vector3 as yi}from"three";var Is=Ds(import.meta.url),Dn=hn.dirname(Is),Ei=hn.resolve(Dn,"./data/lines.meta.json"),xi=hn.resolve(Dn,"./data/lines.bin"),wi=hn.resolve(Dn,"./data/checks.bin");var As=Ls(import.meta.url),Se=Ee.dirname(As),zi=Ee.resolve(Se,"./data/lines.tmp.bin"),Vi=Ee.resolve(Se,"./data/checks.tmp.bin"),Mi=Ee.resolve(Se,"./data/lines.new_points.tmp.bin"),vi=Ee.resolve(Se,"./data/lines.new_points.bin"),Hi=Ee.resolve(Se,"./data/lines.meta.json"),Bi=Ee.resolve(Se,"./data/lines.bin"),_i=Ee.resolve(Se,"./data/checks.bin"),ki=Ee.resolve(Se,"./data/lines.exist_segments.bin"),Ci=Ee.resolve(Se,"./data/lines.exist_segments.tmp.bin");import{Vector3 as Fs}from"three";var dn=class{points=[];_tempArr=[0,0,0];constructor(t){}initPoints(t){this.points=t}getPointByIndex(t,n){let s=t*3;return n.x=this.points[s],n.y=this.points[s+1],n.z=this.points[s+2],n}getPointArrByIndex(t){let n=t*3;return[this.points[n],this.points[n+1],this.points[n+2]]}getPoint2ArrByIndex(t){let n=t*3;return[this.points[n],this.points[n+1]]}getIndexsByIndex(t,n){n.length=0,n.push(t*3),n.push(t*3+1),n.push(t*3+2)}pointsToVector3Arr(t){let n=[];for(let s=0;s<t.length/3;s++)n.push(new Fs(t[s*3],t[s*3+1],t[s*3+2]));return n}vector3ArrToPoints(t){let n=[];for(let s=0;s<t.length;s++)n.push(t[s].x,t[s].y,t[s].z);return n}vector3ArrToFloat32Array(t){return new Float32Array(t.flatMap(s=>[s.x,s.y,s.z]))}clsoe(){this.points=[]}};var uo=(e,t,n)=>{let s=new O.LineBasicMaterial({color:"#0011ff"}),o=[];o.push(e),o.push(t);let r=new O.BufferGeometry;r.setFromPoints(o),r.rotateX(-Math.PI/2),n.add(new O.Line(r,s))},xe=(e,t,n,s,o=1e-8)=>{let r=t.x-e.x,i=t.y-e.y,l=s.x-n.x,f=s.y-n.y,u=r*f-i*l;if(Math.abs(u)<o)return null;let E=((n.x-e.x)*f-(n.y-e.y)*l)/u,a=((n.x-e.x)*i-(n.y-e.y)*r)/u;return E<-o||E>1+o||a<-o||a>1+o?null:{point:new O.Vector3(e.x+E*r,e.y+E*i,e.z)}},ho=(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,E=document.createElement("canvas").getContext("2d");E.font=`bold ${s}px ${o}`;let c=E.measureText(e).width,m=Math.min(c+l*2,f),h=s+l*2,g=document.createElement("canvas");g.width=m,g.height=h;let T=g.getContext("2d");T.fillStyle=r,T.fillRect(0,0,m,h),T.fillStyle=i,T.font=`bold ${s}px ${o}`,T.textAlign="center",T.textBaseline="middle",c>f-l*2?Os(T,e,m/2,h/2,f,s):T.fillText(e,m/2,h/2);let y=new O.CanvasTexture(g),p=new O.SpriteMaterial({map:y,depthTest:!1,transparent:!0}),d=new O.Sprite(p);d.position.set(t.x,t.y,t.z);let x=.005;return d.scale.set(m*x,h*x,1),d};function Os(e,t,n,s,o,r){let i=t.split(""),l="",f=r*1.2,u=s;for(let E=0;E<i.length;E++){let a=l+i[E];e.measureText(a).width>o&&E>0?(e.fillText(l,n,u),l=i[E],u+=f):l=a}e.fillText(l,n,u)}var Kt=(e,t,n=.01)=>{let s=Math.sqrt(e.x*e.x+e.y*e.y+e.z*e.z),o=Math.sqrt(t.x*t.x+t.y*t.y+t.z*t.z);if(s<1e-10||o<1e-10)return{parallel:!1,sameDirection:null,angle:NaN};let r={x:e.x/s,y:e.y/s,z:e.z/s},i={x:t.x/o,y:t.y/o,z:t.z/o},l=r.x*i.x+r.y*i.y+r.z*i.z;l=Math.max(-1,Math.min(1,l));let f=Math.acos(Math.abs(l)),u=f<=n;return{parallel:u,sameDirection:u?l>0:null,angle:f}};var mo=(e,t,n,s)=>{if(t<1e-4||n<1e-4)return{};let o=e,r=[];if(s&&s.length&&(r=s.map(P=>P.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,E=-1/0,a=1/0,c=-1/0;for(let P of o){let R=P.dot(i),b=P.dot(l);R<u&&(u=R),R>E&&(E=R),b<a&&(a=b),b>c&&(c=b)}let m=o[0].dot(f),h=i.clone().multiplyScalar(u).add(l.clone().multiplyScalar(a)).add(f.clone().multiplyScalar(m)),g=i.clone().multiplyScalar(E).add(l.clone().multiplyScalar(a)).add(f.clone().multiplyScalar(m)),T=i.clone().multiplyScalar(E).add(l.clone().multiplyScalar(c)).add(f.clone().multiplyScalar(m)),y=i.clone().multiplyScalar(u).add(l.clone().multiplyScalar(c)).add(f.clone().multiplyScalar(m)),p=[h,g,T,y],d=Kt(new O.Vector3().subVectors(h,g),new O.Vector3(0,0,1));d&&d.parallel&&(p=[h,y,T,g]);let x=0;if(s.length>0){let P=new O.Vector3().subVectors(p[1],p[0]).normalize(),R=P.clone().negate(),b=new O.Vector3().subVectors(p[3],p[0]).normalize(),S=b.clone().negate(),z=p[0].distanceTo(p[1]),V=p[0].distanceTo(p[3]),M=z/t,H=V/n,C=.001;for(let D=0;D<M;D++){let B=p[0],_=0;for(let k=0;k<H;k++){let v=B.clone().addScaledVector(P,t),A=v.clone().addScaledVector(b,n),j=B.clone().addScaledVector(b,n),$=new O.Vector3().add(B).add(v).add(A).add(j).multiplyScalar(.25);for(let Z=0;Z<r.length;Z++)if(r[Z].distanceTo($)<C){_++;break}B=j}if(_>=H/2)break;x+=_,p[0]=p[0].addScaledVector(P,t),p[3]=p[3].addScaledVector(P,t)}z=p[0].distanceTo(p[1]),M=z/t;for(let D=0;D<M;D++){let B=p[1],_=0;for(let k=0;k<H;k++){let v=B.clone().addScaledVector(R,t),A=v.clone().addScaledVector(b,n),j=B.clone().addScaledVector(b,n),$=new O.Vector3().add(B).add(v).add(A).add(j).multiplyScalar(.25);for(let Z=0;Z<r.length;Z++)if(r[Z].distanceTo($)<C){_++;break}B=j}if(_>=H/2)break;x+=_,p[1]=p[1].addScaledVector(R,t),p[2]=p[2].addScaledVector(R,t)}z=p[0].distanceTo(p[1]),M=z/t;for(let D=0;D<H;D++){let B=p[3],_=0;for(let k=0;k<M;k++){let v=B.clone().addScaledVector(P,t),A=v.clone().addScaledVector(S,n),j=B.clone().addScaledVector(S,n),$=new O.Vector3().add(B).add(v).add(A).add(j).multiplyScalar(.25);for(let Z=0;Z<r.length;Z++)if(r[Z].distanceTo($)<C){_++;break}B=v}if(_>=M/2)break;x+=_,p[2]=p[2].addScaledVector(S,n),p[3]=p[3].addScaledVector(S,n)}}let w=p[0].distanceTo(p[1])*p[0].distanceTo(p[3]);return{facePoints:p,boxArea:w,totalInPlaneNum:x}},Yt=(e,t,n,s,o=O.MathUtils.degToRad(8))=>{let r=new O.Vector3,i=new O.Vector3;r.subVectors(new O.Vector3(t.x,t.y,0),new O.Vector3(e.x,e.y,0)).normalize(),i.subVectors(new O.Vector3(s.x,s.y,0),new O.Vector3(n.x,n.y,0)).normalize();let l=r.dot(i),f=Math.acos(Math.min(Math.abs(l),1)),u=1-Math.min(f/o,1),E=l>0?"same":"opposite";return{parallelism:u,angle:f,angleDeg:O.MathUtils.radToDeg(f),isParallel:f<o,direction:E,vectors:{v1:r,v2:i}}},se=(e,t,n,s)=>{let o=new O.Vector3().subVectors(t,e),r=new O.Vector3().subVectors(s,n),i=o.length(),l=r.length();if(i===0||l===0)return{rate:NaN,angle:NaN,isPerpendicular:!1,isParallel:!1};o.normalize(),r.normalize();let f=Math.abs(o.dot(r)),u=Math.min(1,Math.max(0,f)),E=Math.acos(u),a=O.MathUtils.radToDeg(E),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}},qt=(e,t,n=!1)=>new O.Vector3((e.x+t.x)/2,(e.y+t.y)/2,n?0:(e.z+t.z)/2),ye=(e,t,n,s,o={})=>{let{parallelAngleMax:r=O.MathUtils.degToRad(10),collinearAngleMax:i=O.MathUtils.degToRad(7),distanceThreshold:l=2,overlapThreshold:f=.01}=o,u=new O.Vector3().subVectors(t,e),E=new O.Vector3().subVectors(s,n),a=u.clone().normalize(),c=E.clone().normalize(),m=O.MathUtils.clamp(a.dot(c),-1,1),h=Math.acos(Math.abs(m)),g=O.MathUtils.radToDeg(h);if(h>r)return{type:"not_parallel",angleDeg:g,avgPerpendicularDistance:null,maxPerpendicularDistance:null,gap:null,overlap:null,closestDistance:null};m<0&&c.negate();let T=new O.Vector3().addVectors(a,c).normalize(),y=new O.Vector3().addVectors(e,t).multiplyScalar(.5),p=fo(n,y,a),d=fo(s,y,a),x=(p+d)/2,w=Math.max(p,d),P=e.dot(T),R=t.dot(T),b=n.dot(T),S=s.dot(T),z=Math.min(P,R),V=Math.max(P,R),M=Math.min(b,S),H=Math.max(b,S),C=V-z,D=H-M,B=Math.min(C,D),_=Math.min(V,H)-Math.max(z,M),k=_<0?-_:0,v=_>0?_:0,A=B>0?v/B:0,j=Ns(e,t,n,s),$=h<=i&&x<l,Z;return $?Z=A>.5?"collinear_overlap":"collinear_gap":h<=r&&(Z="parallel_offset"),{type:Z,angleDeg:g,avgPerpendicularDistance:x,maxPerpendicularDistance:w,gap:k,overlap:v,closestDistance:j}};function fo(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 Ns(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),E=o.dot(i),a=r.dot(i),c=l*u-f*f,m,h;c<1e-10?(m=0,h=u!==0?a/u:0):(m=(f*a-u*E)/c,h=(l*a-f*E)/c),m=O.MathUtils.clamp(m,0,1),h=u!==0?O.MathUtils.clamp((f*m+a)/u,0,1):0,m=l!==0?O.MathUtils.clamp((f*h-E)/l,0,1):0;let g=e.clone().add(o.clone().multiplyScalar(m)),T=n.clone().add(r.clone().multiplyScalar(h));return g.distanceTo(T)}var mn=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}},tn=(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 y=new O.Vector3;s.projectPoint(T,y),f.push(y.clone()),y.z=o.z,l.push(y)});let u=new O.Vector3,E=new O.Vector3;s.projectPoint(o,u),s.projectPoint(r,E);let a=new O.Line3(u,E),c=[],m=[],h=[],g=new O.Vector3;return l.forEach((T,y)=>{a.closestPointToPoint(T,!0,g).distanceTo(T)<.001?(c.push(n[y]),m.push(f[y])):h.push(T)}),{newOriginalPoints:c,newProjectPoints:h,newOnLinePoints:m}},po=(e,t,n)=>{function s(o,r,i,l,f,u,E,a,c){let m=new O.Line3(o,r),h=new Map,g=new O.Vector3,T=o.clone(),y=r.clone(),p=0;for(;;){let d=new Map,x=0;for(let w=0;w<c.checkResults.length;w++)if(!(c.checkResults[w].allCenterPoints.length/a*100<1))for(let R=0;R<c.checkResults[w].allCenterPoints.length;R++){if(h.has(w)&&h.get(w).removePtsIndex.includes(R))continue;let b=c.checkResults[w].allCenterPoints[R];b=new O.Vector3(b.x,b.y,b.z);let S=m.closestPointToPoint(b,!0,g),z=b.distanceTo(S);Math.abs(z-f)<.01&&(x++,d.has(w)?d.get(w).removePtsIndex.push(R):d.set(w,{index:w,removePtsIndex:[R]}))}if(p==E){o=T,r=y;break}if(x<u/20*19||x==0){d.clear(),E-p<5&&(o=T,r=y,h.clear());break}else{p++;for(let[w,P]of d)h.has(w)?h.get(w).removePtsIndex.push(...P.removePtsIndex):h.set(w,P);d.clear(),o=o.addScaledVector(i,l),r=r.addScaledVector(i,l),m.set(o,r)}}if(h.size>0&&p!=E)for(let[d,x]of h){let w=[],P=[];for(let R=0;R<c.checkResults[d].allCenterPoints.length;R++)x.removePtsIndex.includes(R)||(w.push(c.checkResults[d].allCenterPoints[R]),P.push(c.checkResults[d].originalVertices[R]));c.checkResults[d].allCenterPoints=w,c.checkResults[d].originalVertices=P}}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);f.checkResults=t.getLineCheckReultsById(r.id),f.originalPoints=t.getOriginalPointsById(r.id),r.originalPoints=f.originalPoints,r.checkResults=f.checkResults,r.checkResults.allCenterPoints=[],f=null;for(let D=0;D<r.checkResults.length;D++)for(let B=0;B<r.checkResults[D].originalVertices.length;B++){let _=pn(r.checkResults[D].originalVertices[B]);r.checkResults.allCenterPoints.push(_)}if(!r.checkResults||r.checkResults.length<=0)continue;if(r.checkResults[0].originalVertices&&r.checkResults[0].originalVertices.length>0){let D=r.checkResults[0].originalVertices[0],[B,_,k,v]=D;B=new O.Vector3(B.x,B.y,B.z),_=new O.Vector3(_.x,_.y,_.z),k=new O.Vector3(k.x,k.y,k.z),v=new O.Vector3(v.x,v.y,v.z),i=B.distanceTo(_),l=B.distanceTo(v);let A=new O.Vector3().subVectors(B,_).normalize(),j=Kt(A,new O.Vector3(0,0,1));j&&j.parallel&&([l,i]=[i,l])}if(i<0||l<0)continue;let u=new O.Vector3(r.start.x,r.start.y,r.start.z),E=new O.Vector3(r.end.x,r.end.y,r.end.z),a=u.distanceTo(E),c=r.rooftopPz-r.start.z,m=Math.ceil(a/i),h=Math.ceil(c/l),g=u.clone(),T=E.clone(),y=T.clone().add(new O.Vector3(0,0,c)),p=g.clone().add(new O.Vector3(0,0,c)),d=new O.Vector3().subVectors(T,g).normalize(),x=d.clone().negate(),P=new O.Vector3().subVectors(y,g).normalize().clone().negate(),R=i/2,b=l/2,S=a*c,z=i*l,V=S/z;s(g,p,d,i,R,h,m,V,r),s(T,y,x,i,R,h,m,V,r),r.start=g,r.end=T;let{newOriginalPoints:M}=tn(g,T,r.originalPoints);r.originalPoints=M,n.stageReplaceCheckResults(r.id,r.checkResults);let C=new dn().vector3ArrToFloat32Array(r.originalPoints);n.stageReplacePoints(r.id,C),r.checkResults=null,r.originalPoints=null}n.commit()},$t=(e,t)=>new O.Vector3(e.x,e.y,0).distanceTo(new O.Vector3(t.x,t.y,0)),In=(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},st=(e,t,n=.03)=>Math.abs(e.x-t.x)<n&&Math.abs(e.y-t.y)<n&&Math.abs(e.z-t.z)<n;var go=()=>{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 Ln=(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},yo=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(E,a,c){return t.clone().addScaledVector(r,E).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)]},An=(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 E=new O.Vector3(0,0,1),c=new O.Vector3().add(n).add(s).add(o).add(r).multiplyScalar(.25).clone().addScaledVector(E,t/2),m=new O.BoxGeometry(f,u,t),h=new O.Matrix4;return h.makeBasis(i,l,E),h.setPosition(c),m.applyMatrix4(h),m.computeVertexNormals(),m},pn=e=>{if(!e||e.length===0)return null;let t=new O.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};import*as Xt from"three";var Ws=(e,t)=>{console.log("lines",e);for(let n=0;n<e.length;n++){let s=e[n],o=[];s.originalPoints.forEach(d=>{let x=new Xt.Vector3(d.x,d.y,0),w=!1;for(let P=0;P<o.length;P++)if(st(x,o[P],.01)){w=!0;break}w||o.push(x)});let r=Math.round(Math.max(5,Math.min(350,20*Math.sqrt(s.length)))),i=1,l=new Xt.Vector3(s.start.x,s.start.y,s.start.z),f=new Xt.Vector3(s.end.x,s.end.y,s.end.z),u=new Xt.Vector3().subVectors(f,l).normalize(),E=u.clone().cross(new Xt.Vector3(0,0,1)).normalize(),a=E.clone().negate(),c=[],m=[],h=s.length/r;console.log(h);for(let d=0;d<r;d++){let x=[];x.push(l.clone().addScaledVector(E,i)),x.push(x[0].clone().addScaledVector(u,h)),x.push(x[1].clone().addScaledVector(a,i*2)),x.push(l.clone().addScaledVector(a,h));let w=[];for(let P=0;P<o.length;P++)c.includes(P)||qs(o[P],x)&&(c.push(P),w.push(o[P]));w.length>0&&m.push($s(w)),l=l.addScaledVector(u,h)}let g=new Float32Array(o.length*3);o.forEach((d,x)=>{g[x*3]=d.x,g[x*3+1]=d.y,g[x*3+2]=d.z});let T=new Xt.BufferGeometry;T.setAttribute("position",new Xt.BufferAttribute(g,3)),T.rotateX(-Math.PI/2),t.add(new Xt.Points(T,new Xt.PointsMaterial({color:go(),size:.02})));let[y,p]=Zs(m,{plane:"xy",trimRatio:0});uo(y,p,t)}};function Eo(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 js(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 qs(e,t,n="xy"){if(!t||t.length!==4)throw new Error("rectPoints must contain 4 points");let s=Eo(e,n),o=t.map(l=>Eo(l,n)),r=!1,i=!1;for(let l=0;l<4;l++){let f=o[l],u=o[(l+1)%4],E=js(f,u,s);if(E>1e-9&&(r=!0),E<-1e-9&&(i=!0),r&&i)return!1}return!0}function $s(e){if(!e||e.length===0)return null;let t=new Xt.Vector3(0,0,0);for(let n of e)Array.isArray(n)?(t.x+=n[0],t.y+=n[1],t.z+=n[2]):(t.x+=n.x,t.y+=n.y,t.z+=n.z);return t.divideScalar(e.length),t}function Xs(e){return e instanceof Xt.Vector3?e.clone():Array.isArray(e)?new Xt.Vector3(e[0],e[1],e[2]):new Xt.Vector3(e.x,e.y,e.z)}function Ys(e,t="xy"){let n=Xs(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 xo(e,t,n,s="xy"){if(s==="xy")return new Xt.Vector3(e,t,n);if(s==="xz")return new Xt.Vector3(e,n,t);if(s==="yz")return new Xt.Vector3(n,e,t);throw new Error(`Unsupported plane: ${s}`)}function Gs(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,E=Math.hypot(f,u);return E<1e-12?{x:1,y:0}:{x:f/E,y:u/E}}function Zs(e,t={}){let{plane:n="xy",trimRatio:s=0}=t;if(!e||e.length<2)return null;let o=e.map(_=>Ys(_,n)),r=0,i=0,l=0;for(let _ of o)r+=_.x,i+=_.y,l+=_.up;r/=o.length,i/=o.length,l/=o.length;let f=0,u=0,E=0;for(let _ of o){let k=_.x-r,v=_.y-i;f+=k*k,u+=k*v,E+=v*v}f/=o.length,u/=o.length,E/=o.length;let a=Gs(f,u,E),c={x:-a.y,y:a.x},m=[];for(let _ of o){let k=_.x-r,v=_.y-i,A=k*a.x+v*a.y,j=k*c.x+v*c.y;m.push({s:A,t:j,up:_.up})}m.sort((_,k)=>_.s-k.s);let h=m.length,g=Math.floor(h*s),T=Math.ceil(h*(1-s))-1;g=Math.max(0,Math.min(h-1,g)),T=Math.max(0,Math.min(h-1,T));let y=m[g],p=m[T],d=(()=>{let _=m.map(v=>v.t).sort((v,A)=>v-A),k=Math.floor(_.length/2);return _.length%2===0?(_[k-1]+_[k])*.5:_[k]})(),x=(()=>{let _=m.map(v=>v.up).sort((v,A)=>v-A),k=Math.floor(_.length/2);return _.length%2===0?(_[k-1]+_[k])*.5:_[k]})(),w=y.s,P=p.s,R=d,b=d,S=x,z=x,V=r+a.x*w+c.x*R,M=i+a.y*w+c.y*R,H=r+a.x*P+c.x*b,C=i+a.y*P+c.y*b,D=xo(V,M,S,n),B=xo(H,C,z,n);return[D,B]}import je from"path";import*as lt from"fs";import{fileURLToPath as Us}from"url";import{Vector3 as We}from"three";var Ks=Us(import.meta.url),nn=je.dirname(Ks),en=je.resolve(nn,"./data/lines.meta.json"),Fn=je.resolve(nn,"./data/lines.bin"),On=je.resolve(nn,"./data/checks.bin"),wo=je.resolve(nn,"./data/lines.new_points.bin"),Nn=je.resolve(nn,"./data/lines.exist_segments.bin");function To(e){let t=[],n=0,s=0,o=0,r=lt.openSync(Fn,"w"),i=lt.openSync(On,"w"),l=lt.openSync(Nn,"w");try{for(let u of e){let E=Buffer.alloc(u.originalPoints.length*12),a=new Float32Array(E.buffer,E.byteOffset);for(let h=0,g=0;h<u.originalPoints.length;h++,g+=3){let T=u.originalPoints[h];a[g]=T.x,a[g+1]=T.y,a[g+2]=T.z}lt.writeSync(r,E,0,E.length,n);let c=null;if(Array.isArray(u.checkResults)&&u.checkResults.length>0){let h=[];for(let g of u.checkResults){let T=bo(g);lt.writeSync(i,T,0,T.length,s),h.push({offset:s,byteLength:T.length,faceCount:g.originalVertices.length,centerCount:g.allCenterPoints.length}),s+=T.length}c={checkResults:h}}let m=null;if(Array.isArray(u.existSegments)&&u.existSegments.length>0){let h=[];for(let g of u.existSegments){let T=bo(cr);lt.writeSync(l,T,0,T.length,o),h.push({offset:o,byteLength:T.length,faceCount:g.originalVertices.length,centerCount:(g.allCenterPoints||[]).length}),o+=T.length}m={existSegments:h}}t.push({id:u.id,pointCount:u.originalPoints.length,offset:n,...c||{},...m||{},hasNewOriginalPoints:!1}),n+=E.length,u.originalPoints=null,u.checkResults=null,u.existSegments=null}lt.closeSync(r),lt.closeSync(i),lt.closeSync(l);let f=en+".tmp";lt.writeFileSync(f,JSON.stringify(t,null,2)),lt.renameSync(f,en),console.log("\u2705 writeFile \u5B8C\u6210\uFF08\u542B existSegments\uFF09")}catch(f){try{lt.closeSync(r)}catch{}try{lt.closeSync(i)}catch{}try{lt.closeSync(l)}catch{}throw f}}var gn=class{constructor(t){this.lineStates=new Map;for(let n of t)this.lineStates.set(n.id,n);this.meta=JSON.parse(lt.readFileSync(en,"utf-8")),this.fdRead=lt.openSync(Fn,"r"),this.checkFdRead=lt.openSync(On,"r"),this.existSegmentsFdRead=lt.existsSync(Nn)?lt.openSync(Nn,"r"):null,this.newPointsFdRead=lt.existsSync(wo)?lt.openSync(wo,"r"):null,this.fdWrite=lt.openSync(Fn,"a"),this.checkFdWrite=lt.openSync(On,"a"),this.dataEnd=lt.fstatSync(this.fdWrite).size,this.checkEnd=lt.fstatSync(this.checkFdWrite).size}readLine(t){let n=this.meta[t];if(!n)return null;let s=this.lineStates.get(n.id);if(!s)return null;let o=Buffer.alloc(n.pointCount*12);lt.readSync(this.fdRead,o,0,o.length,n.offset);let r=new Float32Array(o.buffer,o.byteOffset,n.pointCount*3),i=n.checkResults?n.checkResults.map(u=>this.createCheckResultView(u,"checkResults")):[],l=n.existSegments&&n.existSegments.length>0?n.existSegments.map(u=>this.createCheckResultView(u)):[],f=null;if(n.hasNewOriginalPoints&&this.newPointsFdRead&&typeof n.newPointsOffset=="number"&&n.newPointsCount>0){let u=Buffer.alloc(n.newPointsCount*12);lt.readSync(this.newPointsFdRead,u,0,u.length,n.newPointsOffset),f=new Float32Array(u.buffer,u.byteOffset,n.newPointsCount*3)}return{...s,originalPoints:r,checkResults:i,existSegments:l,new_originalPoints:f}}*iterate(){for(let t=0;t<this.meta.length;t++)yield this.readLine(t)}readLineById(t){let n=this.meta.find(u=>u.id===t);if(!n)return null;let s=this.lineStates.get(n.id);if(!s)return null;let o=Buffer.alloc(n.pointCount*12);lt.readSync(this.fdRead,o,0,o.length,n.offset);let r=new Float32Array(o.buffer,o.byteOffset,n.pointCount*3),i=n.checkResults?n.checkResults.map(u=>this.createCheckResultView(u,"checkResults")):[],l=n.existSegments&&n.existSegments.length>0?n.existSegments.map(u=>this.createCheckResultView(u)):[],f=null;if(n.hasNewOriginalPoints&&this.newPointsFdRead&&typeof n.newPointsOffset=="number"&&n.newPointsCount>0){let u=Buffer.alloc(n.newPointsCount*12);lt.readSync(this.newPointsFdRead,u,0,u.length,n.newPointsOffset),f=new Float32Array(u.buffer,u.byteOffset,n.newPointsCount*3)}return{...s,originalPoints:r,checkResults:i,existSegments:l,new_originalPoints:f}}getLineCheckReultsById(t){let n=this.meta.find(i=>i.id===t);if(!n)return[];if(!this.lineStates.get(n.id))return[];let o=n.checkResults?n.checkResults.map(i=>this.createCheckResultView(i,"checkResults")):[],r=[];for(let i of o){let l=[],f=[];for(let u=0;u<i.faceCount;u++){let E=i.getFace(u);l.push(E);let a=i.getCenter(u);f.push(a)}r.push({originalVertices:l,allCenterPoints:f})}return r}getLineExistSegmentsById(t){let n=this.meta.find(f=>f.id===t);if(!n)return[];if(!this.lineStates.get(n.id))return[];let o=Buffer.alloc(n.pointCount*12);lt.readSync(this.fdRead,o,0,o.length,n.offset);let r=new Float32Array(o.buffer,o.byteOffset,n.pointCount*3),i=n.existSegments&&n.existSegments.length>0?n.existSegments.map(f=>this.createCheckResultView(f)):[],l=[];for(let f of i){let u=[],E=[];for(let a=0;a<f.faceCount;a++){let c=f.getFace(a);u.push(c);let m=f.getCenter(a);E.push(m)}l.push({originalVertices:u,allCenterPoints:E})}return l}getOriginalPointsById(t){let n=this.meta.find(f=>f.id===t);if(!n||!this.lineStates.get(n.id))return null;let o=Buffer.alloc(n.pointCount*12);lt.readSync(this.fdRead,o,0,o.length,n.offset);let r=new Float32Array(o.buffer,o.byteOffset,n.pointCount*3),i=[],l=r;for(let f=0;f<l.length;f+=3)i.push(new We(l[f],l[f+1],l[f+2]));return i}replaceOriginalPoints(t,n){let s=this.meta.find(l=>l.id===t);if(!s)throw new Error(`line ${t} not found`);let o=Buffer.alloc(n.length*12);new Float32Array(o.buffer,o.byteOffset).set(n);let i=this.dataEnd;lt.writeSync(this.fdWrite,o,0,o.length,i),this.dataEnd+=o.length,s.pointCount=n.length/3,s.offset=i}replaceAllCheckResults(t,n){let s=this.meta.find(u=>u.id===t);if(!s)throw new Error(`line ${t} not found`);let o=[],r=0,i=n.map(u=>{let E=Js(u.originalVertices,u.allCenterPoints||[]);return r+=E.length,E}),f=this.checkEnd;for(let u=0;u<i.length;u++){let E=i[u];lt.writeSync(this.checkFdWrite,E,0,E.length,f),o.push({offset:f,byteLength:E.length,faceCount:n[u].originalVertices.length,centerCount:(n[u].allCenterPoints||[]).length}),f+=E.length}this.checkEnd+=r,s.checkResults=o}flushMeta(){let t=en+".tmp";lt.writeFileSync(t,JSON.stringify(this.meta,null,2)),lt.renameSync(t,en)}createCheckResultView(t,n){let s=null,o=null,r=()=>{if(s)return;s=Buffer.alloc(t.byteLength);let f=n==="checkResults"?this.checkFdRead:this.existSegmentsFdRead;lt.readSync(f,s,0,t.byteLength,t.offset),o=new Float32Array(s.buffer,s.byteOffset)},i=f=>f*12,l=f=>t.faceCount*12+f*3;return{getFace(f){r();let u=i(f);return[new We(o[u],o[u+1],o[u+2]),new We(o[u+3],o[u+4],o[u+5]),new We(o[u+6],o[u+7],o[u+8]),new We(o[u+9],o[u+10],o[u+11])]},getCenter(f){r();let u=l(f);return new We(o[u],o[u+1],o[u+2])},faceCount:t.faceCount,centerCount:t.centerCount}}close(){lt.closeSync(this.fdRead),lt.closeSync(this.checkFdRead),this.existSegmentsFdRead&&lt.closeSync(this.existSegmentsFdRead),this.newPointsFdRead&&lt.closeSync(this.newPointsFdRead),lt.closeSync(this.fdWrite),lt.closeSync(this.checkFdWrite),this.lineStates.clear()}};function bo(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 Js(e,t){let n=e.length*4*3+t.length*3,s=Buffer.alloc(n*4),o=new Float32Array(s.buffer,s.byteOffset),r=0;for(let i of e)for(let l of i)o[r++]=l.x,o[r++]=l.y,o[r++]=l.z;for(let i of t)o[r++]=i.x,o[r++]=i.y,o[r++]=i.z;return s}import{randomUUID as Qs}from"crypto";function tr(e){for(let t of e)t.id=Qs()}var er=async(e,t,n,s,o)=>{if(po(e,s,o),e.length<=0||t.length<=0)return e;n||(n=[]);for(let y of e){let p=[],d=s.readLineById(y.id);if(d.checkResults=s.getLineCheckReultsById(y.id),y.checkResults=d.checkResults,!(!y.checkResults||y.checkResults.length<=0)){for(let x=0;x<y.checkResults.length;x++){let S=function(C){for(;b[C]!==C;)b[C]=b[b[C]],C=b[C];return C},w=y.checkResults[x];if(!w.originalVertices||w.originalVertices.length==0)continue;let P=[];w.originalVertices.forEach(C=>{let D=[];C.forEach(B=>{D.push(new I.Vector3(B.x,B.y,B.z))}),P.push(D)});let R=P.length,b=Array.from({length:R},(C,D)=>D);for(let C=0;C<R;C++)for(let D=C+1;D<R;D++){let B=P[C],_=P[D];if(B.some(v=>_.some(A=>v.equals(A)))){let v=S(C),A=S(D);v!==A&&(b[v]=A)}}let z=new Map,V=-1,M=-1;for(let C=0;C<R;C++){let D=S(C);z.has(D)||z.set(D,{points:[],area:0,index:-1,gridWidth:-1,gridHeight:-1,centerPts:[],facePoints:[],boxArea:-1,totalInPlaneNum:-1});let B=z.get(D),[_,k,v,A]=P[C],j=new I.Vector3().add(_).add(k).add(v).add(A).multiplyScalar(.25);if(B.points.push(...P[C]),B.area+=_.distanceTo(k)*_.distanceTo(A),B.index=x,B.centerPts.push(j),V==-1||M==-1){let $=new I.Vector3().subVectors(_,k).normalize();M=_.distanceTo(A),V=_.distanceTo(k);let Z=Kt($,new I.Vector3(0,0,1));Z&&Z.parallel&&([M,V]=[V,M])}B.gridWidth=V,B.gridHeight=M}let H=z.values();for(let C of z.values()){let{facePoints:D,boxArea:B,totalInPlaneNum:_}=mo(C.points,C.gridWidth,C.gridHeight,C.centerPts);C.centerPts=null,C.facePoints=D,C.boxArea=B,C.totalInPlaneNum=_}p.push(...H)}y.checkResults=null,y.mergeCheckRegion=p}}let r=[];for(let y=0;y<n.length;y++){let p=n[y];if(p.isFindBeam=!1,p.category=="door"){let d=[];p.coordinatesByArea.coordinates.forEach(b=>{d.push(new I.Vector3(b.x,b.y,b.z))}),d[0].equals(d[d.length-1])&&d.pop();let x=d[0].distanceTo(d[1]),w=d[0].distanceTo(d[3]);w>x&&([x,w]=[w,x],d=[d[0],d[3],d[2],d[1]]);let P=qt(d[0],d[3],!0),R=qt(d[1],d[2],!0);r.push({doorStartPt:P,doorEndPt:R,boxPoints:d,minZ:p.coordinatesByArea.heightData.minZ,maxZ:p.coordinatesByArea.heightData.maxZ,index:y,isFind:!1,inWall:!1})}}for(let y=0;y<r.length;y++){let p=r[y];for(let d=0;d<e.length;d++){if(e[d].length<.5)continue;let x=[],w=qt(e[d].start,e[d].end,!0);x.push(w),x.push(qt(w,e[d].start,!0)),x.push(qt(w,e[d].end,!0));let P=!1,R=p.boxPoints.length;for(let b=0;b<x.length;b++){let S=x[b].x,z=x[b].y;for(let V=0,M=R-1;V<R;M=V++){let H=p.boxPoints[V].x,C=p.boxPoints[V].y,D=p.boxPoints[M].x,B=p.boxPoints[M].y;C>z!=B>z&&S<(D-H)*(z-C)/(B-C)+H&&(P=!P)}if(P)break}if(P){let b=new I.Vector3(e[d].start.x,e[d].start.y,0),S=new I.Vector3(e[d].end.x,e[d].end.y,0),z=p.doorStartPt.distanceTo(p.doorEndPt),V=b.distanceTo(S),M=Yt(p.doorStartPt,p.doorEndPt,b,S);if(Math.abs(V-z)<.5&&M&&M.angleDeg<15){p.doorStartPt=new I.Vector3(e[d].start.x,e[d].start.y,0),p.doorEndPt=new I.Vector3(e[d].end.x,e[d].end.y,0);break}else if(Math.abs(V-z)>1.3&&M&&M.angleDeg<15){let H=ye(p.doorStartPt,p.doorEndPt,b,S,{parallelAngleMax:I.MathUtils.degToRad(15)}),C=p.doorStartPt.distanceTo(b),D=p.doorStartPt.distanceTo(S),B=p.doorEndPt.distanceTo(b),_=p.doorEndPt.distanceTo(S),k=C<.2||D<.2||B<.2||_<.2;if(H&&H.type=="collinear_overlap"&&H.maxPerpendicularDistance<.1&&!k){p.inWall=!0;break}else{let v=new I.Line3(b,S),A=v.closestPointToPoint(p.doorStartPt,!0,new I.Vector3),j=v.closestPointToPoint(p.doorEndPt,!0,new I.Vector3),$=A.distanceTo(p.doorStartPt),Z=j.distanceTo(p.doorEndPt);if($<.1||Z<.1){p.inWall=!0;break}}}}else continue}}let i=0,l=[],f=[],u=[],E=[],a=.15;for(let y=0;y<e.length;y++){let p=e[y];if(p.noDetection)continue;let d=s.readLineById(p.id);if(d.originalPoints=s.getOriginalPointsById(p.id),d.checkResults=s.getLineCheckReultsById(p.id),p.originalPoints=d.originalPoints,p.checkResults=d.checkResults,d=null,p.doorAndBeamData=[],p.doorAndBeamIdToCheckResults=[],!p.mergeCheckRegion||p.mergeCheckRegion.length==0)continue;p.completePointAreaPercentage=-1;let x=new I.Box3;x.setFromPoints(p.originalPoints);let w=x.max.z,P=x.min.z,R=new I.Vector3(p.start.x,p.start.y,p.start.z),b=new I.Vector3(p.end.x,p.end.y,p.end.z),S=p.rooftopPz-p.start.z,z=0;for(let M of p.mergeCheckRegion){let H=M.facePoints,C=M.boxArea,D=M.totalInPlaneNum;if(!H||H.length<=0)continue;let B=H[0].distanceTo(H[1]),_=H[0].distanceTo(H[3]),k=M.gridHeight*(_/M.gridHeight/3*2)+M.gridHeight/2,v=new I.Vector3(H[0].x,H[0].y,H[0].z+k),A=new I.Vector3(H[1].x,H[1].y,H[1].z+k),j=new I.Line3(v,A),$=[],Z=new I.Vector3;M.points.forEach(q=>{j.closestPointToPoint(q,!0,Z).distanceTo(q)<M.gridHeight+.01&&$.push(q)});let Y=[],tt=[];for(;;){let q=[];for(let W=0;W<$.length;W++)tt.includes(W)||q.length==0&&(q.push($[W]),tt.push(W));for(let W=0;W<$.length;W++)if(!tt.includes(W)){for(let U=0;U<q.length;U++)if($[W].distanceTo(q[U])<M.gridWidth+.01){q.push($[W]),tt.push(W),W=-1;break}}if(q.length==0)break;Y.push(q)}let it=[];for(let q=0;q<Y.length;q++){let W={lineSt:new I.Vector3,lineEd:new I.Vector3,facePoints:[]},U=Ne(Y[q]);Array.isArray(U)&&U.length==2&&(W.lineSt=U[0],W.lineEd=U[1],W.facePoints.push(new I.Vector3(U[0].x,U[0].y,H[0].z)),W.facePoints.push(new I.Vector3(U[1].x,U[1].y,H[0].z)),W.facePoints.push(new I.Vector3(U[1].x,U[1].y,H[2].z)),W.facePoints.push(new I.Vector3(U[0].x,U[0].y,H[2].z)),it.push(W))}z+=M.area;let ct=0;if(D!=0&&(ct=M.gridHeight*M.gridWidth*D),(M.area-ct)/C*100>70&&it.length==1||it.length>1)for(let q=0;q<it.length;q++){let W=it[q],U=W.facePoints[0].distanceTo(W.facePoints[1]),wt=W.facePoints[0].distanceTo(W.facePoints[3]),Ft=U/p.length*100,Nt=p.rooftopPz-W.facePoints[2].z;if(wt<1.5||w<W.facePoints[2].z||Nt>S/3*2)continue;let jt=!1,Lt=!1,Pt=!1,It=new I.Vector3(0,0,0),Rt=new I.Vector3(0,0,0),bt=!1,_t=[],J=W.facePoints[2].clone(),ft=W.facePoints[3].clone(),Q=W.facePoints[0].clone(),K=W.facePoints[1].clone(),he=!1,Et=-1;if(Math.abs(W.facePoints[0].z-p.start.z)<.25){let re=!1;for(let et=0;et<t.length;et++){let Mt=et+1;if(Mt>=t.length)continue;let Ot=new I.Vector3(t[et].x,t[et].y,t[et].z),nt=new I.Vector3(t[Mt].x,t[Mt].y,t[Mt].z);if(xe(new I.Vector3(Ot.x,Ot.y,0),new I.Vector3(nt.x,nt.y,0),new I.Vector3(W.facePoints[0].x,W.facePoints[0].y,0),new I.Vector3(W.facePoints[1].x,W.facePoints[1].y,0),.1)!=null){re=!0;break}}let{newOriginalPoints:Te}=tn(Q,K,p.originalPoints),St=[],ie=[];if(Te.forEach(et=>{et.z>=J.z?St.push(et):et.z<=Q.z&&ie.push(et)}),St.length<20)continue;let G=p.rooftopPz-J.z,de=J.clone();de.z+=G;let Be=J.distanceTo(ft),_e=new I.Vector3().subVectors(ft,J).normalize(),Ue=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(Be)))),ke=Be/Ue,me=[],Fe=[];for(let et=0;et<Ue;et++)me.push(new I.Vector3(J.x,J.y,J.z+G/5).addScaledVector(_e,ke*et)),me.push(new I.Vector3(de.x,de.y,de.z-G/5).addScaledVector(_e,ke*et));let Oe=me.length;for(let et=0;et<St.length;et++)for(let Mt=0;Mt<me.length;Mt++)if(new I.Vector3(St[et].x,St[et].y,St[et].z).distanceTo(me[Mt])<.05){Fe.push(me[Mt]),me.splice(Mt,1);break}if(Fe.length/Oe<.5)continue;if(U>.17&&p.length>.5){let et=$t(R,Q),Mt=$t(R,K),Ot=$t(b,Q),nt=$t(b,K),L=.15,xt=10;if(et<L||Mt<L)if(St.length>10){let gt=new I.Vector3(p.start.x,p.start.y,0),rt=new I.Vector3(p.end.x,p.end.y,0),dt=new I.Vector3().subVectors(gt,rt).normalize(),Ct=new I.Vector3,mt=1/0,At=-1,pt=!1,at=!1;for(let X=0;X<e.length;X++){if(X==y)continue;let ht=new I.Vector3(e[X].start.x,e[X].start.y,0),ot=new I.Vector3(e[X].end.x,e[X].end.y,0),zt=xe(gt,rt,ht,ot,.1),vt=se(gt,rt,ht,ot);if(zt!=null){if(vt&&vt.angle>85){let Ht=zt.point.distanceTo(gt),kt=zt.point.distanceTo(rt);if(Ht<.3){at=!0,mt=1/0,At=-1;break}}continue}if(vt&&vt.angle>85){let kt=new I.Line3(ht,ot).closestPointToPoint(gt,!0,Ct),Dt=Yt(gt,rt,kt,gt);if(!Dt||Dt.direction!="same")continue;let ne=gt.clone().addScaledVector(dt,xt),Ut=rt.clone().addScaledVector(dt.clone().negate(),xt),oe=new I.Vector3().subVectors(ot,ht).normalize(),Qt=ht.clone().addScaledVector(oe.clone().negate(),.03),Pe=ot.clone().addScaledVector(oe,.03),le=xe(ne,Ut,Qt,Pe);if(le==null)continue;let te=gt.distanceTo(le.point);te<mt&&(mt=te,At=X)}else if(vt&&vt.angle<5){let Ht=new I.Vector3(Q.x,Q.y,0),kt=new I.Vector3(K.x,K.y,0),Dt=$t(Ht,ht),ne=$t(Ht,ot),Ut=$t(kt,ht),oe=$t(kt,ot),Qt=Yt(gt,rt,ht,Ht),Pe=!1,le=s.readLineById(e[X].id);if(le.checkResults=s.getLineCheckReultsById(e[X].id),e[X].checkResults=le.checkResults,le=null,e[X].checkResults){for(let te=0;te<e[X].checkResults.length;te++){let Je=[];for(let ge=0;ge<e[X].checkResults[te].originalVertices.length;ge++){let Re=pn(e[X].checkResults[te].originalVertices[ge]);Re.z=0,Je.push(Re)}let pe=Ne(Je);if(pe.length==2){let ge=$t(Ht,pe[0]),Re=$t(Ht,pe[1]),Bn=$t(kt,pe[0]),_n=$t(kt,pe[1]);if(ge<.2||Re<.2||Bn<.2||_n<.2){Pe=!0;break}}}e[X].checkResults=null}if(Qt&&Qt.direction=="same"&&!Pe&&(Dt<.1||ne<.1||Ut<.1||oe<.1)){pt=!0,mt=1/0,At=-1;break}}}if(mt!=1/0&&mt<2&&(p.length-U>.2||p.length-U<.02)&&mt<U*2)e[At].length>.25&&U+mt>.5&&(he=!0,et<L?(ft=ft.addScaledVector(dt,mt),Q=Q.addScaledVector(dt,mt)):(J=J.addScaledVector(dt,mt),K=K.addScaledVector(dt,mt)));else{if(!pt&&!at&&p.length-U>.1)continue;if(!pt&&!at&&p.length-U<.1&&p.length<1.8)continue}}else continue;if(Ot<L||nt<L)if(St.length>10){let gt=new I.Vector3(p.start.x,p.start.y,0),rt=new I.Vector3(p.end.x,p.end.y,0),dt=new I.Vector3().subVectors(rt,gt).normalize(),Ct=new I.Vector3,mt=1/0,At=-1,pt=!1,at=!1;for(let X=0;X<e.length;X++){if(X==y)continue;let ht=new I.Vector3(e[X].start.x,e[X].start.y,0),ot=new I.Vector3(e[X].end.x,e[X].end.y,0),zt=xe(gt,rt,ht,ot,.03),vt=se(gt,rt,ht,ot);if(zt!=null){if(vt&&vt.angle>85){let Ht=zt.point.distanceTo(gt);if(zt.point.distanceTo(rt)<.3){at=!0,mt=1/0,At=-1;break}}continue}if(vt&&vt.angle>85){let kt=new I.Line3(ht,ot).closestPointToPoint(rt,!0,Ct),Dt=Yt(rt,gt,kt,rt);if(!Dt||Dt.direction!="same")continue;let ne=gt.clone().addScaledVector(dt.clone().negate(),xt),Ut=rt.clone().addScaledVector(dt,xt),oe=new I.Vector3().subVectors(ot,ht).normalize(),Qt=ht.clone().addScaledVector(oe.clone().negate(),.03),Pe=ot.clone().addScaledVector(oe,.03),le=xe(ne,Ut,Qt,Pe);if(le==null)continue;let te=rt.distanceTo(le.point);te<mt&&(mt=te,At=X)}else if(vt&&vt.angle<5){let Ht=new I.Vector3(Q.x,Q.y,0),kt=new I.Vector3(K.x,K.y,0),Dt=$t(Ht,ht),ne=$t(Ht,ot),Ut=$t(kt,ht),oe=$t(kt,ot),Qt=Yt(rt,gt,ht,Ht),Pe=!1,le=s.readLineById(e[X].id);if(le.checkResults=s.getLineCheckReultsById(e[X].id),e[X].checkResults=le.checkResults,le=null,e[X].checkResults){for(let te=0;te<e[X].checkResults.length;te++){let Je=[];for(let ge=0;ge<e[X].checkResults[te].originalVertices.length;ge++){let Re=pn(e[X].checkResults[te].originalVertices[ge]);Re.z=0,Je.push(Re)}let pe=Ne(Je);if(pe.length==2){let ge=$t(Ht,pe[0]),Re=$t(Ht,pe[1]),Bn=$t(kt,pe[0]),_n=$t(kt,pe[1]);if(ge<.2||Re<.2||Bn<.2||_n<.2){Pe=!0;break}}}e[X].checkResults=null}if(Qt&&Qt.direction=="same"&&!Pe&&(Dt<.1||ne<.1||Ut<.1||oe<.1)){pt=!0,mt=1/0,At=-1;break}}}if(mt!=1/0&&mt<2&&(p.length-U>.2||p.length-U<.02)&&mt<U*2)e[At].length>.25&&U+mt>.5&&(he=!0,Ot<L?(ft=ft.addScaledVector(dt,mt),Q=Q.addScaledVector(dt,mt)):(J=J.addScaledVector(dt,mt),K=K.addScaledVector(dt,mt)));else{if(!pt&&!at&&p.length-U>.1)continue;if(!pt&&!at&&p.length-U<.1&&p.length<1.8)continue}}else continue;U=ft.distanceTo(J)}if(Ft<85&&U>.3||U>.7&&wt>S-S/2){if(!p.isLine2){if(U<3.5)for(let et=0;et<r.length;et++){let Mt=new I.Vector3(r[et].doorStartPt.x,r[et].doorStartPt.y,0),Ot=new I.Vector3(r[et].doorEndPt.x,r[et].doorEndPt.y,0),nt=new I.Vector3(W.facePoints[0].x,W.facePoints[0].y,0),L=new I.Vector3(W.facePoints[1].x,W.facePoints[1].y,0),xt=W.facePoints[2].z<r[et].maxZ||Math.abs(W.facePoints[2].z-r[et].maxZ)<.3,gt=Math.abs(W.facePoints[2].z-r[et].maxZ)>.2;if(xt){let rt=ye(Mt.clone(),Ot.clone(),nt.clone(),L.clone(),{distanceThreshold:2});if(rt&&rt.type=="collinear_gap"){let dt=qt(Mt,Ot),Ct=new I.Line3(new I.Vector3(p.start.x,p.start.y,0),new I.Vector3(p.end.x,p.end.y,0)),mt=new I.Vector3,At=Ct.closestPointToPoint(dt,!0,mt);if(dt.distanceTo(At)<.15){let at=nt.distanceTo(Mt),X=L.distanceTo(Mt);if(at>.25&&X>.25){let zt=nt.distanceTo(Ot),vt=L.distanceTo(Ot);if(zt>.2&&vt>.2)continue}Lt=!0,bt=!0,_t.push(r[et].index),r[et].isFind=!0,Et=et,Pt=n[r[et].index].isFindBeam,n[r[et].index].isFindBeam=!0;let ht=new I.Vector3().subVectors(nt,L).normalize(),ot=Mt.distanceTo(Ot)-rt.overlap;X<at&&ht.negate(),at>X?(J=W.facePoints[2].clone().addScaledVector(ht,ot),ft=W.facePoints[3].clone(),Q=ft.clone(),K=J.clone(),Q.z=K.z=W.facePoints[0].z):(J=W.facePoints[2].clone(),ft=W.facePoints[3].clone().addScaledVector(ht,ot),Q=ft.clone(),K=J.clone(),Q.z=K.z=W.facePoints[0].z)}}else if(rt&&rt.type=="collinear_overlap"&&rt.maxPerpendicularDistance<.35){let dt=nt.distanceTo(L),Ct=Ot.distanceTo(Mt);if(Math.abs(dt-rt.overlap)<.25||Math.abs(Ct-rt.overlap)<.25){if(Ct>dt&&Math.abs(Ct-rt.overlap)>1){let mt=nt.distanceTo(Mt),At=nt.distanceTo(Ot),pt=L.distanceTo(Mt),at=L.distanceTo(Ot),X=mt<At?mt:At,ht=pt<at?pt:at,ot=new I.Vector3().subVectors(nt,L).normalize(),zt=Ct-rt.overlap;X<ht?(ot.negate(),J=W.facePoints[2].clone().addScaledVector(ot,zt),ft=W.facePoints[3].clone(),Q=ft.clone(),K=J.clone(),Q.z=K.z=W.facePoints[0].z):(J=W.facePoints[2].clone(),ft=W.facePoints[3].clone().addScaledVector(ot,zt),Q=ft.clone(),K=J.clone(),Q.z=K.z=W.facePoints[0].z)}U>1.5&&(Lt=!0,bt=!0,_t.push(r[et].index),r[et].isFind=!0,Pt=n[r[et].index].isFindBeam,n[r[et].index].isFindBeam=!0,Et=et)}}}}if(!bt&&U<1.5)for(let et=0;et<r.length;et++){if(r[et].inWall)continue;let Mt=new I.Vector3(r[et].doorStartPt.x,r[et].doorStartPt.y,0),Ot=new I.Vector3(r[et].doorEndPt.x,r[et].doorEndPt.y,0),nt=new I.Vector3(ft.x,ft.y,0),L=new I.Vector3(J.x,J.y,0),xt=new I.Vector3().subVectors(Mt,Ot).normalize(),gt=new I.Vector3().subVectors(nt,L).normalize(),rt=.25,dt=Mt.clone().addScaledVector(xt,rt),Ct=Ot.clone().addScaledVector(xt.clone().negate(),rt),mt=nt.clone().addScaledVector(gt,rt),At=L.clone().addScaledVector(gt.clone().negate(),rt);if(Yt(dt,Ct,mt,At).isParallel)continue;let at=xe(dt,Ct,mt,At),X=!0,ht=Mt.distanceTo(nt),ot=Mt.distanceTo(L),zt=Ot.distanceTo(nt),vt=Ot.distanceTo(L);if((ht<a||ot<a||zt<a||vt<a||at)&&X){let kt=new I.Line3(nt,L);if(ht<a||zt<a)if(It=nt.clone(),ht<a){let Dt=kt.closestPointToPoint(Ot,!1,new I.Vector3);Rt=new I.Vector3().subVectors(Ot,Dt).normalize()}else{let Dt=kt.closestPointToPoint(Mt,!1,new I.Vector3);Rt=new I.Vector3().subVectors(Mt,Dt).normalize()}else if(ot<a||vt<a)if(It=L.clone(),ot<a){let Dt=kt.closestPointToPoint(Ot,!1,new I.Vector3);Rt=new I.Vector3().subVectors(Ot,Dt).normalize()}else{let Dt=kt.closestPointToPoint(Mt,!1,new I.Vector3);Rt=new I.Vector3().subVectors(Mt,Dt).normalize()}else if(at){let Dt=at.point.distanceTo(nt),ne=at.point.distanceTo(L),Ut=at.point.distanceTo(dt),oe=at.point.distanceTo(Ct);if(Dt<ne?It=nt.clone():It=L.clone(),Ut<oe){let Qt=kt.closestPointToPoint(Ct,!1,new I.Vector3);Rt=new I.Vector3().subVectors(Ct,Qt).normalize()}else{let Qt=kt.closestPointToPoint(dt,!1,new I.Vector3);Rt=new I.Vector3().subVectors(dt,Qt).normalize()}}Pt=n[r[et].index].isFindBeam,n[r[et].index].isFindBeam=!0,Lt=!0,r[et].isFind=!0,Et=et}}}(Lt||re||Math.abs(wt-S)>.1&&wt>S/3&&U>.3)&&(jt=!0)}}if(jt){{let nt=new I.Vector3().subVectors(Q,K),L=new I.Vector3().subVectors(K,Q),xt=1/0,gt=1/0,rt=Q.clone(),dt=K.clone(),Ct=[],mt=[],At=new I.Line3(J,ft),pt=new I.Vector3,at=999999;if(p.originalPoints.forEach(X=>{if(X.z-Q.z<wt/2+.1&&X.z-Q.z>wt/2-.1&&Ct.push(X),X.z>J.z){let ht=At.closestPointToPoint(X,!0,pt),ot=new I.Vector3().subVectors(ht,J),zt=new I.Vector3().subVectors(ht,ft),vt=Kt(nt,zt),Ht=Kt(L,ot);vt&&vt.parallel&&!vt.sameDirection&&Ht&&Ht.parallel&&!Ht.sameDirection&&mt.push(X)}}),Ct.length>0){let{newProjectPoints:X}=tn(Q,K,Ct);for(let ht of X)ht.z=Q.z;X.forEach(ht=>{let ot=new I.Vector3(ht.x,ht.y,Q.z),zt=new I.Vector3().subVectors(ot,K),vt=new I.Vector3().subVectors(ot,Q),Ht=Kt(nt,vt),kt=Kt(L,zt);if(Ht&&Ht.parallel&&Ht.sameDirection){let Dt=ot.distanceTo(Q);Dt<xt&&(xt=Dt,rt=ot)}else if(kt&&kt.parallel&&kt.sameDirection){let Dt=ot.distanceTo(K);Dt<gt&&(gt=Dt,dt=ot)}})}if(rt.equals(Q)||(Q=rt,ft=new I.Vector3(Q.x,Q.y,ft.z)),dt.equals(K)||(K=dt,J=new I.Vector3(K.x,K.y,J.z)),mt.length>10){let{newOnLinePoints:X}=tn(ft,J,mt);for(let ht=0;ht<X.length;ht++){let zt=At.closestPointToPoint(X[ht],!0,pt).distanceTo(X[ht]);zt>.02&&at>zt&&(at=zt)}J.z+=at,ft.z+=at,wt+=at}}let re=!1;for(let nt=0;nt<u.length;nt++){let L=ye(u[nt].start,u[nt].end,Q,K);L&&L.type=="collinear_overlap"&&L.maxPerpendicularDistance<.07&&(re=!0)}if(re){Et!=-1&&(Pt||(n[r[Et].index].isFindBeam=!1,r[Et].isFind=!1));continue}let Te=K.distanceTo(Q);if(Te<.4&&!Lt||Te<.3&&Lt)continue;f.includes(y)||f.push(y);let St="",ie=Lt?"singleDoor":"";ie=bt?"pullOutDoor":ie;let G={id:i,beamStart:J,beamEnd:ft,beamHeight:p.rooftopPz-J.z,doorStart:Q,doorEnd:K,doorHeight:wt,nearId:-1,type:St,isExtend:he,isDoor:Lt,isPullOutDoor:bt,pcbDoorIndexs:_t,beamNearWallVec:new I.Vector3(0,0,0),doorType:ie,doorOpenEndPoint:It,doorOpenVector:Rt,lineIsOnlyBeam:!1};if(G.beamHeight<.1)continue;let de=1/0,Be=!1,_e=new I.Vector3,Ue=new I.Vector3,ke=-1,me=-1,Fe=-1,Oe=!1,Ke=!1;if(!Be){let nt=new I.Line3(Q.clone(),K.clone()),L=-1;for(let xt=0;xt<e.length;xt++){if(e[xt].length<.5||xt==y)continue;let gt=new I.Vector3(e[xt].start.x,e[xt].start.y,e[xt].start.z),rt=new I.Vector3(e[xt].end.x,e[xt].end.y,e[xt].end.z),dt=ye(gt,rt,Q,K),Ct=Yt(gt,rt,Q,K);if(dt&&dt.maxPerpendicularDistance<.5){if(Ct&&Ct.isParallel){let ot=new I.Line3(gt,rt),zt=new I.Vector3(Q.x,Q.y,gt.z),vt=ot.closestPointToPoint(zt,!0,new I.Vector3),Ht=se(vt,zt,Q,K);Ht&&Ht.angle>85&&(G.beamNearWallVec=new I.Vector3().subVectors(vt,zt).normalize(),G.beamStart.z>e[xt].rooftopPz-.03&&U>1?Ke=!0:Ke=!1)}let mt=[],At=s.readLineById(e[xt].id);At.originalPoints=s.getOriginalPointsById(e[xt].id),e[xt].originalPoints=At.originalPoints,At=null,e[xt].originalPoints.forEach(ot=>{ot.z>Q.z+.2&&ot.z<Q.z+wt/2&&mt.push(new I.Vector3(ot.x,ot.y,Q.z))}),e[xt].originalPoints=null;let pt=new I.Vector3,at=[],X=[];for(let ot=0;ot<mt.length;ot++){let zt=nt.closestPointToPoint(mt[ot],!0,pt);zt.distanceTo(mt[ot])<.15&&(at.push(mt[ot]),X.push(zt.clone()))}for(let ot=0;ot<X.length;ot++)In(nt,X[ot])&&at.push(X[ot]);if(at=X,at=Ln(at),at.length<150)continue;let ht=Ne(at);if(ht.length==2){let ot=ht[0].distanceTo(ht[1]);if(Math.abs(ot-nt.distance())<.3){L=dt.maxPerpendicularDistance;let zt=new I.Line3(gt,rt),vt=new I.Vector3(Q.x,Q.y,gt.z),Ht=zt.closestPointToPoint(vt,!0,new I.Vector3);if(G.beamNearWallVec=new I.Vector3().subVectors(Ht,vt).normalize(),G.beamStart.z>e[xt].rooftopPz-.03&&U>1)Ke=!0,Oe=!0;else if(re=!0,Et!=-1&&(Pt||(n[r[Et].index].isFindBeam=!1,r[Et].isFind=!1)),me!=-1&&Fe!=-1){let kt=e[me].doorAndBeamData[Fe];kt.nearId=-1}break}}if(re)break}else dt&&dt.type=="collinear_overlap"&&dt.maxPerpendicularDistance>.3&&dt.maxPerpendicularDistance<.7&&(Oe=!0)}if(re){if(U<1.5||L<.08)continue;Oe=!0}}let et=!1;if(ke!=-1)for(let nt=0;nt<E.length&&!(E[nt].length==1&&(E[nt][0].id==i?(E[nt].push({id:ke,beamStart:_e,beamEnd:Ue}),et=!0):E[nt][0].id==ke&&(E[nt].push({id:i,beamStart:J,beamEnd:ft}),et=!0),et));nt++);et||E.push([{id:i,beamStart:J,beamEnd:ft}]);let Mt=G.doorStart.distanceTo(G.doorEnd),Ot=mn(p.originalPoints);if(G.lineIsOnlyBeam=Ot.minZ>p.start.z&&Ot.minZ-p.start.z>1,Lt?St="door":Mt>1.5||he?St="beam":St=Oe&&Mt>1?"beam":"hole",St!="beam"&&e[y].isLine2)continue;G.type=St,G.wallBelowBeam=Ke;for(let nt=0;nt<l.length;nt++){let L=e[l[nt].linesIndex].doorAndBeamData[l[nt].doorIndex];if(L.nearId!=-1||G.type=="beam"&&L.type!="beam"||G.type!="beam"&&L.type=="beam")continue;let xt=Yt(J.clone(),ft.clone(),L.beamStart.clone(),L.beamEnd.clone());if(xt&&xt.isParallel){let gt=J.distanceTo(ft),rt=L.beamStart.distanceTo(L.beamEnd),dt=new I.Line3(J.clone(),ft.clone());dt.start.z=0,dt.end.z=0;let Ct=qt(L.beamStart,L.beamEnd,!0);rt>gt&&(dt.start=new I.Vector3(L.beamStart.x,L.beamStart.y,0),dt.end=new I.Vector3(L.beamEnd.x,L.beamEnd.y,0),Ct=qt(J,ft,!0));let mt=new I.Vector3,At=dt.closestPointToPoint(Ct,!0,mt),pt=At.distanceTo(Ct),at=new I.Vector3().subVectors(Ct,At).normalize(),X=at.clone().negate(),ht=Ct.clone().addScaledVector(X,pt+.1),ot=xe(dt.start,dt.end,Ct,ht),zt=!Lt&&!L.isDoor&&(gt>rt*2||rt>gt*2);if(pt<.4&&ot!=null&&!zt){let vt=!1;for(let Ut=0;Ut<p.doorAndBeamData.length;Ut++)if(p.doorAndBeamData[Ut].id==L.id){vt=!0;break}if(vt)continue;L.nearId=i,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(Ut=>L.pcbDoorIndexs.includes(Ut)),Dt=!1,ne=!1;if(G.type=="beam"&&L.type=="beam"){let Ut=s.readLineById(e[l[nt].linesIndex].id);Ut.originalPoints=s.getOriginalPointsById(e[l[nt].linesIndex].id),e[l[nt].linesIndex].originalPoints=Ut.originalPoints,Ut=null;let oe=mn(e[l[nt].linesIndex].originalPoints),Qt=mn(p.originalPoints);e[l[nt].linesIndex].originalPoints=null,oe.minZ>e[l[nt].linesIndex].start.z&&oe.minZ-e[l[nt].linesIndex].start.z>1&&Qt.minZ>p.start.z&&Qt.minZ-p.start.z>1&&(Dt=gt>rt,ne=gt<rt,rt>gt&&(G.isExtend=!0),gt>rt&&(e[l[nt].linesIndex].isExtend=!0))}gt<rt&&!ne||Dt?(Dt&&(X=X.negate(),at=at.negate()),gt>Ht&&!L.isPullOutDoor?(L.beamStart=J.clone().addScaledVector(X,pt),L.beamEnd=ft.clone().addScaledVector(X,pt),L.doorStart=Q.clone().addScaledVector(X,pt),L.doorEnd=K.clone().addScaledVector(X,pt),L.doorHeight=G.doorHeight,L.beamStart.z=L.beamEnd.z=L.doorStart.z+L.doorHeight,L.doorOpenEndPoint=G.doorOpenEndPoint.clone(),L.doorOpenVector=G.doorOpenVector.clone()):!bt||bt&&L.isPullOutDoor&&kt?(G.beamStart=L.beamStart.clone().addScaledVector(at,pt),G.beamEnd=L.beamEnd.clone().addScaledVector(at,pt),G.doorStart=L.doorStart.clone().addScaledVector(at,pt),G.doorEnd=L.doorEnd.clone().addScaledVector(at,pt),G.doorHeight=L.doorHeight,G.beamStart.z=G.beamEnd.z=G.doorStart.z+G.doorHeight,G.doorOpenEndPoint=L.doorOpenEndPoint.clone(),G.doorOpenVector=L.doorOpenVector.clone()):(L.beamStart=J.clone().addScaledVector(X,pt),L.beamEnd=ft.clone().addScaledVector(X,pt),L.doorStart=Q.clone().addScaledVector(X,pt),L.doorEnd=K.clone().addScaledVector(X,pt),L.doorHeight=G.doorHeight,L.beamStart.z=L.beamEnd.z=L.doorStart.z+L.doorHeight,L.doorOpenEndPoint=G.doorOpenEndPoint.clone(),L.doorOpenVector=G.doorOpenVector.clone())):(gt>rt&&!Dt||ne)&&(ne&&(X=X.negate(),at=at.negate()),rt>Ht&&!bt?(G.beamStart=L.beamStart.clone().addScaledVector(X,pt),G.beamEnd=L.beamEnd.clone().addScaledVector(X,pt),G.doorStart=L.doorStart.clone().addScaledVector(X,pt),G.doorEnd=L.doorEnd.clone().addScaledVector(X,pt),G.doorHeight=L.doorHeight,G.beamStart.z=G.beamEnd.z=G.doorStart.z+G.doorHeight,G.doorOpenEndPoint=L.doorOpenEndPoint.clone(),G.doorOpenVector=L.doorOpenVector.clone()):!L.isPullOutDoor||bt&&L.isPullOutDoor&&kt?(L.beamStart=J.clone().addScaledVector(at,pt),L.beamEnd=ft.clone().addScaledVector(at,pt),L.doorStart=Q.clone().addScaledVector(at,pt),L.doorEnd=K.clone().addScaledVector(at,pt),L.doorHeight=G.doorHeight,L.beamStart.z=L.beamEnd.z=L.doorStart.z+L.doorHeight,L.doorOpenEndPoint=G.doorOpenEndPoint.clone(),L.doorOpenVector=G.doorOpenVector.clone()):(G.beamStart=L.beamStart.clone().addScaledVector(X,pt),G.beamEnd=L.beamEnd.clone().addScaledVector(X,pt),G.doorStart=L.doorStart.clone().addScaledVector(X,pt),G.doorEnd=L.doorEnd.clone().addScaledVector(X,pt),G.doorHeight=L.doorHeight,G.beamStart.z=G.beamEnd.z=G.doorStart.z+G.doorHeight,G.doorOpenEndPoint=L.doorOpenEndPoint.clone(),G.doorOpenVector=L.doorOpenVector.clone())),ke=G.nearId,_e=L.beamStart.clone(),Ue=L.beamEnd.clone(),Be=!0,me=l[nt].linesIndex,Fe=l[nt].doorIndex;break}}}if(G.nearId!=-1&&St=="hole"){let nt=!1;for(let L=0;L<e.length;L++)if(e[L].doorAndBeamData){for(let xt=0;xt<e[L].doorAndBeamData.length;xt++)if(e[L].doorAndBeamData[xt].nearId==i&&e[L].doorAndBeamData[xt].type=="beam"){e[L].doorAndBeamData[xt].type=St,nt=!0;break}if(nt)break}}if(p.doorAndBeamIdToCheckResults.push([M.index,i]),p.doorAndBeamData.push(G),l.push({linesIndex:y,doorIndex:p.doorAndBeamData.length-1}),u.push({start:Q,end:K}),i++,bt&&U<2)break}}}let V=p.length*(p.rooftopPz-p.start.z);p.completePointAreaPercentage=z/V*100,p.checkResults=null,p.originalPoints=null,p.mergeCheckRegion=null}if(f.length>1)for(let y=0;y<f.length;y++){let p=[];for(let d=0;d<e[f[y]].doorAndBeamData.length;d++){let x=!1;if(e[f[y]].doorAndBeamData[d].type==="beam"&&(e[f[y]].doorAndBeamData[d].beamNearWallVec.x==0&&e[f[y]].doorAndBeamData[d].beamNearWallVec.y==0&&e[f[y]].doorAndBeamData[d].beamNearWallVec.z==0&&e[f[y]].doorAndBeamData[d].nearId==-1||!e[f[y]].doorAndBeamData[d].wallBelowBeam&&e[f[y]].doorAndBeamData[d].nearId==-1)&&(e[f[y]].doorAndBeamData[d].lineIsOnlyBeam?x=!0:e[f[y]].doorAndBeamData[d].type="hole"),!x){let w=e[f[y]].doorAndBeamData[d].doorStart.clone(),P=e[f[y]].doorAndBeamData[d].doorEnd.clone();w.z=P.z=0;let R=w.distanceTo(P);for(let b=0;b<f.length;b++)if(y!=b)for(let S=0;S<e[f[b]].doorAndBeamData.length;S++){let z=e[f[b]].doorAndBeamData[S].doorStart.clone(),V=e[f[b]].doorAndBeamData[S].doorEnd.clone();z.z=V.z=0;let M=z.distanceTo(V),H=ye(w,P,z,V);if(H.type=="collinear_overlap"&&H.maxPerpendicularDistance<.2){let C=new I.Line3(z,V),D=qt(w,P),B=C.closestPointToPoint(D,!0,new I.Vector3),_=D.distanceTo(B);if(Math.abs(R-H.overlap)<.1&&_<.04){e[f[b]].doorAndBeamData[S].nearId==e[f[y]].doorAndBeamData[d].id&&(e[f[b]].doorAndBeamData[S].nearId=-1),x=!0;break}}}}if(x){for(let w=0;w<e[f[y]].doorAndBeamIdToCheckResults.length;w++)if(e[f[y]].doorAndBeamIdToCheckResults[1]==e[f[y]].doorAndBeamData[d].id){e[f[y]].doorAndBeamIdToCheckResults.splice(w,1);break}}x||p.push(e[f[y]].doorAndBeamData[d])}p.length!=e[f[y]].doorAndBeamData.length&&(e[f[y]].doorAndBeamData=p)}let c=.65,m=2,h=[],g=[];for(let y=0;y<r.length;y++){if(r[y].isFind||r[y].inWall)continue;let p=new I.Vector3(r[y].doorStartPt.x,r[y].doorStartPt.y,0),d=new I.Vector3(r[y].doorEndPt.x,r[y].doorEndPt.y,0),x=new I.Vector3().subVectors(p,d).normalize();for(let w=0;w<e.length;w++){if(e[w].length<.7||e[w].completePointAreaPercentage>60)continue;let P=new I.Vector3(e[w].start.x,e[w].start.y,0),R=new I.Vector3(e[w].end.x,e[w].end.y,0),b=new I.Vector3().subVectors(P,R).normalize(),S=.3,z=p.clone().addScaledVector(x,S),V=d.clone().addScaledVector(x.clone().negate(),S),M=P.clone().addScaledVector(b,S),H=R.clone().addScaledVector(b.clone().negate(),S),C=xe(z,V,M,H),D=Yt(z,V,M,H),B=p.distanceTo(P)>d.distanceTo(P)?d:p,_=B.distanceTo(P),k=B.distanceTo(R);if((_<a||k<a)&&D&&!D.isParallel){let A=p.distanceTo(P),j=p.distanceTo(R),$=A<j?P:R,Z=!1;for(let Y=0;Y<e.length;Y++){if(Y==w||h.includes(Y)||e[Y].length<.7)continue;let tt=new I.Vector3(e[Y].start.x,e[Y].start.y,0),it=new I.Vector3(e[Y].end.x,e[Y].end.y,0),ct=new I.Vector3().subVectors(tt,it).normalize(),ut=ct.clone().negate(),q=tt.clone().addScaledVector(ct,5),W=it.clone().addScaledVector(ut,5),U=se(P,R,tt,it),wt=ye(P,R,tt,it),Ft=xe(P,R,q,W),Nt=!0;if(Ft!=null&&(Nt=Ft.point.distanceTo(P)<a||Ft.point.distanceTo(R)<a),(U&&U.angle>85||wt&&wt.type=="collinear_gap")&&Nt){let jt=new I.Line3(P,R),Lt=new I.Vector3,Pt=jt.closestPointToPoint(tt,!0,Lt),It=jt.closestPointToPoint(it,!0,Lt),Rt=Pt.distanceTo(tt),bt=It.distanceTo(it),_t,J;if(Rt>bt&&bt>c)_t=it,J=It;else if(Rt<bt&&Rt>c)_t=tt,J=Pt;else continue;if(Rt=$.distanceTo(tt),bt=$.distanceTo(it),Rt>m&&bt>m)continue;let ft=Yt(_t,J,tt,it),Q=Yt(_t,J,z,V);if(Q&&Q.isParallel||!ft||!ft.isParallel)continue;let K=ye(p,d,_t,J);if(K&&K.type=="collinear_overlap"&&K.maxPerpendicularDistance<.2)continue;_t.z=J.z=e[Y].start.z;let he=!1;for(let St=0;St<g.length;St++){let ie=ye(g[St].start,g[St].end,_t,J);if(ie&&ie.type=="collinear_overlap"&&ie.maxPerpendicularDistance<.2){he=!0;break}}if(he)continue;for(let St=0;St<e.length;St++){if(e[St].length<.5)continue;let ie=new I.Vector3(e[St].start.x,e[St].start.y,e[St].start.z),G=new I.Vector3(e[St].end.x,e[St].end.y,e[St].end.z),de=ye(ie,G,_t,J);if(de&&de.type=="collinear_overlap"&&de.maxPerpendicularDistance<.1){he=!0;break}}if(he)continue;g.push({start:_t,end:J}),h.push(Y);let Et=e[Y].rooftopPz-e[Y].start.z,re=e[w].rooftopPz-e[w].start.z,Te=Et<re?Et:re;e[Y].doorAndBeamData||(e[Y].doorAndBeamData=[]),e[Y].doorAndBeamData.push({id:i,beamStart:_t,beamEnd:J,beamHeight:Te,doorStart:_t,doorEnd:J,doorHeight:Te,nearId:-1,type:"onlyDoor",isDoor:!0,beamNearWallVec:new I.Vector3(0,0,0)}),n[r[y].index].isFindBeam=!0,n[r[y].index].isFindOnlyDoor=!0,E.push([{id:i,beamStart:_t,beamEnd:J}]),i++,Z=!0;break}}if(Z)break}}}let T=[];for(let y=0;y<e.length;y++)e[y].isLine2||T.push(e[y]),e[y].isLine2&&e[y].doorAndBeamData.length!=0&&T.push(e[y]);return e.length=0,e.push(...T),{lines:e,beamGroup:E}},nr=async e=>{tr(e),To(e);let t=new gn(e);for(let n=0;n<e.length;n++){let s=e[n],o=new I.Vector3(s.start.x,s.start.y,s.start.z),r=new I.Vector3(s.end.x,s.end.y,s.end.z),i=new I.Line3(o.clone(),r.clone()),l=-1;for(let f=0;f<s.doorAndBeamData.length;f++){let u=s.doorAndBeamData[f],E=u.doorHeight;u.isRebuild=!1;let a=!1,c=!1;if(!(u.nearId!=-1||u.type!="beam")){for(let m=0;m<e.length;m++){if(e[m].length<.5||m==n)continue;let h=new I.Vector3(e[m].start.x,e[m].start.y,e[m].start.z),g=new I.Vector3(e[m].end.x,e[m].end.y,e[m].end.z),T=ye(h,g,o,r),y=Yt(h,g,o,r);if(T&&T.maxPerpendicularDistance<.5){if(y&&y.isParallel){let b=new I.Line3(h,g),S=new I.Vector3(o.x,o.y,h.z),z=b.closestPointToPoint(S,!0,new I.Vector3),V=se(z,S,o,r);V&&V.angle>85&&(u.beamNearWallVec=new I.Vector3().subVectors(z,S).normalize())}let p=[],d=t.readLineById(e[m].id);d.originalPoints=t.getOriginalPointsById(e[m].id),e[m].originalPoints=d.originalPoints,d=null,e[m].originalPoints.forEach(b=>{b.z>o.z+.2&&b.z<o.z+E/2&&p.push(new I.Vector3(b.x,b.y,o.z))}),e[m].originalPoints=null;let x=new I.Vector3,w=[],P=[];for(let b=0;b<p.length;b++){let S=i.closestPointToPoint(p[b],!0,x);S.distanceTo(p[b])<.15&&(w.push(p[b]),P.push(S.clone()))}for(let b=0;b<P.length;b++)In(i,P[b])&&w.push(P[b]);if(w=P,w=Ln(w),w.length<150)continue;let R=Ne(w);if(R.length==2){let b=R[0].distanceTo(R[1]);if(Math.abs(b-i.distance())<.3){l=T.maxPerpendicularDistance;let S=new I.Line3(h,g),z=new I.Vector3(o.x,o.y,h.z),V=S.closestPointToPoint(z,!0,new I.Vector3);u.beamNearWallVec=new I.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 yt from"three";import"three/examples/jsm/utils/BufferGeometryUtils.js";var Po=(e,t={})=>{let n=t.eps??1e-6,s=t.project??(y=>({x:y.x,y:y.z})),o=t.skipSplit??!1,r=t.insideAreaSign??"positive",i=o?e.map((y,p)=>({start:yn(y.start),end:yn(y.end),uuid:y.uuid,sourceIndex:p,sourceSegment:y})):or(e,s,n),l=[],f=new Map;function u(y){let p=Math.round(y.x/n),d=Math.round(y.y/n);return`${p},${d}`}function E(y){let p=u(y);if(f.has(p))return f.get(p);let d=l.length;return l.push({id:d,x:y.x,y:y.y}),f.set(p,d),d}let a=[],c=new Map;for(let y of i){let p=s(y.start),d=s(y.end);if(Ro(p,d)<n*n)continue;let x=E(p),w=E(d);if(x===w)continue;let P=x<w?`${x}_${w}`:`${w}_${x}`;if(c.has(P))continue;let R=a.length;a.push({id:R,a:x,b:w,uuid:y.uuid,sourceIndex:y.sourceIndex,sourceSegment:y.sourceSegment||y}),c.set(P,R)}let m=[],h=Array.from({length:l.length},()=>[]);function g(y,p,d,x,w){let P=l[y],R=l[p],b=m.length,S=Math.atan2(R.y-P.y,R.x-P.x),z={id:b,from:y,to:p,twin:null,next:null,angle:S,edgeId:d,uuid:x,sourceIndex:w,visited:!1};return m.push(z),h[y].push(b),b}for(let y of a){let p=g(y.a,y.b,y.id,y.uuid,y.sourceIndex),d=g(y.b,y.a,y.id,y.uuid,y.sourceIndex);m[p].twin=d,m[d].twin=p}for(let y of h)y.sort((p,d)=>m[p].angle-m[d].angle);for(let y of m){let p=h[y.to],d=y.twin,x=p.indexOf(d);if(x===-1)continue;let w=(x-1+p.length)%p.length;y.next=p[w]}let T=[];for(let y of m){if(y.visited)continue;let p=[],d=[],x=y.id,w=0,P=m.length+10;for(;;){let M=m[x];if(!M||M.visited)break;if(M.visited=!0,p.push(x),d.push(M.from),x=M.next,w++,w>P){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(p.length<3)continue;let R=d.map(M=>l[M]),b=rr(R),S=!1;if(r==="positive"?S=b>n:S=b<-n,!S)continue;let z=p.map(M=>m[M].uuid),V=p.map(M=>m[M].sourceIndex);T.push({uuids:z,area:Math.abs(b),lineIndexes:V})}return T};function or(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:yn(r.start)},{t:1,point:yn(r.end)}];for(let E=0;E<e.length;E++){if(o===E)continue;let a=e[E],c=t(a.start),m=t(a.end),h=sr(i,l,c,m,n);h&&h.t>n&&h.t<1-n&&f.push({t:h.t,point:ir(r.start,r.end,h.t)})}f.sort((E,a)=>E.t-a.t);let u=[];for(let E of f)(u.length===0||Math.abs(E.t-u[u.length-1].t)>n)&&u.push(E);for(let E=0;E<u.length-1;E++){let a=u[E].point,c=u[E+1].point,m=t(a),h=t(c);Ro(m,h)<n*n||s.push({start:a,end:c,uuid:r.uuid,sourceIndex:o,sourceSegment:r})}}return s}function sr(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=Wn(r,i);if(Math.abs(f)<o)return null;let u=Wn(l,i)/f,E=Wn(l,r)/f;return u>=-o&&u<=1+o&&E>=-o&&E<=1+o?{t:u,u:E,point:{x:e.x+u*r.x,y:e.y+u*r.y}}:null}function Wn(e,t){return e.x*t.y-e.y*t.x}function Ro(e,t){let n=e.x-t.x,s=e.y-t.y;return n*n+s*s}function rr(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 ir(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 yn(e){return e&&typeof e.clone=="function"?e.clone():{x:e.x,y:e.y,z:e.z}}var lr=(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 E=[];for(let c=0;c<e.length;c++)E.push({start:e[c].start,end:e[c].end,uuid:e[c].uuid});let a=Po(E,{eps:1e-5,returnDetail:!0,project:c=>({x:c.x,y:c.y})});for(let c=0;c<a.length;c++){if(a[c].uuids.length<4||a[c].area<i||a[c].area>l)continue;let m=!1;for(let h=0;h<a[c].lineIndexes.length;h++){let g=e[a[c].lineIndexes[h]].length;if(g<o||g>r)break;let T=new yt.Vector3(e[a[c].lineIndexes[h]].start.x,e[a[c].lineIndexes[h]].start.y,e[a[c].lineIndexes[h]].start.z),y=new yt.Vector3(e[a[c].lineIndexes[h]].end.x,e[a[c].lineIndexes[h]].end.y,e[a[c].lineIndexes[h]].end.z),p=!1,d=new yt.Vector3(0,0,0);for(let x=h+1;x<a[c].lineIndexes.length;x++){let w=e[a[c].lineIndexes[x]].length;if(w<o||w>r)break;let P=new yt.Vector3(e[a[c].lineIndexes[x]].start.x,e[a[c].lineIndexes[x]].start.y,e[a[c].lineIndexes[x]].start.z),R=new yt.Vector3(e[a[c].lineIndexes[x]].end.x,e[a[c].lineIndexes[x]].end.y,e[a[c].lineIndexes[x]].end.z),b=Yt(T,y,P,R);if(b&&b.isParallel){if(g+w>r){p=!0;break}g+=w;let z=st(T,P),V=st(T,R),M=st(y,P),H=st(y,R);z?(T=y.clone(),y=R.clone()):V?(T=y.clone(),y=P.clone()):M?y=R.clone():H&&(y=P.clone());continue}let S=se(T,y,P,R);if(!S||S.angle<f||S.angle>u){p=!0;break}for(let z=x+1;z<a[c].lineIndexes.length;z++){let V=e[a[c].lineIndexes[z]].length;if(V<o||V>r)break;let M=new yt.Vector3(e[a[c].lineIndexes[z]].start.x,e[a[c].lineIndexes[z]].start.y,e[a[c].lineIndexes[z]].start.z),H=new yt.Vector3(e[a[c].lineIndexes[z]].end.x,e[a[c].lineIndexes[z]].end.y,e[a[c].lineIndexes[z]].end.z),C=Yt(P,R,M,H);if(C&&C.isParallel){if(w+V>r){p=!0;break}w+=V;let B=st(P,M),_=st(P,H),k=st(R,M),v=st(R,H);B?(P=R.clone(),R=H.clone()):_?(P=R.clone(),R=M.clone()):k?R=H.clone():v&&(R=M.clone());continue}let D=se(P,R,M,H);if(!D||D.angle<f||D.angle>u){p=!0;break}for(let B=z+1;B<a[c].lineIndexes.length;B++){let _=e[a[c].lineIndexes[B]].length;if(_<o||_>r)break;let k=new yt.Vector3(e[a[c].lineIndexes[B]].start.x,e[a[c].lineIndexes[B]].start.y,e[a[c].lineIndexes[B]].start.z),v=new yt.Vector3(e[a[c].lineIndexes[B]].end.x,e[a[c].lineIndexes[B]].end.y,e[a[c].lineIndexes[B]].end.z),A=Yt(M,H,k,v);if(A&&A.isParallel){if(V+_>r){p=!0;break}V+=_;let it=st(M,k),ct=st(M,v),ut=st(H,k),q=st(H,v);it?(M=H.clone(),H=v.clone()):ct?(M=H.clone(),H=k.clone()):ut?H=v.clone():q&&(H=k.clone());continue}let j=se(M,H,k,v);if(!j||j.angle<f||j.angle>u){p=!0;break}let $=st(k,T),Z=st(k,y),Y=st(v,T),tt=st(v,y);if($||Z||Y||tt)m=!0;else for(let it=B+1;it<a[c].lineIndexes.length;it++){let ct=e[a[c].lineIndexes[it]].length;if(ct<o||ct>r)break;let ut=new yt.Vector3(e[a[c].lineIndexes[it]].start.x,e[a[c].lineIndexes[it]].start.y,e[a[c].lineIndexes[it]].start.z),q=new yt.Vector3(e[a[c].lineIndexes[it]].end.x,e[a[c].lineIndexes[it]].end.y,e[a[c].lineIndexes[it]].end.z),W=Yt(k,v,ut,q);if(W&&W.isParallel){if(_+ct>r){p=!0;break}_+=ct;let U=st(k,ut),wt=st(k,q),Ft=st(v,ut),Nt=st(v,q);if(U)k=v.clone(),v=q.clone();else if(wt)k=v.clone(),v=ut.clone();else if(Ft)v=q.clone();else if(Nt)v=ut.clone();else continue;if($=st(k,T),Z=st(k,y),Y=st(v,T),tt=st(v,y),$||Z||Y||tt){m=!0;break}}}break}if(p)break}if(p)break}if(p)break}m&&n.rectangles.push(a[c].uuids)}for(let c=0;c<e.length;c++){let m=e[c].length;if(s.has(e[c].uuid)||m<o||m>r)continue;let h={uuids:[],missingEdge:{start:new yt.Vector3,end:new yt.Vector3}},g=new yt.Vector3(e[c].start.x,e[c].start.y,e[c].start.z),T=new yt.Vector3(e[c].end.x,e[c].end.y,e[c].end.z),y=!0,p=!0;for(let w=0;w<e.length;w++){if(w==c)continue;let P=new yt.Vector3(e[w].start.x,e[w].start.y,e[w].start.z),R=new yt.Vector3(e[w].end.x,e[w].end.y,e[w].end.z),b=st(P,g),S=st(R,g),z=st(P,T),V=st(R,T);if(b||S?y=!1:(z||V)&&(p=!1),!y&&!p)break}if(!y&&!p)continue;let d=new yt.Vector3;y||([g,T]=[T,g]),d=new yt.Vector3().subVectors(T,g).normalize();let x=d.clone().negate();for(let w=0;w<e.length;w++){let P=e[w].length;if(w==c||s.has(w)||P<o||P>r)continue;let R=new yt.Vector3(e[w].start.x,e[w].start.y,e[w].start.z),b=new yt.Vector3(e[w].end.x,e[w].end.y,e[w].end.z),S=se(g,T,R,b);if(!S||S.angle<85)continue;let z=st(R,T),V=st(b,T);if(!z&&!V)continue;let M=new yt.Vector3,H=new yt.Vector3;z?(M=R.clone(),H=b.clone()):(M=b.clone(),H=R.clone());for(let C=0;C<e.length;C++){let D=e[C].length;if(C==c||C==w||s.has(C)||D<o||D>r)continue;let B=new yt.Vector3(e[C].start.x,e[C].start.y,e[C].start.z),_=new yt.Vector3(e[C].end.x,e[C].end.y,e[C].end.z),k=se(R,b,B,_);if(!k||k.angle<85)continue;let v=st(B,H),A=st(_,H);if(!v&&!A)continue;let j=new yt.Vector3,$=new yt.Vector3;v?(j=B.clone(),$=_.clone()):(j=_.clone(),$=B.clone());let Z=new yt.Vector3().subVectors($,j).normalize(),Y=Kt(x,Z,.1);if(!Y||!Y.parallel||!Y.sameDirection)continue;let tt=!0,it=!0;for(let ut=0;ut<e.length;ut++){if(ut==C)continue;let q=new yt.Vector3(e[ut].start.x,e[ut].start.y,e[ut].start.z),W=new yt.Vector3(e[ut].end.x,e[ut].end.y,e[ut].end.z),U=st(q,B),wt=st(W,B),Ft=st(q,_),Nt=st(W,_);if(U||wt?tt=!1:(Ft||Nt)&&(it=!1),!tt&&!it)break}if(!tt&&!it)continue;let ct=m*P;if(!(ct<i||ct>l)){h.uuids=[e[c].uuid,e[w].uuid,e[C].uuid],h.missingEdge.start=$,h.missingEdge.end=g;break}}if(h.uuids.length==3)break}h.uuids.length==3&&(h.uuids.forEach(w=>s.add(w)),n.threeEdgeRect.push(h))}return n};import*as F from"three";import"three/examples/jsm/utils/BufferGeometryUtils.js";var Vt=11102230246251565e-32,Gt=134217729,on=(3+8*Vt)*Vt;function Le(e,t,n,s,o){let r,i,l,f,u=t[0],E=s[0],a=0,c=0;E>u==E>-u?(r=u,u=t[++a]):(r=E,E=s[++c]);let m=0;if(a<e&&c<n)for(E>u==E>-u?(i=u+r,l=r-(i-u),u=t[++a]):(i=E+r,l=r-(i-E),E=s[++c]),r=i,l!==0&&(o[m++]=l);a<e&&c<n;)E>u==E>-u?(i=r+u,f=i-r,l=r-(i-f)+(u-f),u=t[++a]):(i=r+E,f=i-r,l=r-(i-f)+(E-f),E=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+E,f=i-r,l=r-(i-f)+(E-f),E=s[++c],r=i,l!==0&&(o[m++]=l);return(r!==0||m===0)&&(o[m++]=r),m}function sn(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 ar=(3+16*Vt)*Vt,fr=(2+12*Vt)*Vt,ur=(9+64*Vt)*Vt*Vt,qe=N(4),So=N(8),zo=N(12),Vo=N(16),ee=N(4);function hr(e,t,n,s,o,r,i){let l,f,u,E,a,c,m,h,g,T,y,p,d,x,w,P,R,b,S=e-o,z=n-o,V=t-r,M=s-r;x=S*M,c=Gt*S,m=c-(c-S),h=S-m,c=Gt*M,g=c-(c-M),T=M-g,w=h*T-(x-m*g-h*g-m*T),P=V*z,c=Gt*V,m=c-(c-V),h=V-m,c=Gt*z,g=c-(c-z),T=z-g,R=h*T-(P-m*g-h*g-m*T),y=w-R,a=w-y,qe[0]=w-(y+a)+(a-R),p=x+y,a=p-x,d=x-(p-a)+(y-a),y=d-P,a=d-y,qe[1]=d-(y+a)+(a-P),b=p+y,a=b-p,qe[2]=p-(b-a)+(y-a),qe[3]=b;let H=sn(4,qe),C=fr*i;if(H>=C||-H>=C||(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,E=s-(M+a)+(a-r),l===0&&f===0&&u===0&&E===0)||(C=ur*i+on*Math.abs(H),H+=S*E+M*l-(V*u+z*f),H>=C||-H>=C))return H;x=l*M,c=Gt*l,m=c-(c-l),h=l-m,c=Gt*M,g=c-(c-M),T=M-g,w=h*T-(x-m*g-h*g-m*T),P=f*z,c=Gt*f,m=c-(c-f),h=f-m,c=Gt*z,g=c-(c-z),T=z-g,R=h*T-(P-m*g-h*g-m*T),y=w-R,a=w-y,ee[0]=w-(y+a)+(a-R),p=x+y,a=p-x,d=x-(p-a)+(y-a),y=d-P,a=d-y,ee[1]=d-(y+a)+(a-P),b=p+y,a=b-p,ee[2]=p-(b-a)+(y-a),ee[3]=b;let D=Le(4,qe,4,ee,So);x=S*E,c=Gt*S,m=c-(c-S),h=S-m,c=Gt*E,g=c-(c-E),T=E-g,w=h*T-(x-m*g-h*g-m*T),P=V*u,c=Gt*V,m=c-(c-V),h=V-m,c=Gt*u,g=c-(c-u),T=u-g,R=h*T-(P-m*g-h*g-m*T),y=w-R,a=w-y,ee[0]=w-(y+a)+(a-R),p=x+y,a=p-x,d=x-(p-a)+(y-a),y=d-P,a=d-y,ee[1]=d-(y+a)+(a-P),b=p+y,a=b-p,ee[2]=p-(b-a)+(y-a),ee[3]=b;let B=Le(D,So,4,ee,zo);x=l*E,c=Gt*l,m=c-(c-l),h=l-m,c=Gt*E,g=c-(c-E),T=E-g,w=h*T-(x-m*g-h*g-m*T),P=f*u,c=Gt*f,m=c-(c-f),h=f-m,c=Gt*u,g=c-(c-u),T=u-g,R=h*T-(P-m*g-h*g-m*T),y=w-R,a=w-y,ee[0]=w-(y+a)+(a-R),p=x+y,a=p-x,d=x-(p-a)+(y-a),y=d-P,a=d-y,ee[1]=d-(y+a)+(a-P),b=p+y,a=b-p,ee[2]=p-(b-a)+(y-a),ee[3]=b;let _=Le(B,zo,4,ee,Vo);return Vo[_-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)>=ar*u?f:-hr(e,t,n,s,o,r,u)}var Yl=(7+56*Vt)*Vt,Gl=(3+28*Vt)*Vt,Zl=(26+288*Vt)*Vt*Vt,Ul=N(4),Kl=N(4),Jl=N(4),Ql=N(4),tc=N(4),ec=N(4),nc=N(4),oc=N(4),sc=N(4),rc=N(8),ic=N(8),lc=N(8),cc=N(4),ac=N(8),fc=N(8),uc=N(16),hc=N(12),dc=N(192),mc=N(192);var yc=(10+96*Vt)*Vt,Ec=(4+48*Vt)*Vt,xc=(44+576*Vt)*Vt*Vt,wc=N(4),bc=N(4),Tc=N(4),Pc=N(4),Rc=N(4),Sc=N(4),zc=N(4),Vc=N(4),Mc=N(8),vc=N(8),Hc=N(8),Bc=N(8),_c=N(8),kc=N(8),Cc=N(8),Dc=N(8),Ic=N(8),Lc=N(4),Ac=N(4),Fc=N(4),Oc=N(8),Nc=N(16),Wc=N(16),jc=N(16),qc=N(32),$c=N(32),Xc=N(48),Yc=N(64),Gc=N(1152),Zc=N(1152);var Qc=(16+224*Vt)*Vt,ta=(5+72*Vt)*Vt,ea=(71+1408*Vt)*Vt*Vt,na=N(4),oa=N(4),sa=N(4),ra=N(4),ia=N(4),la=N(4),ca=N(4),aa=N(4),fa=N(4),ua=N(4),ha=N(24),da=N(24),ma=N(24),pa=N(24),ga=N(24),ya=N(24),Ea=N(24),xa=N(24),wa=N(24),ba=N(24),Ta=N(1152),Pa=N(1152),Ra=N(1152),Sa=N(1152),za=N(1152),Va=N(2304),Ma=N(2304),va=N(3456),Ha=N(5760),Ba=N(8),_a=N(8),ka=N(8),Ca=N(16),Da=N(24),Ia=N(48),La=N(48),Aa=N(96),Fa=N(192),Oa=N(384),Na=N(384),Wa=N(384),ja=N(768);var qa=N(96),$a=N(96),Xa=N(96),Ya=N(1152);var vo=Math.pow(2,-52),En=new Uint32Array(512),Ye=class e{static from(t,n=Er,s=xr){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,E=-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>E&&(E=V),this._ids[S]=S}let a=(l+u)/2,c=(f+E)/2,m=0,h=0,g=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],y=t[2*m+1];for(let S=0,z=1/0;S<i;S++){if(S===m)continue;let V=jn(T,y,t[2*S],t[2*S+1]);V<z&&V>0&&(h=S,z=V)}let p=t[2*h],d=t[2*h+1],x=1/0;for(let S=0;S<i;S++){if(S===m||S===h)continue;let z=gr(T,y,p,d,t[2*S],t[2*S+1]);z<x&&(g=S,x=z)}let w=t[2*g],P=t[2*g+1];if(x===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 H=this._ids[V],C=this._dists[H];C>M&&(S[z++]=H,M=C)}this.hull=S.subarray(0,z),this.triangles=new Uint32Array(0),this.halfedges=new Int32Array(0);return}if($e(T,y,p,d,w,P)<0){let S=h,z=p,V=d;h=g,p=w,d=P,g=S,w=z,P=V}let R=yr(T,y,p,d,w,P);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[g]=h,s[h]=n[m]=g,s[g]=n[h]=m,o[m]=0,o[h]=1,o[g]=2,r.fill(-1),r[this._hashKey(T,y)]=m,r[this._hashKey(p,d)]=h,r[this._hashKey(w,P)]=g,this.trianglesLen=0,this._addTriangle(m,h,g,-1,-1,-1);for(let S=0,z=0,V=0;S<this._ids.length;S++){let M=this._ids[S],H=t[2*M],C=t[2*M+1];if(S>0&&Math.abs(H-z)<=vo&&Math.abs(C-V)<=vo||(z=H,V=C,M===m||M===h||M===g))continue;let D=0;for(let A=0,j=this._hashKey(H,C);A<this._hashSize&&(D=r[(j+A)%this._hashSize],!(D!==-1&&D!==s[D]));A++);D=n[D];let B=D,_;for(;_=s[B],$e(H,C,t[2*B],t[2*B+1],t[2*_],t[2*_+1])>=0;)if(B=_,B===D){B=-1;break}if(B===-1)continue;let k=this._addTriangle(B,M,s[B],-1,-1,o[B]);o[M]=this._legalize(k+2),o[B]=k,b++;let v=s[B];for(;_=s[v],$e(H,C,t[2*v],t[2*v+1],t[2*_],t[2*_+1])<0;)k=this._addTriangle(v,M,_,o[M],-1,o[v]),o[M]=this._legalize(k+2),s[v]=v,b--,v=_;if(B===D)for(;_=n[B],$e(H,C,t[2*_],t[2*_+1],t[2*B],t[2*B+1])<0;)k=this._addTriangle(_,M,B,-1,o[B],o[_]),this._legalize(k+2),o[_]=k,s[B]=B,b--,B=_;this._hullStart=n[M]=B,s[B]=n[v]=M,s[M]=v,r[this._hashKey(H,C)]=M,r[this._hashKey(t[2*B],t[2*B+1])]=B}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(mr(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=En[--r];continue}let u=l-l%3,E=f+(t+1)%3,a=u+(l+2)%3,c=n[i],m=n[t],h=n[E],g=n[a];if(pr(o[2*c],o[2*c+1],o[2*m],o[2*m+1],o[2*h],o[2*h+1],o[2*g],o[2*g+1])){n[t]=g,n[l]=c;let y=s[a];if(y===-1){let d=this._hullStart;do{if(this._hullTri[d]===a){this._hullTri[d]=t;break}d=this._hullPrev[d]}while(d!==this._hullStart)}this._link(t,y),this._link(l,s[i]),this._link(i,a);let p=u+(l+1)%3;r<En.length&&(En[r++]=p)}else{if(r===0)break;t=En[--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 mr(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 pr(e,t,n,s,o,r,i,l){let f=e-i,u=t-l,E=n-i,a=s-l,c=o-i,m=r-l,h=f*f+u*u,g=E*E+a*a,T=c*c+m*m;return f*(a*T-g*m)-u*(E*T-g*c)+h*(E*m-a*c)<0}function gr(e,t,n,s,o,r){let i=n-e,l=s-t,f=o-e,u=r-t,E=i*i+l*l,a=f*f+u*u,c=.5/(i*u-l*f),m=(u*E-l*a)*c,h=(i*a-f*E)*c;return m*m+h*h}function yr(e,t,n,s,o,r){let i=n-e,l=s-t,f=o-e,u=r-t,E=i*i+l*l,a=f*f+u*u,c=.5/(i*u-l*f),m=e+(u*E-l*a)*c,h=t+(i*a-f*E)*c;return{x:m,y:h}}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;rn(e,o,r),t[e[n]]>t[e[s]]&&rn(e,n,s),t[e[r]]>t[e[s]]&&rn(e,r,s),t[e[n]]>t[e[r]]&&rn(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;rn(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 rn(e,t,n){let s=e[t];e[t]=e[n],e[n]=s}function Er(e){return e[0]}function xr(e){return e[1]}var ae=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 Ve=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 ln=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 g=0,T=0,y=s.length,p,d;g<y;g+=3,T+=2){let x=s[g]*2,w=s[g+1]*2,P=s[g+2]*2,R=t[x],b=t[x+1],S=t[w],z=t[w+1],V=t[P],M=t[P+1],H=S-R,C=z-b,D=V-R,B=M-b,_=(H*B-C*D)*2;if(Math.abs(_)<1e-9){if(r===void 0){r=i=0;for(let v of n)r+=t[v*2],i+=t[v*2+1];r/=n.length,i/=n.length}let k=1e9*Math.sign((r-R)*B-(i-b)*D);p=(R+V)/2-k*B,d=(b+M)/2+k*D}else{let k=1/_,v=H*H+C*C,A=D*D+B*B;p=R+(B*v-C*A)*k,d=b+(H*A-D*v)*k}l[T]=p,l[T+1]=d}let f=n[n.length-1],u,E=f*4,a,c=t[2*f],m,h=t[2*f+1];o.fill(0);for(let g=0;g<n.length;++g)f=n[g],u=E,a=c,m=h,E=f*4,c=t[2*f],h=t[2*f+1],o[u+2]=o[E]=m-h,o[u+3]=o[E+1]=c-a}render(t){let n=t==null?t=new ae:void 0,{delaunay:{halfedges:s,inedges:o,hull:r},circumcenters:i,vectors:l}=this;if(r.length<=1)return null;for(let E=0,a=s.length;E<a;++E){let c=s[E];if(c<E)continue;let m=Math.floor(E/3)*2,h=Math.floor(c/3)*2,g=i[m],T=i[m+1],y=i[h],p=i[h+1];this._renderSegment(g,T,y,p,t)}let f,u=r[r.length-1];for(let E=0;E<r.length;++E){f=u,u=r[E];let a=Math.floor(o[u]/3)*2,c=i[a],m=i[a+1],h=f*4,g=this._project(c,m,l[h+2],l[h+3]);g&&this._renderSegment(c,m,g[0],g[1],t)}return n&&n.value()}renderBounds(t){let n=t==null?t=new ae: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 ae: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 Ve;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,E=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=E,E=this._regioncode(l,f),u===0&&E===0)a=c,c=0,o?o.push(l,f):o=[l,f];else{let h,g,T,y,p;if(u===0){if((h=this._clipSegment(r,i,l,f,u,E))===null)continue;[g,T,y,p]=h}else{if((h=this._clipSegment(l,f,r,i,E,u))===null)continue;[y,p,g,T]=h,a=c,c=this._edgecode(g,T),a&&c&&this._edge(t,a,c,o,o.length),o?o.push(g,T):o=[g,T]}a=c,c=this._edgecode(y,p),a&&c&&this._edge(t,a,c,o,o.length),o?o.push(y,p):o=[y,p]}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,E=r||i;E&8?(f=t+(s-t)*(this.ymax-n)/(o-n),u=this.ymax):E&4?(f=t+(s-t)*(this.ymin-n)/(o-n),u=this.ymin):E&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,E=l.length,a,c=this._edgecode(l[E-2],l[E-1]);u<E;u+=2)a=c,c=this._edgecode(l[u],l[u+1]),a&&c&&(u=this._edge(t,a,c,l,u),E=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 wr=2*Math.PI,Ge=Math.pow;function br(e){return e[0]}function Tr(e){return e[1]}function Pr(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 Rr(e,t,n){return[e+Math.sin(e+t)*n,t+Math.cos(e-t)*n]}var Me=class e{static from(t,n=br,s=Tr,o){return new e("length"in t?Sr(t,n,s,o):Float64Array.from(zr(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&&Pr(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],E=[n[2*f],n[2*f+1],n[2*u],n[2*u+1]],a=1e-8*Math.hypot(E[3]-E[1],E[2]-E[0]);for(let c=0,m=n.length/2;c<m;++c){let h=Rr(n[2*c],n[2*c+1],a);n[2*c]=h[0],n[2*c+1]=h[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 E=r[f%3===2?f-2:f+1];(s[f]===-1||i[E]===-1)&&(i[E]=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 ln(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,E=-1;do{if(yield E=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!==E&&(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 E=t,a=Ge(n-u[t*2],2)+Ge(s-u[t*2+1],2),c=o[t],m=c;do{let h=f[m],g=Ge(n-u[h*2],2)+Ge(s-u[h*2+1],2);if(g<a&&(a=g,E=h),m=m%3===2?m-2:m+1,f[m]!==t)break;if(m=l[m],m===-1){if(m=r[(i[t]+1)%r.length],m!==h&&Ge(n-u[m*2],2)+Ge(s-u[m*2+1],2)<a)return m;break}}while(m!==c);return E}render(t){let n=t==null?t=new ae: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,E=r[f]*2;t.moveTo(s[u],s[u+1]),t.lineTo(s[E],s[E+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 ae: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,wr)}return s&&s.value()}renderHull(t){let n=t==null?t=new ae: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 Ve;return this.renderHull(t),t.value()}renderTriangle(t,n){let s=n==null?n=new ae: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 Ve;return this.renderTriangle(t,n),n.value()}};function Sr(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*zr(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 qn(e,t,n,s){let o,r;n<s?(o=n,r=s):(o=s,r=n);let i=o*t+r;e.set(i,(e.get(i)||0)+1)}function Ho(e,t,n){let s=e.get(t);s===void 0&&(s=[],e.set(t,s)),s.push(n)}function ze(e){if(!e||e.length<3)return[];let t=new Set,n=[];for(let g=0;g<e.length;g++){let T=e[g],y=`${T[0]}_${T[1]}`;t.has(y)||(t.add(y),n.push(T))}let s=n.length;if(s<3)return[];let o=new Float64Array(s*2);for(let g=0,T=0;g<s;g++){let y=n[g];o[T++]=y[0],o[T++]=y[1]}let r=new Me(o),{triangles:i}=r;if(!i.length)return[];let l=new Map;for(let g=0;g<i.length;g+=3){let T=i[g],y=i[g+1],p=i[g+2],d=T*2,x=y*2,w=p*2,P=o[d],R=o[d+1],b=o[x],S=o[x+1],z=o[w],V=o[w+1],M=P-b,H=R-S,C=P-z,D=R-V,B=b-z,_=S-V,k=B*B+_*_,v=C*C+D*D,A=M*M+H*H,j=(b-P)*(V-R)-(z-P)*(S-R);if(j===0)continue;let $=j*j,Y=P===0||b===0||z===0?$:4*$;k*v*A<=Y&&(qn(l,s,T,y),qn(l,s,y,p),qn(l,s,p,T))}if(!l.size)return[];let f=new Map,u=0,E=-1;for(let[g,T]of l){if(T!==1)continue;let y=Math.floor(g/s),p=g-y*s;E===-1&&(E=y),Ho(f,y,p),Ho(f,p,y),u++}if(u===0)return[];let a=[],c=new Uint8Array(s),m=E,h=-1;do{a.push(n[m]),c[m]=1;let g=f.get(m)||[],T=-1;for(let y=0;y<g.length;y++){let p=g[y];if(p!==h&&!c[p]){T=p;break}}if(T===-1)for(let y=0;y<g.length;y++){let p=g[y];if(p!==h){T=p;break}}if(T===-1)break;h=m,m=T}while(m!==E&&a.length<=u+1);return a.length>0&&a.push(a[0]),a}import*as Wt from"three";import{OBB as $r}from"three/examples/jsm/math/OBB.js";var Zt=63710088e-1,_o={centimeters:Zt*100,centimetres:Zt*100,degrees:360/(2*Math.PI),feet:Zt*3.28084,inches:Zt*39.37,kilometers:Zt/1e3,kilometres:Zt/1e3,meters:Zt,metres:Zt,miles:Zt/1609.344,millimeters:Zt*1e3,millimetres:Zt*1e3,nauticalmiles:Zt/1852,radians:1,yards:Zt*1.0936};function ko(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 xn(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(!Bo(e[0])||!Bo(e[1]))throw new Error("coordinates must contain numbers");return ko({type:"Point",coordinates:e},t,n)}function wn(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 ko({type:"Polygon",coordinates:e},t,n)}function Vr(e,t="kilometers"){let n=_o[t];if(!n)throw new Error(t+" units is invalid");return e*n}function Mr(e,t="kilometers"){let n=_o[t];if(!n)throw new Error(t+" units is invalid");return e/n}function bn(e){return e%(2*Math.PI)*180/Math.PI}function fe(e){return e%360*Math.PI/180}function Tn(e,t="kilometers",n="kilometers"){if(!(e>=0))throw new Error("length must be a positive number");return Vr(Mr(e,t),n)}function Bo(e){return!isNaN(e)&&e!==null&&!Array.isArray(e)}function Co(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function we(e,t,n){if(e!==null)for(var s,o,r,i,l,f,u,E=0,a=0,c,m=e.type,h=m==="FeatureCollection",g=m==="Feature",T=h?e.features.length:1,y=0;y<T;y++){u=h?e.features[y].geometry:g?e.geometry:e,c=u?u.type==="GeometryCollection":!1,l=c?u.geometries.length:1;for(var p=0;p<l;p++){var d=0,x=0;if(i=c?u.geometries[p]:u,i!==null){f=i.coordinates;var w=i.type;switch(E=n&&(w==="Polygon"||w==="MultiPolygon")?1:0,w){case null:break;case"Point":if(t(f,a,y,d,x)===!1)return!1;a++,d++;break;case"LineString":case"MultiPoint":for(s=0;s<f.length;s++){if(t(f[s],a,y,d,x)===!1)return!1;a++,w==="MultiPoint"&&d++}w==="LineString"&&d++;break;case"Polygon":case"MultiLineString":for(s=0;s<f.length;s++){for(o=0;o<f[s].length-E;o++){if(t(f[s][o],a,y,d,x)===!1)return!1;a++}w==="MultiLineString"&&d++,w==="Polygon"&&x++}w==="Polygon"&&d++;break;case"MultiPolygon":for(s=0;s<f.length;s++){for(x=0,o=0;o<f[s].length;o++){for(r=0;r<f[s][o].length-E;r++){if(t(f[s][o][r],a,y,d,x)===!1)return!1;a++}x++}d++}break;case"GeometryCollection":for(s=0;s<i.geometries.length;s++)if(we(i.geometries[s],t,n)===!1)return!1;break;default:throw new Error("Unknown Geometry Type")}}}}}function Do(e){var t=[];return we(e,function(n){t.push(n)}),t}function vr(e,t){var n,s,o,r,i,l,f,u,E,a,c=0,m=e.type==="FeatureCollection",h=e.type==="Feature",g=m?e.features.length:1;for(n=0;n<g;n++){for(l=m?e.features[n].geometry:h?e.geometry:e,u=m?e.features[n].properties:h?e.properties:{},E=m?e.features[n].bbox:h?e.bbox:void 0,a=m?e.features[n].id:h?e.id:void 0,f=l?l.type==="GeometryCollection":!1,i=f?l.geometries.length:1,o=0;o<i;o++){if(r=f?l.geometries[o]:l,r===null){if(t(null,c,u,E,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,E,a)===!1)return!1;break}case"GeometryCollection":{for(s=0;s<r.geometries.length;s++)if(t(r.geometries[s],c,u,E,a)===!1)return!1;break}default:throw new Error("Unknown Geometry Type")}}c++}}function Io(e,t,n){var s=n;return vr(e,function(o,r,i,l,f){r===0&&n===void 0?s=o:s=t(s,o,r,i,l,f)}),s}var ts=Ms(Qo(),1);function es(e,t={}){t.concavity=t.concavity||1/0;let n=[];if(we(e,o=>{n.push([o[0],o[1]])}),!n.length)return null;let s=(0,ts.default)(n,t.concavity);return s.length>3?wn([s]):null}function Vn(e,t={}){let n=0,s=0,o=0;return we(e,function(r){n+=r[0],s+=r[1],o++},!0),xn([n/o,s/o],t.properties)}function ce(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 ns(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 ss(e,t,n={}){let s;return n.final?s=os(ce(t),ce(e)):s=os(ce(e),ce(t)),s>180?-(360-s):s}function os(e,t){let n=fe(e[1]),s=fe(t[1]),o=fe(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(bn(i)+360)%360}function rs(e,t,n={}){let s=ce(e),o=ce(t);o[0]+=o[0]-s[0]>180?-360:s[0]-o[0]>180?360:0;let r=Fr(s,o);return Tn(r,"meters",n.units)}function Fr(e,t,n){n=n===void 0?Zt:Number(n);let s=n,o=e[1]*Math.PI/180,r=t[1]*Math.PI/180,i=r-o,l=Math.abs(t[0]-e[0])*Math.PI/180;l>Math.PI&&(l-=2*Math.PI);let f=Math.log(Math.tan(r/2+Math.PI/4)/Math.tan(o/2+Math.PI/4)),u=Math.abs(f)>1e-11?i/f:Math.cos(o);return Math.sqrt(i*i+u*u*l*l)*s}function is(e,t,n,s={}){let o=t<0,r=Tn(Math.abs(t),s.units,"meters");o&&(r=-Math.abs(r));let i=ce(e),l=Or(i,r,n);return l[0]+=l[0]-i[0]>180?-360:i[0]-l[0]>180?360:0,xn(l,s.properties)}function Or(e,t,n,s){s=s===void 0?Zt:Number(s);let o=t/s,r=e[0]*Math.PI/180,i=fe(e[1]),l=fe(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 E=Math.log(Math.tan(u/2+Math.PI/4)/Math.tan(i/2+Math.PI/4)),a=Math.abs(E)>1e-11?f/E:Math.cos(i),c=o*Math.sin(l)/a;return[((r+c)*180/Math.PI+540)%360-180,u*180/Math.PI]}function ls(e){if(!e)throw new Error("geojson is required");switch(e.type){case"Feature":return cs(e);case"FeatureCollection":return Nr(e);case"Point":case"LineString":case"Polygon":case"MultiPoint":case"MultiLineString":case"MultiPolygon":case"GeometryCollection":return Qn(e);default:throw new Error("unknown GeoJSON type")}}function cs(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=as(e.properties),e.geometry==null?t.geometry=null:t.geometry=Qn(e.geometry),t}function as(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]=as(s):t[n]=s}),t}function Nr(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=>cs(n)),t}function Qn(e){let t={type:e.type};return e.bbox&&(t.bbox=e.bbox),e.type==="GeometryCollection"?(t.geometries=e.geometries.map(n=>Qn(n)),t):(t.coordinates=fs(e.coordinates),t)}function fs(e){let t=e;return typeof t[0]!="object"?t.slice():t.map(n=>fs(n))}function to(e,t,n){if(n=n||{},!Co(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??Vn(e);return(o===!1||o===void 0)&&(e=ls(e)),we(e,function(i){let f=ss(r,i)+t,u=rs(r,i),E=ns(is(r,u,f));i[0]=E[0],i[1]=E[1]}),e}function eo(e,t,n={}){if(n.final===!0)return Wr(e,t);let s=ce(e),o=ce(t),r=fe(s[0]),i=fe(o[0]),l=fe(s[1]),f=fe(o[1]),u=Math.sin(i-r)*Math.cos(f),E=Math.cos(l)*Math.sin(f)-Math.sin(l)*Math.cos(f)*Math.cos(i-r);return bn(Math.atan2(u,E))}function Wr(e,t){let n=eo(t,e);return n=(n+180)%360,n}function us(e,t={}){if(e.bbox!=null&&t.recompute!==!0)return e.bbox;let n=[1/0,1/0,-1/0,-1/0];return we(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 hs(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 wn([[i,[o,s],[o,r],[n,r],i]],t.properties,{bbox:e,id:t.id})}function ds(e){return hs(us(e))}function gs(e){return Io(e,(t,n)=>t+jr(n),0)}function jr(e){let t=0,n;switch(e.type){case"Polygon":return ms(e.coordinates);case"MultiPolygon":for(n=0;n<e.coordinates.length;n++)t+=ms(e.coordinates[n]);return t;case"Point":case"MultiPoint":case"LineString":case"MultiLineString":return 0}return 0}function ms(e){let t=0;if(e&&e.length>0){t+=Math.abs(ps(e[0]));for(let n=1;n<e.length;n++)t-=Math.abs(ps(e[n]))}return t}var qr=Zt*Zt/2,no=Math.PI/180;function ps(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]*no,f=r[1]*no,u=i[0]*no;n+=(u-l)*Math.sin(f),s++}return n*qr}function ys(e){let t=es(e);if(!t)throw new Error("Can't calculate smallestSurroundingRectangleByArea for given geometry");let n=Vn(t),s=Do(t),o=Number.MAX_SAFE_INTEGER,r=null;for(let i=0;i<s.length-1;i++){let l=eo(s[i],s[i+1]),f=to(t,-1*l,{pivot:n}),u=ds(f),E=gs(u);E<o&&(o=E,r=to(u,l,{pivot:n}))}return r}function Es(e,t){let n=t[0]-e[0],s=t[1]-e[1];return Math.sqrt(n*n+s*s)}function Xr(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 vn=class e extends $r{getBoxMesh(){ve.identity(),ve.setFromMatrix3(this.rotation),ve.decompose(Mn,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();Gr.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 ve.identity(),ve.setFromMatrix3(this.rotation),ve.decompose(Mn,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 ve.compose(n,Ae,Yr),o.center.copy(n),o.halfSize.copy(t.multiplyScalar(.5)),o.rotation.setFromMatrix4(ve),o}static fromByPath2D(t,n,s,o=new e){let r=ys({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=Es(i[0],i[1]),f=Es(i[1],i[2]),u=Math.atan2(i[1][1]-i[0][1],i[1][0]-i[0][0]);Mn.set(l,f,s),xs.set(0,0,u);let[E,a]=Xr(i);return n.x=E,n.y=a,this.from(Mn,n,xs,o)}},ve=new Wt.Matrix4,Ae=new Wt.Quaternion,xs=new Wt.Euler,Yr=new Wt.Vector3(1,1,1),Mn=new Wt.Vector3,Gr=new Wt.Box3;import"three";function Zr(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,E=[];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&&E.push([a,c,m]);for(let a of e){let c=Math.floor(a.x/o),m=Math.floor(a.y/o),h=Math.floor(a.z/o),g=!1;for(let[T,y,p]of E){let d=`${c+T},${m+y},${h+p}`;if(i.has(d)){for(let x of i.get(d))if(a.distanceToSquared(x)<r){g=!0;break}if(g)break}}if(g&&(f++,f/e.length>s))return f/e.length}return f/e.length}function He(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 oo(e,t,n,s){if(e.intersectsOBB(t))return!0;{let r=Jt(e,s),i=Jt(t,n);if(r||i)return!0}return!1}function so(e,t){let n=new F.Vector3,s=new F.Vector3;e.getSize(n),t.getSize(s);let o=n.x*n.y*n.z,r=s.x*s.y*s.z;return o>r?1:o<r?-1:0}function Jt(e,t){let n=!0;for(let s=0;s<t.length;s++)if(!e.containsPoint(t[s])){n=!1;break}return n}function ue(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 be(e,t,n,s){let o=[];for(let i=0;i<e.length;i++)o.push(new F.Vector3(e[i][0],e[i][1],0));if(o.length==0)return null;let r=vn.fromByPath2D(o,t,n);return r.center.z=s,r}var Ur=(e,t)=>{let n=new F.Group,s=new F.MeshStandardMaterial({color:16737792,side:F.DoubleSide});for(let o=0;o<e.length;o++){let r=[];for(let g=0;g<e[o].path.length;g++)r.push(new F.Vector3(e[o].path[g][0],e[o].path[g][1],0));if(r.length==0)continue;n.add(e[o].obb.getBoxEdge());let i=new F.BufferGeometry;i.setFromPoints(r);let l="green",f=new F.LineBasicMaterial({color:l,depthTest:!1,depthWrite:!1}),u=new F.Line(i,f);u.position.z=e[o].maxz,n.add(u);let E=e[o].obb.center.clone(),a=ho(e[o].type,E),c=e[o].stairBottomPt1.clone(),m=e[o].stairBottomPt2.clone();for(let g=0;g<e[o].stairStepNum;g++){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 y=An(T,e[o].stairStepHeight),p=new F.Mesh(y,s);n.add(p),c=c.addScaledVector(e[o].vecStepWidth,e[o].stairStepWidth),c=c.addScaledVector(new F.Vector3(0,0,1),e[o].stairStepHeight),m=m.addScaledVector(e[o].vecStepWidth,e[o].stairStepWidth),m=m.addScaledVector(new F.Vector3(0,0,1),e[o].stairStepHeight)}if(e[o].rectPt1.x!=0&&e[o].rectPt1.y!=0){let g=[e[o].stairBottomPt1,e[o].stairBottomPt2,e[o].rectPt2,e[o].rectPt1],T=An(g,e[o].stairStepHeight),y=new F.Mesh(T,s);n.add(y)}let h=new F.MeshBasicMaterial({color:16776960});for(let g=0;g<e[o].stairBottom1BalconyRailing.length;g++){let T=new F.CylinderGeometry(.03,.03,e[o].balconyRailingHeight,32),y=new F.Mesh(T,h);y.position.set(e[o].stairBottom1BalconyRailing[g].x,e[o].stairBottom1BalconyRailing[g].z+e[o].balconyRailingHeight/2,-e[o].stairBottom1BalconyRailing[g].y),t.add(y)}for(let g=0;g<e[o].stairBottom2BalconyRailing.length;g++){let T=new F.CylinderGeometry(.03,.03,e[o].balconyRailingHeight,32),y=new F.Mesh(T,h);y.position.set(e[o].stairBottom2BalconyRailing[g].x,e[o].stairBottom2BalconyRailing[g].z+e[o].balconyRailingHeight/2,-e[o].stairBottom2BalconyRailing[g].y),t.add(y)}}return n},Kr=(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(y=>[y.x,y.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,E=l.lastIndexOf("_"),a=l.substring(u,E);if(a.includes("top")&&(u=a.indexOf("top")+4,a=a.substring(u,E)),a.includes("left")&&(u=a.indexOf("left")+5,a=a.substring(u,E)),a.includes("right")&&(u=a.indexOf("right")+6,a=a.substring(u,E)),a.includes("front")&&(u=a.indexOf("front")+6,a=a.substring(u,E)),a==="wall"||a==="stair guardrail")continue;let c=[];for(let y=0;y<e[r].points.length;y++)c.push(new F.Vector3(e[r].points[y].x,e[r].points[y].y,e[r].points[y].z));let m=-99999;if(a==="floor"){let y=new Map;for(let d=0;d<e[r].points.length;d++){let x=e[r].points[d].z;if(x=Math.floor(x*10)/10,y.has(x)){let w=y.get(x);w.num+=1,w.points.push(e[r].points[d]),y.set(x,w)}else y.set(x,{num:1,points:[e[r].points[d]]})}let p=[...y.entries()].reduce((d,x)=>x[1].num>d[1].num?x:d);i=[],i=p[1].points.map(d=>[d.x,d.y]),c=[],c=p[1].points.map(d=>new F.Vector3(d.x,d.y,d.z)),m=p[0]}let h=ue(c),g={points:c,path:ze(i),h:h.h,minz:h.minz,maxz:h.maxz,center:{x:h.x,y:h.y,z:h.z},obj_id:e[r].obj_id,type:a,averagePz:t,obb:null,isDel:!1,obj_id:l,positionArr:[e[r].position]};if(g.obb=be(g.path,g.center,g.h,(g.maxz+g.minz)/2),g.obb==null)continue;let T=-1;for(let y=0;y<n.length;y++)if(n[y].type==a){T=y;break}T!=-1?n[T].array.push(g):n.push({type:a,array:[g]})}for(let r=0;r<n.length;r++){let i=n[r].array,l=new Set,f=[];for(let E=0;E<i.length;E++){if(i[E].obb==null||l.has(E))continue;let a={...i[E],obb:i[E].obb.clone()};for(let c=E+1;c<i.length;c++){if(i[c].obb==null||l.has(c))continue;let m=a.obb.intersectsOBB(i[c].obb,.01);if(m||(m=si(a.obb,i[c].obb)),m){l.add(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 h=a.points.map(T=>[T.x,T.y]);a.path=ze(h);let g=ue(a.points);a.h=g.h,a.minz=g.minz,a.maxz=g.maxz,a.center={x:g.x,y:g.y,z:g.z},a.obb=be(a.path,a.center,a.h,(a.maxz+a.minz)/2),a.positionArr.push(...i[c].positionArr),c=E}}a.path.length>i[E].path.length&&(l.add(E),f.push(a))}let u=[];for(let E=0;E<i.length;E++)l.has(E)||u.push(i[E]);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,E=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 F.Vector3;u.getSize(m);let h=[m.x,m.y,m.z],g=0;for(let T of h)if(T<.2&&(g++,g===2)){l[f].isDel=!0;break}}if(!l[f].isDel)for(let m=r+1;m<n.length;m++){let h=n[m].type;if(h==="people")continue;let g=n[m].array;for(let T=0;T<g.length;T++){if(g[T].isDel)continue;let y=g[T].obb,p=g[T].minz,d=g[T].maxz;if(u.intersectsOBB(y)){let x=He(g[T].points,u),w=He(l[f].points,y),P=so(u,y);if(w>=.5&&P==-1&&i!=="Staircase"&&h!=="Staircase"){l[f].isDel=!0;break}if(i!=="wall"&&i!=="floor"&&i!=="roof"){if(i==="window"){if(h==="balcony railing"&&Jt(u,g[T].points)){g[T].isDel=!0;continue}if(h==="balcony railing"&&Jt(y,l[f].points)){l[f].isDel=!0;break}if(h==="balcony railing"&&oo(u,y,l[f].points,g[T].points)&&(Math.abs(E-p)<.1||Math.abs(p-c)>.3)){g[T].isDel=!0;continue}if(h==="door"&&Jt(u,g[T].points)){g[T].isDel=!0;continue}if(h==="door"&&Jt(y,l[f].points)){g[T].isDel=!0;continue}if(h==="window sill")continue}else if(i==="balcony railing"){if(h==="window"&&Jt(u,g[T].points)){g[T].isDel=!0;continue}if(h==="window"&&Jt(y,l[f].points)){l[f].isDel=!0;break}if(h==="window"&&oo(u,y,l[f].points,g[T].points)&&(Math.abs(E-p)<.1||Math.abs(E-c)>.3)){l[f].isDel=!0;break}if(h==="Staircase"&&Jt(u,g[T].points)){l[f].isDel=!0;break}if(h==="Staircase"&&Jt(y,l[f].points)){l[f].isDel=!0;break}if(h==="Staircase"&&u.intersectsOBB(y)){l[f].isDel=!0;break}}else if(i==="door"){if(h==="window"&&Jt(u,g[T].points)){l[f].isDel=!0;break}if(h==="window"&&Jt(y,l[f].points)){l[f].isDel=!0;break}if(h==="window sill"&&Jt(u,g[T].points)){l[f].isDel=!0;break}if(h==="window sill"&&Jt(y,l[f].points)){l[f].isDel=!0;break}}else if(i==="window sill"){if(h==="window")continue;if(h==="floor"&&Jt(u,g[T].points)){g[T].isDel=!0;continue}if(h==="door"&&Jt(u,g[T].points)){g[T].isDel=!0;continue}if(h==="door"&&Jt(y,l[f].points)){g[T].isDel=!0;continue}}else if(i==="Staircase"){if(h==="balcony railing"&&Jt(u,g[T].points)){g[T].isDel=!0;continue}if(h==="balcony railing"&&Jt(y,l[f].points)){g[T].isDel=!0;continue}if(h==="balcony railing"&&u.intersectsOBB(y)){g[T].isDel=!0;continue}}let R=!1,b=[],S=[],z=l[f].points,V=g[T].points;if(z.length>V.length?(R=!0,b=z,S=V):(b=V,S=z),Zr(S,b,.03,.5)>.5)if(R)g[T].isDel=!0;else{l[f].isDel=!0;break}else if(oo(u,y,l[f].points,g[T].points)){let H=so(u,y);if(H===1||H===0){if(h==="switch"||h==="Staircase")continue;z.length>V.length?He(S,u)>=.5&&(g[T].isDel=!0):He(b,u)>=.5&&(g[T].isDel=!0)}else{if(i==="switch"||i==="Staircase")continue;if(z.length>V.length){if(He(b,y)>=.5){l[f].isDel=!0;break}}else if(He(S,y)>=.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,E=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(E-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 F.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-E)<.4&&(l[f].isDel=!0),(E<t&&Math.abs(E-t)>1||E>t&&Math.abs(E-t)>1)&&(l[f].isDel=!0),u<t&&(l[f].isDel=!0)),i==="people"&&(Math.abs(u-E)<1&&(l[f].isDel=!0),E>t&&E-t>.3&&(l[f].isDel=!0),u<t&&(l[f].isDel=!0)),i==="floor"){let c=new F.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 F.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},Jr=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("_"),E=i.substring(f,u);if(E!=="floor")continue;let a=[];for(let T=0;T<e[o].points.length;T++)a.push(new F.Vector3(e[o].points[T].x,e[o].points[T].y,e[o].points[T].z));let c=-99999;if(E==="floor"){let T=new Map;for(let p=0;p<e[o].points.length;p++){let d=e[o].points[p].z;if(d=Math.floor(d*10)/10,T.has(d)){let x=T.get(d);x.num+=1,x.points.push(e[o].points[p]),T.set(d,x)}else T.set(d,{num:1,points:[e[o].points[p]]})}let y=[...T.entries()].reduce((p,d)=>d[1].num>p[1].num?d:p);r=[],r=y[1].points.map(p=>[p.x,p.y]),a=[],a=y[1].points.map(p=>new F.Vector3(p.x,p.y,p.z)),c=y[0]}let m=ue(a),h={points:a,path:ze(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:E,obb:null,isDel:!1,obj_id:i,positionArr:[e[o].position]};if(h.obb=be(h.path,h.center,h.h,(h.maxz+h.minz)/2),h.obb==null)continue;let g=-1;for(let T=0;T<t.length;T++)if(t[T].type==E){g=T;break}if(g!=-1?t[g].array.push(h):t.push({type:E,array:[h]}),E=="floor"&&c!=-99999)if(n.has(c)){let T=n.get(c);T.num+=h.points.length,T.datas.push(h),n.set(c,T)}else n.set(c,{num:h.points.length,datas:[h]})}for(let o=0;o<t.length;o++){let r=t[o].array,i=[],l=[];for(let u=0;u<r.length;u++){if(r[u].obb==null||i.includes(u))continue;let E={...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(E.obb.intersectsOBB(r[a].obb)){i.push(a);for(let g=0;g<r[a].points.length;g++)E.points.push(r[a].points[g]);let m=E.points.map(g=>[g.x,g.y]);E.path=ze(m);let h=ue(E.points);E.h=h.h,E.minz=h.minz,E.maxz=h.maxz,E.center={x:h.x,y:h.y,z:h.z},E.obb=be(E.path,E.center,E.h,(E.maxz+E.minz)/2),E.positionArr.push(...r[a].positionArr),a=u}}E.path.length>r[u].path.length&&(i.push(u),l.push(E))}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 F.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},Qr=(e,t)=>{if(!e||!e.splitFloorProjectsResults||!e.trajectoryResults)return[];let n=e.splitFloorProjectsResults,s=e.trajectoryResults,o=new Map;for(let c=0;c<s.length;c++){let m=s[c].floor;o.has(m)?o.get(m).push(s[c]):o.set(m,[s[c]])}let r=new Map,i=[];for(let c=0;c<n.length;c++){let m=[],h=n[c];for(let g=0;g<h.length;g++){let T=h[g].points.map(S=>[S.x,S.y]),y=h[g].obj_id;y=y.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 p=y.split("_").slice(1,3).join("_").split(".")[0].split("_")[0],d=y.indexOf("_")+1,x=y.lastIndexOf("_"),w=y.substring(d,x);if(w.includes("top")&&(d=w.indexOf("top")+4,w=w.substring(d,x)),w.includes("left")&&(d=w.indexOf("left")+5,w=w.substring(d,x)),w.includes("right")&&(d=w.indexOf("right")+6,w=w.substring(d,x)),w.includes("front")&&(d=w.indexOf("front")+6,w=w.substring(d,x)),w!=="Staircase"&&w!=="balcony railing")continue;let P=[];for(let S=0;S<h[g].points.length;S++)P.push(new F.Vector3(h[g].points[S].x,h[g].points[S].y,h[g].points[S].z));let R=ue(P),b={points:P,path:ze(T),h:R.h,minz:R.minz,maxz:R.maxz,center:{x:R.x,y:R.y,z:R.z},obj_id:h[g].obj_id,type:w,averagePz:0,obb:null,isDel:!1,obj_id:y,positionArr:[h[g].position],aabbBox:new F.Box3().setFromPoints(P)};b.obb=be(b.path,b.center,b.h,(b.maxz+b.minz)/2),b.obb!=null&&(w=="Staircase"?m.push(b):w=="balcony railing"&&i.push(b))}r.set(c+1,m)}let l=[];for(let[c,m]of r){let h={floor:c,findTrajectoryResults:[],otherTrajectoryResults:[],lastTrajectoryResults:[]},g=o.get(c);if(!g){h.otherTrajectoryResults=m,l.push(h);continue}let T=[],y=[],p=[];for(let d=0;d<g.length;d++){let x=[];for(let P=0;P<g[d].points.length;P++){let R=[new F.Vector3(g[d].points[P].x,g[d].points[P].y,g[d].points[P].z)];R.push(R[0].clone().addScaledVector(new F.Vector3(0,0,-1),2));let b=new F.Box3().setFromPoints(R);x.push(b)}let w=[];for(let P=0;P<m.length;P++)for(let R=0;R<x.length;R++)!p.includes(P)&&m[P].aabbBox.intersectsBox(x[R])&&(p.push(P),w.push(m[P]));w.length>0&&y.push(w)}for(let d=0;d<m.length;d++)p.includes(d)||T.push(m[d]);h.findTrajectoryResults=y,h.otherTrajectoryResults=T,l.push(h)}function f(c,m){let h=c,g=[],T=[];for(let p=0;p<c.length;p++){if(c[p].obb==null||g.includes(p))continue;let d={...c[p],obb:c[p].obb.clone()};for(let x=p+1;x<c.length;x++){if(c[x].obb==null||g.includes(x))continue;if(d.obb.intersectsOBB(c[x].obb)||m){g.push(x);for(let b=0;b<c[x].points.length;b++)d.points.push(c[x].points[b]);let P=d.points.map(b=>[b.x,b.y]);d.path=ze(P);let R=ue(d.points);d.h=R.h,d.minz=R.minz,d.maxz=R.maxz,d.center={x:R.x,y:R.y,z:R.z},d.obb=be(d.path,d.center,d.h,(d.maxz+d.minz)/2),d.positionArr.push(...c[x].positionArr),x=p}}d.path.length>c[p].path.length&&(g.push(p),T.push(d))}let y=[];for(let p=0;p<c.length;p++)g.includes(p)||y.push(c[p]);return y.push(...T),c=y,c}for(let c=0;c<l.length;c++){for(let m=0;m<l[c].findTrajectoryResults.length;m++)l[c].findTrajectoryResults[m]=f(l[c].findTrajectoryResults[m],!0);l[c].otherTrajectoryResults=f(l[c].otherTrajectoryResults,!1)}for(let c=0;c<l.length;c++){for(let m=0;m<l[c].findTrajectoryResults.length;m++){for(let h=0;h<l[c].findTrajectoryResults[m].length;h++){let g=ws(l[c].findTrajectoryResults[m][h].points,{binCount:100,minBinPoints:5,sideK:2.2,zK:2.2,minSideRange:.2,minZRange:.2,lowerZScale:.4,upperZScale:1.8}),T=bs(g.keep,{radius:.1,minClusterSize:50,lowPercent:.45});if(T.keep.length==0){l[c].findTrajectoryResults[m][h].isDel=!0;continue}l[c].findTrajectoryResults[m][h].points=T.keep;let y=l[c].findTrajectoryResults[m][h].points.map(d=>[d.x,d.y]);l[c].findTrajectoryResults[m][h].path=ze(y);let p=ue(l[c].findTrajectoryResults[m][h].points);l[c].findTrajectoryResults[m][h].h=p.h,l[c].findTrajectoryResults[m][h].minz=p.minz,l[c].findTrajectoryResults[m][h].maxz=p.maxz,l[c].findTrajectoryResults[m][h].center={x:p.x,y:p.y,z:p.z},l[c].findTrajectoryResults[m][h].obb=be(l[c].findTrajectoryResults[m][h].path,l[c].findTrajectoryResults[m][h].center,l[c].findTrajectoryResults[m][h].h,(l[c].findTrajectoryResults[m][h].maxz+l[c].findTrajectoryResults[m][h].minz)/2)}l[c].findTrajectoryResults[m]=l[c].findTrajectoryResults[m].filter(h=>!h.isDel)}for(let m=0;m<l[c].otherTrajectoryResults.length;m++){let h=ws(l[c].otherTrajectoryResults[m].points,{binCount:100,minBinPoints:5,sideK:2.2,zK:2.2,minSideRange:.2,minZRange:.2,lowerZScale:.4,upperZScale:1.8}),g=bs(h.keep,{radius:.1,minClusterSize:50,lowPercent:.45});if(g.keep.length==0){l[c].otherTrajectoryResults[m].isDel=!0;continue}l[c].otherTrajectoryResults[m].points=g.keep;let T=l[c].otherTrajectoryResults[m].points.map(p=>[p.x,p.y]);l[c].otherTrajectoryResults[m].path=ze(T);let y=ue(l[c].otherTrajectoryResults[m].points);l[c].otherTrajectoryResults[m].h=y.h,l[c].otherTrajectoryResults[m].minz=y.minz,l[c].otherTrajectoryResults[m].maxz=y.maxz,l[c].otherTrajectoryResults[m].center={x:y.x,y:y.y,z:y.z},l[c].otherTrajectoryResults[m].obb=be(l[c].otherTrajectoryResults[m].path,l[c].otherTrajectoryResults[m].center,l[c].otherTrajectoryResults[m].h,(l[c].otherTrajectoryResults[m].maxz+l[c].otherTrajectoryResults[m].minz)/2)}l[c].otherTrajectoryResults.filter(m=>!m.isDel)}function u(c){for(let m=0;m<c.length;m++){let h=c[m].obb;for(let g=m+1;g<c.length;g++){let T=c[g].obb;if(!c[g].isDel){if(h.intersectsOBB(T)){let y=He(c[g].points,h),p=He(c[m].points,T),d=so(h,T);if(y>=.5&&(d==1||d==0)&&(c[g].isDel=!0),p>=.5&&d==-1){c[m].isDel=!0;break}}if(c[m].isDel)break}}}return c=c.filter(m=>!m.isDel),c}for(let c=0;c<l.length;c++){let m=[];for(let h=0;h<l[c].findTrajectoryResults.length;h++)m.push(...l[c].findTrajectoryResults[h]);m.push(...l[c].otherTrajectoryResults),l[c].lastTrajectoryResults=u(m)}function E(c){let m=[];if(c.length>0){let h=.3,g=.5,T=.5,y=.2;for(let p=0;p<c.length;p++){let d=c[p].obb.halfSize.clone().multiplyScalar(2),x=c[p].points,w=d.x,P=d.y,R=d.z;if(w>P&&([w,P]=[P,w]),w<g||P<h||R<T)continue;let b=yo(c[p].obb);if(b.length!=8)continue;let S=new F.Line3(b[0],b[1]),z=new F.Line3(b[1],b[2]),V=new F.Line3(b[2],b[3]),M=new F.Line3(b[3],b[0]),H=new F.Line3(b[4],b[5]),C=new F.Line3(b[5],b[6]),D=new F.Line3(b[6],b[7]),B=new F.Line3(b[7],b[4]),_=[],k=[],v=[],A=[],j=[],$=[],Z=[],Y=[];for(let Et=0;Et<x.length;Et++){let re=S.closestPointToPoint(x[Et],!0,new F.Vector3),Te=z.closestPointToPoint(x[Et],!0,new F.Vector3),St=V.closestPointToPoint(x[Et],!0,new F.Vector3),ie=M.closestPointToPoint(x[Et],!0,new F.Vector3),G=H.closestPointToPoint(x[Et],!0,new F.Vector3),de=C.closestPointToPoint(x[Et],!0,new F.Vector3),Be=D.closestPointToPoint(x[Et],!0,new F.Vector3),_e=B.closestPointToPoint(x[Et],!0,new F.Vector3);re.distanceTo(x[Et])<y&&_.push(x[Et]),Te.distanceTo(x[Et])<y&&k.push(x[Et]),St.distanceTo(x[Et])<y&&v.push(x[Et]),ie.distanceTo(x[Et])<y&&A.push(x[Et]),G.distanceTo(x[Et])<y&&j.push(x[Et]),de.distanceTo(x[Et])<y&&$.push(x[Et]),Be.distanceTo(x[Et])<y&&Z.push(x[Et]),_e.distanceTo(x[Et])<y&&Y.push(x[Et])}let tt=b[0].distanceTo(b[1]),it=b[1].distanceTo(b[2]),ct=b[2].distanceTo(b[3]),ut=b[3].distanceTo(b[0]),q=new F.Vector3,W=new F.Vector3,U=new F.Vector3,wt=new F.Vector3;Math.abs(tt-w)<.01?_.length>v.length?(q=b[0].clone(),W=b[1].clone(),U=new F.Vector3().subVectors(W,q).normalize(),wt=new F.Vector3().subVectors(b[2],b[1]).normalize()):(q=b[2].clone(),W=b[3].clone(),U=new F.Vector3().subVectors(W,q).normalize(),wt=new F.Vector3().subVectors(b[0],b[3]).normalize()):k.length>A.length?(q=b[1].clone(),W=b[2].clone(),U=new F.Vector3().subVectors(W,q).normalize(),wt=new F.Vector3().subVectors(b[3],b[2]).normalize()):(q=b[3].clone(),W=b[0].clone(),U=new F.Vector3().subVectors(W,q).normalize(),wt=new F.Vector3().subVectors(b[1],b[0]).normalize());let Ft=b[4].distanceTo(b[5]),Nt=b[5].distanceTo(b[6]),jt=b[6].distanceTo(b[7]),Lt=b[7].distanceTo(b[4]),Pt=new F.Vector3,It=new F.Vector3,Rt=new F.Vector3(q.x,q.y,b[4].z),bt=new F.Vector3(W.x,W.y,b[4].z);(st(b[4],Rt)||st(b[4],bt))&&(st(b[5],Rt)||st(b[5],bt))?(Pt=b[6].clone(),It=b[7].clone()):(st(b[5],Rt)||st(b[5],bt))&&(st(b[6],Rt)||st(b[6],bt))?(Pt=b[7].clone(),It=b[4].clone()):(st(b[6],Rt)||st(b[6],bt))&&(st(b[7],Rt)||st(b[7],bt))?(Pt=b[4].clone(),It=b[5].clone()):(st(b[7],Rt)||st(b[7],bt))&&(st(b[4],Rt)||st(b[4],bt))&&(Pt=b[5].clone(),It=b[6].clone());let _t=q.distanceTo(W),J=Pt.distanceTo(It),ft=new F.Vector3().subVectors(new F.Vector3(q.x,q.y,Pt.z),q).normalize();if(Math.abs(_t-J)>.01||Math.abs(_t-w)>.01){console.log("\u4E0A\u4E0B\u957F\u5EA6\u4E0D\u4E00\u81F4,\u6216\u4E0E\u5BBD\u4E0D\u4E00\u81F4",_t,J,w);continue}let Q=Math.sqrt(_t*_t+J*J),K=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(Q)))),he={stairStepHeight:R/K,stairStepWidth:P/K,staitWidth:w,stairLength:P,stairHeigth:R,stairStepNum:K,stairBottomPt1:q,stairBottomPt2:W,stairTopPt1:Pt,stairTopPt2:It,vecStepLength:U,vecStepWidth:wt,vecStepHeight:ft,path:c[p].path,obb:c[p].obb,maxz:c[p].maxz,points:c[p].points,rectPt1:new F.Vector3(0,0,0),rectPt2:new F.Vector3(0,0,0)};m.push(he)}}return m}let a=[];for(let c=0;c<l.length;c++)a.push(...E(l[c].lastTrajectoryResults));for(let c=0;c<a.length;c++){let m=a[c].stairTopPt1.clone(),h=a[c].stairTopPt2.clone(),g=a[c].stairBottomPt1.clone(),T=a[c].stairBottomPt2.clone(),y=m.clone(),p=h.clone(),d=g.clone(),x=T.clone();y.z=p.z=d.z=x.z=0;let w=qt(m,h,!0),P=qt(g,T,!0),R=qt(w,P),b=new F.Vector3().subVectors(w,R).normalize(),S=new F.Vector3().subVectors(P,R).normalize(),z=w.distanceTo(P),V=!1,M=!1;for(let H=0;H<a.length;H++){if(c==H)continue;let C=a[H].stairTopPt1.clone(),D=a[H].stairTopPt2.clone(),B=a[H].stairBottomPt1.clone(),_=a[H].stairBottomPt2.clone(),k=new F.Vector3().subVectors(C,D).normalize(),v=new F.Vector3().subVectors(B,_).normalize(),A=C.clone(),j=D.clone(),$=B.clone(),Z=_.clone();A.z=j.z=$.z=Z.z=0;let Y=qt(C,D,!0),tt=qt(B,_,!0),it=Y.distanceTo(tt),ct=Yt(w,P,Y,tt),ut=!1;if(ct&&ct.isParallel&&C.z<=g.z&&g.z-C.z<.3){ut=!0,M=!0;let q=A.addScaledVector(k.clone().negate(),100),W=j.addScaledVector(k,100),U=$.addScaledVector(v.clone().negate(),100),wt=Z.addScaledVector(v,100),Ft=new F.Line3(q,W),Nt=new F.Line3(U,wt),jt=Ft.closestPointToPoint(R,!0,new F.Vector3),Lt=Nt.closestPointToPoint(R,!0,new F.Vector3),Pt=new F.Vector3().subVectors(jt,R),It=new F.Vector3().subVectors(Lt,R),Rt=Pt.length(),bt=It.length();It=It.normalize(),Pt=Pt.normalize();let _t=Kt(b,Pt,.1),J=Kt(S,Pt,.1),ft=Kt(S,It,.1),Q=Kt(b,It,.1);if(_t&&_t.sameDirection&&Rt>z/2){let K=Rt-z/2;a[c].stairBottomPt1=a[c].stairBottomPt1.addScaledVector(S,K),a[c].stairBottomPt2=a[c].stairBottomPt2.addScaledVector(S,K)}else if(J&&J.sameDirection&&Rt>z/2){let K=Rt-z/2;a[c].stairBottomPt1=a[c].stairBottomPt1.addScaledVector(S,K),a[c].stairBottomPt2=a[c].stairBottomPt2.addScaledVector(S,K)}if(ft&&ft.sameDirection&&bt>z/2){let K=bt-z/2;a[c].stairTopPt1=a[c].stairTopPt1.addScaledVector(b,K),a[c].stairTopPt2=a[c].stairTopPt2.addScaledVector(b,K)}else if(Q&&Q.sameDirection&&bt>z/2){let K=bt-z/2;a[c].stairTopPt1=a[c].stairTopPt1.addScaledVector(b,K),a[c].stairTopPt2=a[c].stairTopPt2.addScaledVector(b,K)}}else if(ct&&ct.isParallel&&m.z<B.z&&B.z-m.z<.2){ut=!0,V=!0;let q=A.addScaledVector(k.clone().negate(),100),W=j.addScaledVector(k,100),U=$.addScaledVector(v.clone().negate(),100),wt=Z.addScaledVector(v,100),Ft=new F.Line3(q,W),Nt=new F.Line3(U,wt),jt=Ft.closestPointToPoint(R,!1,new F.Vector3),Lt=Nt.closestPointToPoint(R,!1,new F.Vector3),Pt=new F.Vector3().subVectors(jt,R),It=new F.Vector3().subVectors(Lt,R),Rt=Pt.length(),bt=It.length();It=It.normalize(),Pt=Pt.normalize();let _t=Kt(b,Pt,.1),J=Kt(S,Pt,.1),ft=Kt(S,It,.1),Q=Kt(b,It,.1);if(_t&&_t.sameDirection&&Rt>z/2){let K=Rt-z/2;a[c].stairBottomPt1=a[c].stairBottomPt1.addScaledVector(S,K),a[c].stairBottomPt2=a[c].stairBottomPt2.addScaledVector(S,K)}else if(J&&J.sameDirection&&Rt>z/2){let K=Rt-z/2;a[c].stairBottomPt1=a[c].stairBottomPt1.addScaledVector(S,K),a[c].stairBottomPt2=a[c].stairBottomPt2.addScaledVector(S,K)}if(ft&&ft.sameDirection&&bt>z/2){let K=bt-z/2;a[c].stairTopPt1=a[c].stairTopPt1.addScaledVector(b,K),a[c].stairTopPt2=a[c].stairTopPt2.addScaledVector(b,K)}else if(Q&&Q.sameDirection&&bt>z/2){let K=bt-z/2;a[c].stairTopPt1=a[c].stairTopPt1.addScaledVector(b,K),a[c].stairTopPt2=a[c].stairTopPt2.addScaledVector(b,K)}a[c].stairTopPt1.z=a[c].stairTopPt2.z=B.z}if(ut&&(m=a[c].stairTopPt1.clone(),h=a[c].stairTopPt2.clone(),g=a[c].stairBottomPt1.clone(),T=a[c].stairBottomPt2.clone(),y=m.clone(),p=h.clone(),d=g.clone(),x=T.clone(),y.z=p.z=d.z=x.z=0,w=qt(m,h,!0),P=qt(g,T,!0),R=qt(w,P),b=new F.Vector3().subVectors(w,R).normalize(),S=new F.Vector3().subVectors(P,R).normalize(),z=w.distanceTo(P)),M&&V)break}if(M||V){let H=a[c].stairTopPt1.clone(),C=a[c].stairTopPt2.clone(),D=a[c].stairBottomPt1.clone(),B=a[c].stairBottomPt2.clone(),_=qt(H,C,!0),k=qt(D,B,!0),v=_.distanceTo(k),A=a[c].stairTopPt1.distanceTo(a[c].stairTopPt2),j=a[c].stairBottomPt1.distanceTo(a[c].stairBottomPt2),$=Math.sqrt(A*A+j*j),Z=Math.round(Math.max(5,Math.min(350,10*Math.sqrt($))));a[c].stairStepNum=Z,a[c].stairHeigth=a[c].stairTopPt1.z-a[c].stairBottomPt1.z,a[c].stairStepHeight=a[c].stairHeigth/a[c].stairStepNum,a[c].stairStepWidth=v/a[c].stairStepNum}}for(let c=0;c<a.length;c++){let m=a[c].stairTopPt1,h=a[c].stairTopPt2,g=a[c].stairBottomPt1.clone(),T=a[c].stairBottomPt2.clone(),y=new F.Vector3(m.x,m.y,g.z),p=a[c].vecStepWidth;for(let d=0;d<a.length;d++){if(c==d)continue;let x=a[d].stairTopPt1,w=a[d].stairTopPt2,P=a[d].stairBottomPt1.clone(),R=a[d].stairBottomPt2.clone(),b=new F.Vector3(x.x,x.y,P.z),S=a[d].vecStepWidth;if(Math.abs(m.z-P.z)<.3&&P.z>g.z&&a[c].obb.intersectsOBB(a[d].obb)){let z=se(y,g,b,P);if(z&&z.angle>75){let V=P.distanceTo(m),M=P.distanceTo(h),H=R.distanceTo(m),C=R.distanceTo(h),D=m.clone(),B=D.clone().addScaledVector(p,a[d].staitWidth),_=new F.Vector3().subVectors(h,m).normalize(),k=m.distanceTo(h),v=D.clone().addScaledVector(_,k),A=B.clone().addScaledVector(_,k),j=D.clone().addScaledVector(_,a[d].stairLength),$=B.clone().addScaledVector(_,a[d].stairLength),Z=V;(Z>M||Z>C)&&(Z=M,D=h.clone(),B=D.clone().addScaledVector(p,a[d].staitWidth),_=new F.Vector3().subVectors(m,h).normalize(),k=m.distanceTo(h),v=D.clone().addScaledVector(_,k),A=B.clone().addScaledVector(_,k),j=D.clone().addScaledVector(_,a[d].stairLength),$=B.clone().addScaledVector(_,a[d].stairLength));let Y=new F.Vector3().subVectors(j,v).normalize(),tt=j.distanceTo(v);j.z=$.z=a[d].maxz,a[d].stairBottomPt1=v,a[d].stairBottomPt2=A,a[d].stairTopPt1=j,a[d].stairTopPt2=$,a[d].rectPt1=D,a[d].rectPt2=B;let it=v.distanceTo(A),ct=j.distanceTo($),ut=Math.sqrt(tt*tt+a[d].stairHeigth*a[d].stairHeigth),q=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(ut))));a[d].stairStepNum=q,a[d].stairHeigth=j.z-v.z,a[d].stairStepHeight=a[d].stairHeigth/a[d].stairStepNum,a[d].stairStepWidth=tt/a[d].stairStepNum,a[d].vecStepLength=_.clone().negate(),a[d].vecStepWidth=Y;break}}}}return ti(a,i,t),a},ti=(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(),E=new F.Vector3().subVectors(l,i).normalize();i=i.addScaledVector(E,.05),l=l.addScaledVector(E.clone().negate(),.05);let a=[],c=[];for(let m=0;m<e[r].stairStepNum;m++){let h=[i,f];h.push(h[1].clone().addScaledVector(e[r].vecStepWidth,e[r].stairStepWidth)),h.push(h[0].clone().addScaledVector(e[r].vecStepWidth,e[r].stairStepWidth));let g=h.map(w=>[w.x,w.y]);h.push(new F.Vector3(h[3].x,h[3].y,h[3].z+s)),h.push(new F.Vector3(h[2].x,h[2].y,h[2].z+s)),h.push(new F.Vector3(h[1].x,h[1].y,h[1].z+s)),h.push(new F.Vector3(h[0].x,h[0].y,h[0].z+s));let T=ue(h),y=be(g,{x:T.x,y:T.y,z:T.z},T.h,(T.maxz+T.minz)/2),p=[],d=!1,x=0;for(let w=0;w<t.length;w++)if(y.intersectsOBB(t[w].obb)){for(let P=0;P<t[w].points.length&&!(y.containsPoint(t[w].points[P])&&(m==0&&p.push(t[w].points[P]),t[w].points[P].z>i.z&&t[w].points[P].z-i.z<1&&(x++,x>10&&m!=0)));P++);if(x>10&&(d=!0),m!=0&&d)break}if(o==0&&(o=ue(p).maxz),d){let w=qt(h[1],h[2]);w.z+=e[r].stairStepHeight,a.push(w)}h=[],h=[l,u],h.push(h[1].clone().addScaledVector(e[r].vecStepWidth,e[r].stairStepWidth)),h.push(h[0].clone().addScaledVector(e[r].vecStepWidth,e[r].stairStepWidth)),g=h.map(w=>[w.x,w.y]),h.push(new F.Vector3(h[3].x,h[3].y,h[3].z+s)),h.push(new F.Vector3(h[2].x,h[2].y,h[2].z+s)),h.push(new F.Vector3(h[1].x,h[1].y,h[1].z+s)),h.push(new F.Vector3(h[0].x,h[0].y,h[0].z+s)),T=ue(h),y=be(g,{x:T.x,y:T.y,z:T.z},T.h,(T.maxz+T.minz)/2),p=[],d=!1;for(let w=0;w<t.length;w++)if(y.intersectsOBB(t[w].obb)){let P=0;for(let R=0;R<t[w].points.length&&!(y.containsPoint(t[w].points[R])&&(m==0&&p.push(t[w].points[R]),t[w].points[R].z>i.z&&t[w].points[R].z-i.z<1&&(P++,P>10&&m!=0)));R++);if(P>10&&(d=!0),m!=0&&d)break}if(o==0&&(o=ue(p).maxz),d){let w=qt(h[1],h[2]);w.z+=e[r].stairStepHeight,c.push(w)}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 ws(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:E=1}=t;if(!e||e.length===0)return[];let a=e.map((v,A)=>({index:A,x:v.x,y:v.y,z:v.z,raw:v})),c=0,m=0;for(let v of a)c+=v.x,m+=v.y;c/=a.length,m/=a.length;let h=0,g=0,T=0;for(let v of a){let A=v.x-c,j=v.y-m;h+=A*A,g+=A*j,T+=j*j}h/=a.length,g/=a.length,T/=a.length;let y=h+T,p=Math.sqrt((h-T)*(h-T)+4*g*g),d=(y+p)/2,x,w;Math.abs(g)>1e-8?(x=d-T,w=g):h>=T?(x=1,w=0):(x=0,w=1);let P=Math.sqrt(x*x+w*w)||1;x/=P,w/=P;let R=-w,b=x,S=1/0,z=-1/0,V=a.map(v=>{let A=v.x-c,j=v.y-m,$=A*x+j*w,Z=A*R+j*b;return S=Math.min(S,$),z=Math.max(z,$),{...v,t:$,side:Z}}),H=(z-S||1)/n,C=new Map;for(let v of V){let A=Math.floor((v.t-S)/H);A<0&&(A=0),A>=n&&(A=n-1),C.has(A)||C.set(A,[]),C.get(A).push(v)}let D=new Map;for(let[v,A]of C){if(A.length<s)continue;let j=A.map(q=>q.side).sort((q,W)=>q-W),$=A.map(q=>q.z).sort((q,W)=>q-W),Z=Hn(j),Y=Hn($),tt=Hn(j.map(q=>Math.abs(q-Z)).sort((q,W)=>q-W)),it=Hn($.map(q=>Math.abs(q-Y)).sort((q,W)=>q-W)),ct=Math.max(i,tt*1.4826*o),ut=Math.max(l,it*1.4826*r);D.set(v,{sideMedian:Z,zMedian:Y,sideRange:ct,zRange:ut})}function B(v){if(D.has(v))return D.get(v);for(let A=1;A<=f;A++){if(D.has(v-A))return D.get(v-A);if(D.has(v+A))return D.get(v+A)}return null}let _=[],k=[];for(let v of V){let A=Math.floor((v.t-S)/H);A<0&&(A=0),A>=n&&(A=n-1);let j=B(A);if(!j){k.push(v.raw);continue}let $=Math.abs(v.side-j.sideMedian)<=j.sideRange,Z=j.zMedian-j.zRange*u,Y=j.zMedian+j.zRange*E,tt=v.z>=Z&&v.z<=Y;$&&tt?_.push(v.raw):k.push(v.raw)}return{keep:_,removed:k,debug:{meanX:c,meanY:m,dirX:x,dirY:w,sideX:R,sideY:b,minT:S,maxT:z,binSize:H,stats:D}}}function Hn(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 ei(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 ni(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 E=-1;E<=1;E++)for(let a=-1;a<=1;a++)for(let c=-1;c<=1;c++){let m=`${i+E},${l+a},${f+c}`,h=t.get(m);if(h)for(let g of h){if(g===n)continue;let T=e[g],y=r.x-T.x,p=r.y-T.y,d=r.z-T.z;y*y+p*p+d*d<=o&&u.push(g)}}return u}function bs(e,t={}){let{radius:n=.35,minClusterSize:s=20,lowPercent:o=.35}=t,r=oi(e,{radius:n}),i=e.map(E=>E.z).sort((E,a)=>E-a),l=i[Math.floor(i.length*o)],f=[],u=[];for(let E of r.clusters){let a=E.map(h=>r.points[h]),c=a.reduce((h,g)=>h+g.z,0)/a.length;a.length<s&&c<=l?u.push(...a.map(h=>h.raw)):f.push(...a.map(h=>h.raw))}return{keep:f,removed:u}}function oi(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=ei(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=[],E=[f];for(i[f]=!0;E.length>0;){let a=E.shift();u.push(a);let c=ni(s,o,a,n,r);for(let m of c)i[m]||(i[m]=!0,E.push(m))}l.push(u)}return{points:s,clusters:l}}function si(e,t,n=1e-6){let s=ri(t);for(let o of s)if(!ii(e,o,n))return!1;return!0}function ri(e){let t=e.center,n=e.halfSize,s=e.rotation.elements,o=new F.Vector3(s[0],s[1],s[2]).multiplyScalar(n.x),r=new F.Vector3(s[3],s[4],s[5]).multiplyScalar(n.y),i=new F.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 E of[-1,1]){let a=t.clone().addScaledVector(o,f).addScaledVector(r,u).addScaledVector(i,E);l.push(a)}return l}function ii(e,t,n=1e-6){let s=new F.Vector3().subVectors(t,e.center),o=e.rotation.elements,r=e.halfSize,i=new F.Vector3(o[0],o[1],o[2]),l=new F.Vector3(o[3],o[4],o[5]),f=new F.Vector3(o[6],o[7],o[8]),u=s.dot(i),E=s.dot(l),a=s.dot(f);return Math.abs(u)<=r.x+n&&Math.abs(E)<=r.y+n&&Math.abs(a)<=r.z+n}function li(e,t,n,s){return 1+(e[t][0]===0||e[n][0]===0||e[s][0]===0?1:0)}function ci(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 ai(e){if(!e||e.length<3)return[];let t=new Set,n=[];for(let h of e){let g=`${h[0]}_${h[1]}`;t.has(g)||(t.add(g),n.push(h))}if(n.length<3)return[];let s=new Me(Float64Array.from(n.flat())),{triangles:o}=s;if(!o.length)return[];let r=new Map,i=(h,g)=>h<g?`${h}_${g}`:`${g}_${h}`;for(let h=0;h<o.length;h+=3){let g=o[h],T=o[h+1],y=o[h+2],[p,d]=n[g],[x,w]=n[T],[P,R]=n[y],b=ci(p,d,x,w,P,R),S=li(n,g,T,y);if(b<=1/S)for(let[z,V]of[[g,T],[T,y],[y,g]]){let M=i(z,V);r.set(M,(r.get(M)||0)+1)}}let l=[];for(let[h,g]of r)g===1&&l.push(h.split("_").map(Number));if(!l.length)return[];let f=new Map;for(let[h,g]of l)(f.get(h)||f.set(h,[]).get(h)).push(g),(f.get(g)||f.set(g,[]).get(g)).push(h);let u=l[0][0],E=[],a=new Set,c=u,m=-1;do{E.push(n[c]),a.add(c);let h=f.get(c)||[],g=h.find(T=>T!==m&&!a.has(T));if(g===void 0&&(g=h.find(T=>T!==m)),g===void 0)break;m=c,c=g}while(c!==u&&E.length<=l.length+1);return E.length>0&&E.push(E[0]),E}export{nr as checkBeamIsReasonable,ai as computeContour,Ur as drawStaircase,er as getBeamLine,lr as getColLine,_s as getLineCheckResults,Jr as getMergeFloorMeaning,Kr as getMergeMeaning,Bs as getOneLineCheckResults,Cs as getOneLineClusterResults,Qr as getStaircase,Ws as updateStEdPoint};
1
+ var mi=Object.create;var ar=Object.defineProperty;var gi=Object.getOwnPropertyDescriptor;var pi=Object.getOwnPropertyNames;var xi=Object.getPrototypeOf,yi=Object.prototype.hasOwnProperty;var Be=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var bi=(t,e,n,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of pi(e))!yi.call(t,s)&&s!==n&&ar(t,s,{get:()=>e[s],enumerable:!(o=gi(e,s))||o.enumerable});return t};var wi=(t,e,n)=>(n=t!=null?mi(xi(t)):{},bi(e||!t||!t.__esModule?ar(n,"default",{value:t,enumerable:!0}):n,t));var Hr=Be((Ro,Do)=>{(function(t,e){typeof Ro=="object"&&typeof Do<"u"?Do.exports=e():typeof define=="function"&&define.amd?define(e):(t=t||self,t.RBush=e())})(Ro,function(){"use strict";function t(y,w,z,M,P){e(y,w,z||0,M||y.length-1,P||o)}function e(y,w,z,M,P){for(;M>z;){if(M-z>600){var E=M-z+1,T=w-z+1,V=Math.log(E),_=.5*Math.exp(2*V/3),v=.5*Math.sqrt(V*_*(E-_)/E)*(T-E/2<0?-1:1),S=Math.max(z,Math.floor(w-T*_/E+v)),R=Math.min(M,Math.floor(w+(E-T)*_/E+v));e(y,w,S,R,P)}var D=y[w],W=z,I=M;for(n(y,z,w),P(y[M],D)>0&&n(y,z,M);W<I;){for(n(y,W,I),W++,I--;P(y[W],D)<0;)W++;for(;P(y[I],D)>0;)I--}P(y[z],D)===0?n(y,z,I):(I++,n(y,I,M)),I<=w&&(z=I+1),w<=I&&(M=I-1)}}function n(y,w,z){var M=y[w];y[w]=y[z],y[z]=M}function o(y,w){return y<w?-1:y>w?1:0}var s=function(w){w===void 0&&(w=9),this._maxEntries=Math.max(4,w),this._minEntries=Math.max(2,Math.ceil(this._maxEntries*.4)),this.clear()};s.prototype.all=function(){return this._all(this.data,[])},s.prototype.search=function(w){var z=this.data,M=[];if(!b(w,z))return M;for(var P=this.toBBox,E=[];z;){for(var T=0;T<z.children.length;T++){var V=z.children[T],_=z.leaf?P(V):V;b(w,_)&&(z.leaf?M.push(V):x(w,_)?this._all(V,M):E.push(V))}z=E.pop()}return M},s.prototype.collides=function(w){var z=this.data;if(!b(w,z))return!1;for(var M=[];z;){for(var P=0;P<z.children.length;P++){var E=z.children[P],T=z.leaf?this.toBBox(E):E;if(b(w,T)){if(z.leaf||x(w,T))return!0;M.push(E)}}z=M.pop()}return!1},s.prototype.load=function(w){if(!(w&&w.length))return this;if(w.length<this._minEntries){for(var z=0;z<w.length;z++)this.insert(w[z]);return this}var M=this._build(w.slice(),0,w.length-1,0);if(!this.data.children.length)this.data=M;else if(this.data.height===M.height)this._splitRoot(this.data,M);else{if(this.data.height<M.height){var P=this.data;this.data=M,M=P}this._insert(M,this.data.height-M.height-1,!0)}return this},s.prototype.insert=function(w){return w&&this._insert(w,this.data.height-1),this},s.prototype.clear=function(){return this.data=m([]),this},s.prototype.remove=function(w,z){if(!w)return this;for(var M=this.data,P=this.toBBox(w),E=[],T=[],V,_,v;M||E.length;){if(M||(M=E.pop(),_=E[E.length-1],V=T.pop(),v=!0),M.leaf){var S=r(w,M.children,z);if(S!==-1)return M.children.splice(S,1),E.push(M),this._condense(E),this}!v&&!M.leaf&&x(M,P)?(E.push(M),T.push(V),V=0,_=M,M=M.children[0]):_?(V++,M=_.children[V],v=!1):M=null}return this},s.prototype.toBBox=function(w){return w},s.prototype.compareMinX=function(w,z){return w.minX-z.minX},s.prototype.compareMinY=function(w,z){return w.minY-z.minY},s.prototype.toJSON=function(){return this.data},s.prototype.fromJSON=function(w){return this.data=w,this},s.prototype._all=function(w,z){for(var M=[];w;)w.leaf?z.push.apply(z,w.children):M.push.apply(M,w.children),w=M.pop();return z},s.prototype._build=function(w,z,M,P){var E=M-z+1,T=this._maxEntries,V;if(E<=T)return V=m(w.slice(z,M+1)),i(V,this.toBBox),V;P||(P=Math.ceil(Math.log(E)/Math.log(T)),T=Math.ceil(E/Math.pow(T,P-1))),V=m([]),V.leaf=!1,V.height=P;var _=Math.ceil(E/T),v=_*Math.ceil(Math.sqrt(T));p(w,z,M,v,this.compareMinX);for(var S=z;S<=M;S+=v){var R=Math.min(S+v-1,M);p(w,S,R,_,this.compareMinY);for(var D=S;D<=R;D+=_){var W=Math.min(D+_-1,R);V.children.push(this._build(w,D,W,P-1))}}return i(V,this.toBBox),V},s.prototype._chooseSubtree=function(w,z,M,P){for(;P.push(z),!(z.leaf||P.length-1===M);){for(var E=1/0,T=1/0,V=void 0,_=0;_<z.children.length;_++){var v=z.children[_],S=c(v),R=h(w,v)-S;R<T?(T=R,E=S<E?S:E,V=v):R===T&&S<E&&(E=S,V=v)}z=V||z.children[0]}return z},s.prototype._insert=function(w,z,M){var P=M?w:this.toBBox(w),E=[],T=this._chooseSubtree(P,this.data,z,E);for(T.children.push(w),f(T,P);z>=0&&E[z].children.length>this._maxEntries;)this._split(E,z),z--;this._adjustParentBBoxes(P,E,z)},s.prototype._split=function(w,z){var M=w[z],P=M.children.length,E=this._minEntries;this._chooseSplitAxis(M,E,P);var T=this._chooseSplitIndex(M,E,P),V=m(M.children.splice(T,M.children.length-T));V.height=M.height,V.leaf=M.leaf,i(M,this.toBBox),i(V,this.toBBox),z?w[z-1].children.push(V):this._splitRoot(M,V)},s.prototype._splitRoot=function(w,z){this.data=m([w,z]),this.data.height=w.height+1,this.data.leaf=!1,i(this.data,this.toBBox)},s.prototype._chooseSplitIndex=function(w,z,M){for(var P,E=1/0,T=1/0,V=z;V<=M-z;V++){var _=l(w,0,V,this.toBBox),v=l(w,V,M,this.toBBox),S=g(_,v),R=c(_)+c(v);S<E?(E=S,P=V,T=R<T?R:T):S===E&&R<T&&(T=R,P=V)}return P||M-z},s.prototype._chooseSplitAxis=function(w,z,M){var P=w.leaf?this.compareMinX:d,E=w.leaf?this.compareMinY:u,T=this._allDistMargin(w,z,M,P),V=this._allDistMargin(w,z,M,E);T<V&&w.children.sort(P)},s.prototype._allDistMargin=function(w,z,M,P){w.children.sort(P);for(var E=this.toBBox,T=l(w,0,z,E),V=l(w,M-z,M,E),_=a(T)+a(V),v=z;v<M-z;v++){var S=w.children[v];f(T,w.leaf?E(S):S),_+=a(T)}for(var R=M-z-1;R>=z;R--){var D=w.children[R];f(V,w.leaf?E(D):D),_+=a(V)}return _},s.prototype._adjustParentBBoxes=function(w,z,M){for(var P=M;P>=0;P--)f(z[P],w)},s.prototype._condense=function(w){for(var z=w.length-1,M=void 0;z>=0;z--)w[z].children.length===0?z>0?(M=w[z-1].children,M.splice(M.indexOf(w[z]),1)):this.clear():i(w[z],this.toBBox)};function r(y,w,z){if(!z)return w.indexOf(y);for(var M=0;M<w.length;M++)if(z(y,w[M]))return M;return-1}function i(y,w){l(y,0,y.children.length,w,y)}function l(y,w,z,M,P){P||(P=m(null)),P.minX=1/0,P.minY=1/0,P.maxX=-1/0,P.maxY=-1/0;for(var E=w;E<z;E++){var T=y.children[E];f(P,y.leaf?M(T):T)}return P}function f(y,w){return y.minX=Math.min(y.minX,w.minX),y.minY=Math.min(y.minY,w.minY),y.maxX=Math.max(y.maxX,w.maxX),y.maxY=Math.max(y.maxY,w.maxY),y}function d(y,w){return y.minX-w.minX}function u(y,w){return y.minY-w.minY}function c(y){return(y.maxX-y.minX)*(y.maxY-y.minY)}function a(y){return y.maxX-y.minX+(y.maxY-y.minY)}function h(y,w){return(Math.max(w.maxX,y.maxX)-Math.min(w.minX,y.minX))*(Math.max(w.maxY,y.maxY)-Math.min(w.minY,y.minY))}function g(y,w){var z=Math.max(y.minX,w.minX),M=Math.max(y.minY,w.minY),P=Math.min(y.maxX,w.maxX),E=Math.min(y.maxY,w.maxY);return Math.max(0,P-z)*Math.max(0,E-M)}function x(y,w){return y.minX<=w.minX&&y.minY<=w.minY&&w.maxX<=y.maxX&&w.maxY<=y.maxY}function b(y,w){return w.minX<=y.maxX&&w.minY<=y.maxY&&w.maxX>=y.minX&&w.maxY>=y.minY}function m(y){return{children:y,height:1,leaf:!0,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0}}function p(y,w,z,M,P){for(var E=[w,z];E.length;)if(z=E.pop(),w=E.pop(),!(z-w<=M)){var T=w+Math.ceil((z-w)/M/2)*M;t(y,T,w,z,P),E.push(w,T,T,z)}}return s})});var Ar=Be((vo,Vo)=>{(function(t,e){typeof vo=="object"&&typeof Vo<"u"?Vo.exports=e():typeof define=="function"&&define.amd?define(e):(t=t||self,t.TinyQueue=e())})(vo,function(){"use strict";var t=function(o,s){if(o===void 0&&(o=[]),s===void 0&&(s=e),this.data=o,this.length=this.data.length,this.compare=s,this.length>0)for(var r=(this.length>>1)-1;r>=0;r--)this._down(r)};t.prototype.push=function(o){this.data.push(o),this.length++,this._up(this.length-1)},t.prototype.pop=function(){if(this.length!==0){var o=this.data[0],s=this.data.pop();return this.length--,this.length>0&&(this.data[0]=s,this._down(0)),o}},t.prototype.peek=function(){return this.data[0]},t.prototype._up=function(o){for(var s=this,r=s.data,i=s.compare,l=r[o];o>0;){var f=o-1>>1,d=r[f];if(i(l,d)>=0)break;r[o]=d,o=f}r[o]=l},t.prototype._down=function(o){for(var s=this,r=s.data,i=s.compare,l=this.length>>1,f=r[o];o<l;){var d=(o<<1)+1,u=r[d],c=d+1;if(c<this.length&&i(r[c],u)<0&&(d=c,u=r[c]),i(u,f)>=0)break;r[o]=u,o=d}r[o]=f};function e(n,o){return n<o?-1:n>o?1:0}return t})});var kr=Be((Qd,Lr)=>{Lr.exports=function(e,n,o,s){var r=e[0],i=e[1],l=!1;o===void 0&&(o=0),s===void 0&&(s=n.length);for(var f=(s-o)/2,d=0,u=f-1;d<f;u=d++){var c=n[o+d*2+0],a=n[o+d*2+1],h=n[o+u*2+0],g=n[o+u*2+1],x=a>i!=g>i&&r<(h-c)*(i-a)/(g-a)+c;x&&(l=!l)}return l}});var Or=Be((Jd,Br)=>{Br.exports=function(e,n,o,s){var r=e[0],i=e[1],l=!1;o===void 0&&(o=0),s===void 0&&(s=n.length);for(var f=s-o,d=0,u=f-1;d<f;u=d++){var c=n[d+o][0],a=n[d+o][1],h=n[u+o][0],g=n[u+o][1],x=a>i!=g>i&&r<(h-c)*(i-a)/(g-a)+c;x&&(l=!l)}return l}});var qr=Be((th,Zn)=>{var Fr=kr(),Nr=Or();Zn.exports=function(e,n,o,s){return n.length>0&&Array.isArray(n[0])?Nr(e,n,o,s):Fr(e,n,o,s)};Zn.exports.nested=Nr;Zn.exports.flat=Fr});var jr=Be((Yn,$r)=>{(function(t,e){typeof Yn=="object"&&typeof $r<"u"?e(Yn):typeof define=="function"&&define.amd?define(["exports"],e):e((t=t||self).predicates={})})(Yn,function(t){"use strict";let n=33306690738754706e-32;function o(h,g,x,b,m){let p,y,w,z,M=g[0],P=b[0],E=0,T=0;P>M==P>-M?(p=M,M=g[++E]):(p=P,P=b[++T]);let V=0;if(E<h&&T<x)for(P>M==P>-M?(w=p-((y=M+p)-M),M=g[++E]):(w=p-((y=P+p)-P),P=b[++T]),p=y,w!==0&&(m[V++]=w);E<h&&T<x;)P>M==P>-M?(w=p-((y=p+M)-(z=y-p))+(M-z),M=g[++E]):(w=p-((y=p+P)-(z=y-p))+(P-z),P=b[++T]),p=y,w!==0&&(m[V++]=w);for(;E<h;)w=p-((y=p+M)-(z=y-p))+(M-z),M=g[++E],p=y,w!==0&&(m[V++]=w);for(;T<x;)w=p-((y=p+P)-(z=y-p))+(P-z),P=b[++T],p=y,w!==0&&(m[V++]=w);return p===0&&V!==0||(m[V++]=p),V}function s(h){return new Float64Array(h)}let r=33306690738754716e-32,i=22204460492503146e-32,l=11093356479670487e-47,f=s(4),d=s(8),u=s(12),c=s(16),a=s(4);t.orient2d=function(h,g,x,b,m,p){let y=(g-p)*(x-m),w=(h-m)*(b-p),z=y-w;if(y===0||w===0||y>0!=w>0)return z;let M=Math.abs(y+w);return Math.abs(z)>=r*M?z:-(function(P,E,T,V,_,v,S){let R,D,W,I,C,H,A,k,O,N,L,B,$,G,Q,q,X,Y,it=P-_,ht=T-_,St=E-v,nt=V-v;C=(Q=(k=it-(A=(H=134217729*it)-(H-it)))*(N=nt-(O=(H=134217729*nt)-(H-nt)))-((G=it*nt)-A*O-k*O-A*N))-(L=Q-(X=(k=St-(A=(H=134217729*St)-(H-St)))*(N=ht-(O=(H=134217729*ht)-(H-ht)))-((q=St*ht)-A*O-k*O-A*N))),f[0]=Q-(L+C)+(C-X),C=($=G-((B=G+L)-(C=B-G))+(L-C))-(L=$-q),f[1]=$-(L+C)+(C-q),C=(Y=B+L)-B,f[2]=B-(Y-C)+(L-C),f[3]=Y;let wt=(function(It,ot){let ft=ot[0];for(let rt=1;rt<It;rt++)ft+=ot[rt];return ft})(4,f),zt=i*S;if(wt>=zt||-wt>=zt||(R=P-(it+(C=P-it))+(C-_),W=T-(ht+(C=T-ht))+(C-_),D=E-(St+(C=E-St))+(C-v),I=V-(nt+(C=V-nt))+(C-v),R===0&&D===0&&W===0&&I===0)||(zt=l*S+n*Math.abs(wt),(wt+=it*I+nt*R-(St*W+ht*D))>=zt||-wt>=zt))return wt;C=(Q=(k=R-(A=(H=134217729*R)-(H-R)))*(N=nt-(O=(H=134217729*nt)-(H-nt)))-((G=R*nt)-A*O-k*O-A*N))-(L=Q-(X=(k=D-(A=(H=134217729*D)-(H-D)))*(N=ht-(O=(H=134217729*ht)-(H-ht)))-((q=D*ht)-A*O-k*O-A*N))),a[0]=Q-(L+C)+(C-X),C=($=G-((B=G+L)-(C=B-G))+(L-C))-(L=$-q),a[1]=$-(L+C)+(C-q),C=(Y=B+L)-B,a[2]=B-(Y-C)+(L-C),a[3]=Y;let Dt=o(4,f,4,a,d);C=(Q=(k=it-(A=(H=134217729*it)-(H-it)))*(N=I-(O=(H=134217729*I)-(H-I)))-((G=it*I)-A*O-k*O-A*N))-(L=Q-(X=(k=St-(A=(H=134217729*St)-(H-St)))*(N=W-(O=(H=134217729*W)-(H-W)))-((q=St*W)-A*O-k*O-A*N))),a[0]=Q-(L+C)+(C-X),C=($=G-((B=G+L)-(C=B-G))+(L-C))-(L=$-q),a[1]=$-(L+C)+(C-q),C=(Y=B+L)-B,a[2]=B-(Y-C)+(L-C),a[3]=Y;let Pt=o(Dt,d,4,a,u);C=(Q=(k=R-(A=(H=134217729*R)-(H-R)))*(N=I-(O=(H=134217729*I)-(H-I)))-((G=R*I)-A*O-k*O-A*N))-(L=Q-(X=(k=D-(A=(H=134217729*D)-(H-D)))*(N=W-(O=(H=134217729*W)-(H-W)))-((q=D*W)-A*O-k*O-A*N))),a[0]=Q-(L+C)+(C-X),C=($=G-((B=G+L)-(C=B-G))+(L-C))-(L=$-q),a[1]=$-(L+C)+(C-q),C=(Y=B+L)-B,a[2]=B-(Y-C)+(L-C),a[3]=Y;let Mt=o(Pt,u,4,a,c);return c[Mt-1]})(h,g,x,b,m,p,M)},t.orient2dfast=function(h,g,x,b,m,p){return(g-p)*(x-m)-(h-m)*(b-p)},Object.defineProperty(t,"__esModule",{value:!0})})});var Kr=Be((eh,_o)=>{"use strict";var Xr=Hr(),Kn=Ar(),pa=qr(),xa=jr().orient2d;Kn.default&&(Kn=Kn.default);_o.exports=Ur;_o.exports.default=Ur;function Ur(t,e,n){e=Math.max(0,e===void 0?2:e),n=n||0;var o=Ma(t),s=new Xr(16);s.toBBox=function(p){return{minX:p[0],minY:p[1],maxX:p[0],maxY:p[1]}},s.compareMinX=function(p,y){return p[0]-y[0]},s.compareMinY=function(p,y){return p[1]-y[1]},s.load(t);for(var r=[],i=0,l;i<o.length;i++){var f=o[i];s.remove(f),l=Yr(f,l),r.push(l)}var d=new Xr(16);for(i=0;i<r.length;i++)d.insert(Io(r[i]));for(var u=e*e,c=n*n;r.length;){var a=r.shift(),h=a.p,g=a.next.p,x=Co(h,g);if(!(x<c)){var b=x/u;f=ya(s,a.prev.p,h,g,a.next.next.p,b,d),f&&Math.min(Co(f,h),Co(f,g))<=b&&(r.push(a),r.push(Yr(f,a)),s.remove(f),d.remove(a),d.insert(Io(a)),d.insert(Io(a.next)))}}a=l;var m=[];do m.push(a.p),a=a.next;while(a!==l);return m.push(a.p),m}function ya(t,e,n,o,s,r,i){for(var l=new Kn([],ba),f=t.data;f;){for(var d=0;d<f.children.length;d++){var u=f.children[d],c=f.leaf?Wo(u,n,o):wa(n,o,u);c>r||l.push({node:u,dist:c})}for(;l.length&&!l.peek().node.children;){var a=l.pop(),h=a.node,g=Wo(h,e,n),x=Wo(h,o,s);if(a.dist<g&&a.dist<x&&Zr(n,h,i)&&Zr(o,h,i))return h}f=l.pop(),f&&(f=f.node)}return null}function ba(t,e){return t.dist-e.dist}function wa(t,e,n){if(Gr(t,n)||Gr(e,n))return 0;var o=Un(t[0],t[1],e[0],e[1],n.minX,n.minY,n.maxX,n.minY);if(o===0)return 0;var s=Un(t[0],t[1],e[0],e[1],n.minX,n.minY,n.minX,n.maxY);if(s===0)return 0;var r=Un(t[0],t[1],e[0],e[1],n.maxX,n.minY,n.maxX,n.maxY);if(r===0)return 0;var i=Un(t[0],t[1],e[0],e[1],n.minX,n.maxY,n.maxX,n.maxY);return i===0?0:Math.min(o,s,r,i)}function Gr(t,e){return t[0]>=e.minX&&t[0]<=e.maxX&&t[1]>=e.minY&&t[1]<=e.maxY}function Zr(t,e,n){for(var o=Math.min(t[0],e[0]),s=Math.min(t[1],e[1]),r=Math.max(t[0],e[0]),i=Math.max(t[1],e[1]),l=n.search({minX:o,minY:s,maxX:r,maxY:i}),f=0;f<l.length;f++)if(za(l[f].p,l[f].next.p,t,e))return!1;return!0}function cn(t,e,n){return xa(t[0],t[1],e[0],e[1],n[0],n[1])}function za(t,e,n,o){return t!==o&&e!==n&&cn(t,e,n)>0!=cn(t,e,o)>0&&cn(n,o,t)>0!=cn(n,o,e)>0}function Io(t){var e=t.p,n=t.next.p;return t.minX=Math.min(e[0],n[0]),t.minY=Math.min(e[1],n[1]),t.maxX=Math.max(e[0],n[0]),t.maxY=Math.max(e[1],n[1]),t}function Ma(t){for(var e=t[0],n=t[0],o=t[0],s=t[0],r=0;r<t.length;r++){var i=t[r];i[0]<e[0]&&(e=i),i[0]>o[0]&&(o=i),i[1]<n[1]&&(n=i),i[1]>s[1]&&(s=i)}var l=[e,n,o,s],f=l.slice();for(r=0;r<t.length;r++)pa(t[r],l)||f.push(t[r]);return Pa(f)}function Yr(t,e){var n={p:t,prev:null,next:null,minX:0,minY:0,maxX:0,maxY:0};return e?(n.next=e.next,n.prev=e,e.next.prev=n,e.next=n):(n.prev=n,n.next=n),n}function Co(t,e){var n=t[0]-e[0],o=t[1]-e[1];return n*n+o*o}function Wo(t,e,n){var o=e[0],s=e[1],r=n[0]-o,i=n[1]-s;if(r!==0||i!==0){var l=((t[0]-o)*r+(t[1]-s)*i)/(r*r+i*i);l>1?(o=n[0],s=n[1]):l>0&&(o+=r*l,s+=i*l)}return r=t[0]-o,i=t[1]-s,r*r+i*i}function Un(t,e,n,o,s,r,i,l){var f=n-t,d=o-e,u=i-s,c=l-r,a=t-s,h=e-r,g=f*f+d*d,x=f*u+d*c,b=u*u+c*c,m=f*a+d*h,p=u*a+c*h,y=g*b-x*x,w,z,M,P,E=y,T=y;y===0?(z=0,E=1,P=p,T=b):(z=x*p-b*m,P=g*p-x*m,z<0?(z=0,P=p,T=b):z>E&&(z=E,P=p+x,T=b)),P<0?(P=0,-m<0?z=0:-m>g?z=E:(z=-m,E=g)):P>T&&(P=T,-m+x<0?z=0:-m+x>g?z=E:(z=-m+x,E=g)),w=z===0?0:z/E,M=P===0?0:P/T;var V=(1-w)*t+w*n,_=(1-w)*e+w*o,v=(1-M)*s+M*i,S=(1-M)*r+M*l,R=v-V,D=S-_;return R*R+D*D}function Ea(t,e){return t[0]===e[0]?t[1]-e[1]:t[0]-e[0]}function Pa(t){t.sort(Ea);for(var e=[],n=0;n<t.length;n++){for(;e.length>=2&&cn(e[e.length-2],e[e.length-1],t[n])<=0;)e.pop();e.push(t[n])}for(var o=[],s=t.length-1;s>=0;s--){for(;o.length>=2&&cn(o[o.length-2],o[o.length-1],t[s])<=0;)o.pop();o.push(t[s])}return o.pop(),e.pop(),e.concat(o)}});import*as Fe from"three";import*as Oe from"three";var Ht=class t{constructor(e=0,n=0,o=0){this.x=e,this.y=n,this.z=o}set(e,n,o){return this.x=e,this.y=n,this.z=o,this}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this}clone(){return new t(this.x,this.y,this.z)}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this}subVectors(e,n){return this.x=e.x-n.x,this.y=e.y-n.y,this.z=e.z-n.z,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z}crossVectors(e,n){let o=e.x,s=e.y,r=e.z,i=n.x,l=n.y,f=n.z;return this.x=s*f-r*l,this.y=r*i-o*f,this.z=o*l-s*i,this}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.lengthSq())}normalize(){let e=this.length();return e>0&&(this.x/=e,this.y/=e,this.z/=e),this}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){let n=this.x-e.x,o=this.y-e.y,s=this.z-e.z;return n*n+o*o+s*s}toArray(){return[this.x,this.y,this.z]}fromArray(e,n=0){return this.x=e[n],this.y=e[n+1],this.z=e[n+2],this}applyAxisAngle(e,n){let o=this.x,s=this.y,r=this.z,i=e.x,l=e.y,f=e.z,d=Math.cos(n),u=Math.sin(n),c=i*o+l*s+f*r;return this.x=i*c*(1-d)+o*d+(-f*s+l*r)*u,this.y=l*c*(1-d)+s*d+(f*o-i*r)*u,this.z=f*c*(1-d)+r*d+(-l*o+i*s)*u,this}},Hn=class{constructor(e=new Ht(1,0,0),n=0){this.normal=e,this.constant=n}set(e,n){return this.normal.copy(e),this.constant=n,this}setFromNormalAndCoplanarPoint(e,n){return this.normal.copy(e),this.constant=-n.dot(this.normal),this}setFromCoplanarPoints(e,n,o){let s=new Ht().subVectors(n,e),r=new Ht().subVectors(o,e),i=new Ht().crossVectors(s,r).normalize();return this.normal.copy(i),this.constant=-e.dot(this.normal),this}distanceToPoint(e){return this.normal.dot(e)+this.constant}projectPoint(e,n=new Ht){let o=this.distanceToPoint(e);return n.copy(e),n.x-=this.normal.x*o,n.y-=this.normal.y*o,n.z-=this.normal.z*o,n}},_n=()=>typeof performance<"u"&&performance.now?performance.now():Date.now(),yo=class{constructor(){this.results=null,this.clusterResults=null}initLimits1(e,n){let o,s;return e<.3?o=5:e<.5?o=8:e<.8?o=10:e<1?o=15:e<2?o=30:e<3?o=35:e<4?o=40:e<5?o=45:e<6?o=50:e<7?o=60:e<8.5?o=70:e<10?o=80:e<15?o=100:e<20?o=120:e<25?o=140:e<30?o=160:e<35?o=180:e<40?o=200:e<45?o=230:e<50?o=250:o=350,n<1?s=30:n<2?s=40:n<2.5?s=45:n<3?s=60:n<3.6?s=70:s=80,{horizontalSubdivisions:o,verticalSubdivisions:s}}initLimits2(e,n){let r=Math.round(Math.max(5,Math.min(350,e/.08))),i=Math.round(Math.max(30,Math.min(80,n/.06)));return{horizontalSubdivisions:r,verticalSubdivisions:i}}initLimits3(e,n){let o;e<2?o=.06:e<10?o=.1:o=.15;let s=Math.round(Math.max(5,Math.min(350,e/o))),r=Math.round(Math.max(30,Math.min(80,n/.06)));return{horizontalSubdivisions:s,verticalSubdivisions:r}}initLimits4(e,n){let o=Math.round(Math.max(5,Math.min(350,20*Math.sqrt(e)))),s=Math.round(Math.max(30,Math.min(80,20*Math.sqrt(n))));return{horizontalSubdivisions:o,verticalSubdivisions:s}}createSubdividedWallPlane(e,n,o,s=null){let r=[];if(!e||!e.start||!e.end||isNaN(e.rooftopPz))return r;let i=new Ht(e.start.x,e.start.y,e.start.z),l=new Ht(e.end.x,e.end.y,e.end.z),f=new Ht(e.end.x,e.end.y,e.rooftopPz),d=new Ht(e.start.x,e.start.y,e.rooftopPz),u=[i,l,f,d];for(let P=0;P<u.length;P++)if(!this.isValidVector3(u[P]))return console.error(`\u5899\u4F53\u57FA\u7840\u70B9${P}\u65E0\u6548:`,u[P]),r;let c=i.distanceTo(l),a=Math.abs(e.rooftopPz-e.start.z);if(c===0||a===0)return console.error("\u5899\u4F53\u5BBD\u5EA6\u6216\u9AD8\u5EA6\u4E3A0"),console.log("line.rooftopPz",e.rooftopPz),console.log("bottomLeft",i),console.log("bottomRight",l),console.log(e.length),r;let h=c/o,g=a/n,x=new Ht().subVectors(l,i).normalize(),b=i.x,m=i.y,p=i.z,y=x.x,w=x.y,z=x.z,M=(P,E)=>new Ht(b+y*P,m+w*P,p+z*P+E);for(let P=0;P<n;P++){let E=P*g,T=(P+1)*g;for(let V=0;V<o;V++){let _=V*h,v=(V+1)*h;r.push({points:[M(_,E),M(v,E),M(v,T),M(_,T)],userData:{type:"wallSegment",row:P,col:V,width:h,height:g}})}}return r}analyzePointDistribution(e,n,o=.01,s={}){let r=s.projectPlane||null;this.results={totalSegments:0,segmentsWithPoints:0,segmentsWithoutPoints:0,missingSegments:[],existSegments:[],pointsInSegments:new Map,segmentsByPoint:new Map,segmentDetails:new Map,tolerance:o,analysisTime:null};let i=_n(),l=[],f=new Map,d=1/0,u=-1/0,c=1/0,a=-1/0;for(let _=0;_<e.length;_++){let v=e[_];if(v.userData&&v.userData.type==="wallSegment"){let S=this.getWorldVerticesNew(v.points);if(S.length<4)continue;let R=new Ht().add(S[0]).add(S[1]).add(S[2]).add(S[3]).multiplyScalar(.25);v.userData.center=R,v.vertices=S;let D=v.userData.row,W=v.userData.col,I=`row${D}_col${W}`;l.push(v),f.set(I,v),D<d&&(d=D),D>u&&(u=D),W<c&&(c=W),W>a&&(a=W)}}if(this.results.totalSegments=l.length,l.length===0)return this.results.analysisTime=_n()-i,this.printAnalysisResults(),this.results;let h=`row${d}_col${c}`,g=f.get(h)||l[0];if(!g||!g.vertices||g.vertices.length<4)return this.results.analysisTime=_n()-i,this.printAnalysisResults(),this.results;let x=g.vertices[0],b=g.vertices[1],m=g.vertices[3],p=new Ht().subVectors(b,x).normalize(),y=new Ht().subVectors(m,x).normalize(),w=g.userData.width,z=g.userData.height,M=u-d+1,P=a-c+1,E=new Hn;E.setFromCoplanarPoints(x,b,m);let T=new Ht,V=new Ht;for(let _=0;_<n.length;_+=3){let v=new Ht(n[_],n[_+1],n[_+2]),S=r?r.projectPoint(v,V):v;if(Math.abs(E.distanceToPoint(S))>o)continue;T.subVectors(S,x);let D=T.dot(p),W=T.dot(y),I=Math.ceil((D-o)/w-1),C=Math.floor((D+o)/w),H=Math.ceil((W-o)/z-1),A=Math.floor((W+o)/z);if(C<0||I>P-1||A<0||H>M-1)continue;let k=Math.max(0,I),O=Math.min(P-1,C),N=Math.max(0,H),L=Math.min(M-1,A);for(let B=N;B<=L;B++){let $=d+B;for(let G=k;G<=O;G++){let Q=c+G,q=`row${$}_col${Q}`;f.has(q)&&(this.results.pointsInSegments.has(q)||this.results.pointsInSegments.set(q,[_]))}}}for(let _ of l){let v=`row${_.userData.row}_col${_.userData.col}`,S=this.results.pointsInSegments.has(v)?this.results.pointsInSegments.get(v).length:0,R=S>=1,D={row:_.userData.row,col:_.userData.col,width:_.userData.width,height:_.userData.height,segmentKey:v,vertices:_.vertices,center:_.userData.center,mesh:_,pointCount:S,hasPointsButNotEnough:S>0&&S<1};R?(this.results.segmentsWithPoints++,this.results.existSegments.push(D)):(this.results.segmentsWithoutPoints++,this.results.missingSegments.push(D))}return this.results.analysisTime=_n()-i,this.printAnalysisResults(),this.results}isPointInWallSegmentOptimized(e,n,o,s,r,i,l,f,d,u,c){if(Math.abs(o.distanceToPoint(e))>c)return!1;let h=new Ht().subVectors(e,n),g=Math.abs(h.dot(r)),x=Math.abs(h.dot(i));if(g>d&&x>u)return!1;let b=new Ht().subVectors(e,s),m=b.dot(r),p=b.dot(i),y=m>=-c&&m<=l+c,w=p>=-c&&p<=f+c;return y&&w}getWorldVerticesNew(e){return e}highlightEmptySegments(e,n=null,o=null,s=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 d of this.results.missingSegments)r.set(d.segmentKey,d),i.has(d.row)||i.set(d.row,new Map),i.get(d.row).set(d.col,{segmentKey:d.segmentKey,isEmpty:!0,visited:!1});for(let d of e)if(d.userData&&d.userData.type==="wallSegment"){let u=`row${d.userData.row}_col${d.userData.col}`,c=r.has(u);i.has(d.userData.row)||i.set(d.userData.row,new Map),i.get(d.userData.row).has(d.userData.col)||i.get(d.userData.row).set(d.userData.col,{segmentKey:u,isEmpty:c,visited:!1})}let l=[],f=[[0,1],[1,0],[0,-1],[-1,0]];for(let[d,u]of r){let c=i.get(u.row)?.get(u.col);if(c&&!c.visited){let a=[],h=[[u.row,u.col]],g=0;for(c.visited=!0;g<h.length;){let x=h[g++],b=x[0],m=x[1],p=`row${b}_col${m}`;r.has(p)&&a.push(r.get(p));for(let y of f){let w=b+y[0],z=m+y[1];if(i.has(w)&&i.get(w).has(z)){let M=i.get(w).get(z);!M.visited&&M.isEmpty&&(M.visited=!0,h.push([w,z]))}}}a.length>=s&&l.push(a)}}return this.clusterResults={clusters:l.sort((d,u)=>u.length-d.length),totalClusters:l.length},this.clusterResults}getClusterInfo(){if(!this.clusterResults)return null;let e=this.clusterResults.clusters.map(n=>n.length);return{totalClusters:this.clusterResults.totalClusters,clusterSizes:this.clusterResults.clusters.map((n,o)=>({clusterIndex:o,size:n.length,segments:n.map(s=>s.segmentKey)})),largestCluster:e.length?Math.max(...e):0,smallestCluster:e.length?Math.min(...e):0}}printAnalysisResults(){if(!this.results){console.warn("\u6CA1\u6709\u53EF\u7528\u7684\u5206\u6790\u7ED3\u679C");return}}isValidVector3(e){return e&&!isNaN(e.x)&&!isNaN(e.y)&&!isNaN(e.z)&&isFinite(e.x)&&isFinite(e.y)&&isFinite(e.z)}},lr=(t,e)=>{let n={},o=[],s=[];if(!t||t.length===0)return n.originalVertices=o,n.allCenterPoints=s,n;if(e=="xyz")for(let r of t){s.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});o.push(i)}else if(e=="three")for(let r of t){s.push(new Oe.Vector3(r.center.x,r.center.y,r.center.z));let i=[];for(let l=0;l<r.vertices.length;l++)i.push(new Oe.Vector3(r.vertices[l].x,r.vertices[l].y,r.vertices[l].z));o.push(i)}else if(e=="array")for(let r of t){s.push(r.center.x),s.push(r.center.y),s.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);o.push(i)}return n.originalVertices=o,n.allCenterPoints=s,n},zi=(t,e)=>{let n=new Ht().copy(t.start).add(t.end).multiplyScalar(.5),o=new Ht().subVectors(new Ht(n.x,n.y,n.z+1),n).normalize(),s=new Ht(t.direction.x,t.direction.y,0);s.applyAxisAngle(o,Math.PI/2);let r=new Ht().copy(n).add(s.clone().multiplyScalar(t.length)),i=new Ht().copy(n).sub(s.clone().multiplyScalar(t.length));if(n.z=t.start.z,r.z=t.start.z,i.z=t.start.z,e=="three")return{start:new Oe.Vector3(r.x,r.y,r.z),end:new Oe.Vector3(i.x,i.y,i.z),center:new Oe.Vector3(n.x,n.y,n.z),direction:new Oe.Vector3(s.x,s.y,s.z)};if(e=="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:s.x,y:s.y,z:s.z}};if(e=="array")return{start:[r.x,r.y,r.z],end:[i.x,i.y,i.z],center:[n.x,n.y,n.z],direction:[s.x,s.y,s.z]}},cr=async(t,e=!0,n="three")=>{for(let o=0;o<t.length;o++){let s=t[o];await bo(s,e,n)}},bo=(t,e=!0,n="three")=>{if((t.isBayWindow||t.isWindow||t.isBalconyRailing)&&e)return;let o=new Hn().setFromCoplanarPoints(new Ht(t.start.x,t.start.y,t.start.z),new Ht(t.end.x,t.end.y,t.end.z),new Ht(t.start.x,t.start.y,t.rooftopPz)),s=new Ht(t.start.x,t.start.y,t.start.z).distanceTo(new Ht(t.end.x,t.end.y,t.end.z)),r=Math.abs(t.rooftopPz-t.start.z),i=new yo,{horizontalSubdivisions:l,verticalSubdivisions:f}=i.initLimits4(s,r),d=i.createSubdividedWallPlane(t,f,l,null);i.analyzePointDistribution(d,t.originalPoints,.01,{projectPlane:o});let u=i.highlightEmptySegments(d,null,null),c=[];if(u&&u.clusters)for(let g of u.clusters){let x=lr(g,n);x&&c.push(x)}let h=zi(t,n).direction;if(t.checkResults=c,t.verticalDirection=h,t.saveExistSegments){let g=[],x=lr(i.results.existSegments,n);x&&g.push(x),t.existSegments=g}};var Rt=class t{constructor(e=0,n=0,o=0){this.x=e,this.y=n,this.z=o}set(e,n,o){return this.x=e,this.y=n,this.z=o,this}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this}clone(){return new t(this.x,this.y,this.z)}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this}subVectors(e,n){return this.x=e.x-n.x,this.y=e.y-n.y,this.z=e.z-n.z,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z}crossVectors(e,n){let o=e.x,s=e.y,r=e.z,i=n.x,l=n.y,f=n.z;return this.x=s*f-r*l,this.y=r*i-o*f,this.z=o*l-s*i,this}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.lengthSq())}normalize(){let e=this.length();return e>0&&(this.x/=e,this.y/=e,this.z/=e),this}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){let n=this.x-e.x,o=this.y-e.y,s=this.z-e.z;return n*n+o*o+s*s}toArray(){return[this.x,this.y,this.z]}fromArray(e,n=0){return this.x=e[n],this.y=e[n+1],this.z=e[n+2],this}applyAxisAngle(e,n){let o=this.x,s=this.y,r=this.z,i=e.x,l=e.y,f=e.z,d=Math.cos(n),u=Math.sin(n),c=i*o+l*s+f*r;return this.x=i*c*(1-d)+o*d+(-f*s+l*r)*u,this.y=l*c*(1-d)+s*d+(f*o-i*r)*u,this.z=f*c*(1-d)+r*d+(-l*o+i*s)*u,this}},yn=class{constructor(e=new Rt(1,0,0),n=0){this.normal=e,this.constant=n}set(e,n){return this.normal.copy(e),this.constant=n,this}setFromNormalAndCoplanarPoint(e,n){return this.normal.copy(e),this.constant=-n.dot(this.normal),this}setFromCoplanarPoints(e,n,o){let s=new Rt().subVectors(n,e),r=new Rt().subVectors(o,e),i=new Rt().crossVectors(s,r).normalize();return this.normal.copy(i),this.constant=-e.dot(this.normal),this}distanceToPoint(e){return this.normal.dot(e)+this.constant}projectPoint(e,n=new Rt){let o=this.distanceToPoint(e);return n.copy(e),n.x-=this.normal.x*o,n.y-=this.normal.y*o,n.z-=this.normal.z*o,n}},An=()=>typeof performance<"u"&&performance.now?performance.now():Date.now(),Ln=class{constructor(){this.results=null,this.clusterResults=null}initLimits1(e,n){let o,s;return e<.3?o=5:e<.5?o=8:e<.8?o=10:e<1?o=15:e<2?o=30:e<3?o=35:e<4?o=40:e<5?o=45:e<6?o=50:e<7?o=60:e<8.5?o=70:e<10?o=80:e<15?o=100:e<20?o=120:e<25?o=140:e<30?o=160:e<35?o=180:e<40?o=200:e<45?o=230:e<50?o=250:o=350,n<1?s=30:n<2?s=40:n<2.5?s=45:n<3?s=60:n<3.6?s=70:s=80,{horizontalSubdivisions:o,verticalSubdivisions:s}}initLimits2(e,n){let r=Math.round(Math.max(5,Math.min(350,e/.08))),i=Math.round(Math.max(30,Math.min(80,n/.06)));return{horizontalSubdivisions:r,verticalSubdivisions:i}}initLimits3(e,n){let o;e<2?o=.06:e<10?o=.1:o=.15;let s=Math.round(Math.max(5,Math.min(350,e/o))),r=Math.round(Math.max(30,Math.min(80,n/.06)));return{horizontalSubdivisions:s,verticalSubdivisions:r}}initLimits4(e,n){let o=Math.round(Math.max(5,Math.min(350,20*Math.sqrt(e)))),s=Math.round(Math.max(30,Math.min(80,20*Math.sqrt(n))));return{horizontalSubdivisions:o,verticalSubdivisions:s}}createSubdividedWallPlane(e,n,o,s=null){let r=[];if(!e||!e.start||!e.end||isNaN(e.rooftopPz))return r;let i=new Rt(e.start.x,e.start.y,e.start.z),l=new Rt(e.end.x,e.end.y,e.end.z),f=new Rt(e.end.x,e.end.y,e.rooftopPz),d=new Rt(e.start.x,e.start.y,e.rooftopPz),u=[i,l,f,d];for(let P=0;P<u.length;P++)if(!this.isValidVector3(u[P]))return console.error(`\u5899\u4F53\u57FA\u7840\u70B9${P}\u65E0\u6548:`,u[P]),r;let c=i.distanceTo(l),a=Math.abs(e.rooftopPz-e.start.z);if(c===0||a===0)return r;let h=c/o,g=a/n,x=new Rt().subVectors(l,i).normalize(),b=i.x,m=i.y,p=i.z,y=x.x,w=x.y,z=x.z,M=(P,E)=>new Rt(b+y*P,m+w*P,p+z*P+E);for(let P=0;P<n;P++){let E=P*g,T=(P+1)*g;for(let V=0;V<o;V++){let _=V*h,v=(V+1)*h;r.push({points:[M(_,E),M(v,E),M(v,T),M(_,T)],userData:{type:"wallSegment",row:P,col:V,width:h,height:g}})}}return r}analyzePointDistribution(e,n,o=.01,s={}){let r=s.projectPlane||null;this.results={totalSegments:0,segmentsWithPoints:0,segmentsWithoutPoints:0,missingSegments:[],existSegments:[],pointsInSegments:new Map,segmentsByPoint:new Map,segmentDetails:new Map,tolerance:o,analysisTime:null};let i=An(),l=[],f=new Map,d=1/0,u=-1/0,c=1/0,a=-1/0;for(let _=0;_<e.length;_++){let v=e[_];if(v.userData&&v.userData.type==="wallSegment"){let S=this.getWorldVerticesNew(v.points);if(S.length<4)continue;let R=new Rt().add(S[0]).add(S[1]).add(S[2]).add(S[3]).multiplyScalar(.25);v.userData.center=R,v.vertices=S;let D=v.userData.row,W=v.userData.col,I=`row${D}_col${W}`;l.push(v),f.set(I,v),D<d&&(d=D),D>u&&(u=D),W<c&&(c=W),W>a&&(a=W)}}if(this.results.totalSegments=l.length,l.length===0)return this.results.analysisTime=An()-i,this.printAnalysisResults(),this.results;let h=`row${d}_col${c}`,g=f.get(h)||l[0];if(!g||!g.vertices||g.vertices.length<4)return this.results.analysisTime=An()-i,this.printAnalysisResults(),this.results;let x=g.vertices[0],b=g.vertices[1],m=g.vertices[3],p=new Rt().subVectors(b,x).normalize(),y=new Rt().subVectors(m,x).normalize(),w=g.userData.width,z=g.userData.height,M=u-d+1,P=a-c+1,E=new yn;E.setFromCoplanarPoints(x,b,m);let T=new Rt,V=new Rt;for(let _=0;_<n.length;_++){let v=n[_],S=r?r.projectPoint(v,V):v;if(Math.abs(E.distanceToPoint(S))>o)continue;T.subVectors(S,x);let D=T.dot(p),W=T.dot(y),I=Math.ceil((D-o)/w-1),C=Math.floor((D+o)/w),H=Math.ceil((W-o)/z-1),A=Math.floor((W+o)/z);if(C<0||I>P-1||A<0||H>M-1)continue;let k=Math.max(0,I),O=Math.min(P-1,C),N=Math.max(0,H),L=Math.min(M-1,A);for(let B=N;B<=L;B++){let $=d+B;for(let G=k;G<=O;G++){let Q=c+G,q=`row${$}_col${Q}`;f.has(q)&&(this.results.pointsInSegments.has(q)||this.results.pointsInSegments.set(q,[_]))}}}for(let _ of l){let v=`row${_.userData.row}_col${_.userData.col}`,S=this.results.pointsInSegments.has(v)?this.results.pointsInSegments.get(v).length:0,R=S>=1,D={row:_.userData.row,col:_.userData.col,width:_.userData.width,height:_.userData.height,segmentKey:v,vertices:_.vertices,center:_.userData.center,mesh:_,pointCount:S,hasPointsButNotEnough:S>0&&S<1};R?(this.results.segmentsWithPoints++,this.results.existSegments.push(D)):(this.results.segmentsWithoutPoints++,this.results.missingSegments.push(D))}return this.results.analysisTime=An()-i,this.printAnalysisResults(),this.results}isPointInWallSegmentOptimized(e,n,o,s,r,i,l,f,d,u,c){if(Math.abs(o.distanceToPoint(e))>c)return!1;let h=new Rt().subVectors(e,n),g=Math.abs(h.dot(r)),x=Math.abs(h.dot(i));if(g>d&&x>u)return!1;let b=new Rt().subVectors(e,s),m=b.dot(r),p=b.dot(i),y=m>=-c&&m<=l+c,w=p>=-c&&p<=f+c;return y&&w}getWorldVerticesNew(e){return e}highlightEmptySegments(e,n=null,o=null,s=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 d of this.results.missingSegments)r.set(d.segmentKey,d),i.has(d.row)||i.set(d.row,new Map),i.get(d.row).set(d.col,{segmentKey:d.segmentKey,isEmpty:!0,visited:!1});for(let d of e)if(d.userData&&d.userData.type==="wallSegment"){let u=`row${d.userData.row}_col${d.userData.col}`,c=r.has(u);i.has(d.userData.row)||i.set(d.userData.row,new Map),i.get(d.userData.row).has(d.userData.col)||i.get(d.userData.row).set(d.userData.col,{segmentKey:u,isEmpty:c,visited:!1})}let l=[],f=[[0,1],[1,0],[0,-1],[-1,0]];for(let[d,u]of r){let c=i.get(u.row)?.get(u.col);if(c&&!c.visited){let a=[],h=[[u.row,u.col]],g=0;for(c.visited=!0;g<h.length;){let x=h[g++],b=x[0],m=x[1],p=`row${b}_col${m}`;r.has(p)&&a.push(r.get(p));for(let y of f){let w=b+y[0],z=m+y[1];if(i.has(w)&&i.get(w).has(z)){let M=i.get(w).get(z);!M.visited&&M.isEmpty&&(M.visited=!0,h.push([w,z]))}}}a.length>=s&&l.push(a)}}return this.clusterResults={clusters:l.sort((d,u)=>u.length-d.length),totalClusters:l.length},this.clusterResults}getClusterInfo(){if(!this.clusterResults)return null;let e=this.clusterResults.clusters.map(n=>n.length);return{totalClusters:this.clusterResults.totalClusters,clusterSizes:this.clusterResults.clusters.map((n,o)=>({clusterIndex:o,size:n.length,segments:n.map(s=>s.segmentKey)})),largestCluster:e.length?Math.max(...e):0,smallestCluster:e.length?Math.min(...e):0}}printAnalysisResults(){if(!this.results){console.warn("\u6CA1\u6709\u53EF\u7528\u7684\u5206\u6790\u7ED3\u679C");return}}isValidVector3(e){return e&&!isNaN(e.x)&&!isNaN(e.y)&&!isNaN(e.z)&&isFinite(e.x)&&isFinite(e.y)&&isFinite(e.z)}},ur=(t,e)=>{let n={},o=[],s=[];if(!t||t.length===0)return n.originalVertices=o,n.allCenterPoints=s,n;if(e=="xyz")for(let r of t){s.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});o.push(i)}else if(e=="three")for(let r of t){s.push(new Fe.Vector3(r.center.x,r.center.y,r.center.z));let i=[];for(let l=0;l<r.vertices.length;l++)i.push(new Fe.Vector3(r.vertices[l].x,r.vertices[l].y,r.vertices[l].z));o.push(i)}else if(e=="array")for(let r of t){s.push(r.center.x),s.push(r.center.y),s.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);o.push(i)}return n.originalVertices=o,n.allCenterPoints=s,n},Mi=(t,e)=>{let n=new Rt().copy(t.start).add(t.end).multiplyScalar(.5),o=new Rt().subVectors(new Rt(n.x,n.y,n.z+1),n).normalize(),s=new Rt(t.direction.x,t.direction.y,0);s.applyAxisAngle(o,Math.PI/2);let r=new Rt().copy(n).add(s.clone().multiplyScalar(t.length)),i=new Rt().copy(n).sub(s.clone().multiplyScalar(t.length));if(n.z=t.start.z,r.z=t.start.z,i.z=t.start.z,e=="three")return{start:new Fe.Vector3(r.x,r.y,r.z),end:new Fe.Vector3(i.x,i.y,i.z),center:new Fe.Vector3(n.x,n.y,n.z),direction:new Fe.Vector3(s.x,s.y,s.z)};if(e=="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:s.x,y:s.y,z:s.z}};if(e=="array")return{start:[r.x,r.y,r.z],end:[i.x,i.y,i.z],center:[n.x,n.y,n.z],direction:[s.x,s.y,s.z]}},Ei=(t,e=!0,n="three",o="xyz")=>{o=="xyz"?fr(t,e,n):o=="array"&&bo(t,e,n)},Pi=(t,e=!0,n="three",o="xyz")=>{o=="xyz"?Si(t,e,n):o=="array"&&cr(t,e,n)},Si=(t,e=!0,n="three")=>{for(let o=0;o<t.length;o++){let s=t[o];fr(s,e,n)}},fr=(t,e=!0,n="three")=>{if((t.isBayWindow||t.isWindow||t.isBalconyRailing)&&e)return;let o=new yn().setFromCoplanarPoints(new Rt(t.start.x,t.start.y,t.start.z),new Rt(t.end.x,t.end.y,t.end.z),new Rt(t.start.x,t.start.y,t.rooftopPz)),s=new Rt(t.start.x,t.start.y,t.start.z).distanceTo(new Rt(t.end.x,t.end.y,t.end.z)),r=Math.abs(t.rooftopPz-t.start.z),i=new Ln,{horizontalSubdivisions:l,verticalSubdivisions:f}=i.initLimits4(s,r),d=i.createSubdividedWallPlane(t,f,l,null);i.analyzePointDistribution(d,t.originalPoints,.01,{projectPlane:o});let u=i.highlightEmptySegments(d,null,null),c=[];if(u&&u.clusters)for(let g of u.clusters){let x=ur(g,n);x&&c.push(x)}let h=Mi(t,n).direction;if(t.checkResults=c,t.verticalDirection=h,t.saveExistSegments){let g=[],x=ur(i.results.existSegments,n);x&&g.push(x),t.existSegments=g}},Ti=t=>{if((t.isBayWindow||t.isWindow||t.isBalconyRailing)&&limit)return;let e=new yn().setFromCoplanarPoints(new Rt(t.start.x,t.start.y,t.start.z),new Rt(t.end.x,t.end.y,t.end.z),new Rt(t.start.x,t.start.y,t.rooftopPz)),n=new Rt(t.start.x,t.start.y,t.start.z).distanceTo(new Rt(t.end.x,t.end.y,t.end.z)),o=Math.abs(t.rooftopPz-t.start.z),s=new Ln,{horizontalSubdivisions:r,verticalSubdivisions:i}=s.initLimits4(n,o),l=s.createSubdividedWallPlane(t,i,r,null);return s.analyzePointDistribution(l,t.originalPoints,.01,{projectPlane:e}),s.highlightEmptySegments(l,null,null)};import*as F from"three";import"three/examples/jsm/utils/BufferGeometryUtils.js";import*as U from"three";import{CSS2DObject as Ec}from"three/examples/jsm/renderers/CSS2DRenderer.js";import"three/examples/jsm/utils/BufferGeometryUtils.js";import we from"path";import{fileURLToPath as vi}from"url";import kn from"path";import{fileURLToPath as Ri}from"url";import{Vector3 as ec}from"three";var Di=Ri(import.meta.url),wo=kn.dirname(Di),nc=kn.resolve(wo,"./data/lines.meta.json"),oc=kn.resolve(wo,"./data/lines.bin"),rc=kn.resolve(wo,"./data/checks.bin");var Vi=vi(import.meta.url),De=we.dirname(Vi),uc=we.resolve(De,"./data/lines.tmp.bin"),fc=we.resolve(De,"./data/checks.tmp.bin"),dc=we.resolve(De,"./data/lines.new_points.tmp.bin"),hc=we.resolve(De,"./data/lines.new_points.bin"),mc=we.resolve(De,"./data/lines.meta.json"),gc=we.resolve(De,"./data/lines.bin"),pc=we.resolve(De,"./data/checks.bin"),xc=we.resolve(De,"./data/lines.exist_segments.bin"),yc=we.resolve(De,"./data/lines.exist_segments.tmp.bin");import{Vector3 as Ii}from"three";var Bn=class{points=[];_tempArr=[0,0,0];constructor(e){}initPoints(e){this.points=e}getPointByIndex(e,n){let o=e*3;return n.x=this.points[o],n.y=this.points[o+1],n.z=this.points[o+2],n}getPointArrByIndex(e){let n=e*3;return[this.points[n],this.points[n+1],this.points[n+2]]}getPoint2ArrByIndex(e){let n=e*3;return[this.points[n],this.points[n+1]]}getIndexsByIndex(e,n){n.length=0,n.push(e*3),n.push(e*3+1),n.push(e*3+2)}pointsToVector3Arr(e){let n=[];for(let o=0;o<e.length/3;o++)n.push(new Ii(e[o*3],e[o*3+1],e[o*3+2]));return n}vector3ArrToPoints(e){let n=[];for(let o=0;o<e.length;o++)n.push(e[o].x,e[o].y,e[o].z);return n}vector3ArrToFloat32Array(e){return new Float32Array(e.flatMap(o=>[o.x,o.y,o.z]))}clsoe(){this.points=[]}};var hr=(t,e,n)=>{let o=new U.LineBasicMaterial({color:"#0011ff"}),s=[];s.push(t),s.push(e);let r=new U.BufferGeometry;r.setFromPoints(s),r.rotateX(-Math.PI/2),n.add(new U.Line(r,o))},ze=(t,e,n,o,s=1e-8)=>{let r=e.x-t.x,i=e.y-t.y,l=o.x-n.x,f=o.y-n.y,d=r*f-i*l;if(Math.abs(d)<s)return null;let u=((n.x-t.x)*f-(n.y-t.y)*l)/d,c=((n.x-t.x)*i-(n.y-t.y)*r)/d;return u<-s||u>1+s||c<-s||c>1+s?null:{point:new U.Vector3(t.x+u*r,t.y+u*i,t.z)}},mr=(t,e,n={})=>{let{fontSize:o=36,fontFamily:s="sans-serif",backgroundColor:r="rgba(0,0,0,0)",textColor:i="#ffffff",padding:l=10,maxWidth:f=256}=n,u=document.createElement("canvas").getContext("2d");u.font=`bold ${o}px ${s}`;let a=u.measureText(t).width,h=Math.min(a+l*2,f),g=o+l*2,x=document.createElement("canvas");x.width=h,x.height=g;let b=x.getContext("2d");b.fillStyle=r,b.fillRect(0,0,h,g),b.fillStyle=i,b.font=`bold ${o}px ${s}`,b.textAlign="center",b.textBaseline="middle",a>f-l*2?Ci(b,t,h/2,g/2,f,o):b.fillText(t,h/2,g/2);let m=new U.CanvasTexture(x),p=new U.SpriteMaterial({map:m,depthTest:!1,transparent:!0}),y=new U.Sprite(p);y.position.set(e.x,e.y,e.z);let w=.005;return y.scale.set(h*w,g*w,1),y};function Ci(t,e,n,o,s,r){let i=e.split(""),l="",f=r*1.2,d=o;for(let u=0;u<i.length;u++){let c=l+i[u];t.measureText(c).width>s&&u>0?(t.fillText(l,n,d),l=i[u],d+=f):l=c}t.fillText(l,n,d)}var Kt=(t,e,n=.01)=>{let o=Math.sqrt(t.x*t.x+t.y*t.y+t.z*t.z),s=Math.sqrt(e.x*e.x+e.y*e.y+e.z*e.z);if(o<1e-10||s<1e-10)return{parallel:!1,sameDirection:null,angle:NaN};let r={x:t.x/o,y:t.y/o,z:t.z/o},i={x:e.x/s,y:e.y/s,z:e.z/s},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)),d=f<=n;return{parallel:d,sameDirection:d?l>0:null,angle:f}};var gr=(t,e,n,o)=>{if(e<1e-4||n<1e-4)return{};let s=t,r=[];if(o&&o.length&&(r=o.map(M=>M.clone())),!s||s.length<4)return{};let i=new U.Vector3().subVectors(s[1],s[0]).normalize(),l=new U.Vector3().subVectors(s[3],s[0]).normalize(),f=i.clone().cross(l).normalize(),d=1/0,u=-1/0,c=1/0,a=-1/0;for(let M of s){let P=M.dot(i),E=M.dot(l);P<d&&(d=P),P>u&&(u=P),E<c&&(c=E),E>a&&(a=E)}let h=s[0].dot(f),g=i.clone().multiplyScalar(d).add(l.clone().multiplyScalar(c)).add(f.clone().multiplyScalar(h)),x=i.clone().multiplyScalar(u).add(l.clone().multiplyScalar(c)).add(f.clone().multiplyScalar(h)),b=i.clone().multiplyScalar(u).add(l.clone().multiplyScalar(a)).add(f.clone().multiplyScalar(h)),m=i.clone().multiplyScalar(d).add(l.clone().multiplyScalar(a)).add(f.clone().multiplyScalar(h)),p=[g,x,b,m],y=Kt(new U.Vector3().subVectors(g,x),new U.Vector3(0,0,1));y&&y.parallel&&(p=[g,m,b,x]);let w=0;if(o.length>0){let M=new U.Vector3().subVectors(p[1],p[0]).normalize(),P=M.clone().negate(),E=new U.Vector3().subVectors(p[3],p[0]).normalize(),T=E.clone().negate(),V=p[0].distanceTo(p[1]),_=p[0].distanceTo(p[3]),v=V/e,S=_/n,R=.001;for(let D=0;D<v;D++){let W=p[0],I=0;for(let C=0;C<S;C++){let H=W.clone().addScaledVector(M,e),A=H.clone().addScaledVector(E,n),k=W.clone().addScaledVector(E,n),O=new U.Vector3().add(W).add(H).add(A).add(k).multiplyScalar(.25);for(let N=0;N<r.length;N++)if(r[N].distanceTo(O)<R){I++;break}W=k}if(I>=S/2)break;w+=I,p[0]=p[0].addScaledVector(M,e),p[3]=p[3].addScaledVector(M,e)}V=p[0].distanceTo(p[1]),v=V/e;for(let D=0;D<v;D++){let W=p[1],I=0;for(let C=0;C<S;C++){let H=W.clone().addScaledVector(P,e),A=H.clone().addScaledVector(E,n),k=W.clone().addScaledVector(E,n),O=new U.Vector3().add(W).add(H).add(A).add(k).multiplyScalar(.25);for(let N=0;N<r.length;N++)if(r[N].distanceTo(O)<R){I++;break}W=k}if(I>=S/2)break;w+=I,p[1]=p[1].addScaledVector(P,e),p[2]=p[2].addScaledVector(P,e)}V=p[0].distanceTo(p[1]),v=V/e;for(let D=0;D<S;D++){let W=p[3],I=0;for(let C=0;C<v;C++){let H=W.clone().addScaledVector(M,e),A=H.clone().addScaledVector(T,n),k=W.clone().addScaledVector(T,n),O=new U.Vector3().add(W).add(H).add(A).add(k).multiplyScalar(.25);for(let N=0;N<r.length;N++)if(r[N].distanceTo(O)<R){I++;break}W=H}if(I>=v/2)break;w+=I,p[2]=p[2].addScaledVector(T,n),p[3]=p[3].addScaledVector(T,n)}}let z=p[0].distanceTo(p[1])*p[0].distanceTo(p[3]);return{facePoints:p,boxArea:z,totalInPlaneNum:w}},Gt=(t,e,n,o,s=U.MathUtils.degToRad(8))=>{let r=new U.Vector3,i=new U.Vector3;r.subVectors(new U.Vector3(e.x,e.y,0),new U.Vector3(t.x,t.y,0)).normalize(),i.subVectors(new U.Vector3(o.x,o.y,0),new U.Vector3(n.x,n.y,0)).normalize();let l=r.dot(i),f=Math.acos(Math.min(Math.abs(l),1)),d=1-Math.min(f/s,1),u=l>0?"same":"opposite";return{parallelism:d,angle:f,angleDeg:U.MathUtils.radToDeg(f),isParallel:f<s,direction:u,vectors:{v1:r,v2:i}}},ie=(t,e,n,o)=>{let s=new U.Vector3().subVectors(e,t),r=new U.Vector3().subVectors(o,n),i=s.length(),l=r.length();if(i===0||l===0)return{rate:NaN,angle:NaN,isPerpendicular:!1,isParallel:!1};s.normalize(),r.normalize();let f=Math.abs(s.dot(r)),d=Math.min(1,Math.max(0,f)),u=Math.acos(d),c=U.MathUtils.radToDeg(u),a=1-d,h=1e-6;return{rate:a,percent:`${(a*100).toFixed(2)}%`,angle:c,isPerpendicular:Math.abs(c-90)<.01,isParallel:c<.01}},qt=(t,e,n=!1)=>new U.Vector3((t.x+e.x)/2,(t.y+e.y)/2,n?0:(t.z+e.z)/2),ye=(t,e,n,o,s={})=>{let{parallelAngleMax:r=U.MathUtils.degToRad(10),collinearAngleMax:i=U.MathUtils.degToRad(7),distanceThreshold:l=2,overlapThreshold:f=.01}=s,d=new U.Vector3().subVectors(e,t),u=new U.Vector3().subVectors(o,n),c=d.clone().normalize(),a=u.clone().normalize(),h=U.MathUtils.clamp(c.dot(a),-1,1),g=Math.acos(Math.abs(h)),x=U.MathUtils.radToDeg(g);if(g>r)return{type:"not_parallel",angleDeg:x,avgPerpendicularDistance:null,maxPerpendicularDistance:null,gap:null,overlap:null,closestDistance:null};h<0&&a.negate();let b=new U.Vector3().addVectors(c,a).normalize(),m=new U.Vector3().addVectors(t,e).multiplyScalar(.5),p=dr(n,m,c),y=dr(o,m,c),w=(p+y)/2,z=Math.max(p,y),M=t.dot(b),P=e.dot(b),E=n.dot(b),T=o.dot(b),V=Math.min(M,P),_=Math.max(M,P),v=Math.min(E,T),S=Math.max(E,T),R=_-V,D=S-v,W=Math.min(R,D),I=Math.min(_,S)-Math.max(V,v),C=I<0?-I:0,H=I>0?I:0,A=W>0?H/W:0,k=Wi(t,e,n,o),O=g<=i&&w<l,N;return O?N=A>.5?"collinear_overlap":"collinear_gap":g<=r&&(N="parallel_offset"),{type:N,angleDeg:x,avgPerpendicularDistance:w,maxPerpendicularDistance:z,gap:C,overlap:H,closestDistance:k}};function dr(t,e,n){let o=new U.Vector3().subVectors(t,e),s=o.dot(n),r=n.clone().multiplyScalar(s);return new U.Vector3().subVectors(o,r).length()}function Wi(t,e,n,o){let s=new U.Vector3().subVectors(e,t),r=new U.Vector3().subVectors(o,n),i=new U.Vector3().subVectors(n,t),l=s.dot(s),f=s.dot(r),d=r.dot(r),u=s.dot(i),c=r.dot(i),a=l*d-f*f,h,g;a<1e-10?(h=0,g=d!==0?c/d:0):(h=(f*c-d*u)/a,g=(l*c-f*u)/a),h=U.MathUtils.clamp(h,0,1),g=d!==0?U.MathUtils.clamp((f*h+c)/d,0,1):0,h=l!==0?U.MathUtils.clamp((f*g-u)/l,0,1):0;let x=t.clone().add(s.clone().multiplyScalar(h)),b=n.clone().add(r.clone().multiplyScalar(g));return x.distanceTo(b)}var On=t=>{let e=999999,n=-999999;for(let o=0;o<t.length;o++)t[o].z>n&&(n=t[o].z),t[o].z<e&&(e=t[o].z);return{minZ:e,maxZ:n}},bn=(t,e,n)=>{let o=new U.Plane,s=new U.Vector3(t.x,t.y,t.z),r=new U.Vector3(e.x,e.y,e.z),i=new U.Vector3(e.x,e.y,e.z+5);o.setFromCoplanarPoints(s,r,i);let l=[],f=[];n.forEach(b=>{let m=new U.Vector3;o.projectPoint(b,m),f.push(m.clone()),m.z=s.z,l.push(m)});let d=new U.Vector3,u=new U.Vector3;o.projectPoint(s,d),o.projectPoint(r,u);let c=new U.Line3(d,u),a=[],h=[],g=[],x=new U.Vector3;return l.forEach((b,m)=>{c.closestPointToPoint(b,!0,x).distanceTo(b)<.001?(a.push(n[m]),h.push(f[m])):g.push(b)}),{newOriginalPoints:a,newProjectPoints:g,newOnLinePoints:h}},pr=(t,e,n)=>{function o(s,r,i,l,f,d,u,c,a){let h=new U.Line3(s,r),g=new Map,x=new U.Vector3,b=s.clone(),m=r.clone(),p=0;for(;;){let y=new Map,w=0;for(let z=0;z<a.checkResults.length;z++)if(!(a.checkResults[z].allCenterPoints.length/c*100<1))for(let P=0;P<a.checkResults[z].allCenterPoints.length;P++){if(g.has(z)&&g.get(z).removePtsIndex.includes(P))continue;let E=a.checkResults[z].allCenterPoints[P];E=new U.Vector3(E.x,E.y,E.z);let T=h.closestPointToPoint(E,!0,x),V=E.distanceTo(T);Math.abs(V-f)<.01&&(w++,y.has(z)?y.get(z).removePtsIndex.push(P):y.set(z,{index:z,removePtsIndex:[P]}))}if(p==u){s=b,r=m;break}if(w<d/20*19||w==0){y.clear(),u-p<5&&(s=b,r=m,g.clear());break}else{p++;for(let[z,M]of y)g.has(z)?g.get(z).removePtsIndex.push(...M.removePtsIndex):g.set(z,M);y.clear(),s=s.addScaledVector(i,l),r=r.addScaledVector(i,l),h.set(s,r)}}if(g.size>0&&p!=u)for(let[y,w]of g){let z=[],M=[];for(let P=0;P<a.checkResults[y].allCenterPoints.length;P++)w.removePtsIndex.includes(P)||(z.push(a.checkResults[y].allCenterPoints[P]),M.push(a.checkResults[y].originalVertices[P]));a.checkResults[y].allCenterPoints=z,a.checkResults[y].originalVertices=M}}for(let s=0;s<t.length;s++){let r=t[s];if(r.length<.5)continue;let i=-1,l=-1,f=e.readLineById(r.id);f.checkResults=e.getLineCheckReultsById(r.id),f.originalPoints=e.getOriginalPointsById(r.id),r.originalPoints=f.originalPoints,r.checkResults=f.checkResults,r.checkResults.allCenterPoints=[],f=null;for(let D=0;D<r.checkResults.length;D++)for(let W=0;W<r.checkResults[D].originalVertices.length;W++){let I=Fn(r.checkResults[D].originalVertices[W]);r.checkResults.allCenterPoints.push(I)}if(!r.checkResults||r.checkResults.length<=0)continue;if(r.checkResults[0].originalVertices&&r.checkResults[0].originalVertices.length>0){let D=r.checkResults[0].originalVertices[0],[W,I,C,H]=D;W=new U.Vector3(W.x,W.y,W.z),I=new U.Vector3(I.x,I.y,I.z),C=new U.Vector3(C.x,C.y,C.z),H=new U.Vector3(H.x,H.y,H.z),i=W.distanceTo(I),l=W.distanceTo(H);let A=new U.Vector3().subVectors(W,I).normalize(),k=Kt(A,new U.Vector3(0,0,1));k&&k.parallel&&([l,i]=[i,l])}if(i<0||l<0)continue;let d=new U.Vector3(r.start.x,r.start.y,r.start.z),u=new U.Vector3(r.end.x,r.end.y,r.end.z),c=d.distanceTo(u),a=r.rooftopPz-r.start.z,h=Math.ceil(c/i),g=Math.ceil(a/l),x=d.clone(),b=u.clone(),m=b.clone().add(new U.Vector3(0,0,a)),p=x.clone().add(new U.Vector3(0,0,a)),y=new U.Vector3().subVectors(b,x).normalize(),w=y.clone().negate(),M=new U.Vector3().subVectors(m,x).normalize().clone().negate(),P=i/2,E=l/2,T=c*a,V=i*l,_=T/V;o(x,p,y,i,P,g,h,_,r),o(b,m,w,i,P,g,h,_,r),r.start=x,r.end=b;let{newOriginalPoints:v}=bn(x,b,r.originalPoints);r.originalPoints=v,n.stageReplaceCheckResults(r.id,r.checkResults);let R=new Bn().vector3ArrToFloat32Array(r.originalPoints);n.stageReplacePoints(r.id,R),r.checkResults=null,r.originalPoints=null}n.commit()},jt=(t,e)=>new U.Vector3(t.x,t.y,0).distanceTo(new U.Vector3(e.x,e.y,0)),zo=(t,e,n=1e-6)=>{let o=new U.Vector3;return t.closestPointToPoint(e,!0,o),o.distanceTo(e)<n},nn=t=>{let e=0,n=[];for(let o=0;o<t.length;o++)for(let s=o+1;s<t.length;s++){let r=t[o].distanceTo(t[s]);r>e&&(e=r,n=[t[o],t[s]])}return n},ct=(t,e,n=.03)=>Math.abs(t.x-e.x)<n&&Math.abs(t.y-e.y)<n&&Math.abs(t.z-e.z)<n;var xr=()=>{let t=Math.floor(Math.random()*75+180).toString(16).padStart(2,"0"),e=Math.floor(Math.random()*75+180).toString(16).padStart(2,"0"),n=Math.floor(Math.random()*75+180).toString(16).padStart(2,"0");return`#${t}${e}${n}`};var Mo=(t,e=.001)=>{let n=new Map,o=[];for(let s of t){let r=Math.round(s.x/e),i=Math.round(s.y/e),l=Math.round(s.z/e),f=`${r},${i},${l}`;n.has(f)||(n.set(f,!0),o.push(s))}return o},yr=t=>{let e=t.center,n=t.halfSize,s=t.rotation.elements,r=new U.Vector3(s[0],s[1],s[2]).multiplyScalar(n.x),i=new U.Vector3(s[3],s[4],s[5]).multiplyScalar(n.y),l=new U.Vector3(s[6],s[7],s[8]).multiplyScalar(n.z);function f(u,c,a){return e.clone().addScaledVector(r,u).addScaledVector(i,c).addScaledVector(l,a)}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)]},Eo=(t,e)=>{let n=t[0],o=t[1],s=t[2],r=t[3],i=new U.Vector3().subVectors(o,n),l=new U.Vector3().subVectors(r,n),f=i.length(),d=l.length();i.normalize(),l.normalize();let u=new U.Vector3(0,0,1),a=new U.Vector3().add(n).add(o).add(s).add(r).multiplyScalar(.25).clone().addScaledVector(u,e/2),h=new U.BoxGeometry(f,d,e),g=new U.Matrix4;return g.makeBasis(i,l,u),g.setPosition(a),h.applyMatrix4(g),h.computeVertexNormals(),h},Fn=t=>{if(!t||t.length===0)return null;let e=new U.Vector3(0,0,0);for(let n of t)Array.isArray(n)?(e.x+=n[0],e.y+=n[1],e.z+=n[2]):(e.x+=n.x,e.y+=n.y,e.z+=n.z);return e.divideScalar(t.length),e};import*as Xt from"three";var _i=(t,e)=>{console.log("lines",t);for(let n=0;n<t.length;n++){let o=t[n],s=[];o.originalPoints.forEach(y=>{let w=new Xt.Vector3(y.x,y.y,0),z=!1;for(let M=0;M<s.length;M++)if(ct(w,s[M],.01)){z=!0;break}z||s.push(w)});let r=Math.round(Math.max(5,Math.min(350,20*Math.sqrt(o.length)))),i=1,l=new Xt.Vector3(o.start.x,o.start.y,o.start.z),f=new Xt.Vector3(o.end.x,o.end.y,o.end.z),d=new Xt.Vector3().subVectors(f,l).normalize(),u=d.clone().cross(new Xt.Vector3(0,0,1)).normalize(),c=u.clone().negate(),a=[],h=[],g=o.length/r;console.log(g);for(let y=0;y<r;y++){let w=[];w.push(l.clone().addScaledVector(u,i)),w.push(w[0].clone().addScaledVector(d,g)),w.push(w[1].clone().addScaledVector(c,i*2)),w.push(l.clone().addScaledVector(c,g));let z=[];for(let M=0;M<s.length;M++)a.includes(M)||Ai(s[M],w)&&(a.push(M),z.push(s[M]));z.length>0&&h.push(Li(z)),l=l.addScaledVector(d,g)}let x=new Float32Array(s.length*3);s.forEach((y,w)=>{x[w*3]=y.x,x[w*3+1]=y.y,x[w*3+2]=y.z});let b=new Xt.BufferGeometry;b.setAttribute("position",new Xt.BufferAttribute(x,3)),b.rotateX(-Math.PI/2),e.add(new Xt.Points(b,new Xt.PointsMaterial({color:xr(),size:.02})));let[m,p]=Fi(h,{plane:"xy",trimRatio:0});hr(m,p,e)}};function br(t,e="xy"){if(e==="xy")return{x:t.x,y:t.y};if(e==="xz")return{x:t.x,y:t.z};if(e==="yz")return{x:t.y,y:t.z};throw new Error(`Unsupported plane: ${e}`)}function Hi(t,e,n){let o=e.x-t.x,s=e.y-t.y,r=n.x-t.x,i=n.y-t.y;return o*i-s*r}function Ai(t,e,n="xy"){if(!e||e.length!==4)throw new Error("rectPoints must contain 4 points");let o=br(t,n),s=e.map(l=>br(l,n)),r=!1,i=!1;for(let l=0;l<4;l++){let f=s[l],d=s[(l+1)%4],u=Hi(f,d,o);if(u>1e-9&&(r=!0),u<-1e-9&&(i=!0),r&&i)return!1}return!0}function Li(t){if(!t||t.length===0)return null;let e=new Xt.Vector3(0,0,0);for(let n of t)Array.isArray(n)?(e.x+=n[0],e.y+=n[1],e.z+=n[2]):(e.x+=n.x,e.y+=n.y,e.z+=n.z);return e.divideScalar(t.length),e}function ki(t){return t instanceof Xt.Vector3?t.clone():Array.isArray(t)?new Xt.Vector3(t[0],t[1],t[2]):new Xt.Vector3(t.x,t.y,t.z)}function Bi(t,e="xy"){let n=ki(t);if(e==="xy")return{x:n.x,y:n.y,up:n.z};if(e==="xz")return{x:n.x,y:n.z,up:n.y};if(e==="yz")return{x:n.y,y:n.z,up:n.x};throw new Error(`Unsupported plane: ${e}`)}function wr(t,e,n,o="xy"){if(o==="xy")return new Xt.Vector3(t,e,n);if(o==="xz")return new Xt.Vector3(t,n,e);if(o==="yz")return new Xt.Vector3(n,t,e);throw new Error(`Unsupported plane: ${o}`)}function Oi(t,e,n){if(Math.abs(e)<1e-12)return t>=n?{x:1,y:0}:{x:0,y:1};let s=t+n,r=t*n-e*e,i=Math.sqrt(Math.max(0,s*s*.25-r)),l=s*.5+i,f=e,d=l-t,u=Math.hypot(f,d);return u<1e-12?{x:1,y:0}:{x:f/u,y:d/u}}function Fi(t,e={}){let{plane:n="xy",trimRatio:o=0}=e;if(!t||t.length<2)return null;let s=t.map(I=>Bi(I,n)),r=0,i=0,l=0;for(let I of s)r+=I.x,i+=I.y,l+=I.up;r/=s.length,i/=s.length,l/=s.length;let f=0,d=0,u=0;for(let I of s){let C=I.x-r,H=I.y-i;f+=C*C,d+=C*H,u+=H*H}f/=s.length,d/=s.length,u/=s.length;let c=Oi(f,d,u),a={x:-c.y,y:c.x},h=[];for(let I of s){let C=I.x-r,H=I.y-i,A=C*c.x+H*c.y,k=C*a.x+H*a.y;h.push({s:A,t:k,up:I.up})}h.sort((I,C)=>I.s-C.s);let g=h.length,x=Math.floor(g*o),b=Math.ceil(g*(1-o))-1;x=Math.max(0,Math.min(g-1,x)),b=Math.max(0,Math.min(g-1,b));let m=h[x],p=h[b],y=(()=>{let I=h.map(H=>H.t).sort((H,A)=>H-A),C=Math.floor(I.length/2);return I.length%2===0?(I[C-1]+I[C])*.5:I[C]})(),w=(()=>{let I=h.map(H=>H.up).sort((H,A)=>H-A),C=Math.floor(I.length/2);return I.length%2===0?(I[C-1]+I[C])*.5:I[C]})(),z=m.s,M=p.s,P=y,E=y,T=w,V=w,_=r+c.x*z+a.x*P,v=i+c.y*z+a.y*P,S=r+c.x*M+a.x*E,R=i+c.y*M+a.y*E,D=wr(_,v,T,n),W=wr(S,R,V,n);return[D,W]}var Ni=async(t,e,n,o,s)=>{if(pr(t,o,s),t.length<=0||e.length<=0)return t;n||(n=[]);for(let m of t){let p=[],y=o.readLineById(m.id);if(y.checkResults=o.getLineCheckReultsById(m.id),m.checkResults=y.checkResults,!(!m.checkResults||m.checkResults.length<=0)){for(let w=0;w<m.checkResults.length;w++){let T=function(R){for(;E[R]!==R;)E[R]=E[E[R]],R=E[R];return R},z=m.checkResults[w];if(!z.originalVertices||z.originalVertices.length==0)continue;let M=[];z.originalVertices.forEach(R=>{let D=[];R.forEach(W=>{D.push(new F.Vector3(W.x,W.y,W.z))}),M.push(D)});let P=M.length,E=Array.from({length:P},(R,D)=>D);for(let R=0;R<P;R++)for(let D=R+1;D<P;D++){let W=M[R],I=M[D];if(W.some(H=>I.some(A=>H.equals(A)))){let H=T(R),A=T(D);H!==A&&(E[H]=A)}}let V=new Map,_=-1,v=-1;for(let R=0;R<P;R++){let D=T(R);V.has(D)||V.set(D,{points:[],area:0,index:-1,gridWidth:-1,gridHeight:-1,centerPts:[],facePoints:[],boxArea:-1,totalInPlaneNum:-1});let W=V.get(D),[I,C,H,A]=M[R],k=new F.Vector3().add(I).add(C).add(H).add(A).multiplyScalar(.25);if(W.points.push(...M[R]),W.area+=I.distanceTo(C)*I.distanceTo(A),W.index=w,W.centerPts.push(k),_==-1||v==-1){let O=new F.Vector3().subVectors(I,C).normalize();v=I.distanceTo(A),_=I.distanceTo(C);let N=Kt(O,new F.Vector3(0,0,1));N&&N.parallel&&([v,_]=[_,v])}W.gridWidth=_,W.gridHeight=v}let S=V.values();for(let R of V.values()){let{facePoints:D,boxArea:W,totalInPlaneNum:I}=gr(R.points,R.gridWidth,R.gridHeight,R.centerPts);R.centerPts=null,R.facePoints=D,R.boxArea=W,R.totalInPlaneNum=I}p.push(...S)}m.checkResults=null,m.mergeCheckRegion=p}}let r=[];for(let m=0;m<n.length;m++){let p=n[m];if(p.isFindBeam=!1,p.category=="door"){let y=[];p.coordinatesByArea.coordinates.forEach(E=>{y.push(new F.Vector3(E.x,E.y,E.z))}),y[0].equals(y[y.length-1])&&y.pop();let w=y[0].distanceTo(y[1]),z=y[0].distanceTo(y[3]);z>w&&([w,z]=[z,w],y=[y[0],y[3],y[2],y[1]]);let M=qt(y[0],y[3],!0),P=qt(y[1],y[2],!0);r.push({doorStartPt:M,doorEndPt:P,boxPoints:y,minZ:p.coordinatesByArea.heightData.minZ,maxZ:p.coordinatesByArea.heightData.maxZ,index:m,isFind:!1,inWall:!1})}}for(let m=0;m<r.length;m++){let p=r[m];for(let y=0;y<t.length;y++){if(t[y].length<.5)continue;let w=[],z=qt(t[y].start,t[y].end,!0);w.push(z),w.push(qt(z,t[y].start,!0)),w.push(qt(z,t[y].end,!0));let M=!1,P=p.boxPoints.length;for(let E=0;E<w.length;E++){let T=w[E].x,V=w[E].y;for(let _=0,v=P-1;_<P;v=_++){let S=p.boxPoints[_].x,R=p.boxPoints[_].y,D=p.boxPoints[v].x,W=p.boxPoints[v].y;R>V!=W>V&&T<(D-S)*(V-R)/(W-R)+S&&(M=!M)}if(M)break}if(M){let E=new F.Vector3(t[y].start.x,t[y].start.y,0),T=new F.Vector3(t[y].end.x,t[y].end.y,0),V=p.doorStartPt.distanceTo(p.doorEndPt),_=E.distanceTo(T),v=Gt(p.doorStartPt,p.doorEndPt,E,T);if(Math.abs(_-V)<.5&&v&&v.angleDeg<15){p.doorStartPt=new F.Vector3(t[y].start.x,t[y].start.y,0),p.doorEndPt=new F.Vector3(t[y].end.x,t[y].end.y,0);break}else if(Math.abs(_-V)>1.3&&v&&v.angleDeg<15){let S=ye(p.doorStartPt,p.doorEndPt,E,T,{parallelAngleMax:F.MathUtils.degToRad(15)}),R=p.doorStartPt.distanceTo(E),D=p.doorStartPt.distanceTo(T),W=p.doorEndPt.distanceTo(E),I=p.doorEndPt.distanceTo(T),C=R<.2||D<.2||W<.2||I<.2;if(S&&S.type=="collinear_overlap"&&S.maxPerpendicularDistance<.1&&!C){p.inWall=!0;break}else{let H=new F.Line3(E,T),A=H.closestPointToPoint(p.doorStartPt,!0,new F.Vector3),k=H.closestPointToPoint(p.doorEndPt,!0,new F.Vector3),O=A.distanceTo(p.doorStartPt),N=k.distanceTo(p.doorEndPt);if(O<.1||N<.1){p.inWall=!0;break}}}}else continue}}let i=0,l=[],f=[],d=[],u=[],c=.15;for(let m=0;m<t.length;m++){let p=t[m];if(p.noDetection)continue;let y=o.readLineById(p.id);if(y.originalPoints=o.getOriginalPointsById(p.id),y.checkResults=o.getLineCheckReultsById(p.id),p.originalPoints=y.originalPoints,p.checkResults=y.checkResults,y=null,p.doorAndBeamData=[],p.doorAndBeamIdToCheckResults=[],!p.mergeCheckRegion||p.mergeCheckRegion.length==0)continue;p.completePointAreaPercentage=-1;let w=new F.Box3;w.setFromPoints(p.originalPoints);let z=w.max.z,M=w.min.z,P=new F.Vector3(p.start.x,p.start.y,p.start.z),E=new F.Vector3(p.end.x,p.end.y,p.end.z),T=p.rooftopPz-p.start.z,V=0;for(let v of p.mergeCheckRegion){let S=v.facePoints,R=v.boxArea,D=v.totalInPlaneNum;if(!S||S.length<=0)continue;let W=S[0].distanceTo(S[1]),I=S[0].distanceTo(S[3]),C=v.gridHeight*(I/v.gridHeight/3*2)+v.gridHeight/2,H=new F.Vector3(S[0].x,S[0].y,S[0].z+C),A=new F.Vector3(S[1].x,S[1].y,S[1].z+C),k=new F.Line3(H,A),O=[],N=new F.Vector3;v.points.forEach(q=>{k.closestPointToPoint(q,!0,N).distanceTo(q)<v.gridHeight+.01&&O.push(q)});let L=[],B=[];for(;;){let q=[];for(let X=0;X<O.length;X++)B.includes(X)||q.length==0&&(q.push(O[X]),B.push(X));for(let X=0;X<O.length;X++)if(!B.includes(X)){for(let Y=0;Y<q.length;Y++)if(O[X].distanceTo(q[Y])<v.gridWidth+.01){q.push(O[X]),B.push(X),X=-1;break}}if(q.length==0)break;L.push(q)}let $=[];for(let q=0;q<L.length;q++){let X={lineSt:new F.Vector3,lineEd:new F.Vector3,facePoints:[]},Y=nn(L[q]);Array.isArray(Y)&&Y.length==2&&(X.lineSt=Y[0],X.lineEd=Y[1],X.facePoints.push(new F.Vector3(Y[0].x,Y[0].y,S[0].z)),X.facePoints.push(new F.Vector3(Y[1].x,Y[1].y,S[0].z)),X.facePoints.push(new F.Vector3(Y[1].x,Y[1].y,S[2].z)),X.facePoints.push(new F.Vector3(Y[0].x,Y[0].y,S[2].z)),$.push(X))}V+=v.area;let G=0;if(D!=0&&(G=v.gridHeight*v.gridWidth*D),(v.area-G)/R*100>70&&$.length==1||$.length>1)for(let q=0;q<$.length;q++){let X=$[q],Y=X.facePoints[0].distanceTo(X.facePoints[1]),it=X.facePoints[0].distanceTo(X.facePoints[3]),ht=Y/p.length*100,St=p.rooftopPz-X.facePoints[2].z;if(it<1.5||z<X.facePoints[2].z||St>T/3*2)continue;let nt=!1,wt=!1,zt=!1,Dt=new F.Vector3(0,0,0),Pt=new F.Vector3(0,0,0),Mt=!1,It=[],ot=X.facePoints[2].clone(),ft=X.facePoints[3].clone(),rt=X.facePoints[0].clone(),tt=X.facePoints[1].clone(),ae=!1,bt=-1;if(Math.abs(X.facePoints[0].z-p.start.z)<.25){let Jt=!1;for(let st=0;st<e.length;st++){let Ct=st+1;if(Ct>=e.length)continue;let Ft=new F.Vector3(e[st].x,e[st].y,e[st].z),at=new F.Vector3(e[Ct].x,e[Ct].y,e[Ct].z);if(ze(new F.Vector3(Ft.x,Ft.y,0),new F.Vector3(at.x,at.y,0),new F.Vector3(X.facePoints[0].x,X.facePoints[0].y,0),new F.Vector3(X.facePoints[1].x,X.facePoints[1].y,0),.1)!=null){Jt=!0;break}}let{newOriginalPoints:he}=bn(rt,tt,p.originalPoints),Tt=[],ee=[];if(he.forEach(st=>{st.z>=ot.z?Tt.push(st):st.z<=rt.z&&ee.push(st)}),Tt.length<20)continue;let et=p.rooftopPz-ot.z,me=ot.clone();me.z+=et;let Ae=ot.distanceTo(ft),Le=new F.Vector3().subVectors(ft,ot).normalize(),gn=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(Ae)))),ke=Ae/gn,ge=[],tn=[];for(let st=0;st<gn;st++)ge.push(new F.Vector3(ot.x,ot.y,ot.z+et/5).addScaledVector(Le,ke*st)),ge.push(new F.Vector3(me.x,me.y,me.z-et/5).addScaledVector(Le,ke*st));let en=ge.length;for(let st=0;st<Tt.length;st++)for(let Ct=0;Ct<ge.length;Ct++)if(new F.Vector3(Tt[st].x,Tt[st].y,Tt[st].z).distanceTo(ge[Ct])<.05){tn.push(ge[Ct]),ge.splice(Ct,1);break}if(tn.length/en<.5)continue;if(Y>.17&&p.length>.5){let st=jt(P,rt),Ct=jt(P,tt),Ft=jt(E,rt),at=jt(E,tt),j=.15,Et=10;if(st<j||Ct<j)if(Tt.length>10){let yt=new F.Vector3(p.start.x,p.start.y,0),ut=new F.Vector3(p.end.x,p.end.y,0),gt=new F.Vector3().subVectors(yt,ut).normalize(),kt=new F.Vector3,pt=1/0,Ot=-1,xt=!1,dt=!1;for(let J=0;J<t.length;J++){if(J==m)continue;let mt=new F.Vector3(t[J].start.x,t[J].start.y,0),lt=new F.Vector3(t[J].end.x,t[J].end.y,0),vt=ze(yt,ut,mt,lt,.1),Wt=ie(yt,ut,mt,lt);if(vt!=null){if(Wt&&Wt.angle>85){let _t=vt.point.distanceTo(yt),At=vt.point.distanceTo(ut);if(_t<.3){dt=!0,pt=1/0,Ot=-1;break}}continue}if(Wt&&Wt.angle>85){let At=new F.Line3(mt,lt).closestPointToPoint(yt,!0,kt),Bt=Gt(yt,ut,At,yt);if(!Bt||Bt.direction!="same")continue;let re=yt.clone().addScaledVector(gt,Et),Ut=ut.clone().addScaledVector(gt.clone().negate(),Et),se=new F.Vector3().subVectors(lt,mt).normalize(),te=mt.clone().addScaledVector(se.clone().negate(),.03),Te=lt.clone().addScaledVector(se,.03),le=ze(re,Ut,te,Te);if(le==null)continue;let ne=yt.distanceTo(le.point);ne<pt&&(pt=ne,Ot=J)}else if(Wt&&Wt.angle<5){let _t=new F.Vector3(rt.x,rt.y,0),At=new F.Vector3(tt.x,tt.y,0),Bt=jt(_t,mt),re=jt(_t,lt),Ut=jt(At,mt),se=jt(At,lt),te=Gt(yt,ut,mt,_t),Te=!1,le=o.readLineById(t[J].id);if(le.checkResults=o.getLineCheckReultsById(t[J].id),t[J].checkResults=le.checkResults,le=null,t[J].checkResults){for(let ne=0;ne<t[J].checkResults.length;ne++){let xn=[];for(let xe=0;xe<t[J].checkResults[ne].originalVertices.length;xe++){let Re=Fn(t[J].checkResults[ne].originalVertices[xe]);Re.z=0,xn.push(Re)}let pe=nn(xn);if(pe.length==2){let xe=jt(_t,pe[0]),Re=jt(_t,pe[1]),po=jt(At,pe[0]),xo=jt(At,pe[1]);if(xe<.2||Re<.2||po<.2||xo<.2){Te=!0;break}}}t[J].checkResults=null}if(te&&te.direction=="same"&&!Te&&(Bt<.1||re<.1||Ut<.1||se<.1)){xt=!0,pt=1/0,Ot=-1;break}}}if(pt!=1/0&&pt<2&&(p.length-Y>.2||p.length-Y<.02)&&pt<Y*2)t[Ot].length>.25&&Y+pt>.5&&(ae=!0,st<j?(ft=ft.addScaledVector(gt,pt),rt=rt.addScaledVector(gt,pt)):(ot=ot.addScaledVector(gt,pt),tt=tt.addScaledVector(gt,pt)));else{if(!xt&&!dt&&p.length-Y>.1)continue;if(!xt&&!dt&&p.length-Y<.1&&p.length<1.8)continue}}else continue;if(Ft<j||at<j)if(Tt.length>10){let yt=new F.Vector3(p.start.x,p.start.y,0),ut=new F.Vector3(p.end.x,p.end.y,0),gt=new F.Vector3().subVectors(ut,yt).normalize(),kt=new F.Vector3,pt=1/0,Ot=-1,xt=!1,dt=!1;for(let J=0;J<t.length;J++){if(J==m)continue;let mt=new F.Vector3(t[J].start.x,t[J].start.y,0),lt=new F.Vector3(t[J].end.x,t[J].end.y,0),vt=ze(yt,ut,mt,lt,.03),Wt=ie(yt,ut,mt,lt);if(vt!=null){if(Wt&&Wt.angle>85){let _t=vt.point.distanceTo(yt);if(vt.point.distanceTo(ut)<.3){dt=!0,pt=1/0,Ot=-1;break}}continue}if(Wt&&Wt.angle>85){let At=new F.Line3(mt,lt).closestPointToPoint(ut,!0,kt),Bt=Gt(ut,yt,At,ut);if(!Bt||Bt.direction!="same")continue;let re=yt.clone().addScaledVector(gt.clone().negate(),Et),Ut=ut.clone().addScaledVector(gt,Et),se=new F.Vector3().subVectors(lt,mt).normalize(),te=mt.clone().addScaledVector(se.clone().negate(),.03),Te=lt.clone().addScaledVector(se,.03),le=ze(re,Ut,te,Te);if(le==null)continue;let ne=ut.distanceTo(le.point);ne<pt&&(pt=ne,Ot=J)}else if(Wt&&Wt.angle<5){let _t=new F.Vector3(rt.x,rt.y,0),At=new F.Vector3(tt.x,tt.y,0),Bt=jt(_t,mt),re=jt(_t,lt),Ut=jt(At,mt),se=jt(At,lt),te=Gt(ut,yt,mt,_t),Te=!1,le=o.readLineById(t[J].id);if(le.checkResults=o.getLineCheckReultsById(t[J].id),t[J].checkResults=le.checkResults,le=null,t[J].checkResults){for(let ne=0;ne<t[J].checkResults.length;ne++){let xn=[];for(let xe=0;xe<t[J].checkResults[ne].originalVertices.length;xe++){let Re=Fn(t[J].checkResults[ne].originalVertices[xe]);Re.z=0,xn.push(Re)}let pe=nn(xn);if(pe.length==2){let xe=jt(_t,pe[0]),Re=jt(_t,pe[1]),po=jt(At,pe[0]),xo=jt(At,pe[1]);if(xe<.2||Re<.2||po<.2||xo<.2){Te=!0;break}}}t[J].checkResults=null}if(te&&te.direction=="same"&&!Te&&(Bt<.1||re<.1||Ut<.1||se<.1)){xt=!0,pt=1/0,Ot=-1;break}}}if(pt!=1/0&&pt<2&&(p.length-Y>.2||p.length-Y<.02)&&pt<Y*2)t[Ot].length>.25&&Y+pt>.5&&(ae=!0,Ft<j?(ft=ft.addScaledVector(gt,pt),rt=rt.addScaledVector(gt,pt)):(ot=ot.addScaledVector(gt,pt),tt=tt.addScaledVector(gt,pt)));else{if(!xt&&!dt&&p.length-Y>.1)continue;if(!xt&&!dt&&p.length-Y<.1&&p.length<1.8)continue}}else continue;Y=ft.distanceTo(ot)}if(ht<85&&Y>.3||Y>.7&&it>T-T/2){if(!p.isLine2){if(Y<3.5)for(let st=0;st<r.length;st++){let Ct=new F.Vector3(r[st].doorStartPt.x,r[st].doorStartPt.y,0),Ft=new F.Vector3(r[st].doorEndPt.x,r[st].doorEndPt.y,0),at=new F.Vector3(X.facePoints[0].x,X.facePoints[0].y,0),j=new F.Vector3(X.facePoints[1].x,X.facePoints[1].y,0),Et=X.facePoints[2].z<r[st].maxZ||Math.abs(X.facePoints[2].z-r[st].maxZ)<.3,yt=Math.abs(X.facePoints[2].z-r[st].maxZ)>.2;if(Et){let ut=ye(Ct.clone(),Ft.clone(),at.clone(),j.clone(),{distanceThreshold:2});if(ut&&ut.type=="collinear_gap"){let gt=qt(Ct,Ft),kt=new F.Line3(new F.Vector3(p.start.x,p.start.y,0),new F.Vector3(p.end.x,p.end.y,0)),pt=new F.Vector3,Ot=kt.closestPointToPoint(gt,!0,pt);if(gt.distanceTo(Ot)<.15){let dt=at.distanceTo(Ct),J=j.distanceTo(Ct);if(dt>.25&&J>.25){let vt=at.distanceTo(Ft),Wt=j.distanceTo(Ft);if(vt>.2&&Wt>.2)continue}wt=!0,Mt=!0,It.push(r[st].index),r[st].isFind=!0,bt=st,zt=n[r[st].index].isFindBeam,n[r[st].index].isFindBeam=!0;let mt=new F.Vector3().subVectors(at,j).normalize(),lt=Ct.distanceTo(Ft)-ut.overlap;J<dt&&mt.negate(),dt>J?(ot=X.facePoints[2].clone().addScaledVector(mt,lt),ft=X.facePoints[3].clone(),rt=ft.clone(),tt=ot.clone(),rt.z=tt.z=X.facePoints[0].z):(ot=X.facePoints[2].clone(),ft=X.facePoints[3].clone().addScaledVector(mt,lt),rt=ft.clone(),tt=ot.clone(),rt.z=tt.z=X.facePoints[0].z)}}else if(ut&&ut.type=="collinear_overlap"&&ut.maxPerpendicularDistance<.35){let gt=at.distanceTo(j),kt=Ft.distanceTo(Ct);if(Math.abs(gt-ut.overlap)<.25||Math.abs(kt-ut.overlap)<.25){if(kt>gt&&Math.abs(kt-ut.overlap)>1){let pt=at.distanceTo(Ct),Ot=at.distanceTo(Ft),xt=j.distanceTo(Ct),dt=j.distanceTo(Ft),J=pt<Ot?pt:Ot,mt=xt<dt?xt:dt,lt=new F.Vector3().subVectors(at,j).normalize(),vt=kt-ut.overlap;J<mt?(lt.negate(),ot=X.facePoints[2].clone().addScaledVector(lt,vt),ft=X.facePoints[3].clone(),rt=ft.clone(),tt=ot.clone(),rt.z=tt.z=X.facePoints[0].z):(ot=X.facePoints[2].clone(),ft=X.facePoints[3].clone().addScaledVector(lt,vt),rt=ft.clone(),tt=ot.clone(),rt.z=tt.z=X.facePoints[0].z)}Y>1.5&&(wt=!0,Mt=!0,It.push(r[st].index),r[st].isFind=!0,zt=n[r[st].index].isFindBeam,n[r[st].index].isFindBeam=!0,bt=st)}}}}if(!Mt&&Y<1.5)for(let st=0;st<r.length;st++){if(r[st].inWall)continue;let Ct=new F.Vector3(r[st].doorStartPt.x,r[st].doorStartPt.y,0),Ft=new F.Vector3(r[st].doorEndPt.x,r[st].doorEndPt.y,0),at=new F.Vector3(ft.x,ft.y,0),j=new F.Vector3(ot.x,ot.y,0),Et=new F.Vector3().subVectors(Ct,Ft).normalize(),yt=new F.Vector3().subVectors(at,j).normalize(),ut=.25,gt=Ct.clone().addScaledVector(Et,ut),kt=Ft.clone().addScaledVector(Et.clone().negate(),ut),pt=at.clone().addScaledVector(yt,ut),Ot=j.clone().addScaledVector(yt.clone().negate(),ut);if(Gt(gt,kt,pt,Ot).isParallel)continue;let dt=ze(gt,kt,pt,Ot),J=!0,mt=Ct.distanceTo(at),lt=Ct.distanceTo(j),vt=Ft.distanceTo(at),Wt=Ft.distanceTo(j);if((mt<c||lt<c||vt<c||Wt<c||dt)&&J){let At=new F.Line3(at,j);if(mt<c||vt<c)if(Dt=at.clone(),mt<c){let Bt=At.closestPointToPoint(Ft,!1,new F.Vector3);Pt=new F.Vector3().subVectors(Ft,Bt).normalize()}else{let Bt=At.closestPointToPoint(Ct,!1,new F.Vector3);Pt=new F.Vector3().subVectors(Ct,Bt).normalize()}else if(lt<c||Wt<c)if(Dt=j.clone(),lt<c){let Bt=At.closestPointToPoint(Ft,!1,new F.Vector3);Pt=new F.Vector3().subVectors(Ft,Bt).normalize()}else{let Bt=At.closestPointToPoint(Ct,!1,new F.Vector3);Pt=new F.Vector3().subVectors(Ct,Bt).normalize()}else if(dt){let Bt=dt.point.distanceTo(at),re=dt.point.distanceTo(j),Ut=dt.point.distanceTo(gt),se=dt.point.distanceTo(kt);if(Bt<re?Dt=at.clone():Dt=j.clone(),Ut<se){let te=At.closestPointToPoint(kt,!1,new F.Vector3);Pt=new F.Vector3().subVectors(kt,te).normalize()}else{let te=At.closestPointToPoint(gt,!1,new F.Vector3);Pt=new F.Vector3().subVectors(gt,te).normalize()}}zt=n[r[st].index].isFindBeam,n[r[st].index].isFindBeam=!0,wt=!0,r[st].isFind=!0,bt=st}}}(wt||Jt||Math.abs(it-T)>.1&&it>T/3&&Y>.3)&&(nt=!0)}}if(nt){{let at=new F.Vector3().subVectors(rt,tt),j=new F.Vector3().subVectors(tt,rt),Et=1/0,yt=1/0,ut=rt.clone(),gt=tt.clone(),kt=[],pt=[],Ot=new F.Line3(ot,ft),xt=new F.Vector3,dt=999999;if(p.originalPoints.forEach(J=>{if(J.z-rt.z<it/2+.1&&J.z-rt.z>it/2-.1&&kt.push(J),J.z>ot.z){let mt=Ot.closestPointToPoint(J,!0,xt),lt=new F.Vector3().subVectors(mt,ot),vt=new F.Vector3().subVectors(mt,ft),Wt=Kt(at,vt),_t=Kt(j,lt);Wt&&Wt.parallel&&!Wt.sameDirection&&_t&&_t.parallel&&!_t.sameDirection&&pt.push(J)}}),kt.length>0){let{newProjectPoints:J}=bn(rt,tt,kt);for(let mt of J)mt.z=rt.z;J.forEach(mt=>{let lt=new F.Vector3(mt.x,mt.y,rt.z),vt=new F.Vector3().subVectors(lt,tt),Wt=new F.Vector3().subVectors(lt,rt),_t=Kt(at,Wt),At=Kt(j,vt);if(_t&&_t.parallel&&_t.sameDirection){let Bt=lt.distanceTo(rt);Bt<Et&&(Et=Bt,ut=lt)}else if(At&&At.parallel&&At.sameDirection){let Bt=lt.distanceTo(tt);Bt<yt&&(yt=Bt,gt=lt)}})}if(ut.equals(rt)||(rt=ut,ft=new F.Vector3(rt.x,rt.y,ft.z)),gt.equals(tt)||(tt=gt,ot=new F.Vector3(tt.x,tt.y,ot.z)),pt.length>10){let{newOnLinePoints:J}=bn(ft,ot,pt);for(let mt=0;mt<J.length;mt++){let vt=Ot.closestPointToPoint(J[mt],!0,xt).distanceTo(J[mt]);vt>.02&&dt>vt&&(dt=vt)}ot.z+=dt,ft.z+=dt,it+=dt}}let Jt=!1;for(let at=0;at<d.length;at++){let j=ye(d[at].start,d[at].end,rt,tt);j&&j.type=="collinear_overlap"&&j.maxPerpendicularDistance<.07&&(Jt=!0)}if(Jt){bt!=-1&&(zt||(n[r[bt].index].isFindBeam=!1,r[bt].isFind=!1));continue}let he=tt.distanceTo(rt);if(he<.4&&!wt||he<.3&&wt)continue;f.includes(m)||f.push(m);let Tt="",ee=wt?"singleDoor":"";ee=Mt?"pullOutDoor":ee;let et={id:i,beamStart:ot,beamEnd:ft,beamHeight:p.rooftopPz-ot.z,doorStart:rt,doorEnd:tt,doorHeight:it,nearId:-1,type:Tt,isExtend:ae,isDoor:wt,isPullOutDoor:Mt,pcbDoorIndexs:It,beamNearWallVec:new F.Vector3(0,0,0),doorType:ee,doorOpenEndPoint:Dt,doorOpenVector:Pt,lineIsOnlyBeam:!1};if(et.beamHeight<.1)continue;let me=1/0,Ae=!1,Le=new F.Vector3,gn=new F.Vector3,ke=-1,ge=-1,tn=-1,en=!1,pn=!1;if(!Ae){let at=new F.Line3(rt.clone(),tt.clone()),j=-1;for(let Et=0;Et<t.length;Et++){if(t[Et].length<.5||Et==m)continue;let yt=new F.Vector3(t[Et].start.x,t[Et].start.y,t[Et].start.z),ut=new F.Vector3(t[Et].end.x,t[Et].end.y,t[Et].end.z),gt=ye(yt,ut,rt,tt),kt=Gt(yt,ut,rt,tt);if(gt&&gt.maxPerpendicularDistance<.5){if(kt&&kt.isParallel){let lt=new F.Line3(yt,ut),vt=new F.Vector3(rt.x,rt.y,yt.z),Wt=lt.closestPointToPoint(vt,!0,new F.Vector3),_t=ie(Wt,vt,rt,tt);_t&&_t.angle>85&&(et.beamNearWallVec=new F.Vector3().subVectors(Wt,vt).normalize(),et.beamStart.z>t[Et].rooftopPz-.03&&Y>1?pn=!0:pn=!1)}let pt=[],Ot=o.readLineById(t[Et].id);Ot.originalPoints=o.getOriginalPointsById(t[Et].id),t[Et].originalPoints=Ot.originalPoints,Ot=null,t[Et].originalPoints.forEach(lt=>{lt.z>rt.z+.2&&lt.z<rt.z+it/2&&pt.push(new F.Vector3(lt.x,lt.y,rt.z))}),t[Et].originalPoints=null;let xt=new F.Vector3,dt=[],J=[];for(let lt=0;lt<pt.length;lt++){let vt=at.closestPointToPoint(pt[lt],!0,xt);vt.distanceTo(pt[lt])<.15&&(dt.push(pt[lt]),J.push(vt.clone()))}for(let lt=0;lt<J.length;lt++)zo(at,J[lt])&&dt.push(J[lt]);if(dt=J,dt=Mo(dt),dt.length<150)continue;let mt=nn(dt);if(mt.length==2){let lt=mt[0].distanceTo(mt[1]);if(Math.abs(lt-at.distance())<.3){j=gt.maxPerpendicularDistance;let vt=new F.Line3(yt,ut),Wt=new F.Vector3(rt.x,rt.y,yt.z),_t=vt.closestPointToPoint(Wt,!0,new F.Vector3);if(et.beamNearWallVec=new F.Vector3().subVectors(_t,Wt).normalize(),et.beamStart.z>t[Et].rooftopPz-.03&&Y>.8)pn=!0,en=!0;else if(Jt=!0,bt!=-1&&(zt||(n[r[bt].index].isFindBeam=!1,r[bt].isFind=!1)),ge!=-1&&tn!=-1){let At=t[ge].doorAndBeamData[tn];At.nearId=-1}break}}if(Jt)break}else gt&&gt.type=="collinear_overlap"&&gt.maxPerpendicularDistance>.3&&gt.maxPerpendicularDistance<.7&&(en=!0)}if(Jt){if(Y<1.5||j<.08)continue;en=!0}}let st=!1;if(ke!=-1)for(let at=0;at<u.length&&!(u[at].length==1&&(u[at][0].id==i?(u[at].push({id:ke,beamStart:Le,beamEnd:gn}),st=!0):u[at][0].id==ke&&(u[at].push({id:i,beamStart:ot,beamEnd:ft}),st=!0),st));at++);st||u.push([{id:i,beamStart:ot,beamEnd:ft}]);let Ct=et.doorStart.distanceTo(et.doorEnd),Ft=On(p.originalPoints);if(et.lineIsOnlyBeam=Ft.minZ>p.start.z&&Ft.minZ-p.start.z>1,wt?Tt="door":Ct>1.5||ae?Tt="beam":Tt=en&&Ct>.8?"beam":"hole",Tt!="beam"&&t[m].isLine2)continue;et.type=Tt,et.wallBelowBeam=pn;for(let at=0;at<l.length;at++){let j=t[l[at].linesIndex].doorAndBeamData[l[at].doorIndex];if(j.nearId!=-1||et.type=="beam"&&j.type!="beam"||et.type!="beam"&&j.type=="beam")continue;let Et=Gt(ot.clone(),ft.clone(),j.beamStart.clone(),j.beamEnd.clone());if(Et&&Et.isParallel){let yt=ot.distanceTo(ft),ut=j.beamStart.distanceTo(j.beamEnd),gt=new F.Line3(ot.clone(),ft.clone());gt.start.z=0,gt.end.z=0;let kt=qt(j.beamStart,j.beamEnd,!0);ut>yt&&(gt.start=new F.Vector3(j.beamStart.x,j.beamStart.y,0),gt.end=new F.Vector3(j.beamEnd.x,j.beamEnd.y,0),kt=qt(ot,ft,!0));let pt=new F.Vector3,Ot=gt.closestPointToPoint(kt,!0,pt),xt=Ot.distanceTo(kt),dt=new F.Vector3().subVectors(kt,Ot).normalize(),J=dt.clone().negate(),mt=kt.clone().addScaledVector(J,xt+.1),lt=ze(gt.start,gt.end,kt,mt),vt=!wt&&!j.isDoor&&(yt>ut*2||ut>yt*2);if(xt<.4&&lt!=null&&!vt){let Wt=!1;for(let Ut=0;Ut<p.doorAndBeamData.length;Ut++)if(p.doorAndBeamData[Ut].id==j.id){Wt=!0;break}if(Wt)continue;j.nearId=i,et.nearId=j.id;let _t=.8;(j.isDoor||et.isDoor)&&(j.isDoor=!0,et.isDoor=!0),j.doorType!=""?et.doorType=j.doorType:et.doorType!=""&&(j.doorType=et.doorType),j.isPullOutDoor?et.isPullOutDoor=!0:et.isPullOutDoor&&(j.isPullOutDoor=!0);let At=It.some(Ut=>j.pcbDoorIndexs.includes(Ut)),Bt=!1,re=!1;if(et.type=="beam"&&j.type=="beam"){let Ut=o.readLineById(t[l[at].linesIndex].id);Ut.originalPoints=o.getOriginalPointsById(t[l[at].linesIndex].id),t[l[at].linesIndex].originalPoints=Ut.originalPoints,Ut=null;let se=On(t[l[at].linesIndex].originalPoints),te=On(p.originalPoints);t[l[at].linesIndex].originalPoints=null,se.minZ>t[l[at].linesIndex].start.z&&se.minZ-t[l[at].linesIndex].start.z>1&&te.minZ>p.start.z&&te.minZ-p.start.z>1&&(Bt=yt>ut,re=yt<ut,ut>yt&&(et.isExtend=!0),yt>ut&&(t[l[at].linesIndex].isExtend=!0))}yt<ut&&!re||Bt?(Bt&&(J=J.negate(),dt=dt.negate()),yt>_t&&!j.isPullOutDoor?(j.beamStart=ot.clone().addScaledVector(J,xt),j.beamEnd=ft.clone().addScaledVector(J,xt),j.doorStart=rt.clone().addScaledVector(J,xt),j.doorEnd=tt.clone().addScaledVector(J,xt),j.doorHeight=et.doorHeight,j.beamStart.z=j.beamEnd.z=j.doorStart.z+j.doorHeight,j.doorOpenEndPoint=et.doorOpenEndPoint.clone(),j.doorOpenVector=et.doorOpenVector.clone()):!Mt||Mt&&j.isPullOutDoor&&At?(et.beamStart=j.beamStart.clone().addScaledVector(dt,xt),et.beamEnd=j.beamEnd.clone().addScaledVector(dt,xt),et.doorStart=j.doorStart.clone().addScaledVector(dt,xt),et.doorEnd=j.doorEnd.clone().addScaledVector(dt,xt),et.doorHeight=j.doorHeight,et.beamStart.z=et.beamEnd.z=et.doorStart.z+et.doorHeight,et.doorOpenEndPoint=j.doorOpenEndPoint.clone(),et.doorOpenVector=j.doorOpenVector.clone()):(j.beamStart=ot.clone().addScaledVector(J,xt),j.beamEnd=ft.clone().addScaledVector(J,xt),j.doorStart=rt.clone().addScaledVector(J,xt),j.doorEnd=tt.clone().addScaledVector(J,xt),j.doorHeight=et.doorHeight,j.beamStart.z=j.beamEnd.z=j.doorStart.z+j.doorHeight,j.doorOpenEndPoint=et.doorOpenEndPoint.clone(),j.doorOpenVector=et.doorOpenVector.clone())):(yt>ut&&!Bt||re)&&(re&&(J=J.negate(),dt=dt.negate()),ut>_t&&!Mt?(et.beamStart=j.beamStart.clone().addScaledVector(J,xt),et.beamEnd=j.beamEnd.clone().addScaledVector(J,xt),et.doorStart=j.doorStart.clone().addScaledVector(J,xt),et.doorEnd=j.doorEnd.clone().addScaledVector(J,xt),et.doorHeight=j.doorHeight,et.beamStart.z=et.beamEnd.z=et.doorStart.z+et.doorHeight,et.doorOpenEndPoint=j.doorOpenEndPoint.clone(),et.doorOpenVector=j.doorOpenVector.clone()):!j.isPullOutDoor||Mt&&j.isPullOutDoor&&At?(j.beamStart=ot.clone().addScaledVector(dt,xt),j.beamEnd=ft.clone().addScaledVector(dt,xt),j.doorStart=rt.clone().addScaledVector(dt,xt),j.doorEnd=tt.clone().addScaledVector(dt,xt),j.doorHeight=et.doorHeight,j.beamStart.z=j.beamEnd.z=j.doorStart.z+j.doorHeight,j.doorOpenEndPoint=et.doorOpenEndPoint.clone(),j.doorOpenVector=et.doorOpenVector.clone()):(et.beamStart=j.beamStart.clone().addScaledVector(J,xt),et.beamEnd=j.beamEnd.clone().addScaledVector(J,xt),et.doorStart=j.doorStart.clone().addScaledVector(J,xt),et.doorEnd=j.doorEnd.clone().addScaledVector(J,xt),et.doorHeight=j.doorHeight,et.beamStart.z=et.beamEnd.z=et.doorStart.z+et.doorHeight,et.doorOpenEndPoint=j.doorOpenEndPoint.clone(),et.doorOpenVector=j.doorOpenVector.clone())),ke=et.nearId,Le=j.beamStart.clone(),gn=j.beamEnd.clone(),Ae=!0,ge=l[at].linesIndex,tn=l[at].doorIndex;break}}}if(et.nearId!=-1&&Tt=="hole"){let at=!1;for(let j=0;j<t.length;j++)if(t[j].doorAndBeamData){for(let Et=0;Et<t[j].doorAndBeamData.length;Et++)if(t[j].doorAndBeamData[Et].nearId==i&&t[j].doorAndBeamData[Et].type=="beam"){t[j].doorAndBeamData[Et].type=Tt,at=!0;break}if(at)break}}if(p.doorAndBeamIdToCheckResults.push([v.index,i]),p.doorAndBeamData.push(et),l.push({linesIndex:m,doorIndex:p.doorAndBeamData.length-1}),d.push({start:rt,end:tt}),i++,Mt&&Y<2)break}}}let _=p.length*(p.rooftopPz-p.start.z);p.completePointAreaPercentage=V/_*100,p.checkResults=null,p.originalPoints=null,p.mergeCheckRegion=null}if(f.length>1)for(let m=0;m<f.length;m++){let p=[];for(let y=0;y<t[f[m]].doorAndBeamData.length;y++){let w=!1;if(t[f[m]].doorAndBeamData[y].type==="beam"&&(t[f[m]].doorAndBeamData[y].beamNearWallVec.x==0&&t[f[m]].doorAndBeamData[y].beamNearWallVec.y==0&&t[f[m]].doorAndBeamData[y].beamNearWallVec.z==0&&t[f[m]].doorAndBeamData[y].nearId==-1||!t[f[m]].doorAndBeamData[y].wallBelowBeam&&t[f[m]].doorAndBeamData[y].nearId==-1)&&(t[f[m]].doorAndBeamData[y].lineIsOnlyBeam?w=!0:t[f[m]].doorAndBeamData[y].type="hole"),!w){let z=t[f[m]].doorAndBeamData[y].doorStart.clone(),M=t[f[m]].doorAndBeamData[y].doorEnd.clone();z.z=M.z=0;let P=z.distanceTo(M);for(let E=0;E<f.length;E++)if(m!=E)for(let T=0;T<t[f[E]].doorAndBeamData.length;T++){let V=t[f[E]].doorAndBeamData[T].doorStart.clone(),_=t[f[E]].doorAndBeamData[T].doorEnd.clone();V.z=_.z=0;let v=V.distanceTo(_),S=ye(z,M,V,_);if(S.type=="collinear_overlap"&&S.maxPerpendicularDistance<.2){let R=new F.Line3(V,_),D=qt(z,M),W=R.closestPointToPoint(D,!0,new F.Vector3),I=D.distanceTo(W);if(Math.abs(P-S.overlap)<.1&&I<.04){t[f[E]].doorAndBeamData[T].nearId==t[f[m]].doorAndBeamData[y].id&&(t[f[E]].doorAndBeamData[T].nearId=-1),w=!0;break}}}}if(w){for(let z=0;z<t[f[m]].doorAndBeamIdToCheckResults.length;z++)if(t[f[m]].doorAndBeamIdToCheckResults[1]==t[f[m]].doorAndBeamData[y].id){t[f[m]].doorAndBeamIdToCheckResults.splice(z,1);break}}w||p.push(t[f[m]].doorAndBeamData[y])}p.length!=t[f[m]].doorAndBeamData.length&&(t[f[m]].doorAndBeamData=p)}let a=.65,h=2,g=[],x=[];for(let m=0;m<r.length;m++){if(r[m].isFind||r[m].inWall)continue;let p=new F.Vector3(r[m].doorStartPt.x,r[m].doorStartPt.y,0),y=new F.Vector3(r[m].doorEndPt.x,r[m].doorEndPt.y,0),w=new F.Vector3().subVectors(p,y).normalize();for(let z=0;z<t.length;z++){if(t[z].length<.7||t[z].completePointAreaPercentage>60)continue;let M=new F.Vector3(t[z].start.x,t[z].start.y,0),P=new F.Vector3(t[z].end.x,t[z].end.y,0),E=new F.Vector3().subVectors(M,P).normalize(),T=.3,V=p.clone().addScaledVector(w,T),_=y.clone().addScaledVector(w.clone().negate(),T),v=M.clone().addScaledVector(E,T),S=P.clone().addScaledVector(E.clone().negate(),T),R=ze(V,_,v,S),D=Gt(V,_,v,S),W=p.distanceTo(M)>y.distanceTo(M)?y:p,I=W.distanceTo(M),C=W.distanceTo(P);if((I<c||C<c)&&D&&!D.isParallel){let A=p.distanceTo(M),k=p.distanceTo(P),O=A<k?M:P,N=!1;for(let L=0;L<t.length;L++){if(L==z||g.includes(L)||t[L].length<.7)continue;let B=new F.Vector3(t[L].start.x,t[L].start.y,0),$=new F.Vector3(t[L].end.x,t[L].end.y,0),G=new F.Vector3().subVectors(B,$).normalize(),Q=G.clone().negate(),q=B.clone().addScaledVector(G,5),X=$.clone().addScaledVector(Q,5),Y=ie(M,P,B,$),it=ye(M,P,B,$),ht=ze(M,P,q,X),St=!0;if(ht!=null&&(St=ht.point.distanceTo(M)<c||ht.point.distanceTo(P)<c),(Y&&Y.angle>85||it&&it.type=="collinear_gap")&&St){let nt=new F.Line3(M,P),wt=new F.Vector3,zt=nt.closestPointToPoint(B,!0,wt),Dt=nt.closestPointToPoint($,!0,wt),Pt=zt.distanceTo(B),Mt=Dt.distanceTo($),It,ot;if(Pt>Mt&&Mt>a)It=$,ot=Dt;else if(Pt<Mt&&Pt>a)It=B,ot=zt;else continue;if(Pt=O.distanceTo(B),Mt=O.distanceTo($),Pt>h&&Mt>h)continue;let ft=Gt(It,ot,B,$),rt=Gt(It,ot,V,_);if(rt&&rt.isParallel||!ft||!ft.isParallel)continue;let tt=ye(p,y,It,ot);if(tt&&tt.type=="collinear_overlap"&&tt.maxPerpendicularDistance<.2)continue;It.z=ot.z=t[L].start.z;let ae=!1;for(let Tt=0;Tt<x.length;Tt++){let ee=ye(x[Tt].start,x[Tt].end,It,ot);if(ee&&ee.type=="collinear_overlap"&&ee.maxPerpendicularDistance<.2){ae=!0;break}}if(ae)continue;for(let Tt=0;Tt<t.length;Tt++){if(t[Tt].length<.5)continue;let ee=new F.Vector3(t[Tt].start.x,t[Tt].start.y,t[Tt].start.z),et=new F.Vector3(t[Tt].end.x,t[Tt].end.y,t[Tt].end.z),me=ye(ee,et,It,ot);if(me&&me.type=="collinear_overlap"&&me.maxPerpendicularDistance<.1){ae=!0;break}}if(ae)continue;x.push({start:It,end:ot}),g.push(L);let bt=t[L].rooftopPz-t[L].start.z,Jt=t[z].rooftopPz-t[z].start.z,he=bt<Jt?bt:Jt;t[L].doorAndBeamData||(t[L].doorAndBeamData=[]),t[L].doorAndBeamData.push({id:i,beamStart:It,beamEnd:ot,beamHeight:he,doorStart:It,doorEnd:ot,doorHeight:he,nearId:-1,type:"onlyDoor",isDoor:!0,beamNearWallVec:new F.Vector3(0,0,0)}),n[r[m].index].isFindBeam=!0,n[r[m].index].isFindOnlyDoor=!0,u.push([{id:i,beamStart:It,beamEnd:ot}]),i++,N=!0;break}}if(N)break}}}let b=[];for(let m=0;m<t.length;m++)t[m].isLine2||b.push(t[m]),t[m].isLine2&&t[m].doorAndBeamData.length!=0&&b.push(t[m]);return t.length=0,t.push(...b),{lines:t,beamGroup:u}},qi=async(t,e)=>{for(let n=0;n<t.length;n++){let o=t[n],s=new F.Vector3(o.start.x,o.start.y,o.start.z),r=new F.Vector3(o.end.x,o.end.y,o.end.z),i=new F.Line3(s.clone(),r.clone()),l=-1;for(let f=0;f<o.doorAndBeamData.length;f++){let d=o.doorAndBeamData[f],u=d.doorHeight;d.isRebuild=!1;let c=!1,a=!1;if(!(d.nearId!=-1||d.type!="beam")){for(let h=0;h<t.length;h++){if(t[h].length<.5||h==n)continue;let g=new F.Vector3(t[h].start.x,t[h].start.y,t[h].start.z),x=new F.Vector3(t[h].end.x,t[h].end.y,t[h].end.z),b=ye(g,x,s,r),m=Gt(g,x,s,r);if(b&&b.maxPerpendicularDistance<.5){if(m&&m.isParallel){let E=new F.Line3(g,x),T=new F.Vector3(s.x,s.y,g.z),V=E.closestPointToPoint(T,!0,new F.Vector3),_=ie(V,T,s,r);_&&_.angle>85&&(d.beamNearWallVec=new F.Vector3().subVectors(V,T).normalize())}let p=[],y=e.readLineById(t[h].id);y.originalPoints=e.getOriginalPointsById(t[h].id),t[h].originalPoints=y.originalPoints,y=null,t[h].originalPoints.forEach(E=>{E.z>s.z+.2&&E.z<s.z+u/2&&p.push(new F.Vector3(E.x,E.y,s.z))}),t[h].originalPoints=null;let w=new F.Vector3,z=[],M=[];for(let E=0;E<p.length;E++){let T=i.closestPointToPoint(p[E],!0,w);T.distanceTo(p[E])<.15&&(z.push(p[E]),M.push(T.clone()))}for(let E=0;E<M.length;E++)zo(i,M[E])&&z.push(M[E]);if(z=M,z=Mo(z),z.length<150)continue;let P=nn(z);if(P.length==2){let E=P[0].distanceTo(P[1]);if(Math.abs(E-i.distance())<.3){l=b.maxPerpendicularDistance;let T=new F.Line3(g,x),V=new F.Vector3(s.x,s.y,g.z),_=T.closestPointToPoint(V,!0,new F.Vector3);d.beamNearWallVec=new F.Vector3().subVectors(_,V).normalize(),d.beamStart.z>t[h].rooftopPz-.03&&length>1?a=!0:c=!0;break}}if(c)break}else b&&b.type=="collinear_overlap"&&b.maxPerpendicularDistance>.3&&b.maxPerpendicularDistance<.7&&(a=!0)}if(c){if(length<1.8||l<.2)continue;a=!0}a||(d.isRebuild=!0)}}}};import*as Lt from"three";import"three/examples/jsm/utils/BufferGeometryUtils.js";var zr=(t,e={})=>{let n=e.eps??1e-6,o=e.project??(m=>({x:m.x,y:m.z})),s=e.skipSplit??!1,r=e.insideAreaSign??"positive",i=s?t.map((m,p)=>({start:Nn(m.start),end:Nn(m.end),uuid:m.uuid,sourceIndex:p,sourceSegment:m})):$i(t,o,n),l=[],f=new Map;function d(m){let p=Math.round(m.x/n),y=Math.round(m.y/n);return`${p},${y}`}function u(m){let p=d(m);if(f.has(p))return f.get(p);let y=l.length;return l.push({id:y,x:m.x,y:m.y}),f.set(p,y),y}let c=[],a=new Map;for(let m of i){let p=o(m.start),y=o(m.end);if(Mr(p,y)<n*n)continue;let w=u(p),z=u(y);if(w===z)continue;let M=w<z?`${w}_${z}`:`${z}_${w}`;if(a.has(M))continue;let P=c.length;c.push({id:P,a:w,b:z,uuid:m.uuid,sourceIndex:m.sourceIndex,sourceSegment:m.sourceSegment||m}),a.set(M,P)}let h=[],g=Array.from({length:l.length},()=>[]);function x(m,p,y,w,z){let M=l[m],P=l[p],E=h.length,T=Math.atan2(P.y-M.y,P.x-M.x),V={id:E,from:m,to:p,twin:null,next:null,angle:T,edgeId:y,uuid:w,sourceIndex:z,visited:!1};return h.push(V),g[m].push(E),E}for(let m of c){let p=x(m.a,m.b,m.id,m.uuid,m.sourceIndex),y=x(m.b,m.a,m.id,m.uuid,m.sourceIndex);h[p].twin=y,h[y].twin=p}for(let m of g)m.sort((p,y)=>h[p].angle-h[y].angle);for(let m of h){let p=g[m.to],y=m.twin,w=p.indexOf(y);if(w===-1)continue;let z=(w-1+p.length)%p.length;m.next=p[z]}let b=[];for(let m of h){if(m.visited)continue;let p=[],y=[],w=m.id,z=0,M=h.length+10;for(;;){let v=h[w];if(!v||v.visited)break;if(v.visited=!0,p.push(w),y.push(v.from),w=v.next,z++,z>M){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(p.length<3)continue;let P=y.map(v=>l[v]),E=Xi(P),T=!1;if(r==="positive"?T=E>n:T=E<-n,!T)continue;let V=p.map(v=>h[v].uuid),_=p.map(v=>h[v].sourceIndex);b.push({uuids:V,area:Math.abs(E),lineIndexes:_})}return b};function $i(t,e,n=1e-6){let o=[];for(let s=0;s<t.length;s++){let r=t[s],i=e(r.start),l=e(r.end),f=[{t:0,point:Nn(r.start)},{t:1,point:Nn(r.end)}];for(let u=0;u<t.length;u++){if(s===u)continue;let c=t[u],a=e(c.start),h=e(c.end),g=ji(i,l,a,h,n);g&&g.t>n&&g.t<1-n&&f.push({t:g.t,point:Gi(r.start,r.end,g.t)})}f.sort((u,c)=>u.t-c.t);let d=[];for(let u of f)(d.length===0||Math.abs(u.t-d[d.length-1].t)>n)&&d.push(u);for(let u=0;u<d.length-1;u++){let c=d[u].point,a=d[u+1].point,h=e(c),g=e(a);Mr(h,g)<n*n||o.push({start:c,end:a,uuid:r.uuid,sourceIndex:s,sourceSegment:r})}}return o}function ji(t,e,n,o,s=1e-6){let r={x:e.x-t.x,y:e.y-t.y},i={x:o.x-n.x,y:o.y-n.y},l={x:n.x-t.x,y:n.y-t.y},f=Po(r,i);if(Math.abs(f)<s)return null;let d=Po(l,i)/f,u=Po(l,r)/f;return d>=-s&&d<=1+s&&u>=-s&&u<=1+s?{t:d,u,point:{x:t.x+d*r.x,y:t.y+d*r.y}}:null}function Po(t,e){return t.x*e.y-t.y*e.x}function Mr(t,e){let n=t.x-e.x,o=t.y-e.y;return n*n+o*o}function Xi(t){let e=0;for(let n=0;n<t.length;n++){let o=t[n],s=t[(n+1)%t.length];e+=o.x*s.y-s.x*o.y}return e/2}function Gi(t,e,n){return t&&typeof t.clone=="function"&&typeof t.lerp=="function"?t.clone().lerp(e,n):{x:t.x+(e.x-t.x)*n,y:t.y+(e.y-t.y)*n,z:t.z!==void 0&&e.z!==void 0?t.z+(e.z-t.z)*n:void 0}}function Nn(t){return t&&typeof t.clone=="function"?t.clone():{x:t.x,y:t.y,z:t.z}}var Zi=(t,e)=>{if(!t||t.length<=0)return;let n={rectangles:[],threeEdgeRect:[]},o=new Set,s=.1,r=1.2,i=.15,l=2,f=80,d=95;if(!t[0].uuid){let a=1e4;for(let h=0;h<t.length;h++)t[h].uuid=a++}let u=[];for(let a=0;a<t.length;a++)u.push({start:t[a].start,end:t[a].end,uuid:t[a].uuid});let c=zr(u,{eps:1e-5,returnDetail:!0,project:a=>({x:a.x,y:a.y})});for(let a=0;a<c.length;a++){if(c[a].uuids.length<4||c[a].area<i||c[a].area>l)continue;let h=!1;for(let g=0;g<c[a].lineIndexes.length;g++){let x=t[c[a].lineIndexes[g]].length;if(x<s||x>r)break;let b=new Lt.Vector3(t[c[a].lineIndexes[g]].start.x,t[c[a].lineIndexes[g]].start.y,t[c[a].lineIndexes[g]].start.z),m=new Lt.Vector3(t[c[a].lineIndexes[g]].end.x,t[c[a].lineIndexes[g]].end.y,t[c[a].lineIndexes[g]].end.z),p=!1,y=new Lt.Vector3(0,0,0);for(let w=g+1;w<c[a].lineIndexes.length;w++){let z=t[c[a].lineIndexes[w]].length;if(z<s||z>r)break;let M=new Lt.Vector3(t[c[a].lineIndexes[w]].start.x,t[c[a].lineIndexes[w]].start.y,t[c[a].lineIndexes[w]].start.z),P=new Lt.Vector3(t[c[a].lineIndexes[w]].end.x,t[c[a].lineIndexes[w]].end.y,t[c[a].lineIndexes[w]].end.z),E=Gt(b,m,M,P);if(E&&E.isParallel){if(x+z>r){p=!0;break}x+=z;let V=ct(b,M),_=ct(b,P),v=ct(m,M),S=ct(m,P);V?(b=m.clone(),m=P.clone()):_?(b=m.clone(),m=M.clone()):v?m=P.clone():S&&(m=M.clone());continue}let T=ie(b,m,M,P);if(!T||T.angle<f||T.angle>d){p=!0;break}for(let V=w+1;V<c[a].lineIndexes.length;V++){let _=t[c[a].lineIndexes[V]].length;if(_<s||_>r)break;let v=new Lt.Vector3(t[c[a].lineIndexes[V]].start.x,t[c[a].lineIndexes[V]].start.y,t[c[a].lineIndexes[V]].start.z),S=new Lt.Vector3(t[c[a].lineIndexes[V]].end.x,t[c[a].lineIndexes[V]].end.y,t[c[a].lineIndexes[V]].end.z),R=Gt(M,P,v,S);if(R&&R.isParallel){if(z+_>r){p=!0;break}z+=_;let W=ct(M,v),I=ct(M,S),C=ct(P,v),H=ct(P,S);W?(M=P.clone(),P=S.clone()):I?(M=P.clone(),P=v.clone()):C?P=S.clone():H&&(P=v.clone());continue}let D=ie(M,P,v,S);if(!D||D.angle<f||D.angle>d){p=!0;break}for(let W=V+1;W<c[a].lineIndexes.length;W++){let I=t[c[a].lineIndexes[W]].length;if(I<s||I>r)break;let C=new Lt.Vector3(t[c[a].lineIndexes[W]].start.x,t[c[a].lineIndexes[W]].start.y,t[c[a].lineIndexes[W]].start.z),H=new Lt.Vector3(t[c[a].lineIndexes[W]].end.x,t[c[a].lineIndexes[W]].end.y,t[c[a].lineIndexes[W]].end.z),A=Gt(v,S,C,H);if(A&&A.isParallel){if(_+I>r){p=!0;break}_+=I;let $=ct(v,C),G=ct(v,H),Q=ct(S,C),q=ct(S,H);$?(v=S.clone(),S=H.clone()):G?(v=S.clone(),S=C.clone()):Q?S=H.clone():q&&(S=C.clone());continue}let k=ie(v,S,C,H);if(!k||k.angle<f||k.angle>d){p=!0;break}let O=ct(C,b),N=ct(C,m),L=ct(H,b),B=ct(H,m);if(O||N||L||B)h=!0;else for(let $=W+1;$<c[a].lineIndexes.length;$++){let G=t[c[a].lineIndexes[$]].length;if(G<s||G>r)break;let Q=new Lt.Vector3(t[c[a].lineIndexes[$]].start.x,t[c[a].lineIndexes[$]].start.y,t[c[a].lineIndexes[$]].start.z),q=new Lt.Vector3(t[c[a].lineIndexes[$]].end.x,t[c[a].lineIndexes[$]].end.y,t[c[a].lineIndexes[$]].end.z),X=Gt(C,H,Q,q);if(X&&X.isParallel){if(I+G>r){p=!0;break}I+=G;let Y=ct(C,Q),it=ct(C,q),ht=ct(H,Q),St=ct(H,q);if(Y)C=H.clone(),H=q.clone();else if(it)C=H.clone(),H=Q.clone();else if(ht)H=q.clone();else if(St)H=Q.clone();else continue;if(O=ct(C,b),N=ct(C,m),L=ct(H,b),B=ct(H,m),O||N||L||B){h=!0;break}}}break}if(p)break}if(p)break}if(p)break}h&&n.rectangles.push(c[a].uuids)}for(let a=0;a<t.length;a++){let h=t[a].length;if(o.has(t[a].uuid)||h<s||h>r)continue;let g={uuids:[],missingEdge:{start:new Lt.Vector3,end:new Lt.Vector3}},x=new Lt.Vector3(t[a].start.x,t[a].start.y,t[a].start.z),b=new Lt.Vector3(t[a].end.x,t[a].end.y,t[a].end.z),m=!0,p=!0;for(let z=0;z<t.length;z++){if(z==a)continue;let M=new Lt.Vector3(t[z].start.x,t[z].start.y,t[z].start.z),P=new Lt.Vector3(t[z].end.x,t[z].end.y,t[z].end.z),E=ct(M,x),T=ct(P,x),V=ct(M,b),_=ct(P,b);if(E||T?m=!1:(V||_)&&(p=!1),!m&&!p)break}if(!m&&!p)continue;let y=new Lt.Vector3;m||([x,b]=[b,x]),y=new Lt.Vector3().subVectors(b,x).normalize();let w=y.clone().negate();for(let z=0;z<t.length;z++){let M=t[z].length;if(z==a||o.has(z)||M<s||M>r)continue;let P=new Lt.Vector3(t[z].start.x,t[z].start.y,t[z].start.z),E=new Lt.Vector3(t[z].end.x,t[z].end.y,t[z].end.z),T=ie(x,b,P,E);if(!T||T.angle<85)continue;let V=ct(P,b),_=ct(E,b);if(!V&&!_)continue;let v=new Lt.Vector3,S=new Lt.Vector3;V?(v=P.clone(),S=E.clone()):(v=E.clone(),S=P.clone());for(let R=0;R<t.length;R++){let D=t[R].length;if(R==a||R==z||o.has(R)||D<s||D>r)continue;let W=new Lt.Vector3(t[R].start.x,t[R].start.y,t[R].start.z),I=new Lt.Vector3(t[R].end.x,t[R].end.y,t[R].end.z),C=ie(P,E,W,I);if(!C||C.angle<85)continue;let H=ct(W,S),A=ct(I,S);if(!H&&!A)continue;let k=new Lt.Vector3,O=new Lt.Vector3;H?(k=W.clone(),O=I.clone()):(k=I.clone(),O=W.clone());let N=new Lt.Vector3().subVectors(O,k).normalize(),L=Kt(w,N,.1);if(!L||!L.parallel||!L.sameDirection)continue;let B=!0,$=!0;for(let Q=0;Q<t.length;Q++){if(Q==R)continue;let q=new Lt.Vector3(t[Q].start.x,t[Q].start.y,t[Q].start.z),X=new Lt.Vector3(t[Q].end.x,t[Q].end.y,t[Q].end.z),Y=ct(q,W),it=ct(X,W),ht=ct(q,I),St=ct(X,I);if(Y||it?B=!1:(ht||St)&&($=!1),!B&&!$)break}if(!B&&!$)continue;let G=h*M;if(!(G<i||G>l)){g.uuids=[t[a].uuid,t[z].uuid,t[R].uuid],g.missingEdge.start=O,g.missingEdge.end=x;break}}if(g.uuids.length==3)break}g.uuids.length==3&&(g.uuids.forEach(z=>o.add(z)),n.threeEdgeRect.push(g))}return n};import*as Z from"three";import"three/examples/jsm/utils/BufferGeometryUtils.js";var Vt=11102230246251565e-32,Zt=134217729,wn=(3+8*Vt)*Vt;function Ne(t,e,n,o,s){let r,i,l,f,d=e[0],u=o[0],c=0,a=0;u>d==u>-d?(r=d,d=e[++c]):(r=u,u=o[++a]);let h=0;if(c<t&&a<n)for(u>d==u>-d?(i=d+r,l=r-(i-d),d=e[++c]):(i=u+r,l=r-(i-u),u=o[++a]),r=i,l!==0&&(s[h++]=l);c<t&&a<n;)u>d==u>-d?(i=r+d,f=i-r,l=r-(i-f)+(d-f),d=e[++c]):(i=r+u,f=i-r,l=r-(i-f)+(u-f),u=o[++a]),r=i,l!==0&&(s[h++]=l);for(;c<t;)i=r+d,f=i-r,l=r-(i-f)+(d-f),d=e[++c],r=i,l!==0&&(s[h++]=l);for(;a<n;)i=r+u,f=i-r,l=r-(i-f)+(u-f),u=o[++a],r=i,l!==0&&(s[h++]=l);return(r!==0||h===0)&&(s[h++]=r),h}function zn(t,e){let n=e[0];for(let o=1;o<t;o++)n+=e[o];return n}function K(t){return new Float64Array(t)}var Yi=(3+16*Vt)*Vt,Ui=(2+12*Vt)*Vt,Ki=(9+64*Vt)*Vt*Vt,on=K(4),Er=K(8),Pr=K(12),Sr=K(16),oe=K(4);function Qi(t,e,n,o,s,r,i){let l,f,d,u,c,a,h,g,x,b,m,p,y,w,z,M,P,E,T=t-s,V=n-s,_=e-r,v=o-r;w=T*v,a=Zt*T,h=a-(a-T),g=T-h,a=Zt*v,x=a-(a-v),b=v-x,z=g*b-(w-h*x-g*x-h*b),M=_*V,a=Zt*_,h=a-(a-_),g=_-h,a=Zt*V,x=a-(a-V),b=V-x,P=g*b-(M-h*x-g*x-h*b),m=z-P,c=z-m,on[0]=z-(m+c)+(c-P),p=w+m,c=p-w,y=w-(p-c)+(m-c),m=y-M,c=y-m,on[1]=y-(m+c)+(c-M),E=p+m,c=E-p,on[2]=p-(E-c)+(m-c),on[3]=E;let S=zn(4,on),R=Ui*i;if(S>=R||-S>=R||(c=t-T,l=t-(T+c)+(c-s),c=n-V,d=n-(V+c)+(c-s),c=e-_,f=e-(_+c)+(c-r),c=o-v,u=o-(v+c)+(c-r),l===0&&f===0&&d===0&&u===0)||(R=Ki*i+wn*Math.abs(S),S+=T*u+v*l-(_*d+V*f),S>=R||-S>=R))return S;w=l*v,a=Zt*l,h=a-(a-l),g=l-h,a=Zt*v,x=a-(a-v),b=v-x,z=g*b-(w-h*x-g*x-h*b),M=f*V,a=Zt*f,h=a-(a-f),g=f-h,a=Zt*V,x=a-(a-V),b=V-x,P=g*b-(M-h*x-g*x-h*b),m=z-P,c=z-m,oe[0]=z-(m+c)+(c-P),p=w+m,c=p-w,y=w-(p-c)+(m-c),m=y-M,c=y-m,oe[1]=y-(m+c)+(c-M),E=p+m,c=E-p,oe[2]=p-(E-c)+(m-c),oe[3]=E;let D=Ne(4,on,4,oe,Er);w=T*u,a=Zt*T,h=a-(a-T),g=T-h,a=Zt*u,x=a-(a-u),b=u-x,z=g*b-(w-h*x-g*x-h*b),M=_*d,a=Zt*_,h=a-(a-_),g=_-h,a=Zt*d,x=a-(a-d),b=d-x,P=g*b-(M-h*x-g*x-h*b),m=z-P,c=z-m,oe[0]=z-(m+c)+(c-P),p=w+m,c=p-w,y=w-(p-c)+(m-c),m=y-M,c=y-m,oe[1]=y-(m+c)+(c-M),E=p+m,c=E-p,oe[2]=p-(E-c)+(m-c),oe[3]=E;let W=Ne(D,Er,4,oe,Pr);w=l*u,a=Zt*l,h=a-(a-l),g=l-h,a=Zt*u,x=a-(a-u),b=u-x,z=g*b-(w-h*x-g*x-h*b),M=f*d,a=Zt*f,h=a-(a-f),g=f-h,a=Zt*d,x=a-(a-d),b=d-x,P=g*b-(M-h*x-g*x-h*b),m=z-P,c=z-m,oe[0]=z-(m+c)+(c-P),p=w+m,c=p-w,y=w-(p-c)+(m-c),m=y-M,c=y-m,oe[1]=y-(m+c)+(c-M),E=p+m,c=E-p,oe[2]=p-(E-c)+(m-c),oe[3]=E;let I=Ne(W,Pr,4,oe,Sr);return Sr[I-1]}function rn(t,e,n,o,s,r){let i=(e-r)*(n-s),l=(t-s)*(o-r),f=i-l,d=Math.abs(i+l);return Math.abs(f)>=Yi*d?f:-Qi(t,e,n,o,s,r,d)}var bu=(7+56*Vt)*Vt,wu=(3+28*Vt)*Vt,zu=(26+288*Vt)*Vt*Vt,Mu=K(4),Eu=K(4),Pu=K(4),Su=K(4),Tu=K(4),Ru=K(4),Du=K(4),vu=K(4),Vu=K(4),Iu=K(8),Cu=K(8),Wu=K(8),_u=K(4),Hu=K(8),Au=K(8),Lu=K(16),ku=K(12),Bu=K(192),Ou=K(192);var qu=(10+96*Vt)*Vt,$u=(4+48*Vt)*Vt,ju=(44+576*Vt)*Vt*Vt,Xu=K(4),Gu=K(4),Zu=K(4),Yu=K(4),Uu=K(4),Ku=K(4),Qu=K(4),Ju=K(4),tf=K(8),ef=K(8),nf=K(8),of=K(8),rf=K(8),sf=K(8),af=K(8),lf=K(8),cf=K(8),uf=K(4),ff=K(4),df=K(4),hf=K(8),mf=K(16),gf=K(16),pf=K(16),xf=K(32),yf=K(32),bf=K(48),wf=K(64),zf=K(1152),Mf=K(1152);var Tf=(16+224*Vt)*Vt,Rf=(5+72*Vt)*Vt,Df=(71+1408*Vt)*Vt*Vt,vf=K(4),Vf=K(4),If=K(4),Cf=K(4),Wf=K(4),_f=K(4),Hf=K(4),Af=K(4),Lf=K(4),kf=K(4),Bf=K(24),Of=K(24),Ff=K(24),Nf=K(24),qf=K(24),$f=K(24),jf=K(24),Xf=K(24),Gf=K(24),Zf=K(24),Yf=K(1152),Uf=K(1152),Kf=K(1152),Qf=K(1152),Jf=K(1152),td=K(2304),ed=K(2304),nd=K(3456),od=K(5760),rd=K(8),sd=K(8),id=K(8),ad=K(16),ld=K(24),cd=K(48),ud=K(48),fd=K(96),dd=K(192),hd=K(384),md=K(384),gd=K(384),pd=K(768);var xd=K(96),yd=K(96),bd=K(96),wd=K(1152);var Rr=Math.pow(2,-52),qn=new Uint32Array(512),an=class t{static from(e,n=ra,o=sa){let s=e.length,r=new Float64Array(s*2);for(let i=0;i<s;i++){let l=e[i];r[2*i]=n(l),r[2*i+1]=o(l)}return new t(r)}constructor(e){let n=e.length>>1;if(n>0&&typeof e[0]!="number")throw new Error("Expected coords to contain numbers.");this.coords=e;let o=Math.max(2*n-5,0);this._triangles=new Uint32Array(o*3),this._halfedges=new Int32Array(o*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:e,_hullPrev:n,_hullNext:o,_hullTri:s,_hullHash:r}=this,i=e.length>>1,l=1/0,f=1/0,d=-1/0,u=-1/0;for(let T=0;T<i;T++){let V=e[2*T],_=e[2*T+1];V<l&&(l=V),_<f&&(f=_),V>d&&(d=V),_>u&&(u=_),this._ids[T]=T}let c=(l+d)/2,a=(f+u)/2,h=0,g=0,x=0;for(let T=0,V=1/0;T<i;T++){let _=So(c,a,e[2*T],e[2*T+1]);_<V&&(h=T,V=_)}let b=e[2*h],m=e[2*h+1];for(let T=0,V=1/0;T<i;T++){if(T===h)continue;let _=So(b,m,e[2*T],e[2*T+1]);_<V&&_>0&&(g=T,V=_)}let p=e[2*g],y=e[2*g+1],w=1/0;for(let T=0;T<i;T++){if(T===h||T===g)continue;let V=na(b,m,p,y,e[2*T],e[2*T+1]);V<w&&(x=T,w=V)}let z=e[2*x],M=e[2*x+1];if(w===1/0){for(let _=0;_<i;_++)this._dists[_]=e[2*_]-e[0]||e[2*_+1]-e[1];sn(this._ids,this._dists,0,i-1);let T=new Uint32Array(i),V=0;for(let _=0,v=-1/0;_<i;_++){let S=this._ids[_],R=this._dists[S];R>v&&(T[V++]=S,v=R)}this.hull=T.subarray(0,V),this.triangles=new Uint32Array(0),this.halfedges=new Int32Array(0);return}if(rn(b,m,p,y,z,M)<0){let T=g,V=p,_=y;g=x,p=z,y=M,x=T,z=V,M=_}let P=oa(b,m,p,y,z,M);this._cx=P.x,this._cy=P.y;for(let T=0;T<i;T++)this._dists[T]=So(e[2*T],e[2*T+1],P.x,P.y);sn(this._ids,this._dists,0,i-1),this._hullStart=h;let E=3;o[h]=n[x]=g,o[g]=n[h]=x,o[x]=n[g]=h,s[h]=0,s[g]=1,s[x]=2,r.fill(-1),r[this._hashKey(b,m)]=h,r[this._hashKey(p,y)]=g,r[this._hashKey(z,M)]=x,this.trianglesLen=0,this._addTriangle(h,g,x,-1,-1,-1);for(let T=0,V=0,_=0;T<this._ids.length;T++){let v=this._ids[T],S=e[2*v],R=e[2*v+1];if(T>0&&Math.abs(S-V)<=Rr&&Math.abs(R-_)<=Rr||(V=S,_=R,v===h||v===g||v===x))continue;let D=0;for(let A=0,k=this._hashKey(S,R);A<this._hashSize&&(D=r[(k+A)%this._hashSize],!(D!==-1&&D!==o[D]));A++);D=n[D];let W=D,I;for(;I=o[W],rn(S,R,e[2*W],e[2*W+1],e[2*I],e[2*I+1])>=0;)if(W=I,W===D){W=-1;break}if(W===-1)continue;let C=this._addTriangle(W,v,o[W],-1,-1,s[W]);s[v]=this._legalize(C+2),s[W]=C,E++;let H=o[W];for(;I=o[H],rn(S,R,e[2*H],e[2*H+1],e[2*I],e[2*I+1])<0;)C=this._addTriangle(H,v,I,s[v],-1,s[H]),s[v]=this._legalize(C+2),o[H]=H,E--,H=I;if(W===D)for(;I=n[W],rn(S,R,e[2*I],e[2*I+1],e[2*W],e[2*W+1])<0;)C=this._addTriangle(I,v,W,-1,s[W],s[I]),this._legalize(C+2),s[I]=C,o[W]=W,E--,W=I;this._hullStart=n[v]=W,o[W]=n[H]=v,o[v]=H,r[this._hashKey(S,R)]=v,r[this._hashKey(e[2*W],e[2*W+1])]=W}this.hull=new Uint32Array(E);for(let T=0,V=this._hullStart;T<E;T++)this.hull[T]=V,V=o[V];this.triangles=this._triangles.subarray(0,this.trianglesLen),this.halfedges=this._halfedges.subarray(0,this.trianglesLen)}_hashKey(e,n){return Math.floor(ta(e-this._cx,n-this._cy)*this._hashSize)%this._hashSize}_legalize(e){let{_triangles:n,_halfedges:o,coords:s}=this,r=0,i=0;for(;;){let l=o[e],f=e-e%3;if(i=f+(e+2)%3,l===-1){if(r===0)break;e=qn[--r];continue}let d=l-l%3,u=f+(e+1)%3,c=d+(l+2)%3,a=n[i],h=n[e],g=n[u],x=n[c];if(ea(s[2*a],s[2*a+1],s[2*h],s[2*h+1],s[2*g],s[2*g+1],s[2*x],s[2*x+1])){n[e]=x,n[l]=a;let m=o[c];if(m===-1){let y=this._hullStart;do{if(this._hullTri[y]===c){this._hullTri[y]=e;break}y=this._hullPrev[y]}while(y!==this._hullStart)}this._link(e,m),this._link(l,o[i]),this._link(i,c);let p=d+(l+1)%3;r<qn.length&&(qn[r++]=p)}else{if(r===0)break;e=qn[--r]}}return i}_link(e,n){this._halfedges[e]=n,n!==-1&&(this._halfedges[n]=e)}_addTriangle(e,n,o,s,r,i){let l=this.trianglesLen;return this._triangles[l]=e,this._triangles[l+1]=n,this._triangles[l+2]=o,this._link(l,s),this._link(l+1,r),this._link(l+2,i),this.trianglesLen+=3,l}};function ta(t,e){let n=t/(Math.abs(t)+Math.abs(e));return(e>0?3-n:1+n)/4}function So(t,e,n,o){let s=t-n,r=e-o;return s*s+r*r}function ea(t,e,n,o,s,r,i,l){let f=t-i,d=e-l,u=n-i,c=o-l,a=s-i,h=r-l,g=f*f+d*d,x=u*u+c*c,b=a*a+h*h;return f*(c*b-x*h)-d*(u*b-x*a)+g*(u*h-c*a)<0}function na(t,e,n,o,s,r){let i=n-t,l=o-e,f=s-t,d=r-e,u=i*i+l*l,c=f*f+d*d,a=.5/(i*d-l*f),h=(d*u-l*c)*a,g=(i*c-f*u)*a;return h*h+g*g}function oa(t,e,n,o,s,r){let i=n-t,l=o-e,f=s-t,d=r-e,u=i*i+l*l,c=f*f+d*d,a=.5/(i*d-l*f),h=t+(d*u-l*c)*a,g=e+(i*c-f*u)*a;return{x:h,y:g}}function sn(t,e,n,o){if(o-n<=20)for(let s=n+1;s<=o;s++){let r=t[s],i=e[r],l=s-1;for(;l>=n&&e[t[l]]>i;)t[l+1]=t[l--];t[l+1]=r}else{let s=n+o>>1,r=n+1,i=o;Mn(t,s,r),e[t[n]]>e[t[o]]&&Mn(t,n,o),e[t[r]]>e[t[o]]&&Mn(t,r,o),e[t[n]]>e[t[r]]&&Mn(t,n,r);let l=t[r],f=e[l];for(;;){do r++;while(e[t[r]]<f);do i--;while(e[t[i]]>f);if(i<r)break;Mn(t,r,i)}t[n+1]=t[i],t[i]=l,o-r+1>=i-n?(sn(t,e,r,o),sn(t,e,n,i-1)):(sn(t,e,n,i-1),sn(t,e,r,o))}}function Mn(t,e,n){let o=t[e];t[e]=t[n],t[n]=o}function ra(t){return t[0]}function sa(t){return t[1]}var ue=class{constructor(){this._x0=this._y0=this._x1=this._y1=null,this._=""}moveTo(e,n){this._+=`M${this._x0=this._x1=+e},${this._y0=this._y1=+n}`}closePath(){this._x1!==null&&(this._x1=this._x0,this._y1=this._y0,this._+="Z")}lineTo(e,n){this._+=`L${this._x1=+e},${this._y1=+n}`}arc(e,n,o){e=+e,n=+n,o=+o;let s=e+o,r=n;if(o<0)throw new Error("negative radius");this._x1===null?this._+=`M${s},${r}`:(Math.abs(this._x1-s)>1e-6||Math.abs(this._y1-r)>1e-6)&&(this._+="L"+s+","+r),o&&(this._+=`A${o},${o},0,1,1,${e-o},${n}A${o},${o},0,1,1,${this._x1=s},${this._y1=r}`)}rect(e,n,o,s){this._+=`M${this._x0=this._x1=+e},${this._y0=this._y1=+n}h${+o}v${+s}h${-o}Z`}value(){return this._||null}};var Ce=class{constructor(){this._=[]}moveTo(e,n){this._.push([e,n])}closePath(){this._.push(this._[0].slice())}lineTo(e,n){this._.push([e,n])}value(){return this._.length?this._:null}};var En=class{constructor(e,[n,o,s,r]=[0,0,960,500]){if(!((s=+s)>=(n=+n))||!((r=+r)>=(o=+o)))throw new Error("invalid bounds");this.delaunay=e,this._circumcenters=new Float64Array(e.points.length*2),this.vectors=new Float64Array(e.points.length*2),this.xmax=s,this.xmin=n,this.ymax=r,this.ymin=o,this._init()}update(){return this.delaunay.update(),this._init(),this}_init(){let{delaunay:{points:e,hull:n,triangles:o},vectors:s}=this,r,i,l=this.circumcenters=this._circumcenters.subarray(0,o.length/3*2);for(let x=0,b=0,m=o.length,p,y;x<m;x+=3,b+=2){let w=o[x]*2,z=o[x+1]*2,M=o[x+2]*2,P=e[w],E=e[w+1],T=e[z],V=e[z+1],_=e[M],v=e[M+1],S=T-P,R=V-E,D=_-P,W=v-E,I=(S*W-R*D)*2;if(Math.abs(I)<1e-9){if(r===void 0){r=i=0;for(let H of n)r+=e[H*2],i+=e[H*2+1];r/=n.length,i/=n.length}let C=1e9*Math.sign((r-P)*W-(i-E)*D);p=(P+_)/2-C*W,y=(E+v)/2+C*D}else{let C=1/I,H=S*S+R*R,A=D*D+W*W;p=P+(W*H-R*A)*C,y=E+(S*A-D*H)*C}l[b]=p,l[b+1]=y}let f=n[n.length-1],d,u=f*4,c,a=e[2*f],h,g=e[2*f+1];s.fill(0);for(let x=0;x<n.length;++x)f=n[x],d=u,c=a,h=g,u=f*4,a=e[2*f],g=e[2*f+1],s[d+2]=s[u]=h-g,s[d+3]=s[u+1]=a-c}render(e){let n=e==null?e=new ue:void 0,{delaunay:{halfedges:o,inedges:s,hull:r},circumcenters:i,vectors:l}=this;if(r.length<=1)return null;for(let u=0,c=o.length;u<c;++u){let a=o[u];if(a<u)continue;let h=Math.floor(u/3)*2,g=Math.floor(a/3)*2,x=i[h],b=i[h+1],m=i[g],p=i[g+1];this._renderSegment(x,b,m,p,e)}let f,d=r[r.length-1];for(let u=0;u<r.length;++u){f=d,d=r[u];let c=Math.floor(s[d]/3)*2,a=i[c],h=i[c+1],g=f*4,x=this._project(a,h,l[g+2],l[g+3]);x&&this._renderSegment(a,h,x[0],x[1],e)}return n&&n.value()}renderBounds(e){let n=e==null?e=new ue:void 0;return e.rect(this.xmin,this.ymin,this.xmax-this.xmin,this.ymax-this.ymin),n&&n.value()}renderCell(e,n){let o=n==null?n=new ue:void 0,s=this._clip(e);if(s===null||!s.length)return;n.moveTo(s[0],s[1]);let r=s.length;for(;s[0]===s[r-2]&&s[1]===s[r-1]&&r>1;)r-=2;for(let i=2;i<r;i+=2)(s[i]!==s[i-2]||s[i+1]!==s[i-1])&&n.lineTo(s[i],s[i+1]);return n.closePath(),o&&o.value()}*cellPolygons(){let{delaunay:{points:e}}=this;for(let n=0,o=e.length/2;n<o;++n){let s=this.cellPolygon(n);s&&(s.index=n,yield s)}}cellPolygon(e){let n=new Ce;return this.renderCell(e,n),n.value()}_renderSegment(e,n,o,s,r){let i,l=this._regioncode(e,n),f=this._regioncode(o,s);l===0&&f===0?(r.moveTo(e,n),r.lineTo(o,s)):(i=this._clipSegment(e,n,o,s,l,f))&&(r.moveTo(i[0],i[1]),r.lineTo(i[2],i[3]))}contains(e,n,o){return n=+n,n!==n||(o=+o,o!==o)?!1:this.delaunay._step(e,n,o)===e}*neighbors(e){let n=this._clip(e);if(n)for(let o of this.delaunay.neighbors(e)){let s=this._clip(o);if(s){t:for(let r=0,i=n.length;r<i;r+=2)for(let l=0,f=s.length;l<f;l+=2)if(n[r]===s[l]&&n[r+1]===s[l+1]&&n[(r+2)%i]===s[(l+f-2)%f]&&n[(r+3)%i]===s[(l+f-1)%f]){yield o;break t}}}}_cell(e){let{circumcenters:n,delaunay:{inedges:o,halfedges:s,triangles:r}}=this,i=o[e];if(i===-1)return null;let l=[],f=i;do{let d=Math.floor(f/3);if(l.push(n[d*2],n[d*2+1]),f=f%3===2?f-2:f+1,r[f]!==e)break;f=s[f]}while(f!==i&&f!==-1);return l}_clip(e){if(e===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(e);if(n===null)return null;let{vectors:o}=this,s=e*4;return this._simplify(o[s]||o[s+1]?this._clipInfinite(e,n,o[s],o[s+1],o[s+2],o[s+3]):this._clipFinite(e,n))}_clipFinite(e,n){let o=n.length,s=null,r,i,l=n[o-2],f=n[o-1],d,u=this._regioncode(l,f),c,a=0;for(let h=0;h<o;h+=2)if(r=l,i=f,l=n[h],f=n[h+1],d=u,u=this._regioncode(l,f),d===0&&u===0)c=a,a=0,s?s.push(l,f):s=[l,f];else{let g,x,b,m,p;if(d===0){if((g=this._clipSegment(r,i,l,f,d,u))===null)continue;[x,b,m,p]=g}else{if((g=this._clipSegment(l,f,r,i,u,d))===null)continue;[m,p,x,b]=g,c=a,a=this._edgecode(x,b),c&&a&&this._edge(e,c,a,s,s.length),s?s.push(x,b):s=[x,b]}c=a,a=this._edgecode(m,p),c&&a&&this._edge(e,c,a,s,s.length),s?s.push(m,p):s=[m,p]}if(s)c=a,a=this._edgecode(s[0],s[1]),c&&a&&this._edge(e,c,a,s,s.length);else if(this.contains(e,(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 s}_clipSegment(e,n,o,s,r,i){let l=r<i;for(l&&([e,n,o,s,r,i]=[o,s,e,n,i,r]);;){if(r===0&&i===0)return l?[o,s,e,n]:[e,n,o,s];if(r&i)return null;let f,d,u=r||i;u&8?(f=e+(o-e)*(this.ymax-n)/(s-n),d=this.ymax):u&4?(f=e+(o-e)*(this.ymin-n)/(s-n),d=this.ymin):u&2?(d=n+(s-n)*(this.xmax-e)/(o-e),f=this.xmax):(d=n+(s-n)*(this.xmin-e)/(o-e),f=this.xmin),r?(e=f,n=d,r=this._regioncode(e,n)):(o=f,s=d,i=this._regioncode(o,s))}}_clipInfinite(e,n,o,s,r,i){let l=Array.from(n),f;if((f=this._project(l[0],l[1],o,s))&&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(e,l))for(let d=0,u=l.length,c,a=this._edgecode(l[u-2],l[u-1]);d<u;d+=2)c=a,a=this._edgecode(l[d],l[d+1]),c&&a&&(d=this._edge(e,c,a,l,d),u=l.length);else this.contains(e,(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(e,n,o,s,r){for(;n!==o;){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}(s[r]!==i||s[r+1]!==l)&&this.contains(e,i,l)&&(s.splice(r,0,i,l),r+=2)}return r}_project(e,n,o,s){let r=1/0,i,l,f;if(s<0){if(n<=this.ymin)return null;(i=(this.ymin-n)/s)<r&&(f=this.ymin,l=e+(r=i)*o)}else if(s>0){if(n>=this.ymax)return null;(i=(this.ymax-n)/s)<r&&(f=this.ymax,l=e+(r=i)*o)}if(o>0){if(e>=this.xmax)return null;(i=(this.xmax-e)/o)<r&&(l=this.xmax,f=n+(r=i)*s)}else if(o<0){if(e<=this.xmin)return null;(i=(this.xmin-e)/o)<r&&(l=this.xmin,f=n+(r=i)*s)}return[l,f]}_edgecode(e,n){return(e===this.xmin?1:e===this.xmax?2:0)|(n===this.ymin?4:n===this.ymax?8:0)}_regioncode(e,n){return(e<this.xmin?1:e>this.xmax?2:0)|(n<this.ymin?4:n>this.ymax?8:0)}_simplify(e){if(e&&e.length>4){for(let n=0;n<e.length;n+=2){let o=(n+2)%e.length,s=(n+4)%e.length;(e[n]===e[o]&&e[o]===e[s]||e[n+1]===e[o+1]&&e[o+1]===e[s+1])&&(e.splice(o,2),n-=2)}e.length||(e=null)}return e}};var ia=2*Math.PI,ln=Math.pow;function aa(t){return t[0]}function la(t){return t[1]}function ca(t){let{triangles:e,coords:n}=t;for(let o=0;o<e.length;o+=3){let s=2*e[o],r=2*e[o+1],i=2*e[o+2];if((n[i]-n[s])*(n[r+1]-n[s+1])-(n[r]-n[s])*(n[i+1]-n[s+1])>1e-10)return!1}return!0}function ua(t,e,n){return[t+Math.sin(t+e)*n,e+Math.cos(t-e)*n]}var We=class t{static from(e,n=aa,o=la,s){return new t("length"in e?fa(e,n,o,s):Float64Array.from(da(e,n,o,s)))}constructor(e){this._delaunator=new an(e),this.inedges=new Int32Array(e.length/2),this._hullIndex=new Int32Array(e.length/2),this.points=this._delaunator.coords,this._init()}update(){return this._delaunator.update(),this._init(),this}_init(){let e=this._delaunator,n=this.points;if(e.hull&&e.hull.length>2&&ca(e)){this.collinear=Int32Array.from({length:n.length/2},(a,h)=>h).sort((a,h)=>n[2*a]-n[2*h]||n[2*a+1]-n[2*h+1]);let f=this.collinear[0],d=this.collinear[this.collinear.length-1],u=[n[2*f],n[2*f+1],n[2*d],n[2*d+1]],c=1e-8*Math.hypot(u[3]-u[1],u[2]-u[0]);for(let a=0,h=n.length/2;a<h;++a){let g=ua(n[2*a],n[2*a+1],c);n[2*a]=g[0],n[2*a+1]=g[1]}this._delaunator=new an(n)}else delete this.collinear;let o=this.halfedges=this._delaunator.halfedges,s=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,d=o.length;f<d;++f){let u=r[f%3===2?f-2:f+1];(o[f]===-1||i[u]===-1)&&(i[u]=f)}for(let f=0,d=s.length;f<d;++f)l[s[f]]=f;s.length<=2&&s.length>0&&(this.triangles=new Int32Array(3).fill(-1),this.halfedges=new Int32Array(3).fill(-1),this.triangles[0]=s[0],i[s[0]]=1,s.length===2&&(i[s[1]]=0,this.triangles[1]=s[1],this.triangles[2]=s[1]))}voronoi(e){return new En(this,e)}*neighbors(e){let{inedges:n,hull:o,_hullIndex:s,halfedges:r,triangles:i,collinear:l}=this;if(l){let c=l.indexOf(e);c>0&&(yield l[c-1]),c<l.length-1&&(yield l[c+1]);return}let f=n[e];if(f===-1)return;let d=f,u=-1;do{if(yield u=i[d],d=d%3===2?d-2:d+1,i[d]!==e)return;if(d=r[d],d===-1){let c=o[(s[e]+1)%o.length];c!==u&&(yield c);return}}while(d!==f)}find(e,n,o=0){if(e=+e,e!==e||(n=+n,n!==n))return-1;let s=o,r;for(;(r=this._step(o,e,n))>=0&&r!==o&&r!==s;)o=r;return r}_step(e,n,o){let{inedges:s,hull:r,_hullIndex:i,halfedges:l,triangles:f,points:d}=this;if(s[e]===-1||!d.length)return(e+1)%(d.length>>1);let u=e,c=ln(n-d[e*2],2)+ln(o-d[e*2+1],2),a=s[e],h=a;do{let g=f[h],x=ln(n-d[g*2],2)+ln(o-d[g*2+1],2);if(x<c&&(c=x,u=g),h=h%3===2?h-2:h+1,f[h]!==e)break;if(h=l[h],h===-1){if(h=r[(i[e]+1)%r.length],h!==g&&ln(n-d[h*2],2)+ln(o-d[h*2+1],2)<c)return h;break}}while(h!==a);return u}render(e){let n=e==null?e=new ue:void 0,{points:o,halfedges:s,triangles:r}=this;for(let i=0,l=s.length;i<l;++i){let f=s[i];if(f<i)continue;let d=r[i]*2,u=r[f]*2;e.moveTo(o[d],o[d+1]),e.lineTo(o[u],o[u+1])}return this.renderHull(e),n&&n.value()}renderPoints(e,n){n===void 0&&(!e||typeof e.moveTo!="function")&&(n=e,e=null),n=n==null?2:+n;let o=e==null?e=new ue:void 0,{points:s}=this;for(let r=0,i=s.length;r<i;r+=2){let l=s[r],f=s[r+1];e.moveTo(l+n,f),e.arc(l,f,n,0,ia)}return o&&o.value()}renderHull(e){let n=e==null?e=new ue:void 0,{hull:o,points:s}=this,r=o[0]*2,i=o.length;e.moveTo(s[r],s[r+1]);for(let l=1;l<i;++l){let f=2*o[l];e.lineTo(s[f],s[f+1])}return e.closePath(),n&&n.value()}hullPolygon(){let e=new Ce;return this.renderHull(e),e.value()}renderTriangle(e,n){let o=n==null?n=new ue:void 0,{points:s,triangles:r}=this,i=r[e*=3]*2,l=r[e+1]*2,f=r[e+2]*2;return n.moveTo(s[i],s[i+1]),n.lineTo(s[l],s[l+1]),n.lineTo(s[f],s[f+1]),n.closePath(),o&&o.value()}*trianglePolygons(){let{triangles:e}=this;for(let n=0,o=e.length/3;n<o;++n)yield this.trianglePolygon(n)}trianglePolygon(e){let n=new Ce;return this.renderTriangle(e,n),n.value()}};function fa(t,e,n,o){let s=t.length,r=new Float64Array(s*2);for(let i=0;i<s;++i){let l=t[i];r[i*2]=e.call(o,l,i,t),r[i*2+1]=n.call(o,l,i,t)}return r}function*da(t,e,n,o){let s=0;for(let r of t)yield e.call(o,r,s,t),yield n.call(o,r,s,t),++s}function To(t,e,n,o){let s,r;n<o?(s=n,r=o):(s=o,r=n);let i=s*e+r;t.set(i,(t.get(i)||0)+1)}function Dr(t,e,n){let o=t.get(e);o===void 0&&(o=[],t.set(e,o)),o.push(n)}function ve(t){if(!t||t.length<3)return[];let e=new Set,n=[];for(let x=0;x<t.length;x++){let b=t[x],m=`${b[0]}_${b[1]}`;e.has(m)||(e.add(m),n.push(b))}let o=n.length;if(o<3)return[];let s=new Float64Array(o*2);for(let x=0,b=0;x<o;x++){let m=n[x];s[b++]=m[0],s[b++]=m[1]}let r=new We(s),{triangles:i}=r;if(!i.length)return[];let l=new Map;for(let x=0;x<i.length;x+=3){let b=i[x],m=i[x+1],p=i[x+2],y=b*2,w=m*2,z=p*2,M=s[y],P=s[y+1],E=s[w],T=s[w+1],V=s[z],_=s[z+1],v=M-E,S=P-T,R=M-V,D=P-_,W=E-V,I=T-_,C=W*W+I*I,H=R*R+D*D,A=v*v+S*S,k=(E-M)*(_-P)-(V-M)*(T-P);if(k===0)continue;let O=k*k,L=M===0||E===0||V===0?O:4*O;C*H*A<=L&&(To(l,o,b,m),To(l,o,m,p),To(l,o,p,b))}if(!l.size)return[];let f=new Map,d=0,u=-1;for(let[x,b]of l){if(b!==1)continue;let m=Math.floor(x/o),p=x-m*o;u===-1&&(u=m),Dr(f,m,p),Dr(f,p,m),d++}if(d===0)return[];let c=[],a=new Uint8Array(o),h=u,g=-1;do{c.push(n[h]),a[h]=1;let x=f.get(h)||[],b=-1;for(let m=0;m<x.length;m++){let p=x[m];if(p!==g&&!a[p]){b=p;break}}if(b===-1)for(let m=0;m<x.length;m++){let p=x[m];if(p!==g){b=p;break}}if(b===-1)break;g=h,h=b}while(h!==u&&c.length<=d+1);return c.length>0&&c.push(c[0]),c}import*as Nt from"three";import{OBB as Ia}from"three/examples/jsm/math/OBB.js";var Yt=63710088e-1,Vr={centimeters:Yt*100,centimetres:Yt*100,degrees:360/(2*Math.PI),feet:Yt*3.28084,inches:Yt*39.37,kilometers:Yt/1e3,kilometres:Yt/1e3,meters:Yt,metres:Yt,miles:Yt/1609.344,millimeters:Yt*1e3,millimetres:Yt*1e3,nauticalmiles:Yt/1852,radians:1,yards:Yt*1.0936};function Ir(t,e,n={}){let o={type:"Feature"};return(n.id===0||n.id)&&(o.id=n.id),n.bbox&&(o.bbox=n.bbox),o.properties=e||{},o.geometry=t,o}function $n(t,e,n={}){if(!t)throw new Error("coordinates is required");if(!Array.isArray(t))throw new Error("coordinates must be an Array");if(t.length<2)throw new Error("coordinates must be at least 2 numbers long");if(!vr(t[0])||!vr(t[1]))throw new Error("coordinates must contain numbers");return Ir({type:"Point",coordinates:t},e,n)}function jn(t,e,n={}){for(let s of t){if(s.length<4)throw new Error("Each LinearRing of a Polygon must have 4 or more Positions.");if(s[s.length-1].length!==s[0].length)throw new Error("First and last Position are not equivalent.");for(let r=0;r<s[s.length-1].length;r++)if(s[s.length-1][r]!==s[0][r])throw new Error("First and last Position are not equivalent.")}return Ir({type:"Polygon",coordinates:t},e,n)}function ha(t,e="kilometers"){let n=Vr[e];if(!n)throw new Error(e+" units is invalid");return t*n}function ma(t,e="kilometers"){let n=Vr[e];if(!n)throw new Error(e+" units is invalid");return t/n}function Xn(t){return t%(2*Math.PI)*180/Math.PI}function fe(t){return t%360*Math.PI/180}function Gn(t,e="kilometers",n="kilometers"){if(!(t>=0))throw new Error("length must be a positive number");return ha(ma(t,e),n)}function vr(t){return!isNaN(t)&&t!==null&&!Array.isArray(t)}function Cr(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Me(t,e,n){if(t!==null)for(var o,s,r,i,l,f,d,u=0,c=0,a,h=t.type,g=h==="FeatureCollection",x=h==="Feature",b=g?t.features.length:1,m=0;m<b;m++){d=g?t.features[m].geometry:x?t.geometry:t,a=d?d.type==="GeometryCollection":!1,l=a?d.geometries.length:1;for(var p=0;p<l;p++){var y=0,w=0;if(i=a?d.geometries[p]:d,i!==null){f=i.coordinates;var z=i.type;switch(u=n&&(z==="Polygon"||z==="MultiPolygon")?1:0,z){case null:break;case"Point":if(e(f,c,m,y,w)===!1)return!1;c++,y++;break;case"LineString":case"MultiPoint":for(o=0;o<f.length;o++){if(e(f[o],c,m,y,w)===!1)return!1;c++,z==="MultiPoint"&&y++}z==="LineString"&&y++;break;case"Polygon":case"MultiLineString":for(o=0;o<f.length;o++){for(s=0;s<f[o].length-u;s++){if(e(f[o][s],c,m,y,w)===!1)return!1;c++}z==="MultiLineString"&&y++,z==="Polygon"&&w++}z==="Polygon"&&y++;break;case"MultiPolygon":for(o=0;o<f.length;o++){for(w=0,s=0;s<f[o].length;s++){for(r=0;r<f[o][s].length-u;r++){if(e(f[o][s][r],c,m,y,w)===!1)return!1;c++}w++}y++}break;case"GeometryCollection":for(o=0;o<i.geometries.length;o++)if(Me(i.geometries[o],e,n)===!1)return!1;break;default:throw new Error("Unknown Geometry Type")}}}}}function Wr(t){var e=[];return Me(t,function(n){e.push(n)}),e}function ga(t,e){var n,o,s,r,i,l,f,d,u,c,a=0,h=t.type==="FeatureCollection",g=t.type==="Feature",x=h?t.features.length:1;for(n=0;n<x;n++){for(l=h?t.features[n].geometry:g?t.geometry:t,d=h?t.features[n].properties:g?t.properties:{},u=h?t.features[n].bbox:g?t.bbox:void 0,c=h?t.features[n].id:g?t.id:void 0,f=l?l.type==="GeometryCollection":!1,i=f?l.geometries.length:1,s=0;s<i;s++){if(r=f?l.geometries[s]:l,r===null){if(e(null,a,d,u,c)===!1)return!1;continue}switch(r.type){case"Point":case"LineString":case"MultiPoint":case"Polygon":case"MultiLineString":case"MultiPolygon":{if(e(r,a,d,u,c)===!1)return!1;break}case"GeometryCollection":{for(o=0;o<r.geometries.length;o++)if(e(r.geometries[o],a,d,u,c)===!1)return!1;break}default:throw new Error("Unknown Geometry Type")}}a++}}function _r(t,e,n){var o=n;return ga(t,function(s,r,i,l,f){r===0&&n===void 0?o=s:o=e(o,s,r,i,l,f)}),o}var Qr=wi(Kr(),1);function Jr(t,e={}){e.concavity=e.concavity||1/0;let n=[];if(Me(t,s=>{n.push([s[0],s[1]])}),!n.length)return null;let o=(0,Qr.default)(n,e.concavity);return o.length>3?jn([o]):null}function Qn(t,e={}){let n=0,o=0,s=0;return Me(t,function(r){n+=r[0],o+=r[1],s++},!0),$n([n/s,o/s],e.properties)}function ce(t){if(!t)throw new Error("coord is required");if(!Array.isArray(t)){if(t.type==="Feature"&&t.geometry!==null&&t.geometry.type==="Point")return[...t.geometry.coordinates];if(t.type==="Point")return[...t.coordinates]}if(Array.isArray(t)&&t.length>=2&&!Array.isArray(t[0])&&!Array.isArray(t[1]))return[...t];throw new Error("coord must be GeoJSON Point or an Array of numbers")}function ts(t){if(Array.isArray(t))return t;if(t.type==="Feature"){if(t.geometry!==null)return t.geometry.coordinates}else if(t.coordinates)return t.coordinates;throw new Error("coords must be GeoJSON Feature, Geometry Object or an Array")}function ns(t,e,n={}){let o;return n.final?o=es(ce(e),ce(t)):o=es(ce(t),ce(e)),o>180?-(360-o):o}function es(t,e){let n=fe(t[1]),o=fe(e[1]),s=fe(e[0]-t[0]);s>Math.PI&&(s-=2*Math.PI),s<-Math.PI&&(s+=2*Math.PI);let r=Math.log(Math.tan(o/2+Math.PI/4)/Math.tan(n/2+Math.PI/4)),i=Math.atan2(s,r);return(Xn(i)+360)%360}function os(t,e,n={}){let o=ce(t),s=ce(e);s[0]+=s[0]-o[0]>180?-360:o[0]-s[0]>180?360:0;let r=Sa(o,s);return Gn(r,"meters",n.units)}function Sa(t,e,n){n=n===void 0?Yt:Number(n);let o=n,s=t[1]*Math.PI/180,r=e[1]*Math.PI/180,i=r-s,l=Math.abs(e[0]-t[0])*Math.PI/180;l>Math.PI&&(l-=2*Math.PI);let f=Math.log(Math.tan(r/2+Math.PI/4)/Math.tan(s/2+Math.PI/4)),d=Math.abs(f)>1e-11?i/f:Math.cos(s);return Math.sqrt(i*i+d*d*l*l)*o}function rs(t,e,n,o={}){let s=e<0,r=Gn(Math.abs(e),o.units,"meters");s&&(r=-Math.abs(r));let i=ce(t),l=Ta(i,r,n);return l[0]+=l[0]-i[0]>180?-360:i[0]-l[0]>180?360:0,$n(l,o.properties)}function Ta(t,e,n,o){o=o===void 0?Yt:Number(o);let s=e/o,r=t[0]*Math.PI/180,i=fe(t[1]),l=fe(n),f=s*Math.cos(l),d=i+f;Math.abs(d)>Math.PI/2&&(d=d>0?Math.PI-d:-Math.PI-d);let u=Math.log(Math.tan(d/2+Math.PI/4)/Math.tan(i/2+Math.PI/4)),c=Math.abs(u)>1e-11?f/u:Math.cos(i),a=s*Math.sin(l)/c;return[((r+a)*180/Math.PI+540)%360-180,d*180/Math.PI]}function ss(t){if(!t)throw new Error("geojson is required");switch(t.type){case"Feature":return is(t);case"FeatureCollection":return Ra(t);case"Point":case"LineString":case"Polygon":case"MultiPoint":case"MultiLineString":case"MultiPolygon":case"GeometryCollection":return Ho(t);default:throw new Error("unknown GeoJSON type")}}function is(t){let e={type:"Feature"};return Object.keys(t).forEach(n=>{switch(n){case"type":case"properties":case"geometry":return;default:e[n]=t[n]}}),e.properties=as(t.properties),t.geometry==null?e.geometry=null:e.geometry=Ho(t.geometry),e}function as(t){let e={};return t&&Object.keys(t).forEach(n=>{let o=t[n];typeof o=="object"?o===null?e[n]=null:Array.isArray(o)?e[n]=o.map(s=>s):e[n]=as(o):e[n]=o}),e}function Ra(t){let e={type:"FeatureCollection"};return Object.keys(t).forEach(n=>{switch(n){case"type":case"features":return;default:e[n]=t[n]}}),e.features=t.features.map(n=>is(n)),e}function Ho(t){let e={type:t.type};return t.bbox&&(e.bbox=t.bbox),t.type==="GeometryCollection"?(e.geometries=t.geometries.map(n=>Ho(n)),e):(e.coordinates=ls(t.coordinates),e)}function ls(t){let e=t;return typeof e[0]!="object"?e.slice():e.map(n=>ls(n))}function Ao(t,e,n){if(n=n||{},!Cr(n))throw new Error("options is invalid");let o=n.pivot,s=n.mutate;if(!t)throw new Error("geojson is required");if(e==null||isNaN(e))throw new Error("angle is required");if(e===0)return t;let r=o??Qn(t);return(s===!1||s===void 0)&&(t=ss(t)),Me(t,function(i){let f=ns(r,i)+e,d=os(r,i),u=ts(rs(r,d,f));i[0]=u[0],i[1]=u[1]}),t}function Lo(t,e,n={}){if(n.final===!0)return Da(t,e);let o=ce(t),s=ce(e),r=fe(o[0]),i=fe(s[0]),l=fe(o[1]),f=fe(s[1]),d=Math.sin(i-r)*Math.cos(f),u=Math.cos(l)*Math.sin(f)-Math.sin(l)*Math.cos(f)*Math.cos(i-r);return Xn(Math.atan2(d,u))}function Da(t,e){let n=Lo(e,t);return n=(n+180)%360,n}function cs(t,e={}){if(t.bbox!=null&&e.recompute!==!0)return t.bbox;let n=[1/0,1/0,-1/0,-1/0];return Me(t,o=>{n[0]>o[0]&&(n[0]=o[0]),n[1]>o[1]&&(n[1]=o[1]),n[2]<o[0]&&(n[2]=o[0]),n[3]<o[1]&&(n[3]=o[1])}),n}function us(t,e={}){let n=Number(t[0]),o=Number(t[1]),s=Number(t[2]),r=Number(t[3]);if(t.length===6)throw new Error("@turf/bbox-polygon does not support BBox with 6 positions");let i=[n,o];return jn([[i,[s,o],[s,r],[n,r],i]],e.properties,{bbox:t,id:e.id})}function fs(t){return us(cs(t))}function ms(t){return _r(t,(e,n)=>e+va(n),0)}function va(t){let e=0,n;switch(t.type){case"Polygon":return ds(t.coordinates);case"MultiPolygon":for(n=0;n<t.coordinates.length;n++)e+=ds(t.coordinates[n]);return e;case"Point":case"MultiPoint":case"LineString":case"MultiLineString":return 0}return 0}function ds(t){let e=0;if(t&&t.length>0){e+=Math.abs(hs(t[0]));for(let n=1;n<t.length;n++)e-=Math.abs(hs(t[n]))}return e}var Va=Yt*Yt/2,ko=Math.PI/180;function hs(t){let e=t.length-1;if(e<=2)return 0;let n=0,o=0;for(;o<e;){let s=t[o],r=t[o+1===e?0:o+1],i=t[o+2>=e?(o+2)%e:o+2],l=s[0]*ko,f=r[1]*ko,d=i[0]*ko;n+=(d-l)*Math.sin(f),o++}return n*Va}function gs(t){let e=Jr(t);if(!e)throw new Error("Can't calculate smallestSurroundingRectangleByArea for given geometry");let n=Qn(e),o=Wr(e),s=Number.MAX_SAFE_INTEGER,r=null;for(let i=0;i<o.length-1;i++){let l=Lo(o[i],o[i+1]),f=Ao(e,-1*l,{pivot:n}),d=fs(f),u=ms(d);u<s&&(s=u,r=Ao(d,l,{pivot:n}))}return r}function ps(t,e){let n=e[0]-t[0],o=e[1]-t[1];return Math.sqrt(n*n+o*o)}function Ca(t){let e=1/0,n=-1/0,o=1/0,s=-1/0;for(let[r,i]of t)r<e&&(e=r),r>n&&(n=r),i<o&&(o=i),i>s&&(s=i);return[(n+e)*.5,(s+o)*.5]}var to=class t extends Ia{getBoxMesh(){_e.identity(),_e.setFromMatrix3(this.rotation),_e.decompose(Jn,qe,new Nt.Vector3);let e=this.halfSize.clone().multiplyScalar(2),n=new Nt.Mesh(new Nt.BoxGeometry(e.x,e.y,e.z));return n.position.copy(this.center),n.rotation.setFromQuaternion(qe),n}getBoxEdge(e=16776960){let n=this.getBoxMesh();_a.setFromObject(n);let o=new Nt.EdgesGeometry(n.geometry.clone().applyMatrix4(n.matrixWorld));return new Nt.LineSegments(o,new Nt.LineBasicMaterial({color:e,toneMapped:!1}))}toJson(){return _e.identity(),_e.setFromMatrix3(this.rotation),_e.decompose(Jn,qe,new Nt.Vector3),{size:this.halfSize.toArray(),center:this.center.toArray(),quaternion:qe.toArray()}}static from(e,n,o,s=new t){if(o instanceof Nt.Euler)qe.setFromEuler(o);else if(o instanceof Nt.Quaternion)qe.copy(o);else throw new Error("\u4F20\u5165\u7684\u65CB\u8F6C\u4E0D\u662F\u6B27\u62C9\u89D2\u6216\u8005\u56DB\u5143\u6570");return _e.compose(n,qe,Wa),s.center.copy(n),s.halfSize.copy(e.multiplyScalar(.5)),s.rotation.setFromMatrix4(_e),s}static fromByPath2D(e,n,o,s=new t){let r=gs({type:"Polygon",coordinates:[e.map(h=>[h.x,h.y])]});if(!r)throw new Error("2d obb \u83B7\u53D6\u5931\u8D25");let i=r.geometry.coordinates[0],l=ps(i[0],i[1]),f=ps(i[1],i[2]),d=Math.atan2(i[1][1]-i[0][1],i[1][0]-i[0][0]);Jn.set(l,f,o),xs.set(0,0,d);let[u,c]=Ca(i);return n.x=u,n.y=c,this.from(Jn,n,xs,s)}},_e=new Nt.Matrix4,qe=new Nt.Quaternion,xs=new Nt.Euler,Wa=new Nt.Vector3(1,1,1),Jn=new Nt.Vector3,_a=new Nt.Box3;import"three";function Ha(t,e,n=.005,o=.2){if(!t.length||!e.length)return 0;let s=Math.max(n,.03),r=n*n,i=new Map,l=(c,a,h)=>`${Math.floor(c/s)},${Math.floor(a/s)},${Math.floor(h/s)}`;for(let c of e){let a=l(c.x,c.y,c.z);i.has(a)||i.set(a,[]),i.get(a).push(c)}let f=0,d=Math.ceil(n/s)+1,u=[];for(let c=-d;c<=d;c++)for(let a=-d;a<=d;a++)for(let h=-d;h<=d;h++)c*c+a*a+h*h<=d*d&&u.push([c,a,h]);for(let c of t){let a=Math.floor(c.x/s),h=Math.floor(c.y/s),g=Math.floor(c.z/s),x=!1;for(let[b,m,p]of u){let y=`${a+b},${h+m},${g+p}`;if(i.has(y)){for(let w of i.get(y))if(c.distanceToSquared(w)<r){x=!0;break}if(x)break}}if(x&&(f++,f/t.length>o))return f/t.length}return f/t.length}function He(t,e,n=.5){let o=0,s=0;for(let r of t)if(e.containsPoint(r)&&(o++,s=o/t.length,s>n))break;return s}function Bo(t,e,n,o){if(t.intersectsOBB(e))return!0;{let r=Qt(t,o),i=Qt(e,n);if(r||i)return!0}return!1}function Oo(t,e){let n=new Z.Vector3,o=new Z.Vector3;t.getSize(n),e.getSize(o);let s=n.x*n.y*n.z,r=o.x*o.y*o.z;return s>r?1:s<r?-1:0}function Qt(t,e){let n=!0;for(let o=0;o<e.length;o++)if(!t.containsPoint(e[o])){n=!1;break}return n}function de(t){if(t.length===0)return{x:0,y:0,z:0,h:0};let e=0,n=0,o=-1/0,s=1/0;for(let r of t)e+=r.x,n+=r.y,o=Math.max(o,r.z),s=Math.min(s,r.z);return{x:e/t.length,y:n/t.length,z:0,maxz:o,minz:s,h:o-s}}function Ee(t,e,n,o){let s=[];for(let i=0;i<t.length;i++)s.push(new Z.Vector3(t[i][0],t[i][1],0));if(s.length==0)return null;let r=to.fromByPath2D(s,e,n);return r.center.z=o,r}var Aa=(t,e)=>{let n=new Z.Group,o=new Z.MeshStandardMaterial({color:16737792,side:Z.DoubleSide});for(let s=0;s<t.length;s++){let r=[];for(let x=0;x<t[s].path.length;x++)r.push(new Z.Vector3(t[s].path[x][0],t[s].path[x][1],0));if(r.length==0)continue;n.add(t[s].obb.getBoxEdge());let i=new Z.BufferGeometry;i.setFromPoints(r);let l="green",f=new Z.LineBasicMaterial({color:l,depthTest:!1,depthWrite:!1}),d=new Z.Line(i,f);d.position.z=t[s].maxz,n.add(d);let u=t[s].obb.center.clone(),c=mr(t[s].type,u),a=t[s].stairBottomPt1.clone(),h=t[s].stairBottomPt2.clone();for(let x=0;x<t[s].stairStepNum;x++){let b=[a,h];b.push(h.clone().addScaledVector(t[s].vecStepWidth,t[s].stairStepWidth)),b.push(a.clone().addScaledVector(t[s].vecStepWidth,t[s].stairStepWidth));let m=Eo(b,t[s].stairStepHeight),p=new Z.Mesh(m,o);n.add(p),a=a.addScaledVector(t[s].vecStepWidth,t[s].stairStepWidth),a=a.addScaledVector(new Z.Vector3(0,0,1),t[s].stairStepHeight),h=h.addScaledVector(t[s].vecStepWidth,t[s].stairStepWidth),h=h.addScaledVector(new Z.Vector3(0,0,1),t[s].stairStepHeight)}if(t[s].rectPt1.x!=0&&t[s].rectPt1.y!=0){let x=[t[s].stairBottomPt1,t[s].stairBottomPt2,t[s].rectPt2,t[s].rectPt1],b=Eo(x,t[s].stairStepHeight),m=new Z.Mesh(b,o);n.add(m)}let g=new Z.MeshBasicMaterial({color:16776960});for(let x=0;x<t[s].stairBottom1BalconyRailing.length;x++){let b=new Z.CylinderGeometry(.03,.03,t[s].balconyRailingHeight,32),m=new Z.Mesh(b,g);m.position.set(t[s].stairBottom1BalconyRailing[x].x,t[s].stairBottom1BalconyRailing[x].z+t[s].balconyRailingHeight/2,-t[s].stairBottom1BalconyRailing[x].y),e.add(m)}for(let x=0;x<t[s].stairBottom2BalconyRailing.length;x++){let b=new Z.CylinderGeometry(.03,.03,t[s].balconyRailingHeight,32),m=new Z.Mesh(b,g);m.position.set(t[s].stairBottom2BalconyRailing[x].x,t[s].stairBottom2BalconyRailing[x].z+t[s].balconyRailingHeight/2,-t[s].stairBottom2BalconyRailing[x].y),e.add(m)}}return n},La=(t,e)=>{if(t.length==0)return[];e||(e=t[0].averagePz);let n=[],o=new Map;for(let r=0;r<t.length;r++){let i=t[r].points.map(m=>[m.x,m.y]),l=t[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],d=l.indexOf("_")+1,u=l.lastIndexOf("_"),c=l.substring(d,u);if(c.includes("top")&&(d=c.indexOf("top")+4,c=c.substring(d,u)),c.includes("left")&&(d=c.indexOf("left")+5,c=c.substring(d,u)),c.includes("right")&&(d=c.indexOf("right")+6,c=c.substring(d,u)),c.includes("front")&&(d=c.indexOf("front")+6,c=c.substring(d,u)),c==="wall"||c==="stair guardrail")continue;let a=[];for(let m=0;m<t[r].points.length;m++)a.push(new Z.Vector3(t[r].points[m].x,t[r].points[m].y,t[r].points[m].z));let h=-99999;if(c==="floor"){let m=new Map;for(let y=0;y<t[r].points.length;y++){let w=t[r].points[y].z;if(w=Math.floor(w*10)/10,m.has(w)){let z=m.get(w);z.num+=1,z.points.push(t[r].points[y]),m.set(w,z)}else m.set(w,{num:1,points:[t[r].points[y]]})}let p=[...m.entries()].reduce((y,w)=>w[1].num>y[1].num?w:y);i=[],i=p[1].points.map(y=>[y.x,y.y]),a=[],a=p[1].points.map(y=>new Z.Vector3(y.x,y.y,y.z)),h=p[0]}let g=de(a),x={points:a,path:ve(i),h:g.h,minz:g.minz,maxz:g.maxz,center:{x:g.x,y:g.y,z:g.z},obj_id:t[r].obj_id,type:c,averagePz:e,obb:null,isDel:!1,obj_id:l,positionArr:[t[r].position]};if(x.obb=Ee(x.path,x.center,x.h,(x.maxz+x.minz)/2),x.obb==null)continue;let b=-1;for(let m=0;m<n.length;m++)if(n[m].type==c){b=m;break}b!=-1?n[b].array.push(x):n.push({type:c,array:[x]})}for(let r=0;r<n.length;r++){let i=n[r].array,l=new Set,f=[];for(let u=0;u<i.length;u++){if(i[u].obb==null||l.has(u))continue;let c={...i[u],obb:i[u].obb.clone()};for(let a=u+1;a<i.length;a++){if(i[a].obb==null||l.has(a))continue;let h=c.obb.intersectsOBB(i[a].obb,.01);if(h||(h=$a(c.obb,i[a].obb)),h){l.add(a);for(let b=0;b<i[a].points.length;b++)(i[a].points[b].z>e&&i[a].points[b].z-e>.1||c.type=="floor"||c.type=="Staircase")&&c.points.push(i[a].points[b]);let g=c.points.map(b=>[b.x,b.y]);c.path=ve(g);let x=de(c.points);c.h=x.h,c.minz=x.minz,c.maxz=x.maxz,c.center={x:x.x,y:x.y,z:x.z},c.obb=Ee(c.path,c.center,c.h,(c.maxz+c.minz)/2),c.positionArr.push(...i[a].positionArr),a=u}}c.path.length>i[u].path.length&&(l.add(u),f.push(c))}let d=[];for(let u=0;u<i.length;u++)l.has(u)||d.push(i[u]);d.push(...f),n[r].array=d}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 d=l[f].obb,u=l[f].minz,c=l[f].maxz,a=l[f].averagePz;if(i==="window"||i==="door"||i==="tv"||i==="chair"||i==="cabinet"||i==="table"){let h=new Z.Vector3;d.getSize(h);let g=[h.x,h.y,h.z],x=0;for(let b of g)if(b<.2&&(x++,x===2)){l[f].isDel=!0;break}}if(!l[f].isDel)for(let h=r+1;h<n.length;h++){let g=n[h].type;if(g==="people")continue;let x=n[h].array;for(let b=0;b<x.length;b++){if(x[b].isDel)continue;let m=x[b].obb,p=x[b].minz,y=x[b].maxz;if(d.intersectsOBB(m)){let w=He(x[b].points,d),z=He(l[f].points,m),M=Oo(d,m);if(z>=.5&&M==-1&&i!=="Staircase"&&g!=="Staircase"){l[f].isDel=!0;break}if(i!=="wall"&&i!=="floor"&&i!=="roof"){if(i==="window"){if(g==="balcony railing"&&Qt(d,x[b].points)){x[b].isDel=!0;continue}if(g==="balcony railing"&&Qt(m,l[f].points)){l[f].isDel=!0;break}if(g==="balcony railing"&&Bo(d,m,l[f].points,x[b].points)&&(Math.abs(u-p)<.1||Math.abs(p-a)>.3)){x[b].isDel=!0;continue}if(g==="door"&&Qt(d,x[b].points)){x[b].isDel=!0;continue}if(g==="door"&&Qt(m,l[f].points)){x[b].isDel=!0;continue}if(g==="window sill")continue}else if(i==="balcony railing"){if(g==="window"&&Qt(d,x[b].points)){x[b].isDel=!0;continue}if(g==="window"&&Qt(m,l[f].points)){l[f].isDel=!0;break}if(g==="window"&&Bo(d,m,l[f].points,x[b].points)&&(Math.abs(u-p)<.1||Math.abs(u-a)>.3)){l[f].isDel=!0;break}if(g==="Staircase"&&Qt(d,x[b].points)){l[f].isStaircaseBalconyRailing=!0;break}if(g==="Staircase"&&Qt(m,l[f].points)){l[f].isStaircaseBalconyRailing=!0;break}if(g==="Staircase"&&d.intersectsOBB(m)){l[f].isStaircaseBalconyRailing=!0;break}}else if(i==="door"){if(g==="window"&&Qt(d,x[b].points)){l[f].isDel=!0;break}if(g==="window"&&Qt(m,l[f].points)){l[f].isDel=!0;break}if(g==="window sill"&&Qt(d,x[b].points)){l[f].isDel=!0;break}if(g==="window sill"&&Qt(m,l[f].points)){l[f].isDel=!0;break}}else if(i==="window sill"){if(g==="window")continue;if(g==="floor"&&Qt(d,x[b].points)){x[b].isDel=!0;continue}if(g==="door"&&Qt(d,x[b].points)){x[b].isDel=!0;continue}if(g==="door"&&Qt(m,l[f].points)){x[b].isDel=!0;continue}}else if(i==="Staircase"){if(g==="balcony railing"&&Qt(d,x[b].points)){x[b].isStaircaseBalconyRailing=!0;continue}if(g==="balcony railing"&&Qt(m,l[f].points)){x[b].isStaircaseBalconyRailing=!0;continue}if(g==="balcony railing"&&d.intersectsOBB(m)){x[b].isStaircaseBalconyRailing=!0;continue}}let P=!1,E=[],T=[],V=l[f].points,_=x[b].points;if(V.length>_.length?(P=!0,E=V,T=_):(E=_,T=V),Ha(T,E,.03,.5)>.5)if(P)x[b].isDel=!0;else{l[f].isDel=!0;break}else if(Bo(d,m,l[f].points,x[b].points)){let S=Oo(d,m);if(S===1||S===0){if(g==="switch"||g==="Staircase")continue;V.length>_.length?He(T,d)>=.5&&(x[b].isDel=!0):He(E,d)>=.5&&(x[b].isDel=!0)}else{if(i==="switch"||i==="Staircase")continue;if(V.length>_.length){if(He(E,m)>=.5){l[f].isDel=!0;break}}else if(He(T,m)>=.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 d=l[f].maxz,u=l[f].minz,c=i==="switch"?.1:.3;if(Math.abs(d-e)<c&&i!="floor"){l[f].isDel=!0;continue}if(i==="window"||i==="door"||i==="tv"){let a=Math.abs(d-e),h=Math.abs(u-e);(i==="tv"&&h<1.6||i!=="window"&&a<1.6)&&(l[f].isDel=!0),i==="window"&&a<1&&(l[f].isDel=!0),i==="door"&&h>1&&(l[f].isDel=!0)}if(i==="chair"){let a=new Z.Vector3;l[f].obb.getSize(a),(a.x<.1||a.y<.1||a.z<.2)&&(l[f].isDel=!0)}if(i==="balcony railing"&&(Math.abs(d-u)<.4&&(l[f].isDel=!0),(u<e&&Math.abs(u-e)>1||u>e&&Math.abs(u-e)>1)&&(l[f].isDel=!0),d<e&&(l[f].isDel=!0)),i==="people"&&(Math.abs(d-u)<1&&(l[f].isDel=!0),u>e&&u-e>.3&&(l[f].isDel=!0),d<e&&(l[f].isDel=!0)),i==="floor"){let a=new Z.Vector3;l[f].obb.getSize(a),(a.x<.1||a.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 s=[];for(let r=0;r<n.length;r++){let i=n[r].array;for(let l=0;l<i.length;l++)s.push({obbBox:i[l].obb,box:new Z.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 s},ka=t=>{if(t.length==0)return[];let e=[],n=new Map;for(let s=0;s<t.length;s++){let r=t[s].points.map(b=>[b.x,b.y]),i=t[s].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,d=i.lastIndexOf("_"),u=i.substring(f,d);if(u!=="floor")continue;let c=[];for(let b=0;b<t[s].points.length;b++)c.push(new Z.Vector3(t[s].points[b].x,t[s].points[b].y,t[s].points[b].z));let a=-99999;if(u==="floor"){let b=new Map;for(let p=0;p<t[s].points.length;p++){let y=t[s].points[p].z;if(y=Math.floor(y*10)/10,b.has(y)){let w=b.get(y);w.num+=1,w.points.push(t[s].points[p]),b.set(y,w)}else b.set(y,{num:1,points:[t[s].points[p]]})}let m=[...b.entries()].reduce((p,y)=>y[1].num>p[1].num?y:p);r=[],r=m[1].points.map(p=>[p.x,p.y]),c=[],c=m[1].points.map(p=>new Z.Vector3(p.x,p.y,p.z)),a=m[0]}let h=de(c),g={points:c,path:ve(r),h:h.h,minz:h.minz,maxz:h.maxz,center:{x:h.x,y:h.y,z:h.z},obj_id:t[s].obj_id,type:u,obb:null,isDel:!1,obj_id:i,positionArr:[t[s].position]};if(g.obb=Ee(g.path,g.center,g.h,(g.maxz+g.minz)/2),g.obb==null)continue;let x=-1;for(let b=0;b<e.length;b++)if(e[b].type==u){x=b;break}if(x!=-1?e[x].array.push(g):e.push({type:u,array:[g]}),u=="floor"&&a!=-99999)if(n.has(a)){let b=n.get(a);b.num+=g.points.length,b.datas.push(g),n.set(a,b)}else n.set(a,{num:g.points.length,datas:[g]})}for(let s=0;s<e.length;s++){let r=e[s].array,i=[],l=[];for(let d=0;d<r.length;d++){if(r[d].obb==null||i.includes(d))continue;let u={...r[d],obb:r[d].obb.clone()};for(let c=d+1;c<r.length;c++){if(r[c].obb==null||i.includes(c))continue;if(u.obb.intersectsOBB(r[c].obb)){i.push(c);for(let x=0;x<r[c].points.length;x++)u.points.push(r[c].points[x]);let h=u.points.map(x=>[x.x,x.y]);u.path=ve(h);let g=de(u.points);u.h=g.h,u.minz=g.minz,u.maxz=g.maxz,u.center={x:g.x,y:g.y,z:g.z},u.obb=Ee(u.path,u.center,u.h,(u.maxz+u.minz)/2),u.positionArr.push(...r[c].positionArr),c=d}}u.path.length>r[d].path.length&&(i.push(d),l.push(u))}let f=[];for(let d=0;d<r.length;d++)i.includes(d)||f.push(r[d]);f.push(...l),e[s].array=f}for(let s=0;s<e.length;s++){let r=e[s].type,i=e[s].array;for(let l=0;l<i.length;l++)r==="floor"&&i[l].points.length<500&&(i[l].isDel=!0)}for(let s=0;s<e.length;s++)e[s].array=e[s].array.filter(r=>!r.isDel);let o=[];for(let s=0;s<e.length;s++){let r=e[s].array;for(let i=0;i<r.length;i++)o.push({obbBox:r[i].obb,box:new Z.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 o},Ba=(t,e)=>{if(!t||!t.splitFloorProjectsResults||!t.trajectoryResults)return[];let n=t.splitFloorProjectsResults,o=t.trajectoryResults,s=new Map;for(let a=0;a<o.length;a++){let h=o[a].floor;s.has(h)?s.get(h).push(o[a]):s.set(h,[o[a]])}let r=new Map,i=[];for(let a=0;a<n.length;a++){let h=[],g=n[a];for(let x=0;x<g.length;x++){let b=g[x].points.map(T=>[T.x,T.y]),m=g[x].obj_id;m=m.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 p=m.split("_").slice(1,3).join("_").split(".")[0].split("_")[0],y=m.indexOf("_")+1,w=m.lastIndexOf("_"),z=m.substring(y,w);if(z.includes("top")&&(y=z.indexOf("top")+4,z=z.substring(y,w)),z.includes("left")&&(y=z.indexOf("left")+5,z=z.substring(y,w)),z.includes("right")&&(y=z.indexOf("right")+6,z=z.substring(y,w)),z.includes("front")&&(y=z.indexOf("front")+6,z=z.substring(y,w)),z!=="Staircase"&&z!=="balcony railing")continue;let M=[];for(let T=0;T<g[x].points.length;T++)M.push(new Z.Vector3(g[x].points[T].x,g[x].points[T].y,g[x].points[T].z));let P=de(M),E={points:M,path:ve(b),h:P.h,minz:P.minz,maxz:P.maxz,center:{x:P.x,y:P.y,z:P.z},obj_id:g[x].obj_id,type:z,averagePz:0,obb:null,isDel:!1,obj_id:m,positionArr:[g[x].position],aabbBox:new Z.Box3().setFromPoints(M)};E.obb=Ee(E.path,E.center,E.h,(E.maxz+E.minz)/2),E.obb!=null&&(z=="Staircase"?h.push(E):z=="balcony railing"&&i.push(E))}r.set(a+1,h)}let l=[];for(let[a,h]of r){let g={floor:a,findTrajectoryResults:[],otherTrajectoryResults:[],lastTrajectoryResults:[]},x=s.get(a);if(!x){g.otherTrajectoryResults=h,l.push(g);continue}let b=[],m=[],p=[];for(let y=0;y<x.length;y++){let w=[];for(let M=0;M<x[y].points.length;M++){let P=[new Z.Vector3(x[y].points[M].x,x[y].points[M].y,x[y].points[M].z)];P.push(P[0].clone().addScaledVector(new Z.Vector3(0,0,-1),2));let E=new Z.Box3().setFromPoints(P);w.push(E)}let z=[];for(let M=0;M<h.length;M++)for(let P=0;P<w.length;P++)!p.includes(M)&&h[M].aabbBox.intersectsBox(w[P])&&(p.push(M),z.push(h[M]));z.length>0&&m.push(z)}for(let y=0;y<h.length;y++)p.includes(y)||b.push(h[y]);g.findTrajectoryResults=m,g.otherTrajectoryResults=b,l.push(g)}function f(a,h){let g=a,x=[],b=[];for(let p=0;p<a.length;p++){if(a[p].obb==null||x.includes(p))continue;let y={...a[p],obb:a[p].obb.clone()};for(let w=p+1;w<a.length;w++){if(a[w].obb==null||x.includes(w))continue;if(y.obb.intersectsOBB(a[w].obb)||h){x.push(w);for(let E=0;E<a[w].points.length;E++)y.points.push(a[w].points[E]);let M=y.points.map(E=>[E.x,E.y]);y.path=ve(M);let P=de(y.points);y.h=P.h,y.minz=P.minz,y.maxz=P.maxz,y.center={x:P.x,y:P.y,z:P.z},y.obb=Ee(y.path,y.center,y.h,(y.maxz+y.minz)/2),y.positionArr.push(...a[w].positionArr),w=p}}y.path.length>a[p].path.length&&(x.push(p),b.push(y))}let m=[];for(let p=0;p<a.length;p++)x.includes(p)||m.push(a[p]);return m.push(...b),a=m,a}for(let a=0;a<l.length;a++){for(let h=0;h<l[a].findTrajectoryResults.length;h++)l[a].findTrajectoryResults[h]=f(l[a].findTrajectoryResults[h],!0);l[a].otherTrajectoryResults=f(l[a].otherTrajectoryResults,!1)}for(let a=0;a<l.length;a++){for(let h=0;h<l[a].findTrajectoryResults.length;h++){for(let g=0;g<l[a].findTrajectoryResults[h].length;g++){let x=ys(l[a].findTrajectoryResults[h][g].points,{binCount:100,minBinPoints:5,sideK:2.2,zK:2.2,minSideRange:.2,minZRange:.2,lowerZScale:.4,upperZScale:1.8}),b=bs(x.keep,{radius:.1,minClusterSize:50,lowPercent:.45});if(b.keep.length==0){l[a].findTrajectoryResults[h][g].isDel=!0;continue}l[a].findTrajectoryResults[h][g].points=b.keep;let m=l[a].findTrajectoryResults[h][g].points.map(y=>[y.x,y.y]);l[a].findTrajectoryResults[h][g].path=ve(m);let p=de(l[a].findTrajectoryResults[h][g].points);l[a].findTrajectoryResults[h][g].h=p.h,l[a].findTrajectoryResults[h][g].minz=p.minz,l[a].findTrajectoryResults[h][g].maxz=p.maxz,l[a].findTrajectoryResults[h][g].center={x:p.x,y:p.y,z:p.z},l[a].findTrajectoryResults[h][g].obb=Ee(l[a].findTrajectoryResults[h][g].path,l[a].findTrajectoryResults[h][g].center,l[a].findTrajectoryResults[h][g].h,(l[a].findTrajectoryResults[h][g].maxz+l[a].findTrajectoryResults[h][g].minz)/2)}l[a].findTrajectoryResults[h]=l[a].findTrajectoryResults[h].filter(g=>!g.isDel)}for(let h=0;h<l[a].otherTrajectoryResults.length;h++){let g=ys(l[a].otherTrajectoryResults[h].points,{binCount:100,minBinPoints:5,sideK:2.2,zK:2.2,minSideRange:.2,minZRange:.2,lowerZScale:.4,upperZScale:1.8}),x=bs(g.keep,{radius:.1,minClusterSize:50,lowPercent:.45});if(x.keep.length==0){l[a].otherTrajectoryResults[h].isDel=!0;continue}l[a].otherTrajectoryResults[h].points=x.keep;let b=l[a].otherTrajectoryResults[h].points.map(p=>[p.x,p.y]);l[a].otherTrajectoryResults[h].path=ve(b);let m=de(l[a].otherTrajectoryResults[h].points);l[a].otherTrajectoryResults[h].h=m.h,l[a].otherTrajectoryResults[h].minz=m.minz,l[a].otherTrajectoryResults[h].maxz=m.maxz,l[a].otherTrajectoryResults[h].center={x:m.x,y:m.y,z:m.z},l[a].otherTrajectoryResults[h].obb=Ee(l[a].otherTrajectoryResults[h].path,l[a].otherTrajectoryResults[h].center,l[a].otherTrajectoryResults[h].h,(l[a].otherTrajectoryResults[h].maxz+l[a].otherTrajectoryResults[h].minz)/2)}l[a].otherTrajectoryResults.filter(h=>!h.isDel)}function d(a){for(let h=0;h<a.length;h++){let g=a[h].obb;for(let x=h+1;x<a.length;x++){let b=a[x].obb;if(!a[x].isDel){if(g.intersectsOBB(b)){let m=He(a[x].points,g),p=He(a[h].points,b),y=Oo(g,b);if(m>=.5&&(y==1||y==0)&&(a[x].isDel=!0),p>=.5&&y==-1){a[h].isDel=!0;break}}if(a[h].isDel)break}}}return a=a.filter(h=>!h.isDel),a}for(let a=0;a<l.length;a++){let h=[];for(let g=0;g<l[a].findTrajectoryResults.length;g++)h.push(...l[a].findTrajectoryResults[g]);h.push(...l[a].otherTrajectoryResults),l[a].lastTrajectoryResults=d(h)}function u(a){let h=[];if(a.length>0){let g=.3,x=.5,b=.5,m=.2;for(let p=0;p<a.length;p++){let y=a[p].obb.halfSize.clone().multiplyScalar(2),w=a[p].points,z=y.x,M=y.y,P=y.z;if(z>M&&([z,M]=[M,z]),z<x||M<g||P<b)continue;let E=yr(a[p].obb);if(E.length!=8)continue;let T=new Z.Line3(E[0],E[1]),V=new Z.Line3(E[1],E[2]),_=new Z.Line3(E[2],E[3]),v=new Z.Line3(E[3],E[0]),S=new Z.Line3(E[4],E[5]),R=new Z.Line3(E[5],E[6]),D=new Z.Line3(E[6],E[7]),W=new Z.Line3(E[7],E[4]),I=[],C=[],H=[],A=[],k=[],O=[],N=[],L=[];for(let bt=0;bt<w.length;bt++){let Jt=T.closestPointToPoint(w[bt],!0,new Z.Vector3),he=V.closestPointToPoint(w[bt],!0,new Z.Vector3),Tt=_.closestPointToPoint(w[bt],!0,new Z.Vector3),ee=v.closestPointToPoint(w[bt],!0,new Z.Vector3),et=S.closestPointToPoint(w[bt],!0,new Z.Vector3),me=R.closestPointToPoint(w[bt],!0,new Z.Vector3),Ae=D.closestPointToPoint(w[bt],!0,new Z.Vector3),Le=W.closestPointToPoint(w[bt],!0,new Z.Vector3);Jt.distanceTo(w[bt])<m&&I.push(w[bt]),he.distanceTo(w[bt])<m&&C.push(w[bt]),Tt.distanceTo(w[bt])<m&&H.push(w[bt]),ee.distanceTo(w[bt])<m&&A.push(w[bt]),et.distanceTo(w[bt])<m&&k.push(w[bt]),me.distanceTo(w[bt])<m&&O.push(w[bt]),Ae.distanceTo(w[bt])<m&&N.push(w[bt]),Le.distanceTo(w[bt])<m&&L.push(w[bt])}let B=E[0].distanceTo(E[1]),$=E[1].distanceTo(E[2]),G=E[2].distanceTo(E[3]),Q=E[3].distanceTo(E[0]),q=new Z.Vector3,X=new Z.Vector3,Y=new Z.Vector3,it=new Z.Vector3;Math.abs(B-z)<.01?I.length>H.length?(q=E[0].clone(),X=E[1].clone(),Y=new Z.Vector3().subVectors(X,q).normalize(),it=new Z.Vector3().subVectors(E[2],E[1]).normalize()):(q=E[2].clone(),X=E[3].clone(),Y=new Z.Vector3().subVectors(X,q).normalize(),it=new Z.Vector3().subVectors(E[0],E[3]).normalize()):C.length>A.length?(q=E[1].clone(),X=E[2].clone(),Y=new Z.Vector3().subVectors(X,q).normalize(),it=new Z.Vector3().subVectors(E[3],E[2]).normalize()):(q=E[3].clone(),X=E[0].clone(),Y=new Z.Vector3().subVectors(X,q).normalize(),it=new Z.Vector3().subVectors(E[1],E[0]).normalize());let ht=E[4].distanceTo(E[5]),St=E[5].distanceTo(E[6]),nt=E[6].distanceTo(E[7]),wt=E[7].distanceTo(E[4]),zt=new Z.Vector3,Dt=new Z.Vector3,Pt=new Z.Vector3(q.x,q.y,E[4].z),Mt=new Z.Vector3(X.x,X.y,E[4].z);(ct(E[4],Pt)||ct(E[4],Mt))&&(ct(E[5],Pt)||ct(E[5],Mt))?(zt=E[6].clone(),Dt=E[7].clone()):(ct(E[5],Pt)||ct(E[5],Mt))&&(ct(E[6],Pt)||ct(E[6],Mt))?(zt=E[7].clone(),Dt=E[4].clone()):(ct(E[6],Pt)||ct(E[6],Mt))&&(ct(E[7],Pt)||ct(E[7],Mt))?(zt=E[4].clone(),Dt=E[5].clone()):(ct(E[7],Pt)||ct(E[7],Mt))&&(ct(E[4],Pt)||ct(E[4],Mt))&&(zt=E[5].clone(),Dt=E[6].clone());let It=q.distanceTo(X),ot=zt.distanceTo(Dt),ft=new Z.Vector3().subVectors(new Z.Vector3(q.x,q.y,zt.z),q).normalize();if(Math.abs(It-ot)>.01||Math.abs(It-z)>.01){console.log("\u4E0A\u4E0B\u957F\u5EA6\u4E0D\u4E00\u81F4,\u6216\u4E0E\u5BBD\u4E0D\u4E00\u81F4",It,ot,z);continue}let rt=Math.sqrt(It*It+ot*ot),tt=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(rt)))),ae={stairStepHeight:P/tt,stairStepWidth:M/tt,staitWidth:z,stairLength:M,stairHeigth:P,stairStepNum:tt,stairBottomPt1:q,stairBottomPt2:X,stairTopPt1:zt,stairTopPt2:Dt,vecStepLength:Y,vecStepWidth:it,vecStepHeight:ft,path:a[p].path,obb:a[p].obb,maxz:a[p].maxz,points:a[p].points,rectPt1:new Z.Vector3(0,0,0),rectPt2:new Z.Vector3(0,0,0)};h.push(ae)}}return h}let c=[];for(let a=0;a<l.length;a++)c.push(...u(l[a].lastTrajectoryResults));for(let a=0;a<c.length;a++){let h=c[a].stairTopPt1.clone(),g=c[a].stairTopPt2.clone(),x=c[a].stairBottomPt1.clone(),b=c[a].stairBottomPt2.clone(),m=h.clone(),p=g.clone(),y=x.clone(),w=b.clone();m.z=p.z=y.z=w.z=0;let z=qt(h,g,!0),M=qt(x,b,!0),P=qt(z,M),E=new Z.Vector3().subVectors(z,P).normalize(),T=new Z.Vector3().subVectors(M,P).normalize(),V=z.distanceTo(M),_=!1,v=!1;for(let S=0;S<c.length;S++){if(a==S)continue;let R=c[S].stairTopPt1.clone(),D=c[S].stairTopPt2.clone(),W=c[S].stairBottomPt1.clone(),I=c[S].stairBottomPt2.clone(),C=new Z.Vector3().subVectors(R,D).normalize(),H=new Z.Vector3().subVectors(W,I).normalize(),A=R.clone(),k=D.clone(),O=W.clone(),N=I.clone();A.z=k.z=O.z=N.z=0;let L=qt(R,D,!0),B=qt(W,I,!0),$=L.distanceTo(B),G=Gt(z,M,L,B),Q=!1;if(G&&G.isParallel&&R.z<=x.z&&x.z-R.z<.3){Q=!0,v=!0;let q=A.addScaledVector(C.clone().negate(),100),X=k.addScaledVector(C,100),Y=O.addScaledVector(H.clone().negate(),100),it=N.addScaledVector(H,100),ht=new Z.Line3(q,X),St=new Z.Line3(Y,it),nt=ht.closestPointToPoint(P,!0,new Z.Vector3),wt=St.closestPointToPoint(P,!0,new Z.Vector3),zt=new Z.Vector3().subVectors(nt,P),Dt=new Z.Vector3().subVectors(wt,P),Pt=zt.length(),Mt=Dt.length();Dt=Dt.normalize(),zt=zt.normalize();let It=Kt(E,zt,.1),ot=Kt(T,zt,.1),ft=Kt(T,Dt,.1),rt=Kt(E,Dt,.1);if(It&&It.sameDirection&&Pt>V/2){let tt=Pt-V/2;c[a].stairBottomPt1=c[a].stairBottomPt1.addScaledVector(T,tt),c[a].stairBottomPt2=c[a].stairBottomPt2.addScaledVector(T,tt)}else if(ot&&ot.sameDirection&&Pt>V/2){let tt=Pt-V/2;c[a].stairBottomPt1=c[a].stairBottomPt1.addScaledVector(T,tt),c[a].stairBottomPt2=c[a].stairBottomPt2.addScaledVector(T,tt)}if(ft&&ft.sameDirection&&Mt>V/2){let tt=Mt-V/2;c[a].stairTopPt1=c[a].stairTopPt1.addScaledVector(E,tt),c[a].stairTopPt2=c[a].stairTopPt2.addScaledVector(E,tt)}else if(rt&&rt.sameDirection&&Mt>V/2){let tt=Mt-V/2;c[a].stairTopPt1=c[a].stairTopPt1.addScaledVector(E,tt),c[a].stairTopPt2=c[a].stairTopPt2.addScaledVector(E,tt)}}else if(G&&G.isParallel&&h.z<W.z&&W.z-h.z<.2){Q=!0,_=!0;let q=A.addScaledVector(C.clone().negate(),100),X=k.addScaledVector(C,100),Y=O.addScaledVector(H.clone().negate(),100),it=N.addScaledVector(H,100),ht=new Z.Line3(q,X),St=new Z.Line3(Y,it),nt=ht.closestPointToPoint(P,!1,new Z.Vector3),wt=St.closestPointToPoint(P,!1,new Z.Vector3),zt=new Z.Vector3().subVectors(nt,P),Dt=new Z.Vector3().subVectors(wt,P),Pt=zt.length(),Mt=Dt.length();Dt=Dt.normalize(),zt=zt.normalize();let It=Kt(E,zt,.1),ot=Kt(T,zt,.1),ft=Kt(T,Dt,.1),rt=Kt(E,Dt,.1);if(It&&It.sameDirection&&Pt>V/2){let tt=Pt-V/2;c[a].stairBottomPt1=c[a].stairBottomPt1.addScaledVector(T,tt),c[a].stairBottomPt2=c[a].stairBottomPt2.addScaledVector(T,tt)}else if(ot&&ot.sameDirection&&Pt>V/2){let tt=Pt-V/2;c[a].stairBottomPt1=c[a].stairBottomPt1.addScaledVector(T,tt),c[a].stairBottomPt2=c[a].stairBottomPt2.addScaledVector(T,tt)}if(ft&&ft.sameDirection&&Mt>V/2){let tt=Mt-V/2;c[a].stairTopPt1=c[a].stairTopPt1.addScaledVector(E,tt),c[a].stairTopPt2=c[a].stairTopPt2.addScaledVector(E,tt)}else if(rt&&rt.sameDirection&&Mt>V/2){let tt=Mt-V/2;c[a].stairTopPt1=c[a].stairTopPt1.addScaledVector(E,tt),c[a].stairTopPt2=c[a].stairTopPt2.addScaledVector(E,tt)}c[a].stairTopPt1.z=c[a].stairTopPt2.z=W.z}if(Q&&(h=c[a].stairTopPt1.clone(),g=c[a].stairTopPt2.clone(),x=c[a].stairBottomPt1.clone(),b=c[a].stairBottomPt2.clone(),m=h.clone(),p=g.clone(),y=x.clone(),w=b.clone(),m.z=p.z=y.z=w.z=0,z=qt(h,g,!0),M=qt(x,b,!0),P=qt(z,M),E=new Z.Vector3().subVectors(z,P).normalize(),T=new Z.Vector3().subVectors(M,P).normalize(),V=z.distanceTo(M)),v&&_)break}if(v||_){let S=c[a].stairTopPt1.clone(),R=c[a].stairTopPt2.clone(),D=c[a].stairBottomPt1.clone(),W=c[a].stairBottomPt2.clone(),I=qt(S,R,!0),C=qt(D,W,!0),H=I.distanceTo(C),A=c[a].stairTopPt1.distanceTo(c[a].stairTopPt2),k=c[a].stairBottomPt1.distanceTo(c[a].stairBottomPt2),O=Math.sqrt(A*A+k*k),N=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(O))));c[a].stairStepNum=N,c[a].stairHeigth=c[a].stairTopPt1.z-c[a].stairBottomPt1.z,c[a].stairStepHeight=c[a].stairHeigth/c[a].stairStepNum,c[a].stairStepWidth=H/c[a].stairStepNum}}for(let a=0;a<c.length;a++){let h=c[a].stairTopPt1,g=c[a].stairTopPt2,x=c[a].stairBottomPt1.clone(),b=c[a].stairBottomPt2.clone(),m=new Z.Vector3(h.x,h.y,x.z),p=c[a].vecStepWidth;for(let y=0;y<c.length;y++){if(a==y)continue;let w=c[y].stairTopPt1,z=c[y].stairTopPt2,M=c[y].stairBottomPt1.clone(),P=c[y].stairBottomPt2.clone(),E=new Z.Vector3(w.x,w.y,M.z),T=c[y].vecStepWidth;if(Math.abs(h.z-M.z)<.3&&M.z>x.z&&c[a].obb.intersectsOBB(c[y].obb)){let V=ie(m,x,E,M);if(V&&V.angle>75){let _=M.distanceTo(h),v=M.distanceTo(g),S=P.distanceTo(h),R=P.distanceTo(g),D=h.clone(),W=D.clone().addScaledVector(p,c[y].staitWidth),I=new Z.Vector3().subVectors(g,h).normalize(),C=h.distanceTo(g),H=D.clone().addScaledVector(I,C),A=W.clone().addScaledVector(I,C),k=D.clone().addScaledVector(I,c[y].stairLength),O=W.clone().addScaledVector(I,c[y].stairLength),N=_;(N>v||N>R)&&(N=v,D=g.clone(),W=D.clone().addScaledVector(p,c[y].staitWidth),I=new Z.Vector3().subVectors(h,g).normalize(),C=h.distanceTo(g),H=D.clone().addScaledVector(I,C),A=W.clone().addScaledVector(I,C),k=D.clone().addScaledVector(I,c[y].stairLength),O=W.clone().addScaledVector(I,c[y].stairLength));let L=new Z.Vector3().subVectors(k,H).normalize(),B=k.distanceTo(H);k.z=O.z=c[y].maxz,c[y].stairBottomPt1=H,c[y].stairBottomPt2=A,c[y].stairTopPt1=k,c[y].stairTopPt2=O,c[y].rectPt1=D,c[y].rectPt2=W;let $=H.distanceTo(A),G=k.distanceTo(O),Q=Math.sqrt(B*B+c[y].stairHeigth*c[y].stairHeigth),q=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(Q))));c[y].stairStepNum=q,c[y].stairHeigth=k.z-H.z,c[y].stairStepHeight=c[y].stairHeigth/c[y].stairStepNum,c[y].stairStepWidth=B/c[y].stairStepNum,c[y].vecStepLength=I.clone().negate(),c[y].vecStepWidth=L;break}}}}return Oa(c,i,e),c},Oa=(t,e,n)=>{if(!t||t.length<=0||!e||e.length<=0)return;let o=1.5,s=0;for(let r=0;r<t.length;r++){t[r].stairBottom1BalconyRailing=[],t[r].stairBottom2BalconyRailing=[],t[r].balconyRailingHeight=0;let i=t[r].stairBottomPt1.clone(),l=t[r].stairBottomPt2.clone(),f=t[r].stairBottomPt1.clone(),d=t[r].stairBottomPt2.clone(),u=new Z.Vector3().subVectors(l,i).normalize();i=i.addScaledVector(u,.05),l=l.addScaledVector(u.clone().negate(),.05);let c=[],a=[];for(let h=0;h<t[r].stairStepNum;h++){let g=[i,f];g.push(g[1].clone().addScaledVector(t[r].vecStepWidth,t[r].stairStepWidth)),g.push(g[0].clone().addScaledVector(t[r].vecStepWidth,t[r].stairStepWidth));let x=g.map(z=>[z.x,z.y]);g.push(new Z.Vector3(g[3].x,g[3].y,g[3].z+o)),g.push(new Z.Vector3(g[2].x,g[2].y,g[2].z+o)),g.push(new Z.Vector3(g[1].x,g[1].y,g[1].z+o)),g.push(new Z.Vector3(g[0].x,g[0].y,g[0].z+o));let b=de(g),m=Ee(x,{x:b.x,y:b.y,z:b.z},b.h,(b.maxz+b.minz)/2),p=[],y=!1,w=0;for(let z=0;z<e.length;z++)if(m.intersectsOBB(e[z].obb)){for(let M=0;M<e[z].points.length&&!(m.containsPoint(e[z].points[M])&&(h==0&&p.push(e[z].points[M]),e[z].points[M].z>i.z&&e[z].points[M].z-i.z<1&&(w++,w>10&&h!=0)));M++);if(w>10&&(y=!0),h!=0&&y)break}if(s==0&&(s=de(p).maxz),y){let z=qt(g[1],g[2]);z.z+=t[r].stairStepHeight,c.push(z)}g=[],g=[l,d],g.push(g[1].clone().addScaledVector(t[r].vecStepWidth,t[r].stairStepWidth)),g.push(g[0].clone().addScaledVector(t[r].vecStepWidth,t[r].stairStepWidth)),x=g.map(z=>[z.x,z.y]),g.push(new Z.Vector3(g[3].x,g[3].y,g[3].z+o)),g.push(new Z.Vector3(g[2].x,g[2].y,g[2].z+o)),g.push(new Z.Vector3(g[1].x,g[1].y,g[1].z+o)),g.push(new Z.Vector3(g[0].x,g[0].y,g[0].z+o)),b=de(g),m=Ee(x,{x:b.x,y:b.y,z:b.z},b.h,(b.maxz+b.minz)/2),p=[],y=!1;for(let z=0;z<e.length;z++)if(m.intersectsOBB(e[z].obb)){let M=0;for(let P=0;P<e[z].points.length&&!(m.containsPoint(e[z].points[P])&&(h==0&&p.push(e[z].points[P]),e[z].points[P].z>i.z&&e[z].points[P].z-i.z<1&&(M++,M>10&&h!=0)));P++);if(M>10&&(y=!0),h!=0&&y)break}if(s==0&&(s=de(p).maxz),y){let z=qt(g[1],g[2]);z.z+=t[r].stairStepHeight,a.push(z)}i=i.addScaledVector(t[r].vecStepWidth,t[r].stairStepWidth),i=i.addScaledVector(t[r].vecStepHeight,t[r].stairStepHeight),l=l.addScaledVector(t[r].vecStepWidth,t[r].stairStepWidth),l=l.addScaledVector(t[r].vecStepHeight,t[r].stairStepHeight),f=f.addScaledVector(t[r].vecStepWidth,t[r].stairStepWidth),f=f.addScaledVector(t[r].vecStepHeight,t[r].stairStepHeight),d=d.addScaledVector(t[r].vecStepWidth,t[r].stairStepWidth),d=d.addScaledVector(t[r].vecStepHeight,t[r].stairStepHeight)}c.length>t[r].stairStepNum-3&&(t[r].stairBottom1BalconyRailing=c),a.length>t[r].stairStepNum-3&&(t[r].stairBottom2BalconyRailing=a),t[r].balconyRailingHeight=s}};function ys(t,e={}){let{binCount:n=80,minBinPoints:o=5,sideK:s=3,zK:r=3,minSideRange:i=.2,minZRange:l=.2,maxSearchBins:f=3,lowerZScale:d=1,upperZScale:u=1}=e;if(!t||t.length===0)return[];let c=t.map((H,A)=>({index:A,x:H.x,y:H.y,z:H.z,raw:H})),a=0,h=0;for(let H of c)a+=H.x,h+=H.y;a/=c.length,h/=c.length;let g=0,x=0,b=0;for(let H of c){let A=H.x-a,k=H.y-h;g+=A*A,x+=A*k,b+=k*k}g/=c.length,x/=c.length,b/=c.length;let m=g+b,p=Math.sqrt((g-b)*(g-b)+4*x*x),y=(m+p)/2,w,z;Math.abs(x)>1e-8?(w=y-b,z=x):g>=b?(w=1,z=0):(w=0,z=1);let M=Math.sqrt(w*w+z*z)||1;w/=M,z/=M;let P=-z,E=w,T=1/0,V=-1/0,_=c.map(H=>{let A=H.x-a,k=H.y-h,O=A*w+k*z,N=A*P+k*E;return T=Math.min(T,O),V=Math.max(V,O),{...H,t:O,side:N}}),S=(V-T||1)/n,R=new Map;for(let H of _){let A=Math.floor((H.t-T)/S);A<0&&(A=0),A>=n&&(A=n-1),R.has(A)||R.set(A,[]),R.get(A).push(H)}let D=new Map;for(let[H,A]of R){if(A.length<o)continue;let k=A.map(q=>q.side).sort((q,X)=>q-X),O=A.map(q=>q.z).sort((q,X)=>q-X),N=eo(k),L=eo(O),B=eo(k.map(q=>Math.abs(q-N)).sort((q,X)=>q-X)),$=eo(O.map(q=>Math.abs(q-L)).sort((q,X)=>q-X)),G=Math.max(i,B*1.4826*s),Q=Math.max(l,$*1.4826*r);D.set(H,{sideMedian:N,zMedian:L,sideRange:G,zRange:Q})}function W(H){if(D.has(H))return D.get(H);for(let A=1;A<=f;A++){if(D.has(H-A))return D.get(H-A);if(D.has(H+A))return D.get(H+A)}return null}let I=[],C=[];for(let H of _){let A=Math.floor((H.t-T)/S);A<0&&(A=0),A>=n&&(A=n-1);let k=W(A);if(!k){C.push(H.raw);continue}let O=Math.abs(H.side-k.sideMedian)<=k.sideRange,N=k.zMedian-k.zRange*d,L=k.zMedian+k.zRange*u,B=H.z>=N&&H.z<=L;O&&B?I.push(H.raw):C.push(H.raw)}return{keep:I,removed:C,debug:{meanX:a,meanY:h,dirX:w,dirY:z,sideX:P,sideY:E,minT:T,maxT:V,binSize:S,stats:D}}}function eo(t){if(t.length===0)return 0;let e=Math.floor(t.length/2);return t.length%2===0?(t[e-1]+t[e])/2:t[e]}function Fa(t,e){let n=new Map;for(let o=0;o<t.length;o++){let s=t[o],r=Math.floor(s.x/e),i=Math.floor(s.y/e),l=Math.floor(s.z/e),f=`${r},${i},${l}`;n.has(f)||n.set(f,[]),n.get(f).push(o)}return n}function Na(t,e,n,o,s){let r=t[n],i=Math.floor(r.x/o),l=Math.floor(r.y/o),f=Math.floor(r.z/o),d=[];for(let u=-1;u<=1;u++)for(let c=-1;c<=1;c++)for(let a=-1;a<=1;a++){let h=`${i+u},${l+c},${f+a}`,g=e.get(h);if(g)for(let x of g){if(x===n)continue;let b=t[x],m=r.x-b.x,p=r.y-b.y,y=r.z-b.z;m*m+p*p+y*y<=s&&d.push(x)}}return d}function bs(t,e={}){let{radius:n=.35,minClusterSize:o=20,lowPercent:s=.35}=e,r=qa(t,{radius:n}),i=t.map(u=>u.z).sort((u,c)=>u-c),l=i[Math.floor(i.length*s)],f=[],d=[];for(let u of r.clusters){let c=u.map(g=>r.points[g]),a=c.reduce((g,x)=>g+x.z,0)/c.length;c.length<o&&a<=l?d.push(...c.map(g=>g.raw)):f.push(...c.map(g=>g.raw))}return{keep:f,removed:d}}function qa(t,e={}){let{radius:n=.35}=e,o=t.map((f,d)=>({index:d,x:f.x,y:f.y,z:f.z,raw:f})),s=Fa(o,n),r=n*n,i=new Array(o.length).fill(!1),l=[];for(let f=0;f<o.length;f++){if(i[f])continue;let d=[],u=[f];for(i[f]=!0;u.length>0;){let c=u.shift();d.push(c);let a=Na(o,s,c,n,r);for(let h of a)i[h]||(i[h]=!0,u.push(h))}l.push(d)}return{points:o,clusters:l}}function $a(t,e,n=1e-6){let o=ja(e);for(let s of o)if(!Xa(t,s,n))return!1;return!0}function ja(t){let e=t.center,n=t.halfSize,o=t.rotation.elements,s=new Z.Vector3(o[0],o[1],o[2]).multiplyScalar(n.x),r=new Z.Vector3(o[3],o[4],o[5]).multiplyScalar(n.y),i=new Z.Vector3(o[6],o[7],o[8]).multiplyScalar(n.z),l=[];for(let f of[-1,1])for(let d of[-1,1])for(let u of[-1,1]){let c=e.clone().addScaledVector(s,f).addScaledVector(r,d).addScaledVector(i,u);l.push(c)}return l}function Xa(t,e,n=1e-6){let o=new Z.Vector3().subVectors(e,t.center),s=t.rotation.elements,r=t.halfSize,i=new Z.Vector3(s[0],s[1],s[2]),l=new Z.Vector3(s[3],s[4],s[5]),f=new Z.Vector3(s[6],s[7],s[8]),d=o.dot(i),u=o.dot(l),c=o.dot(f);return Math.abs(d)<=r.x+n&&Math.abs(u)<=r.y+n&&Math.abs(c)<=r.z+n}function Ga(t,e,n,o){return 1+(t[e][0]===0||t[n][0]===0||t[o][0]===0?1:0)}function Za(t,e,n,o,s,r){let i=Math.hypot(n-s,o-r),l=Math.hypot(t-s,e-r),f=Math.hypot(t-n,e-o),d=Math.abs((n-t)*(r-e)-(s-t)*(o-e))/2;return d===0?1/0:i*l*f/(4*d)}function Ya(t){if(!t||t.length<3)return[];let e=new Set,n=[];for(let g of t){let x=`${g[0]}_${g[1]}`;e.has(x)||(e.add(x),n.push(g))}if(n.length<3)return[];let o=new We(Float64Array.from(n.flat())),{triangles:s}=o;if(!s.length)return[];let r=new Map,i=(g,x)=>g<x?`${g}_${x}`:`${x}_${g}`;for(let g=0;g<s.length;g+=3){let x=s[g],b=s[g+1],m=s[g+2],[p,y]=n[x],[w,z]=n[b],[M,P]=n[m],E=Za(p,y,w,z,M,P),T=Ga(n,x,b,m);if(E<=1/T)for(let[V,_]of[[x,b],[b,m],[m,x]]){let v=i(V,_);r.set(v,(r.get(v)||0)+1)}}let l=[];for(let[g,x]of r)x===1&&l.push(g.split("_").map(Number));if(!l.length)return[];let f=new Map;for(let[g,x]of l)(f.get(g)||f.set(g,[]).get(g)).push(x),(f.get(x)||f.set(x,[]).get(x)).push(g);let d=l[0][0],u=[],c=new Set,a=d,h=-1;do{u.push(n[a]),c.add(a);let g=f.get(a)||[],x=g.find(b=>b!==h&&!c.has(b));if(x===void 0&&(x=g.find(b=>b!==h)),x===void 0)break;h=a,a=x}while(a!==d&&u.length<=l.length+1);return u.length>0&&u.push(u[0]),u}function $e(t,e){let n=t.x-e.x,o=t.y-e.y;return Math.sqrt(n*n+o*o)}function je(t){let e=0,n=0,o=0;for(let s=0;s<4;s++){let r=t[s],i=t[(s+1)%4],l=i.x-r.x,f=i.y-r.y,d=Math.sqrt(l*l+f*f);d>e&&(e=d,n=l/d,o=f/d)}return{longSide:e,dirX:n,dirY:o}}function Xe(t,e,n){let s=[];for(let r of t){let i=(r.start.x+r.end.x)/2,l=(r.start.y+r.end.y)/2,f=i-e,d=l-n;f*f+d*d<=9&&s.push(r.start.z,r.end.z)}if(s.length===0){let r=[];for(let i of t)r.push(i.start.z,i.end.z);return r.length?(r.sort((i,l)=>i-l),r[Math.floor(r.length/2)]):-1/0}return s.sort((r,i)=>r-i),s[Math.floor(s.length/2)]}function Ve(t,e,n,o,s,r){let i=s-n,l=r-o,f=i*i+l*l;if(f<1e-12)return{dist:Math.sqrt((t-n)**2+(e-o)**2),t:0};let d=t-n,u=e-o,c=(d*i+u*l)/f,a=n+c*i,h=o+c*l;return{dist:Math.sqrt((t-a)**2+(e-h)**2),t:c}}function Fo(t,e,n){let o=0;for(let s=0;s<4;s++){let r=n[s],i=n[(s+1)%4],l=(i.x-r.x)*(e-r.y)-(i.y-r.y)*(t-r.x);if(Math.abs(l)<1e-12)continue;let f=l>0?1:-1;if(o===0)o=f;else if(o!==f)return!1}return!0}function ws(t,e,n,o,s,r,i,l){let f=n-t,d=o-e,u=i-s,c=l-r,a=f*c-d*u;if(Math.abs(a)<1e-12)return null;let h=((s-t)*c-(r-e)*u)/a,g=((s-t)*d-(r-e)*f)/a;return h<-1e-12||h>1+1e-12||g<-1e-12||g>1+1e-12?null:Math.max(0,Math.min(1,h))}function zs(t,e,n,o,s){let r=[];Fo(t,e,s)&&r.push(0),Fo(n,o,s)&&r.push(1);for(let f=0;f<4;f++){let d=s[f],u=s[(f+1)%4],c=ws(t,e,n,o,d.x,d.y,u.x,u.y);c!==null&&r.push(c)}if(r.length<2)return 0;r.sort((f,d)=>f-d);let i=Math.sqrt((n-t)**2+(o-e)**2),l=0;for(let f=0;f<r.length-1;f++){let d=r[f],u=r[f+1],c=(d+u)/2,a=t+c*(n-t),h=e+c*(o-e);Fo(a,h,s)&&(l+=(u-d)*i)}return l}function Ms(t,e,n=1e-6){let o=[],s=t.start.x,r=t.start.y,i=t.end.x,l=t.end.y;for(let u of e){if(u===t)continue;let c=ws(s,r,i,l,u.start.x,u.start.y,u.end.x,u.end.y);c!==null&&c>n&&c<1-n&&o.push(c)}o.sort((u,c)=>u-c);let f=[],d=-1/0;for(let u of o)u-d>n&&(f.push(u),d=u);return f}function Es(t,e){if(!e.length)return[t];let n=[],o=0;for(let r of e){let i=t.start.x+r*(t.end.x-t.start.x),l=t.start.y+r*(t.end.y-t.start.y),f=t.start.z+r*(t.end.z-t.start.z),d=o===0?{...t.start}:{x:t.start.x+o*(t.end.x-t.start.x),y:t.start.y+o*(t.end.y-t.start.y),z:t.start.z+o*(t.end.z-t.start.z)},u={...t,start:d,end:{x:i,y:l,z:f},length:t.length*(r-o)};u.drawWindow=void 0,u.isWindow=!1,n.push(u),o=r}let s={...t,start:{x:t.start.x+o*(t.end.x-t.start.x),y:t.start.y+o*(t.end.y-t.start.y),z:t.start.z+o*(t.end.z-t.start.z)},end:{...t.end},length:t.length*(1-o)};return s.drawWindow=void 0,s.isWindow=!1,n.push(s),n}function Ua(t,e,n=.15){let o=0,s=0;for(let i of e)i!==t&&(($e(t.start,i.start)<=n||$e(t.start,i.end)<=n)&&o++,($e(t.end,i.start)<=n||$e(t.end,i.end)<=n)&&s++);let r=0;return o>=1&&s>=1?r=5:(o>=1||s>=1)&&(r=2),{left:o,right:s,score:r}}function Ka(t,e){let n=[],{start:o,end:s}=t;for(let l of e){let{dist:f}=Ve(l.x,l.y,o.x,o.y,s.x,s.y);n.push(f)}let r=n.reduce((l,f)=>l+f,0)/n.length,i=n.reduce((l,f)=>l+(f-r)**2,0)/n.length;return i<.01?3:i<.05?2:i<.1?1:0}function Qa(t,e,n=.15){let o=t.end.x-t.start.x,s=t.end.y-t.start.y,r=Math.sqrt(o*o+s*s);if(r<1e-12)return 0;let i=-s/r,l=o/r,f=[[],[]];for(let c=0;c<2;c++){let a=c===0?t.start:t.end;for(let h of e){if(h===t)continue;let g=$e(a,h.start),x=$e(a,h.end),b=null;if(g<=n?b=h.end:x<=n&&(b=h.start),!b)continue;let m=h.end.x-h.start.x,p=h.end.y-h.start.y,y=Math.sqrt(m*m+p*p);if(y<1e-12||Math.abs(o*m+s*p)/(r*y)>=.342)continue;let z=(b.x-a.x)*i+(b.y-a.y)*l;f[c].push(z>0?1:-1)}}if(f[0].length===0||f[1].length===0)return 0;let d=[...f[0],...f[1]];return d.every(c=>c===d[0])?2:1}function Ps(t,e,n){let o=Ua(t,n),s=Ka(t,e),r=Qa(t,n);return{score:o.score*3+s*2+r*2,details:{conn:o.score,variance:s,sameSide:r}}}function Ja(t){let e=t.end.x-t.start.x,n=t.end.y-t.start.y,o=Math.atan2(n,e)*(180/Math.PI);return o<0&&(o+=180),o}function tl(t,e){let n=[];for(let o of t){let s=!1;for(let r of n){let i=Math.abs(o.angle-r[0].angle);if(Math.min(i,180-i)<=e){r.push(o),s=!0;break}}s||n.push([o])}return n}function el(t,e=.05){let n=[];for(let o of t){let s=!1;for(let r of n)if(Math.abs(o.offset-r[0].offset)<=e){r.push(o),s=!0;break}s||n.push([o])}return n}function nl(t,e,n,o,s){let r=[];for(let d of t){let u=d.seg,c=(u.start.x-e.start.x)*n+(u.start.y-e.start.y)*o,a=(u.end.x-e.start.x)*n+(u.end.y-e.start.y)*o;c<=a?r.push({l:c,r:a,idx:d.idx,startPt:u.start,endPt:u.end}):r.push({l:a,r:c,idx:d.idx,startPt:u.end,endPt:u.start})}r.sort((d,u)=>d.l-u.l);let i=[],l=.2,f=.5;for(let{l:d,r:u,idx:c,startPt:a,endPt:h}of r){if(i.length===0){i.push({l:d,r:u,srcIdxs:[c],startPt:a,endPt:h});continue}let g=i[i.length-1];if(d<=g.r+s){let x=Math.min(g.r,u)-Math.max(g.l,d),b=Math.hypot(g.endPt.x-a.x,g.endPt.y-a.y);x>=f||b<=l?(d<g.l&&(g.l=d,g.startPt=a),u>g.r&&(g.r=u,g.endPt=h),g.srcIdxs.includes(c)||g.srcIdxs.push(c)):i.push({l:d,r:u,srcIdxs:[c],startPt:a,endPt:h})}else i.push({l:d,r:u,srcIdxs:[c],startPt:a,endPt:h})}return i}function ol(t,e,n,o,s,r,i){let l=Math.hypot(n.x-e.x,n.y-e.y),f={...t};return f.start={...e},f.end={...n},f.length=l,f.direction={x:o,y:s,z:0},r!==void 0&&(f.rooftopPz=r),f.buildRosource=i,f.isRebuild=!1,f.doorAndBeamData||(f.doorAndBeamData=[]),f.insetionArr||(f.insetionArr=[]),f}function rl(t,e){let n=!0;for(;n;){n=!1;for(let o=0;o<t.length;o++)for(let s=o+1;s<t.length;s++){let r=t[o],i=t[s];if(r.rooftopPz!==void 0&&i.rooftopPz!==void 0&&Math.abs(r.rooftopPz-i.rooftopPz)>.05)continue;let l=Math.abs(r.end.x-i.start.x)<.001&&Math.abs(r.end.y-i.start.y)<.001,f=Math.abs(r.start.x-i.end.x)<.001&&Math.abs(r.start.y-i.end.y)<.001,d=Math.abs(r.end.x-i.end.x)<.001&&Math.abs(r.end.y-i.end.y)<.001,u=Math.abs(r.start.x-i.start.x)<.001&&Math.abs(r.start.y-i.start.y)<.001;if(!(l||f||d||u)||r.direction.x*i.direction.x+r.direction.y*i.direction.y<.98)continue;let a=r.start,h=r.end;l?h=i.end:f?a=i.start:d?h=i.start:u&&(a=i.end);let g=Math.hypot(h.x-a.x,h.y-a.y),x={...r};x.start=a,x.end=h,x.length=g,x.direction={x:(h.x-a.x)/g,y:(h.y-a.y)/g,z:0},r.rooftopPz!==void 0&&i.rooftopPz!==void 0?x.rooftopPz=Math.max(r.rooftopPz,i.rooftopPz):x.rooftopPz=r.rooftopPz!==void 0?r.rooftopPz:i.rooftopPz,x.buildRosource=r.buildRosource||i.buildRosource,x.isRebuild=!1,x.doorAndBeamData||(x.doorAndBeamData=[]),x.insetionArr||(x.insetionArr=[]),t[o]=x,e[o]=[...new Set([...e[o],...e[s]])],t.splice(s,1),e.splice(s,1),s--,n=!0}}return{segments:t,sourceMap:e}}function Ge(t,e=5,n=.05){if(t.length<=1)return{segments:t,sourceMap:t.map((f,d)=>[d])};let o=t.map((f,d)=>({seg:f,angle:Ja(f),idx:d}));o.sort((f,d)=>f.angle-d.angle);let s=tl(o,e),r=[],i=[],l=[];for(let f of s){let d=f[0].seg;for(let m of f)m.seg.length>d.length&&(d=m.seg);let u=d.end.x-d.start.x,c=d.end.y-d.start.y,a=Math.sqrt(u*u+c*c);if(a<1e-12)continue;let h=-c/a,g=u/a,x=f.map(m=>{let p=m.seg.start.x-d.start.x,y=m.seg.start.y-d.start.y;return{seg:m.seg,offset:Math.abs(p*h+y*g),idx:m.idx}});x.sort((m,p)=>m.offset-p.offset);let b=el(x);for(let m of b){let p=m[0].seg;for(let S of m)S.seg.length>p.length&&(p=S.seg);let y=p.end.x-p.start.x,w=p.end.y-p.start.y,z=Math.sqrt(y*y+w*w);if(z<1e-12)continue;let M=y/z,P=w/z,E=m.map(S=>S.seg.rooftopPz).filter(S=>S!==void 0),T=E.length>0?Math.max(...E):void 0,V=[...new Set(E.map(S=>S.toFixed(3)))];if(V.length>1){let S=m.map(R=>({idx:R.idx,start:{x:R.seg.start.x,y:R.seg.start.y,z:R.seg.start.z},end:{x:R.seg.end.x,y:R.seg.end.y,z:R.seg.end.z},length:R.seg.length,rooftopPz:R.seg.rooftopPz}));l.push({values:[...V],segments:S})}let _=[...new Set(m.map(S=>String(S.seg.buildRosource)))],v=nl(m,p,M,P,n);for(let{l:S,r:R,srcIdxs:D,startPt:W,endPt:I}of v){if(R-S<.01)continue;let C=ol(p,W,I,M,P,T,p.buildRosource);r.push(C),i.push(D)}}}return{...rl(r,i),debugRPZGroups:l}}function sl(t){return{minLengthRatio:.95,maxDistance:.5,angleThreshold:45,projectionMargin:.1,printOnly:!0,minEmbedRatioThreshold:.3,noWallSurroundDistance:.3,minEmbedRatio:.05,...t}}function il(t,e,n){return[{x:e,y:n,z:0},{x:t[0].x,y:t[0].y,z:0},{x:t[1].x,y:t[1].y,z:0},{x:t[2].x,y:t[2].y,z:0},{x:t[3].x,y:t[3].y,z:0}]}function al(t,e,n,o,s,r,i,l,f){if(!["1527725434500","1527725386500","1527726772000","1527725058500"].some(c=>t.includes(c)))return;e.map(c=>{let{start:a,end:h}=c,g=Ve(n,o,a.x,a.y,h.x,h.y),x=s.map(z=>{let M=Ve(z.x,z.y,a.x,a.y,h.x,h.y);return`t=${M.t.toFixed(3)},d=${M.dist.toFixed(3)}`}),b=h.x-a.x,m=h.y-a.y,p=Math.sqrt(b*b+m*m)||1,y=Math.abs(i*(b/p)+l*(m/p)),w=Math.acos(Math.min(y,1))*(180/Math.PI);return{seg:c,lineDist:g.dist,t:g.t,pts:x,angle:w,length:c.length}}).sort((c,a)=>c.lineDist-a.lineDist)}function ll(t,e,n,o,s,r,i){let l=[{margin:r.projectionMargin,maxDist:r.maxDistance,label:"\u4E25\u683C"},{margin:.4,maxDist:.65,label:"\u5BBD\u677E"}],f=[];for(let d of l){if(f.length>0)break;for(let u of t){let c=!1,a=!1,h=!1,g=e*r.minLengthRatio;if(u.length<g){continue}c=!0;let{start:x,end:b}=u,m=!1,p=1/0;for(let v of s){let{dist:S,t:R}=Ve(v.x,v.y,x.x,x.y,b.x,b.y);R>=-d.margin&&R<=1+d.margin&&S<=d.maxDist&&(m=!0,p=Math.min(p,S))}if(!m){`${d.maxDist}${(-d.margin).toFixed(1)}${(1+d.margin).toFixed(1)}`;continue}a=!0;let y=Ve(s[0].x,s[0].y,x.x,x.y,b.x,b.y);if(y.t<0||y.t>1){`${y.t.toFixed(3)}`;continue}let w=Math.sqrt((b.x-x.x)**2+(b.y-x.y)**2);if(w<1e-12)continue;let z=(b.x-x.x)/w,M=(b.y-x.y)/w,P=Math.abs(n*z+o*M),E=Math.acos(Math.min(P,1))*(180/Math.PI);if(E>r.angleThreshold){`${E.toFixed(1)}${r.angleThreshold}`;continue}h=!0;let T=[s[1],s[2],s[3],s[4]],V=zs(x.x,x.y,b.x,b.y,T),_=e>0?V/e:0;f.push({seg:u,minDist:p,embedRatio:_,ratio:u.length/e,score:0,details:{conn:0,variance:0,sameSide:0}})}}return f}function cl(t,e,n,o){if(t.length<=1)return t.length===1&&(t[0].score=-1),t;for(let s of t){let{score:r,details:i}=Ps(s.seg,e,n);s.score=r,s.details=i}return t.sort((s,r)=>r.embedRatio-s.embedRatio||r.score-s.score||s.minDist-r.minDist),t}function ul(t,e,n,o){let s=t.end.x-t.start.x,r=t.end.y-t.start.y,i=Math.sqrt(s*s+r*r),l=s/i,f=r/i,d=e.map(P=>{let E=P.x-t.start.x,T=P.y-t.start.y;return(E*l+T*f)/i}),u=Math.min(...d),c=Math.max(...d),a=(c-u)*i,h=(u+c)/2,g=t.start.x+h*s,x=t.start.y+h*r,b=n.box.min.z,m=n.box.max.z,p=Math.abs(m-b),y=Xe(o,t.start.x,t.start.y),w=Math.max(0,b-y),z=u<=0&&c>=1,M=t.start.z+h*(t.end.z-t.start.z);return{p:{x:g,y:x,z:M},width:a,full:z,height:p,groundClearance:w}}function No(t,e,n){let o=e.map(u=>n[u]),s=[],r=[],i=[],l=[],f,d;for(let u of o){if(u.originalPoints?.length)for(let c of u.originalPoints)s.push(c);if(u.doorAndBeamData?.length)for(let c of u.doorAndBeamData)r.push(c);if(u.insetionArr?.length)for(let c of u.insetionArr)i.push(c);if(u.drawWindow?.length)for(let c of u.drawWindow)l.push(c);u.boxData&&!f&&(f=u.boxData),u.rooftopPz!==void 0&&(d===void 0||u.rooftopPz>d)&&(d=u.rooftopPz)}s.length&&(t.originalPoints=s),r.length&&(t.doorAndBeamData=r),i.length&&(t.insetionArr=i),l.length&&(t.drawWindow=l),f&&(t.boxData=f),d!==void 0&&(t.rooftopPz=d)}function Pn(t,e,n=10,o=.2,s=.2){let r=[];if(!t.drawWindow)return r;let i=t.drawWindow.p,l=t.wallSegment,f=l.end.x-l.start.x,d=l.end.y-l.start.y,u=Math.sqrt(f*f+d*d)||1,c=f/u,a=d/u,h=i.x-l.start.x,g=i.y-l.start.y,x=(h*c+g*a)/u;for(let b of e){if(b===l)continue;let m=b.end.x-b.start.x,p=b.end.y-b.start.y,y=Math.sqrt(m*m+p*p)||1,w=m/y,z=p/y,M=Math.abs(c*w+a*z),E=Math.acos(Math.min(M,1))*(180/Math.PI);if(Math.abs(E-90)>n)continue;let T=[b.start,b.end];for(let V of T){let _=V.x-l.start.x,v=V.y-l.start.y,S=(_*c+v*a)/u,R=l.start.x+S*u*c,D=l.start.y+S*u*a;if(Math.sqrt((V.x-R)**2+(V.y-D)**2)>s)continue;let I=Math.abs((S-x)*u);if(I<=o){r.push({seg:b,distAlongWall:I,angle:E,endPoint:V});break}}}return r}function Sn(t,e){let n=t.start,o=t.end,s=o.x-n.x,r=o.y-n.y,i=Math.sqrt(s*s+r*r)||1,l=((e.x-n.x)*s+(e.y-n.y)*r)/(i*i),f=Math.max(0,Math.min(1,l)),d={x:n.x+f*s,y:n.y+f*r,z:n.z+(o.z-n.z)*f||0};function u(y){if(!y||!y.length)return[[],[]];let w=[],z=[];for(let M of y){let P=((M.x-n.x)*s+(M.y-n.y)*r)/(i*i);P<=f+1e-8&&w.push(M),P>=f-1e-8&&z.push(M)}return(w.length===0||c(w[w.length-1],d)>1e-6)&&w.push({...d}),(z.length===0||c(z[0],d)>1e-6)&&z.unshift({...d}),[w,z]}function c(y,w){return Math.sqrt((y.x-w.x)**2+(y.y-w.y)**2)}let[a,h]=u(t.originalPoints),g=Math.max(f*i,1e-6),x=Math.max((1-f)*i,1e-6),b=t.direction||{x:s/i,y:r/i,z:(o.z-n.z)/i||0},m={...t,start:{...n},end:{...d},length:g,direction:{...b},originalPoints:a.length?a:void 0},p={...t,start:{...d},end:{...o},length:x,direction:{...b},originalPoints:h.length?h:void 0};if(t.drawWindow&&t.drawWindow.length>0){let y=[],w=[];for(let z of t.drawWindow){let M=((z.p.x-n.x)*s+(z.p.y-n.y)*r)/(i*i);M<=f+1e-8&&y.push(z),M>=f-1e-8&&w.push(z)}m.drawWindow=y.length?y:void 0,p.drawWindow=w.length?w:void 0}else m.drawWindow=void 0,p.drawWindow=void 0;if(t.boxData){let y=w=>{if(!w.length)return;let z=1/0,M=1/0,P=1/0,E=-1/0,T=-1/0,V=-1/0;for(let _ of w)_.x<z&&(z=_.x),_.y<M&&(M=_.y),_.z!==void 0&&_.z<P&&(P=_.z),_.x>E&&(E=_.x),_.y>T&&(T=_.y),_.z!==void 0&&_.z>V&&(V=_.z);return{isBox3:!0,min:{x:z,y:M,z:P},max:{x:E,y:T,z:V}}};m.boxData=y(a),p.boxData=y(h)}return[m,p]}function Tn(t,e,n,o){let s=sl(n),r=[],{segments:i,sourceMap:l}=o??Ge(e),f=i;for(let d of t){let u=d.coordinatesByArea?.coordinates;if(!u||u.length<4)continue;let c=u.slice(0,4),a=c.reduce((V,_)=>V+_.x,0)/4,h=c.reduce((V,_)=>V+_.y,0)/4,{longSide:g,dirX:x,dirY:b}=je(c);if(g<.01)continue;let m=c.reduce((V,_)=>V+_.z,0)/4,p=Xe(e,a,h);if(m<p-.3)continue;let y=il(c,a,h);al(d.name,f,a,h,y,g,x,b,s);let w=ll(f,g,x,b,y,s,d.name);if(w.length>1&&s.minEmbedRatioThreshold>0){let V=Math.max(...w.map(_=>_.embedRatio));if(V>0){let _=w.length;w=w.filter(v=>v.embedRatio>=V*s.minEmbedRatioThreshold)}}if(w.length>0&&s.minEmbedRatio>0){let V=w.length;w=w.filter(_=>_.embedRatio>=s.minEmbedRatio)}w=cl(w,y,e,d.name);let z=null,M=1/0,P=0,E=0;if(w.length>0){let V=w[0];z=V.seg,M=V.minDist,P=V.ratio,E=V.embedRatio}if(z&&E<=0&&s.noWallSurroundDistance>0){let V=s.noWallSurroundDistance,_=c.map(C=>C.x),v=c.map(C=>C.y),S=Math.min(..._)-V,R=Math.max(..._)+V,D=Math.min(...v)-V,W=Math.max(...v)+V,I=!1;for(let C of f){let H=Math.min(C.start.x,C.end.x),A=Math.max(C.start.x,C.end.x),k=Math.min(C.start.y,C.end.y),O=Math.max(C.start.y,C.end.y);if(!(A<S||H>R)&&!(O<D||k>W)){I=!0;break}}I||(z=null)}let T;if(z&&(T=ul(z,c,d,i),!s.printOnly)){let V=z;V.drawWindow||(V.drawWindow=[]),V.drawWindow.push(T),V.isWindow=!0}if(z){let V={windowName:d.name,windowCategory:d.category,windowCenter:d.center,wallSegment:z,distance:M,wallLengthRatio:P,drawWindow:T};r.push(V)}}for(let d of r){let u=d.wallSegment,c=i.indexOf(u);if(c===-1)continue;let a=l[c];!a||a.length<=1||No(u,a,e)}return r}function qo(t,e,n){let o={printOnly:!1,skipMerge:!1,...n};for(let b of t)b.drawWindow&&(b.drawWindow=void 0),b.isWindow&&(b.isWindow=void 0);let s=Array.isArray(e)?e.filter(b=>b&&b.category==="window"&&!b.isBayWindowObj):[],r,i;if(o.skipMerge)r=t,i=t.map((b,m)=>[m]);else{let b=Ge(t);r=b.segments,i=b.sourceMap}let l=Tn(s,t,o,{segments:r,sourceMap:i}),f=new Set;for(let b of l){let m=r.indexOf(b.wallSegment);m>=0&&f.add(m)}let d=[],u=new Set;for(let b of f){let m=i[b];if(m){No(r[b],m,t);for(let p of m)u.add(p)}d.push(r[b])}for(let b=0;b<t.length;b++)u.has(b)||d.push(t[b]);let c=new Set(l.map(b=>b.windowName));for(let b of e)b&&b.category==="window"&&!b.isBayWindowObj&&(c.has(b.name)?delete b.AbnormalWindow:b.AbnormalWindow=!0);let a=new Map;for(let b of e)b&&b.name&&a.set(b.name,b);let h=new Map;for(let b of l){let m=b.wallSegment;h.has(m)||h.set(m,[]),h.get(m).push(b)}let g=new Map,x=d;for(let[b,m]of h){if(!b.drawWindow||!b.drawWindow.length||g.has(b))continue;let p=b.length,y=b.end.x-b.start.x,w=b.end.y-b.start.y,z=[];for(let S of m){if(!S.drawWindow)continue;let R=S.drawWindow.width/2,D=((S.drawWindow.p.x-b.start.x)*y+(S.drawWindow.p.y-b.start.y)*w)/(p*p),W=R/p;z.push({left:D-W,right:D+W,match:S})}if(z.length===0)continue;let M=Ms(b,x),P=1e-6,E=new Set,T=!1;for(let S of z){let R=!1,D=!1,W=null;for(let C of M)C<S.left-P&&((W===null||C>W)&&(W=C),R=!0);let I=null;for(let C of M)C>S.right+P&&((I===null||C<I)&&(I=C),D=!0);W!==null&&(E.add(W),T=!0),I!==null&&(E.add(I),T=!0)}if(!T)continue;let V=!1,_=null,v=null;for(let S of z){let R=S.match;if(!R.drawWindow||R.drawWindow.width<=1)continue;let D=a.get(R.windowName);if(!D||!D.positionArr||!D.positionArr.length)continue;let W=Pn(R,r);if(W.length<=1)continue;let I=D.positionArr[0],C=R.drawWindow.p,H=I.x-C.x,A=I.y-C.y,k=Math.sqrt(H*H+A*A);if(k<.001)continue;let O=H/k,N=A/k,L=W.filter(B=>{let $=(B.seg.start.x+B.seg.end.x)/2,G=(B.seg.start.y+B.seg.end.y)/2,Q=$-C.x,q=G-C.y;return Q*O+q*N>0});if(L.length){V=!0,_=L[0].endPoint,v=R;break}}if(V&&_&&v){let[S,R]=Sn(b,_);g.set(b,[S,R]);let D=((v.drawWindow.p.x-b.start.x)*y+(v.drawWindow.p.y-b.start.y)*w)/(p*p),W=((_.x-b.start.x)*y+(_.y-b.start.y)*w)/(p*p);D<=W?v.wallSegment=S:v.wallSegment=R}else{let S=Array.from(E).sort((D,W)=>D-W),R=Es(b,S);for(let D of z){let W=(D.left+D.right)/2,I=0;for(let C of R){let H=C.length/p;if(W>=I-P&&W<=I+H+P){let A=D.match.drawWindow;A&&(C.drawWindow||(C.drawWindow=[]),C.drawWindow.push(A),C.isWindow=!0),D.match.wallSegment=C;break}I+=H}}g.set(b,R)}}if(g.size>0){let b=[];for(let m of d)g.has(m)?b.push(...g.get(m)):b.push(m);for(let m of b)m.isWindow===void 0&&(m.isWindow=!!(m.drawWindow&&m.drawWindow.length>0));return{segments:b,matches:l}}for(let b of d)b.isWindow=!!(b.drawWindow&&b.drawWindow.length>0);return{segments:d,matches:l}}function Ze(t,e){let n=t.x-e.x,o=t.y-e.y;return Math.sqrt(n*n+o*o)}function no(t){let e=0,n=1/0,o=0,s=0;for(let r=0;r<4;r++){let i=t[r],l=t[(r+1)%4],f=l.x-i.x,d=l.y-i.y,u=Math.sqrt(f*f+d*d);u>e&&(e=u,o=f/u,s=d/u),u<n&&(n=u)}return{longSide:e,shortSide:n===1/0?e:n,dirX:o,dirY:s}}function Ye(t,e,n){let s=[];for(let r of t){let i=(r.start.x+r.end.x)/2,l=(r.start.y+r.end.y)/2,f=i-e,d=l-n;f*f+d*d<=9&&s.push(r.start.z,r.end.z)}if(s.length===0){let r=[];for(let i of t)r.push(i.start.z,i.end.z);return r.length?(r.sort((i,l)=>i-l),r[Math.floor(r.length/2)]):-1/0}return s.sort((r,i)=>r-i),s[Math.floor(s.length/2)]}function $t(t,e,n,o,s,r){let i=s-n,l=r-o,f=i*i+l*l;if(f<1e-12)return{dist:Math.sqrt((t-n)**2+(e-o)**2),t:0};let d=t-n,u=e-o,c=(d*i+u*l)/f,a=n+c*i,h=o+c*l;return{dist:Math.sqrt((t-a)**2+(e-h)**2),t:c}}function $o(t,e,n){let o=0;for(let s=0;s<4;s++){let r=n[s],i=n[(s+1)%4],l=(i.x-r.x)*(e-r.y)-(i.y-r.y)*(t-r.x);if(Math.abs(l)<1e-12)continue;let f=l>0?1:-1;if(o===0)o=f;else if(o!==f)return!1}return!0}function fl(t,e,n,o,s,r,i,l){let f=n-t,d=o-e,u=i-s,c=l-r,a=f*c-d*u;if(Math.abs(a)<1e-12)return null;let h=((s-t)*c-(r-e)*u)/a,g=((s-t)*d-(r-e)*f)/a;return h<-1e-12||h>1+1e-12||g<-1e-12||g>1+1e-12?null:Math.max(0,Math.min(1,h))}function Ts(t,e,n,o,s){let r=[];$o(t,e,s)&&r.push(0),$o(n,o,s)&&r.push(1);for(let f=0;f<4;f++){let d=s[f],u=s[(f+1)%4],c=fl(t,e,n,o,d.x,d.y,u.x,u.y);c!==null&&r.push(c)}if(r.length<2)return 0;r.sort((f,d)=>f-d);let i=Math.sqrt((n-t)**2+(o-e)**2),l=0;for(let f=0;f<r.length-1;f++){let d=r[f],u=r[f+1],c=(d+u)/2,a=t+c*(n-t),h=e+c*(o-e);$o(a,h,s)&&(l+=(u-d)*i)}return l}function Rs(t){if(!t||t.length<4)return[];let e=[...t].sort((i,l)=>i.z-l.z),n=e.slice(0,2),o=e.slice(2,4),s=[],r=new Set;for(let i of n){let l=-1,f=1/0;for(let d=0;d<o.length;d++){if(r.has(d))continue;let u=o[d].x-i.x,c=o[d].y-i.y,a=Math.sqrt(u*u+c*c);a<f&&(f=a,l=d)}if(l>=0){r.add(l);let d=o[l];s.push({bottom:i,top:d,midX:(i.x+d.x)/2,midY:(i.y+d.y)/2,height:Math.abs(d.z-i.z)})}}return s}function Ss(t,e,n){return $t(t.midX,t.midY,e.x,e.y,n.x,n.y)}function Ds(t,e,n,o=.08){if(!t||t.length<2)return null;let s=Ss(t[0],e,n),r=Ss(t[1],e,n);if(s.dist<=o&&r.dist<=o){let i=s.dist<=r.dist?0:1,l=1-i;return{hingeEdge:t[i],otherEdge:t[l],hingeDist:i===0?s.dist:r.dist,otherDist:l===0?s.dist:r.dist,isClosed:!0,hingeT:i===0?s.t:r.t}}if(s.dist<=o||r.dist<=o){let i=s.dist<=o?0:1,l=1-i;return{hingeEdge:t[i],otherEdge:t[l],hingeDist:i===0?s.dist:r.dist,otherDist:l===0?s.dist:r.dist,isClosed:!1,hingeT:i===0?s.t:r.t}}return null}function vs(t){if(!t||t.length<2)return 0;let e=t[0].midX-t[1].midX,n=t[0].midY-t[1].midY;return Math.sqrt(e*e+n*n)}function jo(t){if(!t||!t.start||!t.end)return null;let e=t.start,n=t.end,o=n.x-e.x,s=n.y-e.y,r=Math.sqrt(o*o+s*s)||1,i=0,l=0;return t.centerDir?(i=t.centerDir.x,l=t.centerDir.y):(i=-s/r,l=o/r),{p1:e,p2:n,dirX:o/r,dirY:s/r,length:r,midX:(e.x+n.x)/2,midY:(e.y+n.y)/2,normalX:i,normalY:l}}function Vs(t,e,n,o=.08){let s=jo(t);if(!s)return null;let r=$t(s.p1.x,s.p1.y,e.x,e.y,n.x,n.y),i=$t(s.p2.x,s.p2.y,e.x,e.y,n.x,n.y);if(r.dist<=o&&i.dist<=o){let l=r.dist<=i.dist;return{hingePoint:l?s.p1:s.p2,otherPoint:l?s.p2:s.p1,hingeDist:l?r.dist:i.dist,otherDist:l?i.dist:r.dist,isClosed:!0,hingeT:l?r.t:i.t}}if(r.dist<=o||i.dist<=o){let l=r.dist<=o;return{hingePoint:l?s.p1:s.p2,otherPoint:l?s.p2:s.p1,hingeDist:l?r.dist:i.dist,otherDist:l?i.dist:r.dist,isClosed:!1,hingeT:l?r.t:i.t}}return null}function oo(t,e=.1){let n=t.originalPoints;if(!n||n.length===0)return{densityProfile:[],binStartT:[],binEndT:[],avgDensity:0,maxDensity:0,minDensity:0,binSize:e};let o=t.end.x-t.start.x,s=t.end.y-t.start.y,r=t.length;if(r<=0)return{densityProfile:[],binStartT:[],binEndT:[],avgDensity:0,maxDensity:0,minDensity:0,binSize:e};let i=[];for(let b of n){let m=b.x-t.start.x,p=b.y-t.start.y,y=(m*o+p*s)/(r*r);i.push(Math.max(0,Math.min(1,y)))}let l=Math.max(1,Math.ceil(r/e)),f=r/l,d=new Array(l).fill(0);for(let b of i){let m=Math.min(l-1,Math.floor(b*l));d[m]++}let u=d.map(b=>b/f),c=d.map((b,m)=>m/l),a=d.map((b,m)=>(m+1)/l),h=u.reduce((b,m)=>b+m,0)/l,g=Math.max(...u),x=Math.min(...u);return{densityProfile:u,binStartT:c,binEndT:a,avgDensity:h,maxDensity:g,minDensity:x,binSize:f}}function Is(t){let{densityProfile:e,avgDensity:n}=t;if(e.length===0||n===0)return 0;let o=e.length,s=e.reduce((i,l)=>i+(l-n)**2,0)/o;return Math.sqrt(s)/n}function Cs(t){let e=[];for(let o of t)if(o.originalPoints&&o.originalPoints.length>=50&&o.length>=.5){let s=oo(o,.1);s.avgDensity>0&&e.push(s.avgDensity)}e.sort((o,s)=>o-s);let n=e.length>0?e[Math.floor(e.length/2)]:1;return{sortedDensities:e,medianDensity:n}}function Xo(t,e){let{sortedDensities:n}=e;if(n.length===0)return .5;if(t<=0)return 1;let o=0;for(let s of n)s<t&&o++;return 1-o/n.length}function Ws(t,e,n=.5,o=.5,s=3){let{densityProfile:r,avgDensity:i}=t;if(r.length===0||i===0)return[];let l=i*n,f=r.length,d=[],u=!1,c=0,a=0,h=0;for(let g=0;g<f;g++){let x=r[g]<l;if(x&&!u)u=!0,c=g,a=r[g],h=1;else if(x&&u)a+=r[g],h++;else if(!x&&u){u=!1;let b=g-1,m=c/f,p=(b+1)/f,y=(p-m)*e;y>=o&&y<=s&&d.push({startT:m,endT:p,startLen:m*e,endLen:p*e,avgDensity:a/h}),a=0,h=0}}if(u){let g=f-1,x=c/f,b=(g+1)/f,m=(b-x)*e;m>=o&&m<=s&&d.push({startT:x,endT:b,startLen:x*e,endLen:b*e,avgDensity:a/h})}return d}function dl(t,e,n){let o=t.originalPoints;if(!o||o.length<5)return{verticalGapRatio:1,isDoorSized:!0};let s=t.end.x-t.start.x,r=t.end.y-t.start.y,i=t.length*t.length;if(i<=0)return{verticalGapRatio:0,isDoorSized:!1};let l=[];for(let m of o){let p=m.x-t.start.x,y=m.y-t.start.y,w=(p*s+y*r)/i;w>=e&&w<=n&&m.z!==void 0&&isFinite(m.z)&&l.push(m.z)}if(l.length<5)return{verticalGapRatio:1,isDoorSized:!0};let f=1/0,d=-1/0;for(let m of o)m.z!==void 0&&isFinite(m.z)&&(m.z<f&&(f=m.z),m.z>d&&(d=m.z));let u=d-f;if(u<.5)return{verticalGapRatio:0,isDoorSized:!1};let c=15,a=new Array(c).fill(!1);for(let m of l){let p=Math.min(c-1,Math.max(0,Math.floor((m-f)/u*c)));a[p]=!0}let h=0,g=0;for(let m=0;m<c;m++)a[m]?(h=Math.max(h,g),g=0):g++;h=Math.max(h,g);let x=h/c,b=x>=.35;return{verticalGapRatio:x,isDoorSized:b}}function _s(t,e,n,o=.5,s=.5,r=3,i=.35){let l=Ws(e,n,o,s,r),f=[];for(let d of l){let{verticalGapRatio:u,isDoorSized:c}=dl(t,d.startT,d.endT);f.push({...d,verticalGapRatio:u,isRectangular:c})}return f}function Hs(t,e,n){if(!t||!t.start||!t.end)return null;let o=t.start,s=t.end,r=$t(o.x,o.y,e.x,e.y,n.x,n.y),i=$t(s.x,s.y,e.x,e.y,n.x,n.y),l=r.dist<=i.dist,f=l?o:s,d=l?r.dist:i.dist,u=$t(f.x,f.y,e.x,e.y,n.x,n.y);return{hingeT:Math.max(0,Math.min(1,u.t)),hingeDist:d}}function As(t,e,n,o=2e3){let{hingeT:s}=t,r=.25,i=0,l=null,f=0;for(let d of e){let u=(d.startT+d.endT)/2,c=Math.abs(u-s),a=Math.max(0,1-c/r),h=d.isRectangular?1:.3,g=Math.max(0,1-d.avgDensity/o),x=a*.5+h*.3+g*.2;x>i&&(i=x,l=d,f=a)}return{score:i>.5?i:-1,bestRegion:l,bestOverlap:f,bestOpeningStartT:l?.startT??0,bestOpeningEndT:l?.endT??0}}function hl(t,e,n=.15){let o=0,s=0;for(let i of e)i!==t&&((Ze(t.start,i.start)<=n||Ze(t.start,i.end)<=n)&&o++,(Ze(t.end,i.start)<=n||Ze(t.end,i.end)<=n)&&s++);let r=0;return o>=1&&s>=1?r=5:(o>=1||s>=1)&&(r=2),{left:o,right:s,score:r}}function ml(t,e){let n=[],{start:o,end:s}=t;for(let l of e){let{dist:f}=$t(l.x,l.y,o.x,o.y,s.x,s.y);n.push(f)}let r=n.reduce((l,f)=>l+f,0)/n.length,i=n.reduce((l,f)=>l+(f-r)**2,0)/n.length;return i<.01?3:i<.05?2:i<.1?1:0}function gl(t,e,n=.15){let o=t.end.x-t.start.x,s=t.end.y-t.start.y,r=Math.sqrt(o*o+s*s);if(r<1e-12)return 0;let i=-s/r,l=o/r,f=[[],[]];for(let c=0;c<2;c++){let a=c===0?t.start:t.end;for(let h of e){if(h===t)continue;let g=Ze(a,h.start),x=Ze(a,h.end),b=null;if(g<=n?b=h.end:x<=n&&(b=h.start),!b)continue;let m=h.end.x-h.start.x,p=h.end.y-h.start.y,y=Math.sqrt(m*m+p*p);if(y<1e-12||Math.abs(o*m+s*p)/(r*y)>=.342)continue;let z=(b.x-a.x)*i+(b.y-a.y)*l;f[c].push(z>0?1:-1)}}if(f[0].length===0||f[1].length===0)return 0;let d=[...f[0],...f[1]];return d.every(c=>c===d[0])?2:1}function Ls(t,e,n){let o=hl(t,n),s=ml(t,e),r=gl(t,n);return{score:o.score*3+s*2+r*2,details:{conn:o.score,variance:s,sameSide:r}}}function pl(t){let e=t.end.x-t.start.x,n=t.end.y-t.start.y,o=Math.atan2(n,e)*(180/Math.PI);return o<0&&(o+=180),o}function xl(t,e){let n=[];for(let o of t){let s=!1;for(let r of n){let i=Math.abs(o.angle-r[0].angle);if(Math.min(i,180-i)<=e){r.push(o),s=!0;break}}s||n.push([o])}return n}function yl(t,e=.05){let n=[];for(let o of t){let s=!1;for(let r of n)if(Math.abs(o.offset-r[0].offset)<=e){r.push(o),s=!0;break}s||n.push([o])}return n}function bl(t,e,n,o,s){let r=[];for(let d of t){let u=d.seg,c=(u.start.x-e.start.x)*n+(u.start.y-e.start.y)*o,a=(u.end.x-e.start.x)*n+(u.end.y-e.start.y)*o;c<=a?r.push({l:c,r:a,idx:d.idx,startPt:u.start,endPt:u.end}):r.push({l:a,r:c,idx:d.idx,startPt:u.end,endPt:u.start})}r.sort((d,u)=>d.l-u.l);let i=[],l=.01,f=.5;for(let{l:d,r:u,idx:c,startPt:a,endPt:h}of r){if(i.length===0){i.push({l:d,r:u,srcIdxs:[c],startPt:a,endPt:h});continue}let g=i[i.length-1];if(d<=g.r+s){let x=Math.min(g.r,u)-Math.max(g.l,d),b=Math.hypot(g.endPt.x-a.x,g.endPt.y-a.y);x>=f||b<=l?(d<g.l&&(g.l=d,g.startPt=a),u>g.r&&(g.r=u,g.endPt=h),g.srcIdxs.includes(c)||g.srcIdxs.push(c)):i.push({l:d,r:u,srcIdxs:[c],startPt:a,endPt:h})}else i.push({l:d,r:u,srcIdxs:[c],startPt:a,endPt:h})}return i}function wl(t,e,n,o,s,r,i){let l=Math.hypot(n.x-e.x,n.y-e.y),f={...t};return f.start={...e},f.end={...n},f.length=l,f.direction={x:o,y:s,z:0},r!==void 0&&(f.rooftopPz=r),f.buildRosource=i,f.isRebuild=!1,f.doorAndBeamData||(f.doorAndBeamData=[]),f.insetionArr||(f.insetionArr=[]),f}function zl(t,e){let n=!0;for(;n;){n=!1;for(let o=0;o<t.length;o++)for(let s=o+1;s<t.length;s++){let r=t[o],i=t[s];if(r.rooftopPz!==void 0&&i.rooftopPz!==void 0&&Math.abs(r.rooftopPz-i.rooftopPz)>.05)continue;let l=Math.abs(r.end.x-i.start.x)<.001&&Math.abs(r.end.y-i.start.y)<.001,f=Math.abs(r.start.x-i.end.x)<.001&&Math.abs(r.start.y-i.end.y)<.001,d=Math.abs(r.end.x-i.end.x)<.001&&Math.abs(r.end.y-i.end.y)<.001,u=Math.abs(r.start.x-i.start.x)<.001&&Math.abs(r.start.y-i.start.y)<.001;if(!(l||f||d||u)||r.direction.x*i.direction.x+r.direction.y*i.direction.y<.98)continue;let a=r.start,h=r.end;l?h=i.end:f?a=i.start:d?h=i.start:u&&(a=i.end);let g=Math.hypot(h.x-a.x,h.y-a.y),x={...r};x.start=a,x.end=h,x.length=g,x.direction={x:(h.x-a.x)/g,y:(h.y-a.y)/g,z:0},r.rooftopPz!==void 0&&i.rooftopPz!==void 0?x.rooftopPz=Math.max(r.rooftopPz,i.rooftopPz):x.rooftopPz=r.rooftopPz!==void 0?r.rooftopPz:i.rooftopPz,x.buildRosource=r.buildRosource||i.buildRosource,x.isRebuild=!1,x.doorAndBeamData||(x.doorAndBeamData=[]),x.insetionArr||(x.insetionArr=[]),t[o]=x,e[o]=[...new Set([...e[o],...e[s]])],t.splice(s,1),e.splice(s,1),s--,n=!0}}return{segments:t,sourceMap:e}}function Ue(t,e=5,n=.05){if(t.length<=1)return{segments:t,sourceMap:t.map((f,d)=>[d])};let o=t.map((f,d)=>({seg:f,angle:pl(f),idx:d}));o.sort((f,d)=>f.angle-d.angle);let s=xl(o,e),r=[],i=[],l=[];for(let f of s){let d=f[0].seg;for(let m of f)m.seg.length>d.length&&(d=m.seg);let u=d.end.x-d.start.x,c=d.end.y-d.start.y,a=Math.sqrt(u*u+c*c);if(a<1e-12)continue;let h=-c/a,g=u/a,x=f.map(m=>{let p=m.seg.start.x-d.start.x,y=m.seg.start.y-d.start.y;return{seg:m.seg,offset:Math.abs(p*h+y*g),idx:m.idx}});x.sort((m,p)=>m.offset-p.offset);let b=yl(x);for(let m of b){let p=m[0].seg;for(let S of m)S.seg.length>p.length&&(p=S.seg);let y=p.end.x-p.start.x,w=p.end.y-p.start.y,z=Math.sqrt(y*y+w*w);if(z<1e-12)continue;let M=y/z,P=w/z,E=m.map(S=>S.seg.rooftopPz).filter(S=>S!==void 0),T=E.length>0?Math.max(...E):void 0,V=[...new Set(E.map(S=>S.toFixed(3)))];if(V.length>1){let S=m.map(R=>({idx:R.idx,start:{x:R.seg.start.x,y:R.seg.start.y,z:R.seg.start.z},end:{x:R.seg.end.x,y:R.seg.end.y,z:R.seg.end.z},length:R.seg.length,rooftopPz:R.seg.rooftopPz}));l.push({values:[...V],segments:S})}let _=[...new Set(m.map(S=>String(S.seg.buildRosource)))],v=bl(m,p,M,P,n);for(let{l:S,r:R,srcIdxs:D,startPt:W,endPt:I}of v){if(R-S<.01)continue;let C=wl(p,W,I,M,P,T,p.buildRosource);r.push(C),i.push(D)}}}return{...zl(r,i),debugRPZGroups:l}}function Ml(t){return{minLengthRatio:0,maxDistance:.5,angleThreshold:45,projectionMargin:.1,printOnly:!0,minEmbedRatioThreshold:.3,noWallSurroundDistance:.3,minEmbedRatio:.05,...t}}function El(t,e,n){return[{x:e,y:n,z:0},{x:t[0].x,y:t[0].y,z:0},{x:t[1].x,y:t[1].y,z:0},{x:t[2].x,y:t[2].y,z:0},{x:t[3].x,y:t[3].y,z:0}]}function Pl(t,e,n,o,s,r,i,l,f){if(!__DEBUG__||!["_008","_002","_014","_015","_020"].some(c=>t.includes(c)))return;e.map(c=>{let{start:a,end:h}=c,g=$t(n,o,a.x,a.y,h.x,h.y),x=s.map(z=>{let M=$t(z.x,z.y,a.x,a.y,h.x,h.y);return`t=${M.t.toFixed(3)},d=${M.dist.toFixed(3)}`}),b=h.x-a.x,m=h.y-a.y,p=Math.sqrt(b*b+m*m)||1,y=Math.abs(i*(b/p)+l*(m/p)),w=Math.acos(Math.min(y,1))*(180/Math.PI);return{seg:c,lineDist:g.dist,t:g.t,pts:x,angle:w,length:c.length}}).sort((c,a)=>c.lineDist-a.lineDist)}function Sl(t,e,n,o,s,r,i,l,f){let d=[{margin:r.projectionMargin,maxDist:r.maxDistance,label:"\u4E25\u683C"},{margin:.4,maxDist:.65,label:"\u5BBD\u677E"}],u=[],c=vs(l)||e;for(let a of d){if(u.length>0)break;for(let h of t){let{start:g,end:x}=h,b=!1,m=1/0;for(let E of s){let{dist:T,t:V}=$t(E.x,E.y,g.x,g.y,x.x,x.y);V>=-a.margin&&V<=1+a.margin&&T<=a.maxDist&&(b=!0,T<m&&(m=T))}if(!b)continue;let p=null;if(f&&(p=Vs(f,g,x,.3)),!p||!p.hingePoint){let E=Ds(l,g,x,.1);E&&E.hingeEdge&&(p={...E,hingePoint:E.hingeEdge?{x:E.hingeEdge.midX,y:E.hingeEdge.midY,z:0}:null,otherPoint:E.otherEdge?{x:E.otherEdge.midX,y:E.otherEdge.midY,z:0}:null})}p&&p.hingePoint&&$t(s[0].x,s[0].y,g.x,g.y,x.x,x.y).dist>.3&&(p=null);let y=!1;if(!p||!p.hingePoint){let E=$t(s[0].x,s[0].y,g.x,g.y,x.x,x.y);if(m<.15&&E.dist<.3&&h.originalPoints&&h.originalPoints.length>=50&&h.length>=.5)y=!0;else continue}if(!y&&(p.hingeT<-a.margin||p.hingeT>1+a.margin)){let E=$t(s[0].x,s[0].y,g.x,g.y,x.x,x.y);if(m<.15&&E.dist<.3&&h.originalPoints&&h.originalPoints.length>=50&&h.length>=.5)y=!0,h.__candidatesDebug="hingeT\u8D85\u8303\u56F4-\u5BC6\u5EA6\u515C\u5E95";else continue}let w=y?0:p.isClosed?1:.5,z=[s[1],s[2],s[3],s[4]],M=Ts(g.x,g.y,x.x,x.y,z),P=c>0?M/c:0;u.push({seg:h,minDist:m,embedRatio:P,ratio:h.length/c,score:0,details:{conn:0,variance:0,sameSide:0},hingeInfo:p,hingeScore:w})}}return u}function Tl(t,e,n,o){if(t.length<=1)return t.length===1&&(t[0].score=-1),t;for(let s of t){let{score:r,details:i}=Ls(s.seg,e,n);s.score=r,s.details=i}if(__DEBUG__&&o.includes("1527726772000"))for(let s of t){let r=s.seg,i=s.hingeInfo,l=s.hingeScore||0}return t.sort((s,r)=>{let i=s.hingeScore||0;return(r.hingeScore||0)-i||r.embedRatio-s.embedRatio||r.score-s.score||s.minDist-r.minDist}),t}function Rl(t,e,n,o){let s=t.end.x-t.start.x,r=t.end.y-t.start.y,i=Math.sqrt(s*s+r*r),l=s/i,f=r/i,d=e.map(P=>{let E=P.x-t.start.x,T=P.y-t.start.y;return(E*l+T*f)/i}),u=Math.min(...d),c=Math.max(...d),a=(c-u)*i,h=(u+c)/2,g=t.start.x+h*s,x=t.start.y+h*r,b=n.box.min.z,m=n.box.max.z,p=Math.abs(m-b),y=Ye(o,t.start.x,t.start.y),w=Math.max(0,b-y),z=u<=0&&c>=1,M=t.start.z+h*(t.end.z-t.start.z);return{p:{x:g,y:x,z:M},width:a,full:z,height:p,groundClearance:w,wallTMin:Math.max(0,Math.min(1,u)),wallTMax:Math.max(0,Math.min(1,c))}}function Go(t,e,n){let o=e.map(u=>n[u]),s=[],r=[],i=[],l=[],f,d;for(let u of o){if(u.originalPoints?.length)for(let c of u.originalPoints)s.push(c);if(u.doorAndBeamData?.length)for(let c of u.doorAndBeamData)r.push(c);if(u.insetionArr?.length)for(let c of u.insetionArr)i.push(c);if(u.DrawDoor?.length)for(let c of u.DrawDoor)l.push(c);u.boxData&&!f&&(f=u.boxData),u.rooftopPz!==void 0&&(d===void 0||u.rooftopPz>d)&&(d=u.rooftopPz)}s.length&&(t.originalPoints=s),r.length&&(t.doorAndBeamData=r),i.length&&(t.insetionArr=i),l.length&&(t.DrawDoor=l),f&&(t.boxData=f),d!==void 0&&(t.rooftopPz=d)}function un(t,e,n=10,o=.2,s=.2){let r=[];if(!t.DrawDoor)return r;let i=t.DrawDoor.p,l=t.wallSegment,f=l.end.x-l.start.x,d=l.end.y-l.start.y,u=Math.sqrt(f*f+d*d)||1,c=f/u,a=d/u,h=i.x-l.start.x,g=i.y-l.start.y,x=(h*c+g*a)/u;for(let b of e){if(b===l)continue;let m=b.end.x-b.start.x,p=b.end.y-b.start.y,y=Math.sqrt(m*m+p*p)||1,w=m/y,z=p/y,M=Math.abs(c*w+a*z),E=Math.acos(Math.min(M,1))*(180/Math.PI);if(Math.abs(E-90)>n)continue;let T=[b.start,b.end];for(let V of T){let _=V.x-l.start.x,v=V.y-l.start.y,S=(_*c+v*a)/u,R=l.start.x+S*u*c,D=l.start.y+S*u*a;if(Math.sqrt((V.x-R)**2+(V.y-D)**2)>s)continue;let I=Math.abs((S-x)*u);if(I<=o){r.push({seg:b,distAlongWall:I,angle:E,endPoint:V});break}}}return r}function Rn(t,e){let n=t.start,o=t.end,s=o.x-n.x,r=o.y-n.y,i=Math.sqrt(s*s+r*r)||1,l=((e.x-n.x)*s+(e.y-n.y)*r)/(i*i),f=Math.max(0,Math.min(1,l)),d={x:n.x+f*s,y:n.y+f*r,z:n.z+(o.z-n.z)*f||0};function u(y){if(!y||!y.length)return[[],[]];let w=[],z=[];for(let M of y){let P=((M.x-n.x)*s+(M.y-n.y)*r)/(i*i);P<=f+1e-8&&w.push(M),P>=f-1e-8&&z.push(M)}return(w.length===0||c(w[w.length-1],d)>1e-6)&&w.push({...d}),(z.length===0||c(z[0],d)>1e-6)&&z.unshift({...d}),[w,z]}function c(y,w){return Math.sqrt((y.x-w.x)**2+(y.y-w.y)**2)}let[a,h]=u(t.originalPoints),g=Math.max(f*i,1e-6),x=Math.max((1-f)*i,1e-6),b=t.direction||{x:s/i,y:r/i,z:(o.z-n.z)/i||0},m={...t,start:{...n},end:{...d},length:g,direction:{...b},originalPoints:a.length?a:void 0},p={...t,start:{...d},end:{...o},length:x,direction:{...b},originalPoints:h.length?h:void 0};if("isRebuild"in t&&(m.isRebuild=t.isRebuild,p.isRebuild=t.isRebuild),t.DrawDoor&&t.DrawDoor.length>0){let y=[],w=[];for(let z of t.DrawDoor){let M=((z.p.x-n.x)*s+(z.p.y-n.y)*r)/(i*i);M<=f+1e-8&&y.push(z),M>=f-1e-8&&w.push(z)}m.DrawDoor=y.length?y:void 0,p.DrawDoor=w.length?w:void 0}else m.DrawDoor=void 0,p.DrawDoor=void 0;if(t.boxData){let y=w=>{if(!w.length)return;let z=1/0,M=1/0,P=1/0,E=-1/0,T=-1/0,V=-1/0;for(let _ of w)_.x<z&&(z=_.x),_.y<M&&(M=_.y),_.z!==void 0&&_.z<P&&(P=_.z),_.x>E&&(E=_.x),_.y>T&&(T=_.y),_.z!==void 0&&_.z>V&&(V=_.z);return{isBox3:!0,min:{x:z,y:M,z:P},max:{x:E,y:T,z:V}}};m.boxData=y(a),p.boxData=y(h)}return[m,p]}function Dn(t,e,n,o){let s=Ml(n),r=[],{segments:i,sourceMap:l}=o??Ue(e),f=i,d=Cs(f);for(let u of t){let c=u.coordinatesByArea?.coordinates;if(!c||c.length<4)continue;let a=c.slice(0,4),h=jo(u.nline),g=no(a),x,b,m,p,y;if(h?(x=h.midX,b=h.midY,m=h.length,p=h.dirX,y=h.dirY):(x=a.reduce((L,B)=>L+B.x,0)/4,b=a.reduce((L,B)=>L+B.y,0)/4,m=g.longSide,p=g.dirX,y=g.dirY),m<.01)continue;let w=a.reduce((L,B)=>L+B.z,0)/4,z=Ye(e,x,b);if(w<z-.3)continue;let M=Rs(a),P=[...a].sort((L,B)=>L.z-B.z),E=P[0].x-P[1].x,T=P[0].y-P[1].y,V=Math.sqrt(E*E+T*T),_=El(a,x,b);Pl(u.name,f,x,b,_,m,p,y,s);let v=Sl(f,V,p,y,_,s,u.name,M,u.nline);if(v.length>0)for(let L=0;L<v.length;L++){let B=v[L],$=B.seg,G=!!B.hingeInfo?.hingePoint,Q=B.hingeInfo?.isClosed,q=B.hingeInfo?.hingeDist??-1,X=$t(_[0].x,_[0].y,$.start.x,$.start.y,$.end.x,$.end.y)}if(v=Tl(v,_,e,u.name),v.length===0){for(let B of f){let $=B.start.x+(B.end.x-B.start.x)/2-x,G=B.start.y+(B.end.y-B.start.y)/2-b;if(Math.sqrt($*$+G*G)>2)continue;let q=B.end.x-B.start.x,X=B.end.y-B.start.y,Y=Math.sqrt(q*q+X*X),it=q/Y,ht=X/Y,St=Math.abs(it*p+ht*y),nt=Math.acos(Math.min(1,Math.abs(St)))*180/Math.PI,wt=$t(x,b,B.start.x,B.start.y,B.end.x,B.end.y)}let L=0;for(let B of f)$t(x,b,B.start.x,B.start.y,B.end.x,B.end.y).dist<2&&L++}let S=V;for(let L of v){let B=L.seg;if(B.originalPoints&&B.originalPoints.length>100&&B.length>.5)try{let $=oo(B,.1),G=_s(B,$,B.length,.5,.5,3,.35),Q,q=!1;if(u.nline){let ht=Hs(u.nline,B.start,B.end);if(ht)Q=ht.hingeT,q=ht.hingeDist>.05;else{let St=$t(x,b,B.start.x,B.start.y,B.end.x,B.end.y);Q=Math.max(0,Math.min(1,St.t))}}else{let ht=$t(x,b,B.start.x,B.start.y,B.end.x,B.end.y);Q=Math.max(0,Math.min(1,ht.t))}let X=Is($),Y,it=X<=.3;it?Y={score:Xo($.avgDensity,d),bestRegion:null,bestOverlap:0,bestOpeningStartT:0,bestOpeningEndT:1}:(Y=As({hingeT:Q,doorWidth:S,isOpenDoor:q},G,B.length,d.medianDensity),Y.score<0&&(Y={score:Xo($.avgDensity,d),bestRegion:null,bestOverlap:0,bestOpeningStartT:0,bestOpeningEndT:1})),u.name.includes("door_002")&&(window.__doorLog=!0),L.densityScore=Y.score,L.densityOverlap=Y.bestOverlap,L.rectangularRegions=G,L.densityResult=$,L.densityOpeningStartT=Y.bestOpeningStartT,L.densityOpeningEndT=Y.bestOpeningEndT,L.densityCV=X,L.densityUsedGlobalRank=it}catch{L.densityScore=-1}else L.densityScore=-1}if(u.name.includes("door_002"))for(let L=0;L<v.length;L++){let $=v[L].seg,G=f.findIndex(q=>Math.abs(q.start.x-$.start.x)<.001&&Math.abs(q.start.y-$.start.y)<.001&&Math.abs(q.end.x-$.end.x)<.001&&Math.abs(q.end.y-$.end.y)<.001),Q=G>=0?l[G]||[]:[];for(let q of Q){let X=e[q]}}if(v.sort((L,B)=>{let $=L.densityScore>=0?L.densityScore:-1/0,G=B.densityScore>=0?B.densityScore:-1/0;if($!==G)return G-$;if(Math.abs($-G)<.3){let X=L.ratio||0,Y=B.ratio||0,it=Math.abs(X-1),ht=Math.abs(Y-1);if(it!==ht)return it-ht}let Q=L.hingeScore||0,q=B.hingeScore||0;return Q!==q?q-Q:L.minDist-B.minDist}),v.length>0)for(let L=0;L<v.length;L++){let B=v[L],$=B.seg,G=B.ratio||$.length/S,Q=Math.abs(G-1)}let R=null,D=1/0,W=0,I=0,C=null,H=-1,A=0,k=0,O=0;if(v.length>0){let L=v[0];R=L.seg,D=L.minDist,W=L.ratio,I=L.embedRatio,C=L.hingeInfo,H=L.densityScore??-1,A=L.densityOverlap??0,k=L.densityOpeningStartT??0,O=L.densityOpeningEndT??0}let N;if(R&&(N=Rl(R,a,u,i),N&&O>k&&(N.wallTMin=Math.max(0,Math.min(1,k)),N.wallTMax=Math.max(0,Math.min(1,O))),!s.printOnly)){let L=R;L.DrawDoor||(L.DrawDoor=[]),L.DrawDoor.push(N),L.isDoor=!0}if(R){let L=v.map(($,G)=>{let Q=$.seg;return{start:{x:Q.start.x,y:Q.start.y,z:Q.start.z},end:{x:Q.end.x,y:Q.end.y,z:Q.end.z},length:Q.length,densityScore:$.densityScore??-1,hingeScore:$.hingeScore??0,minDist:$.minDist,ratio:$.ratio,isWinner:G===0}}),B={doorName:u.name,doorCategory:u.category,doorCenter:u.center,wallSegment:R,distance:D,wallLengthRatio:W,DrawDoor:N,densityScore:H,densityOverlap:A,candidates:L,hingePoint:C?.hingePoint,otherPoint:C?.otherPoint,isClosed:C?.isClosed,doorWidth:N?.width,wallTMin:N?.wallTMin,wallTMax:N?.wallTMax};if(r.push(B),(u.name==="1527727501200_window_001"||u.name==="1527727427200_window_001")&&N){let $=R.end.x-R.start.x,G=R.end.y-R.start.y,Q=Math.sqrt($*$+G*G),q=$/Q,X=G/Q,Y=N.p.x-R.start.x,it=N.p.y-R.start.y,ht=(Y*q+it*X)/Q,St=0;for(let nt of i){if(nt===R)continue;let wt=nt.end.x-nt.start.x,zt=nt.end.y-nt.start.y,Dt=Math.sqrt(wt*wt+zt*zt)||1,Pt=wt/Dt,Mt=zt/Dt,It=Math.abs(q*Pt+X*Mt),ot=Math.acos(Math.min(It,1))*(180/Math.PI);if(Math.abs(ot-90)>10)continue;St++;let ft=[nt.start,nt.end],rt="";for(let tt of ft){let ae=tt.x-R.start.x,bt=tt.y-R.start.y,Jt=(ae*q+bt*X)/Q,he=R.start.x+Jt*Q*q,Tt=R.start.y+Jt*Q*X,ee=Math.sqrt((tt.x-he)**2+(tt.y-Tt)**2),et=Math.abs((Jt-ht)*Q);rt+=`\u7AEF(${tt.x.toFixed(2)},${tt.y.toFixed(2)})\u22A5=${ee.toFixed(3)}m \u6CBF\u5899=${et.toFixed(3)}m `}}}if(N&&N.width>1){let $=un(B,i);$.length>0&&$.forEach((G,Q)=>{})}}}for(let u of r){let c=u.wallSegment,a=i.indexOf(c);if(a===-1)continue;let h=l[a];!h||h.length<=1||Go(c,h,e)}return r}function ro(t){return[t.wallTMin??0,t.wallTMax??1]}function Dl(t,e){let[n,o]=ro(t),[s,r]=ro(e),i=Math.max(0,Math.min(o,r)-Math.max(n,s)),l=Math.min(o-n,r-s);return l>0?i/l:0}function vl(t,e){if(!t.hingePoint||!e.hingePoint)return null;let n=t.hingePoint.x-e.hingePoint.x,o=t.hingePoint.y-e.hingePoint.y;return Math.sqrt(n*n+o*o)}function ks(t,e){let n=e.end.x-e.start.x,o=e.end.y-e.start.y,s=n*n+o*o;if(s<1e-10)return 0;let r=((t.x-e.start.x)*n+(t.y-e.start.y)*o)/s;return Math.max(0,Math.min(1,r))}function Bs(t,e={}){let n=e.minTOverlapRatio??.5,o=e.maxHingeDist??.3,s=e.minHingeTOverlapRatio??.2;if(t.length<2)return{matches:t,removed:[]};let r=new Set,i=new Map;for(let u=0;u<t.length;u++){let a=t[u].wallSegment;i.has(a)||i.set(a,[]),i.get(a).push(u)}let l=0;for(let[u,c]of i){l++;let a=c.map(x=>t[x].doorName).join(", "),h=u.start,g=u.end}for(let[,u]of i){if(u.length<2)continue;let c=[...u].sort((a,h)=>{let g=t[a].densityScore??0;return(t[h].densityScore??0)-g});for(let a=0;a<c.length;a++){let h=c[a];if(r.has(h))continue;let g=t[h];for(let x=a+1;x<c.length;x++){let b=c[x];if(r.has(b))continue;let m=t[b],p=!1,y="",w=Dl(g,m),z=[g.hingePoint,g.otherPoint].filter(Boolean),M=[m.hingePoint,m.otherPoint].filter(Boolean),P=null;for(let W of z)for(let I of M){let C=Math.sqrt((W.x-I.x)**2+(W.y-I.y)**2);if(C>.25)continue;let H=ks(W,g.wallSegment),A=ks(I,m.wallSegment),k=Math.abs(H-A);(!P||C<P.dist)&&(P={dist:C,tDiff:k})}P&&P.tDiff<=.08&&(p=!0,y=`\u6700\u77ED\u8FB9\u8DDD=${P.dist.toFixed(3)}m t\u5DEE=${P.tDiff.toFixed(3)}`);let[E,T]=ro(g),[V,_]=ro(m),v=vl(g,m);g.doorName.includes("door_002")||g.doorName.includes("door_004")||m.doorName.includes("door_002")||m.doorName.includes("door_004");let S=[g.hingePoint,g.otherPoint].filter(Boolean),R=[m.hingePoint,m.otherPoint].filter(Boolean),D=1/0;for(let W of S)for(let I of R){let C=Math.sqrt((W.x-I.x)**2+(W.y-I.y)**2);C<D&&(D=C)}p&&r.add(b)}}}let f=t.filter((u,c)=>!r.has(c)),d=t.filter((u,c)=>r.has(c)).map(u=>u.doorName);return{matches:f,removed:d}}function Zo(t,e,n){let o={printOnly:!1,skipMerge:!1,...n};for(let m of t)m.DrawDoor&&(m.DrawDoor=void 0),m.isDoor&&(m.isDoor=void 0),m.drawDoorData&&(m.drawDoorData=void 0);let s=Array.isArray(e)?e.filter(m=>m&&m.category==="door"&&!m.isFindBeam):[],r,i;if(o.skipMerge)r=t,i=t.map((m,p)=>[p]);else{let m=Ue(t);r=m.segments,i=m.sourceMap}for(let m=0;m<r.length;m++){let p=i[m];p&&!r[m].originalPoints&&Go(r[m],p,t)}let l=Dn(s,t,o,{segments:r,sourceMap:i}),d=Bs(l,{minTOverlapRatio:.5}).matches,u=new Set(d.map(m=>m.doorName));for(let m of r){let p=m;if(p.DrawDoor&&p.DrawDoor.length>0){let y=l.filter(z=>z.wallSegment===m).length;d.filter(z=>z.wallSegment===m).length===0&&(p.DrawDoor=[],p.isDoor=!1)}}let c=new Map;for(let m=0;m<d.length;m++){let p=d[m],y=r.indexOf(p.wallSegment);y>=0&&c.set(y,m)}let a=[],h=new Set,g=new Map;for(let m of e)m&&m.name&&g.set(m.name,m);for(let[m,p]of c){let y=i[m];if(!y)continue;let w=r[m],z=w.DrawDoor,M=w.isDoor,P=w.end.x-w.start.x,E=w.end.y-w.start.y,T=P*P+E*E,V=0,_=1,v=d[p],R=(v?g.get(v.doorName):void 0)?.coordinatesByArea?.coordinates;if(R&&R.length>=4&&T>0){let C=R.slice(0,4).map(H=>{let A=H.x-w.start.x,k=H.y-w.start.y;return(A*P+k*E)/T});V=Math.max(0,Math.min(1,Math.min(...C))),_=Math.max(0,Math.min(1,Math.max(...C)))}let D,W;T>0&&_>V&&(D={x:w.start.x+V*P,y:w.start.y+V*E,z:w.start.z+V*(w.end.z-w.start.z)},W={x:w.start.x+_*P,y:w.start.y+_*E,z:w.start.z+_*(w.end.z-w.start.z)});let I=!1;for(let C of y){let H=t[C];if(!H)continue;let A=H.end.x-H.start.x,k=H.end.y-H.start.y,O=A*A+k*k,N=Math.sqrt(O);if(O<1e-10||!D||!W){h.add(C),a.push(H);continue}let L=((D.x-H.start.x)*A+(D.y-H.start.y)*k)/O,B=((W.x-H.start.x)*A+(W.y-H.start.y)*k)/O,$=Math.max(0,Math.min(1,Math.min(L,B))),G=Math.max(0,Math.min(1,Math.max(L,B)));if(G-$<.001)continue;h.add(C);let Q=nt=>({x:H.start.x+nt*A,y:H.start.y+nt*k,z:H.start.z+nt*(H.end.z-H.start.z)}),q=Q($),X=Q(G),Y=H.direction||{x:A/N,y:k/N,z:0},it,ht,St;if(H.originalPoints&&H.originalPoints.length>0){it=[],ht=[],St=[];for(let nt of H.originalPoints){let wt=((nt.x-H.start.x)*A+(nt.y-H.start.y)*k)/O;wt<$-1e-8?it.push(nt):wt>G+1e-8?St.push(nt):ht.push(nt)}it.length===0&&(it=void 0),ht.length===0&&(ht=void 0),St.length===0&&(St=void 0)}if($>.001){let nt={...H,start:{...H.start},end:{...q},length:$*N,direction:{...Y}};nt.DrawDoor=void 0,nt.isDoor=!1,nt.drawDoorData=void 0,nt.length<.01?(nt.isRebuild=!0,nt.originalPoints=[]):nt.originalPoints=it,a.push(nt)}{let nt={...H,start:{...q},end:{...X},length:(G-$)*N,direction:{...Y}};if(z&&(nt.DrawDoor=z),M&&(nt.isDoor=!0),nt.__matchIdx=p,nt.length<.01?(nt.isRebuild=!0,nt.originalPoints=[]):nt.originalPoints=ht,!I&&z&&z.length>0){I=!0;let wt=Math.sqrt(T),zt=wt>0?-E/wt:0,Dt=wt>0?P/wt:0,Pt={pointNum:2,start:D,end:W,n:{x:zt,y:Dt,z:0},height:z[0].height,groundClearance:z[0].groundClearance};nt.drawDoorData=Pt}a.push(nt)}if(G<.999){let nt={...H,start:{...X},end:{...H.end},length:(1-G)*N,direction:{...Y}};nt.DrawDoor=void 0,nt.isDoor=!1,nt.drawDoorData=void 0,nt.length<.01?(nt.isRebuild=!0,nt.originalPoints=[]):nt.originalPoints=St,a.push(nt)}}}for(let m=0;m<t.length;m++)h.has(m)||a.push(t[m]);let x=new Set(d.map(m=>m.doorName));for(let m of e)m&&m.category==="door"&&(x.has(m.name)?delete m.AbnormalDoor:m.AbnormalDoor=!0);let b=new Map;for(let m of d){if(!m.DrawDoor||m.DrawDoor.width<=1)continue;let p=g.get(m.doorName);if(!p||!p.positionArr||!p.positionArr.length)continue;let y=un(m,r);if(y.length<=1)continue;let w=p.positionArr[0],z=m.DrawDoor.p,M=w.x-z.x,P=w.y-z.y,E=Math.sqrt(M*M+P*P);if(E<.001)continue;let T=M/E,V=P/E,_=y.filter(C=>{let H=(C.seg.start.x+C.seg.end.x)/2,A=(C.seg.start.y+C.seg.end.y)/2,k=H-z.x,O=A-z.y;return k*T+O*V>0});if(!_.length)continue;let v=_[0].endPoint,S=m.wallSegment;if(b.has(S))continue;let[R,D]=Rn(S,v);b.set(S,[R,D]);let W=((z.x-S.start.x)*(S.end.x-S.start.x)+(z.y-S.start.y)*(S.end.y-S.start.y))/(S.length*S.length),I=((v.x-S.start.x)*(S.end.x-S.start.x)+(v.y-S.start.y)*(S.end.y-S.start.y))/(S.length*S.length);W<=I?m.wallSegment=R:m.wallSegment=D}if(b.size>0){let m=[];for(let p of a)b.has(p)?m.push(...b.get(p)):m.push(p);for(let p of m)p.isDoor=!!(p.DrawDoor&&p.DrawDoor.length>0);return{segments:m,matches:d}}for(let m of a)m.isDoor=!!(m.DrawDoor&&m.DrawDoor.length>0);return{segments:a,matches:d}}var Vl={findWalls:Tn,mergeSegments:Ge,computeFloorZ:Xe,analyzeQuadrangle:je,detectPerpWalls:Pn,splitSegment:Sn,process:qo},Il={findWalls:Dn,mergeSegments:Ue,computeFloorZ:Ye,analyzeQuadrangle:je,detectPerpWalls:un,splitSegment:Rn,process:Zo};function fn(t){return t==="window"?Vl:Il}function Cl(t,e,n,o,s){return fn(t).findWalls(e,n,o,s)}function Wl(t,e,n,o){return fn(t).process(e,n,o)}function _l(t,e){return fn(t).mergeSegments(e)}function Hl(t,e,n){return fn(t).detectPerpWalls(e,n)}function Al(t,e,n){return fn(t).splitSegment(e,n)}function Ke(t,e){let n=Math.atan2(e,t);return n<0&&(n+=Math.PI),n>=Math.PI&&(n-=Math.PI),n}function Ie(t,e,n){let o=Math.cos(n),s=Math.sin(n);return{x:t*o-e*s,z:t*s+e*o}}function so(t,e,n,o,s,r){let i=s-n,l=r-o,f=i*i+l*l;if(f<1e-10){let g=t-n,x=e-o;return Math.sqrt(g*g+x*x)}let d=((t-n)*i+(e-o)*l)/f;d=Math.max(0,Math.min(1,d));let u=n+d*i,c=o+d*l,a=t-u,h=e-c;return Math.sqrt(a*a+h*h)}function Os(t){if(t.length<3)return 0;let e=0,n=t.length;for(let o=0;o<n;o++){let s=(o+1)%n;e+=t[o].x*t[s].z,e-=t[s].x*t[o].z}return Math.abs(e)/2}function Yo(t){let e=t.x2-t.x1,n=t.z2-t.z1;return Math.sqrt(e*e+n*n)}function io(t){if(!t.length)return{rotated:[],mainAngle:0};let e=180,n=new Array(e).fill(0),o=Math.PI/e;for(let u of t){let c=u.x2-u.x1,a=u.z2-u.z1,h=Math.sqrt(c*c+a*a);if(h<.01)continue;let g=Ke(c,a),x=Math.floor(g/o);x>=e&&(x=e-1),n[x]+=h}let s=new Array(e).fill(0),r=5;for(let u=0;u<e;u++){let c=0;for(let a=-r;a<=r;a++){let h=u+a;h<0&&(h+=e),h>=e&&(h-=e),c+=n[h]}s[u]=c}let i=0,l=0;for(let u=0;u<e;u++)s[u]>i&&(i=s[u],l=u);let f=(l+.5)*o;return{rotated:t.map(u=>{let c=Ie(u.x1,u.z1,-f),a=Ie(u.x2,u.z2,-f);return{...u,x1:c.x,z1:c.z,x2:a.x,z2:a.z}}),mainAngle:f}}var Uo=15*(Math.PI/180);function ao(t,e,n=.15,o=.5){let s=[];for(let u of t){let c=u.x2-u.x1,a=u.z2-u.z1,h=Math.sqrt(c*c+a*a);if(h<.01)continue;let g=Ke(c,a),x;if(e==="X"?x=g<Uo||g>Math.PI-Uo:x=Math.abs(g-Math.PI/2)<Uo,!x)continue;let b,m,p;e==="X"?(b=(u.z1+u.z2)/2,m=Math.min(u.x1,u.x2),p=Math.max(u.x1,u.x2)):(b=(u.x1+u.x2)/2,m=Math.min(u.z1,u.z2),p=Math.max(u.z1,u.z2)),s.push({line:u,offset:b,pStart:m,pEnd:p,length:h})}if(s.length===0)return{groups:[],lineToGroup:new Map};s.sort((u,c)=>u.offset-c.offset);let r=[],i=[s[0]],l=s[0].offset;for(let u=1;u<s.length;u++){let c=s[u];Math.abs(c.offset-l)<n?i.push(c):(r.push(i),i=[c],l=c.offset)}i.length>0&&r.push(i);let f=[],d=new Map;for(let u of r){u.sort((a,h)=>a.pStart-h.pStart);let c=[];for(let a of u){let h=!1;for(let g of c)if(a.pStart<=g.end+o){g.items.push(a),g.end=Math.max(g.end,a.pEnd),h=!0;break}h||c.push({items:[a],end:a.pEnd})}for(let a of c){let h=a.items.map(x=>x.line),g=f.length;f.push(h);for(let x of h)d.set(x.id,g)}}return{groups:f,lineToGroup:d}}function lo(t,e,n=.3){let o=new Map;for(let s of t){let r=null,i=1/0;for(let l of e){let f=so(s.x,s.z,l.x1,l.z1,l.x2,l.z2);f<i&&(i=f,r=l.id)}r!==null&&i<=n&&o.set(s.id,r)}return o}var dn=.15;function Ll(t,e){return Math.round(t/dn)+"_"+Math.round(e/dn)}function Fs(t,e=5){if(t.length<3)return new Set;let n=new Map,o=0,s=0;function r(f,d){let u=Ll(f,d),c=n.get(u);if(c)return c;let a=Math.round(f/dn),h=Math.round(d/dn),g=null,x=dn*dn;for(let b=-1;b<=1;b++)for(let m=-1;m<=1;m++){let p=a+b+"_"+(h+m),y=n.get(p);if(!y)continue;let w=y.x-f,z=y.z-d,M=w*w+z*z;M<x&&(x=M,g=y)}return g?(n.set(u,g),g):(c={id:o++,x:f,z:d,edges:[]},n.set(u,c),c)}let i=[];for(let f of t){let d=r(f.x1,f.z1),u=r(f.x2,f.z2);if(d.id===u.id)continue;let c=Math.atan2(u.z-d.z,u.x-d.x),a=Math.atan2(d.z-u.z,d.x-u.x),h={id:s++,wallId:f.id,from:d,to:u,twin:null,angle:c,visited:!1},g={id:s++,wallId:f.id,from:u,to:d,twin:h,angle:a,visited:!1};h.twin=g,d.edges.push(h),u.edges.push(g),i.push(h,g)}if(i.length<6)return new Set;for(let f of n.values())f.edges.sort((d,u)=>d.angle-u.angle);let l=new Set;for(let f of i){if(f.visited)continue;let d=[],u=f,c=i.length+10;for(;!u.visited&&d.length<c;){u.visited=!0,d.push(u);let a=u.to,h=u.twin,g=a.edges.indexOf(h);if(g<0)break;let x=(g+1)%a.edges.length;u=a.edges[x]}if(d.length>=3){let a=d[0];if(d[d.length-1].to.id===a.from.id){let g=[],x=new Set;for(let m of d)x.add(m.wallId),g.length===0&&g.push({x:m.from.x,z:m.from.z}),g.push({x:m.to.x,z:m.to.z});if(Os(g)>=e)for(let m of x)l.add(m)}}}return l}var ag=12*(Math.PI/180);function Ns(t,e=2){let n=new Map;for(let o of t){let s=(o.x1+o.x2)/2,r=(o.z1+o.z2)/2,i=Math.floor(s/e),l=Math.floor(r/e),f=`${i},${l}`;n.has(f)||n.set(f,[]),n.get(f).push(o)}return n}var kl=0;function qs(){return++kl}function $s(t,e,n=.15,o=.5){if(!t.length)return[];let s=10*Math.PI/180,r=[];for(let u of t){let c=u.x2-u.x1,a=u.z2-u.z1,h=Math.sqrt(c*c+a*a);if(!(h<.01))if(e==="X"){if(Math.abs(a)>h*Math.sin(s))continue;let g=(u.z1+u.z2)/2,x=Math.min(u.x1,u.x2),b=Math.max(u.x1,u.x2);r.push({line:u,pStart:x,pEnd:b,offset:g,yMin:Math.min(u.y1,u.y2),yMax:Math.max(u.y1,u.y2)})}else{if(Math.abs(c)>h*Math.sin(s))continue;let g=(u.x1+u.x2)/2,x=Math.min(u.z1,u.z2),b=Math.max(u.z1,u.z2);r.push({line:u,pStart:x,pEnd:b,offset:g,yMin:Math.min(u.y1,u.y2),yMax:Math.max(u.y1,u.y2)})}}if(!r.length)return[];r.sort((u,c)=>u.offset-c.offset);let i=[],l=[r[0]],f=r[0].offset;for(let u=1;u<r.length;u++){let c=r[u];Math.abs(c.offset-f)<n?l.push(c):(i.push(l),l=[c],f=c.offset)}i.push(l);let d=[];for(let u of i){u.sort((a,h)=>a.pStart-h.pStart);let c=[];for(let a of u){if(c.length===0){c.push({pStart:a.pStart,pEnd:a.pEnd,offset:a.offset,count:1,yMin:a.yMin,yMax:a.yMax});continue}let h=c[c.length-1];a.pStart<=h.pEnd+o?(h.pEnd=Math.max(h.pEnd,a.pEnd),h.count+=1,h.yMin=Math.min(h.yMin,a.yMin),h.yMax=Math.max(h.yMax,a.yMax),h.offset=(h.offset*(h.count-1)+a.offset)/h.count):c.push({pStart:a.pStart,pEnd:a.pEnd,offset:a.offset,count:1,yMin:a.yMin,yMax:a.yMax})}for(let a of c){let h=a.pEnd-a.pStart;if(h<.01)continue;let g;e==="X"?g={id:qs(),x1:a.pStart,y1:a.yMin,z1:a.offset,x2:a.pEnd,y2:a.yMax,z2:a.offset,length:h,pointCount:a.count,isMain:!1}:g={id:qs(),x1:a.offset,y1:a.yMin,z1:a.pStart,x2:a.offset,y2:a.yMax,z2:a.pEnd,length:h,pointCount:a.count,isMain:!1},d.push(g)}}return d}function js(t,e=.8,n=3){return t.filter(o=>o.length>=e&&o.pointCount>=n)}function Xs(t,e=1,n=3){return t.filter(o=>o.length>=e&&o.pointCount>=n)}function Bl(t,e,n={}){let{distTol:o=.15,gapTol:s=.5,minLen:r=.2,minGroupLen:i=1,minArea:l=3,maxWinDist:f=.3,minLongWall:d=2}=n,u=performance.now(),{rotated:c,mainAngle:a}=io(t),h=performance.now(),g=e.map(D=>{let W=Ie(D.x,D.z,-a);return{...D,x:W.x,z:W.z}}),{groups:x}=ao(c,"X",o,s),{groups:b}=ao(c,"Z",o,s),m=[...x,...b],p=performance.now(),y=new Map,w=[];for(let D=0;D<m.length;D++){let W=m[D];if(W.length===0){w.push(0);continue}let I=0;for(let C of W)I+=Yo(C),y.set(C.id,D);w.push(I)}let z=performance.now(),M=new Set;for(let D=0;D<m.length;D++)w[D]>=d&&M.add(D);if(M.size>0){let D=[...M];for(;D.length>0;){let W=D.shift(),I=m[W];for(let C=0;C<m.length;C++){if(M.has(C)||w[C]<i)continue;let H=m[C],A=!1;t:for(let k of I)for(let O of H)if(Math.hypot(k.x1-O.x1,k.z1-O.z1)<=co||Math.hypot(k.x1-O.x2,k.z1-O.z2)<=co||Math.hypot(k.x2-O.x1,k.z2-O.z1)<=co||Math.hypot(k.x2-O.x2,k.z2-O.z2)<=co){A=!0;break t}A&&(M.add(C),D.push(C))}}}let P=c.map((D,W)=>{let I=Yo(D),C=y.get(D.id),H=C!==void 0&&M.has(C),A=I>=d;return{id:W,x1:D.x1,y1:D.y1,z1:D.z1,x2:D.x2,y2:D.y2,z2:D.z2,length:I,pointCount:1,isMain:H||A}}),E=P.filter(D=>D.isMain),T=P.filter(D=>!D.isMain),V=performance.now(),_=lo(g,E,f),v=performance.now(),S=D=>D.map(W=>{let I=Ie(W.x1,W.z1,a),C=Ie(W.x2,W.z2,a);return{...W,x1:I.x,z1:I.z,x2:C.x,z2:C.z}}),R=performance.now();return console.log(`[\u4E3B\u4F53\u67B6\u6784] \u89D2\u5EA6\u5F52\u4E00\u5316: ${(h-u).toFixed(0)}ms`),console.log(`[\u4E3B\u4F53\u67B6\u6784] \u5171\u7EBF\u5206\u7EC4: ${(p-h).toFixed(0)}ms (\u6C34\u5E73${x.length}\u7EC4 \u5782\u76F4${b.length}\u7EC4)`),console.log(`[\u4E3B\u4F53\u67B6\u6784] \u7EC4\u5206\u6790+\u4E3B\u4F53\u5224\u5B9A: ${(R-p).toFixed(0)}ms (\u4E3B\u4F53\u7EC4${M.size} / \u603B\u7EC4${m.length})`),console.log(`[\u4E3B\u4F53\u67B6\u6784] \u6807\u8BB0\u539F\u59CB\u7EBF\u6BB5: ${(V-R).toFixed(0)}ms (\u4E3B\u4F53${E.length} / \u6742\u7EBF${T.length})`),console.log(`[\u4E3B\u4F53\u67B6\u6784] \u7A97\u6237\u6302\u63A5: ${(v-V).toFixed(0)}ms`),console.log(`[\u4E3B\u4F53\u67B6\u6784] \u603B\u8BA1: ${(v-u).toFixed(0)}ms`),{mainWalls:S(E),noiseWalls:S(T),windowToWall:_}}var co=.2;function Pe(t,e){let n=Math.atan2(e,t);return n<0&&(n+=Math.PI),n>=Math.PI&&(n-=Math.PI),n}function vn(t){for(;t>Math.PI;)t-=2*Math.PI;for(;t<-Math.PI;)t+=2*Math.PI;return t}function uo(t){return t*Math.PI/180}function Vn(t,e,n){let o=Math.cos(n),s=Math.sin(n);return{x:t*o-e*s,z:t*s+e*o}}function Se(t){let e=0;for(let n=1;n<t.length;n++){let o=t[n].x-t[n-1].x,s=t[n].z-t[n-1].z;e+=Math.sqrt(o*o+s*s)}return e}function Ko(t){if(t.length<3)return 0;let e=0,n=t.length;for(let o=0;o<n;o++){let s=(o+1)%n;e+=t[o].x*t[s].z,e-=t[s].x*t[o].z}return Math.abs(e)/2}function be(t,e,n,o){let s=n-t,r=o-e;return Math.sqrt(s*s+r*r)}function In(t,e,n,o,s,r){let i=s-n,l=r-o,f=i*i+l*l;if(f<1e-6)return be(t,e,n,o);let d=((t-n)*i+(e-o)*l)/f;return d=Math.max(0,Math.min(1,d)),be(t,e,n+d*i,o+d*l)}function Qo(t){if(t.length<4)return t;let e=t.map(n=>({x:n.x,z:n.z}));for(let n=0;n<3;n++){let o=[{...e[0]}];for(let s=1;s<e.length-1;s++)o.push({x:(e[s-1].x+e[s].x+e[s+1].x)/3,z:(e[s-1].z+e[s].z+e[s+1].z)/3});o.push({...e[e.length-1]}),e=o}return e}function Gs(t,e){let n=1/0;for(let o of t)for(let s=0;s<e.length-1;s++){let r=In(o.x,o.z,e[s].x,e[s].z,e[s+1].x,e[s+1].z);r<n&&(n=r)}return n}function fo(t,e){let n=new Map,o=1/0,s=-1/0,r=1/0,i=-1/0;for(let l of t){let f=Math.floor(l.x/e),d=Math.floor(l.z/e),u=f+","+d;n.set(u,(n.get(u)||0)+1),f<o&&(o=f),f>s&&(s=f),d<r&&(r=d),d>i&&(i=d)}return{cells:n,minX:o,maxX:s,minZ:r,maxZ:i}}function Zs(t,e){let n=new Set,o=1/0,s=-1/0,r=1/0,i=-1/0,l=(f,d)=>{let u=f+","+d;n.add(u),f<o&&(o=f),f>s&&(s=f),d<r&&(r=d),d>i&&(i=d)};for(let f of t){let d=f.x1,u=f.z1,c=f.x2,a=f.z2,h=Math.floor(d/e),g=Math.floor(u/e),x=Math.floor(c/e),b=Math.floor(a/e),m=Math.abs(x-h),p=Math.abs(b-g),y=h<x?1:-1,w=g<b?1:-1,z=m-p,M=Math.max(m,p)*2+5,P=0;for(;P++<M&&(l(h,g),!(h===x&&g===b));){let E=2*z;E>-p&&(z-=p,h+=y),E<m&&(z+=m,g+=w)}}return{active:n,minX:o,maxX:s,minZ:r,maxZ:i}}function Wn(t,e=1){let n=new Set(t);for(let o=0;o<e;o++){let s=new Set(n);for(let i of n){let[l,f]=i.split(",").map(Number);for(let d=-1;d<=1;d++)for(let u=-1;u<=1;u++)d===0&&u===0||s.add(l+d+","+(f+u))}let r=new Set(s);for(let i of s){let[l,f]=i.split(",").map(Number),d=!0;for(let u=-1;u<=1;u++){for(let c=-1;c<=1;c++)if(!s.has(l+u+","+(f+c))){d=!1;break}if(!d)break}d||r.delete(i)}n.clear();for(let i of r)n.add(i)}return n}function Jo(t){let e=[],n=new Set;for(let o of t){if(n.has(o))continue;let s=new Set,r=[o];for(n.add(o);r.length>0;){let i=r.shift();s.add(i);let[l,f]=i.split(",").map(Number);for(let d=-1;d<=1;d++)for(let u=-1;u<=1;u++){if(d===0&&u===0)continue;let c=l+d+","+(f+u);t.has(c)&&!n.has(c)&&(n.add(c),r.push(c))}}s.size>=4&&e.push(s)}return e}function tr(t,e){if(t.size<3)return[];let n=new Set,o=(g,x)=>t.has(g+","+x);for(let g of t){let[x,b]=g.split(",").map(Number);(!o(x+1,b)||!o(x-1,b)||!o(x,b+1)||!o(x,b-1))&&n.add(g)}if(n.size<3)return[];let s="",r=1/0,i=1/0;for(let g of n){let[x,b]=g.split(",").map(Number);(b<r||b===r&&x<i)&&(r=b,i=x,s=g)}if(!s)return[];let l=[[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1]],f=[],[d,u]=s.split(",").map(Number),c=0,a=new Set,h=n.size*8;for(let g=0;g<h;g++){let b=d+","+u+"|"+c;if(a.has(b))break;a.add(b),f.push({x:(d+.5)*e,z:(u+.5)*e});let m=(c+3)%8,p=!1;for(let y=0;y<8;y++){let w=(m+y)%8,z=d+l[w][0],M=u+l[w][1];if(n.has(z+","+M)){c=(w+4)%8,d=z,u=M,p=!0;break}}if(!p||d+","+u===s&&f.length>2)break}return f}function Cn(t,e){if(t.length<=2)return[...t];let n=0,o=0,s=t[0],r=t[t.length-1];for(let i=1;i<t.length-1;i++){let l=In(t[i].x,t[i].z,s.x,s.z,r.x,r.z);l>n&&(n=l,o=i)}if(n>e){let i=Cn(t.slice(0,o+1),e),l=Cn(t.slice(o),e);return[...i.slice(0,-1),...l]}return[s,r]}var er={cellSize:.1,densityThreshold:1,minComponentCells:20,simplifyEpsilon:.01,heightMin:.3,heightMax:2.8,closeIterations:5,sparseRadius:.3,sparseMinNeighbors:5,lineDensityMin:0,lineDensityMinLen:1,densityRatio:.12};function hn(t){let e=t.length;if(e<3)return{cx:0,cz:0,r:0,rmsResidual:0};let n=0,o=0,s=0,r=0,i=0,l=0,f=0,d=0,u=0;for(let m of t){let p=m.x,y=m.z;n+=p,o+=y,s+=p*p,r+=y*y,i+=p*y,l+=p*p*p,f+=y*y*y,d+=p*p*y,u+=p*y*y}let c=2*(e*(s+r)-n*n-o*o);if(Math.abs(c)<1e-10)return{cx:0,cz:0,r:0,rmsResidual:0};let a=(e*(l+u)-n*(s+r))/c,h=(e*(d+f)-o*(s+r))/c,g=Math.sqrt(Math.abs((s+r-2*a*n-2*h*o)/e+a*a+h*h)),x=0;for(let m of t){let y=Math.hypot(m.x-a,m.z-h)-g;x+=y*y}let b=Math.sqrt(x/e);return{cx:a,cz:h,r:g,rmsResidual:b}}function Ol(t){let e=t.length;if(e<4)return{eigenRatio:1,isLinear:!1,spread:0,mx:0,mz:0,v1x:1,v1z:0,v2x:0,v2z:1,s1:0,s2:0};let n=0,o=0;for(let w of t)n+=w.x,o+=w.z;n/=e,o/=e;let s=0,r=0,i=0;for(let w of t){let z=w.x-n,M=w.z-o;s+=z*z,r+=M*M,i+=z*M}s/=e,r/=e,i/=e;let l=s+r,f=Math.max(0,(s-r)*(s-r)+4*i*i),d=Math.sqrt(f),u=(l+d)/2,c=(l-d)/2,a=Math.sqrt(u),h=Math.sqrt(c),g=h,x=1,b=0,m=0,p=1;if(Math.abs(i)>1e-12||Math.abs(s-r)>1e-12){let w=i,z=u-s,M=Math.sqrt(w*w+z*z);M>1e-12&&(x=w/M,b=z/M);let P=i,E=c-s,T=Math.sqrt(P*P+E*E);T>1e-12&&(m=P/T,p=E/T)}let y=u>1e-10?c/u:0;return{eigenRatio:y,isLinear:y<.05,spread:g,mx:n,mz:o,v1x:x,v1z:b,v2x:m,v2z:p,s1:a,s2:h}}function Ys(t,e,n){if(t.length<6)return{type:"straight",eigenRatio:.5,spread:0,cloudUsed:t.length,mx:0,mz:0,v1x:1,v1z:0,v2x:0,v2z:1,s1:0,s2:0};let{eigenRatio:o,isLinear:s,spread:r,mx:i,mz:l,v1x:f,v1z:d,v2x:u,v2z:c,s1:a,s2:h}=Ol(t),g=0;for(let w=1;w<t.length;w++){let z=t[w].x-t[w-1].x,M=t[w].z-t[w-1].z;g+=Math.sqrt(z*z+M*M)}let x=Fl(t),b=hn(x);if(b.r>.1&&b.r<Math.max(g*5,2)&&b.rmsResidual<.07)return{type:"curved",eigenRatio:o,spread:r,cloudUsed:t.length,mx:i,mz:l,v1x:f,v1z:d,v2x:u,v2z:c,s1:a,s2:h};let p=g>.01?r/g:1;return{type:s&&(r<.05||p<.1)?"straight":"curved",eigenRatio:o,spread:r,cloudUsed:t.length,mx:i,mz:l,v1x:f,v1z:d,v2x:u,v2z:c,s1:a,s2:h}}function Fl(t){if(t.length<4)return[...t];let e=[{...t[0]}];for(let n=1;n<t.length-1;n++)e.push({x:(t[n-1].x+t[n].x+t[n+1].x)/3,z:(t[n-1].z+t[n].z+t[n+1].z)/3});return e.push({...t[t.length-1]}),e}function Nl(t,e,n=1.57){if(e<10)return[];let o=[];for(let x=0;x<e;x++){let b=(x+1)%e;o.push(Math.atan2(t[b].z-t[x].z,t[b].x-t[x].x))}let s=[o[0]];for(let x=1;x<e;x++){let b=o[x]-o[x-1];b>Math.PI?b-=2*Math.PI:b<-Math.PI&&(b+=2*Math.PI),s.push(s[x-1]+b)}let r=0;{let x=o[0]-o[e-1];x>Math.PI?x-=2*Math.PI:x<-Math.PI&&(x+=2*Math.PI),r=x}Math.abs(r)<.1;let i=[],l=5;for(let x=0;x<e;x++){let b=0;for(let m=-l;m<=l;m++)b+=s[(x+m+e)%e];i.push(b/(l*2+1))}let f=5,d=[];for(let x=0;x<e;x++){let b=i[(x+f)%e]-i[x];b>Math.PI?b-=2*Math.PI:b<-Math.PI&&(b+=2*Math.PI),d.push(b)}let u=10,c=.003,a=10,h=.05,g=[];for(let x=0;x<e;x++){let b=x,m=x,p=0,y=0,w=x,z=e+10;for(;z-- >0;){let P=d[w],E=Math.abs(P),T=P>0?1:P<0?-1:0;if(E<c){w=(w+1)%e;continue}if(y===0){y=T,p=E,m=w,w=(w+1)%e;continue}if(T!==y){let V=E,_=T,v=(w+1)%e,S=1;for(let R=0;R<a&&S<a*2;R++){let D=d[v],W=Math.abs(D);if(W<c){v=(v+1)%e;continue}(D>0?1:-1)===_?V+=W:(V-=W,V<0&&(_=-_,V=-V)),v=(v+1)%e,S++}if(_===y&&V>h){w=(w+1)%e;continue}break}if(p+=E,m=w,w=(w+1)%e,w===x)break}if((m>b?m-b+1:e-b+m+1)>=u&&p>=n){let P=b,E=(b+f)%e,T=(m-f+e)%e,V=m,_=t[P],v=t[E],S=t[T],R=t[V],D=Math.atan2(v.z-_.z,v.x-_.x),I=Math.atan2(R.z-S.z,R.x-S.x)-D;I>Math.PI?I-=2*Math.PI:I<-Math.PI&&(I+=2*Math.PI);let C=Math.abs(I);if(!g.some(A=>{function k(L,B,$){return L<=B?$>=L&&$<=B:$>=L||$<=B}let O=0,N=0;for(let L=b;N++,k(A.start,A.end,L)&&O++,L!==m;L=(L+1)%e);return N>0&&O/N>.7})){let A=g.findIndex(k=>{function O(B,$,G){return B<=$?G>=B&&G<=$:G>=B||G<=$}let N=0,L=0;for(let B=k.start;L++,O(b,m,B)&&N++,B!==k.end;B=(B+1)%e);return L>0&&N/L>.7});A>=0?p>g[A].cumAngle&&(g[A]={start:b,end:m,cumAngle:p,actualAngle:C}):g.push({start:b,end:m,cumAngle:p,actualAngle:C})}}}return g}function ql(t,e){let r=new Array(e).fill(!1);for(let d=0;d<e;d++){let u=t[d],c=t[(d+15)%e],a=t[(d+30)%e],h=Math.atan2(c.z-u.z,c.x-u.x),g=Math.atan2(a.z-c.z,a.x-c.x),x=Math.abs(g-h);x>Math.PI&&(x=2*Math.PI-x),x>.07&&(r[(d+15)%e]=!0)}let i=new Set,l=[],f=-1;for(let d=0;d<e*2;d++){let u=d%e;if(r[u])f<0&&(f=u);else if(f>=0){let c=(u-1+e)%e,a=0;for(let h=f;a++,h!==c;h=(h+1)%e);if(a>=12){let h=`${f},${c}`;i.has(h)||(i.add(h),l.push({start:f,end:c}))}f=-1}}if(l.length>1){let d=l[0],u=l[l.length-1];u.end>e-3&&d.start<3&&(l[0]={start:u.start,end:d.end},l.pop())}return l}function $l(t,e){let n=[10,15,20,25,30,40],o=.15,s=.15,r=.5,i=3,l=6,f=new Array(e).fill(0);for(let c of n)if(!(c>=e))for(let a=0;a<e;a+=i){let h=a+c;if(h>=e)break;let g=[];for(let w=a;w<=h;w++)g.push(t[w]);if(g.length<c-1)continue;let{cx:x,cz:b,r:m,rmsResidual:p}=hn(g);if(m<.1||p>o||m<r)continue;let y=0;for(let w=1;w<g.length;w++){let z=g[w-1].x-x,M=g[w-1].z-b,P=g[w].x-x,E=g[w].z-b;y+=Math.abs(Math.atan2(z*E-M*P,z*P+M*E))}if(!(y<s))for(let w=a;w<=h;w++)f[w]++}let d=[],u=-1;for(let c=0;c<e*2;c++){let a=c%e;if(f[a]>=2)u<0&&(u=a);else if(u>=0){let h=(a-1+e)%e,g=0;for(let x=u;g++,x!==h;x=(x+1)%e);g>=l&&d.push({start:u,end:h}),u=-1}}if(d.length>1){let c=d[0],a=d[d.length-1];a.end>e-3&&c.start<3&&(d[0]={start:a.start,end:c.end},d.pop())}return d}function jl(t,e,n){function o(h,g){return h<=g?g-h+1:n-h+(g+1)}function s(h,g,x){return h<=g?x>=h&&x<=g:x>=h||x<=g}let r=o(t.start,t.end),i=o(e.start,e.end),l=r<=i?t.start:e.start,f=r<=i?t.end:e.end,d=r<=i?e.start:t.start,u=r<=i?e.end:t.end,c=0;for(let h=l;s(d,u,h)&&c++,h!==f;h=(h+1)%n);let a=r+i-c;return a>0?c/a:0}function Xl(t){if(t.length<2)return[];let e=[],n=.15,o=1.22,s=1.92;for(let l=0;l<t.length;l++){let f=t[l];for(let d=l+1;d<t.length;d++){let u=t[d],c=f.bx-f.ax,a=f.bz-f.az,h=u.bx-u.ax,g=u.bz-u.az,x=Math.sqrt(c*c+a*a),b=Math.sqrt(h*h+g*g);if(x<.01||b<.01)continue;let m=Math.abs(Math.atan2(c*g-a*h,c*h+a*g));if(m<o||m>s)continue;let p=[{x:f.ax,z:f.az},{x:f.bx,z:f.bz}],y=[{x:u.ax,z:u.az},{x:u.bx,z:u.bz}];for(let w of p)for(let z of y){let M=w.x-z.x,P=w.z-z.z;Math.sqrt(M*M+P*P)<n&&e.push({x:(w.x+z.x)/2,z:(w.z+z.z)/2})}}}if(e.length<2)return e;let r=[],i=new Array(e.length).fill(!1);for(let l=0;l<e.length;l++){if(i[l])continue;let f=e[l].x,d=e[l].z,u=1;i[l]=!0;for(let c=l+1;c<e.length;c++){if(i[c])continue;let a=e[c].x-f/u,h=e[c].z-d/u;Math.sqrt(a*a+h*h)<.3&&(f+=e[c].x,d+=e[c].z,u++,i[c]=!0)}r.push({x:f/u,z:d/u})}return r}function Us(t,e){if(t.length<6)return[];let n={minCurveAngle:.05,minCurvePoints:5,smoothWindow:3,...e},o=t.length,s=[];for(let S=0;S<o;S++){let R=t[(S-1+o)%o],D=t[S],W=t[(S+1)%o],I=D.x-R.x,C=D.z-R.z,H=W.x-D.x,A=W.z-D.z,k=Math.sqrt(I*I+C*C),O=Math.sqrt(H*H+A*A);if(k<.001||O<.001){s.push(0);continue}s.push(Math.atan2((I*A-C*H)/(k*O),(I*H+C*A)/(k*O)))}let r=[],i=n.smoothWindow;for(let S=0;S<o;S++){let R=0;for(let D=-i;D<=i;D++)R+=s[(S+D+o)%o];r.push(R/(i*2+1))}let l=.008,f=[],d=-1,u=0,c=new Set;for(let S=0;S<o*2;S++){let R=S%o,D=r[R],W=D>=0?1:-1;if(Math.abs(D)>l&&(u===0||u===W))d<0&&(d=R,u=W);else if(d>=0){let I=(R-1+o)%o,C=0,H=0;for(let A=d;C+=Math.abs(r[A]),H++,A!==I;A=(A+1)%o);if(H>=n.minCurvePoints&&C>n.minCurveAngle){let A=`${d},${I}`;c.has(A)||(c.add(A),f.push({start:d,end:I,sign:u}))}d=-1,u=0}}if(f.length>1){let S=f[0],R=f[f.length-1];S.sign===R.sign&&R.end>o-3&&S.start<3&&(f[0]={start:R.start,end:S.end,sign:S.sign},f.pop())}{let S=r.filter(I=>Math.abs(I)>.001).map(I=>Math.abs(I)),R=S.length>0?Math.max(...S):0,D=S.length>0?S.reduce((I,C)=>I+C,0)/S.length:0,W=f.reduce((I,C)=>{let H=0;for(let A=C.start;H++,A!==C.end;A=(A+1)%o);return I+H},0)}let a=ql(t,o),h=$l(t,o),g=[...f,...a.map(S=>({start:S.start,end:S.end,sign:1})),...h.map(S=>({start:S.start,end:S.end,sign:1}))],x=f.length,m=g.map((S,R)=>{let D=[];for(let G=S.start;D.push({...t[G]}),G!==S.end;G=(G+1)%o);let W=0;for(let G=1;G<D.length;G++)r[(S.start+G-1)%o]*r[(S.start+G)%o]<-1e-8&&W++;let{cx:I,cz:C,r:H,rmsResidual:A}=hn(D),k=0,O=0;for(let G=1;G<D.length;G++){let Q=D[G-1].x-I,q=D[G-1].z-C,X=D[G].x-I,Y=D[G].z-C,it=Math.atan2(Q*Y-q*X,Q*X+q*Y);k+=Math.abs(it),O+=it}let N=Se(D),L=W===0?.12:.08;if(H>.1&&A>L||H>.1&&H>Math.max(N*15,8)||Math.abs(O)<.05)return null;let B=R<x?"turning":"sliding",$=B!=="turning"?Math.abs(O)>.35?"C_curve":"S_curve":W>0?"S_curve":"C_curve";return{seg:{points:D,type:$,radius:H,centerX:I,centerZ:C,arcAngle:k,arcLength:N},start:S.start,end:S.end,source:B}}).filter(S=>S!==null),p=new Set;function y(S,R){return S<=R?R-S+1:o-S+(R+1)}function w(S,R,D,W){for(let I=S;;I=(I+1)%o){let C;if(D<=W?C=I>=D&&I<=W:C=I>=D||I<=W,!C)return!1;if(I===R)break}return!0}for(let S=0;S<m.length;S++)if(!p.has(S))for(let R=S+1;R<m.length;R++){if(p.has(R))continue;if(jl({start:m[S].start,end:m[S].end},{start:m[R].start,end:m[R].end},o)>.6){let I=(m[S].seg.arcAngle>=m[R].seg.arcAngle?S:R)===S?R:S;if(m[S].seg.arcAngle>=m[R].seg.arcAngle)p.add(R);else{p.add(S);break}}else{let W=y(m[S].start,m[S].end),I=y(m[R].start,m[R].end),C=W<=I?S:R,H=W<=I?R:S;w(m[C].start,m[C].end,m[H].start,m[H].end)&&y(m[C].start,m[C].end)/y(m[H].start,m[H].end)<.7&&p.add(C)}}let z=m.filter((S,R)=>!p.has(R)),M=10,P=10,E=30,T=15,V=[],_=0;if(z.length>0){for(let D of z)D.start=(D.start-T+o)%o,D.end=(D.end+T)%o;let S=[...z].sort((D,W)=>D.start-W.start),R=S[0];for(let D=1;D<S.length;D++){let W=S[D],I=W.start-R.end;I<0&&(R.end>o*.5&&W.start<o*.5?I=W.start+o-R.end:I=0);let C=I===0,H=I<=E&&C;if(!H&&I<=E){let A=Math.sqrt((R.seg.centerX-W.seg.centerX)**2+(R.seg.centerZ-W.seg.centerZ)**2),k=Math.max(R.seg.radius,W.seg.radius),O=Math.min(R.seg.radius,W.seg.radius),N=O>0?k/O:99;H=A<P&&N<M}if(H){let A=Math.min(R.start,W.start),k=Math.max(R.end,W.end),O=[];for(let G=A;O.push({...t[G]}),G!==k;G=(G+1)%o);let{cx:N,cz:L,r:B}=hn(O),$=0;for(let G=1;G<O.length;G++){let Q=O[G-1].x-N,q=O[G-1].z-L,X=O[G].x-N,Y=O[G].z-L;$+=Math.abs(Math.atan2(Q*Y-q*X,Q*X+q*Y))}R={seg:{points:O,type:"C_curve",radius:B,centerX:N,centerZ:L,arcAngle:$,arcLength:Se(O)},start:R.start,end:W.end,source:R.source},_++}else V.push(R),R=W}V.push(R)}{if(V.length>1){let R=V.map((D,W)=>{if(W===0)return 0;let I=D.start-V[W-1].end;return I<0&&(I=D.start+o-V[W-1].end),I})}let S=[];for(let R=0;R<V.length;R++){if(S.length===0){S.push(V[R]);continue}let D=S[S.length-1],W=V[R].start-D.end;if(W<0&&(W=V[R].start+o-D.end),W<=30){let I=[...D.seg.points];for(let O=(D.end+1)%o;I.push({...t[O]}),O!==V[R].end;O=(O+1)%o);let{cx:C,cz:H,r:A}=hn(I),k=0;for(let O=1;O<I.length;O++){let N=I[O-1].x-C,L=I[O-1].z-H,B=I[O].x-C,$=I[O].z-H;k+=Math.abs(Math.atan2(N*$-L*B,N*B+L*$))}S[S.length-1]={seg:{points:I,type:"C_curve",radius:A,centerX:C,centerZ:H,arcAngle:k,arcLength:Se(I)},start:D.start,end:V[R].end,source:D.source}}else S.push(V[R])}V=S}return V.map((S,R)=>{let D=S.seg;return D.candidateId=R,D})}function Gl(t){let e=t.length;if(e<6)return null;let n=Nl(t,e,.35);if(n.length===0)return null;let o=n.filter(a=>a.actualAngle!=null&&a.actualAngle>.17);if(o.length===0)return null;o.sort((a,h)=>{let g=a.end>=a.start?a.end-a.start+1:e-a.start+a.end+1;return(h.end>=h.start?h.end-h.start+1:e-h.start+h.end+1)-g});let s=o[0],r=[];for(let a=s.start;r.push({...t[a]}),a!==s.end;a=(a+1)%e);if(r.length<10)return null;let{cx:i,cz:l,r:f,rmsResidual:d}=hn(r);if(f>.1&&d>.1)return null;let u=s.actualAngle,c=r.reduce((a,h,g)=>g===0?0:a+Math.hypot(h.x-r[g-1].x,h.z-r[g-1].z),0);return f>.3&&u>.17?{points:r,type:"C_curve",radius:f,centerX:i,centerZ:l,arcAngle:u,arcLength:c}:null}function ho(t,e,n){let o={...er,...n},s=Date.now(),r=t,i=Array.isArray(e)?e:[],l=[];if(i.length>10)try{for(let S of i){let R=S.x1,D=S.z1,W=S.x2,I=S.z2;if(R==null||D==null||W==null||I==null){let C=S.start?.x,H=S.start?.y,A=S.end?.x,k=S.end?.y;if(C==null||H==null||A==null||k==null)continue;l.push({ax:C,az:H,bx:A,bz:k})}else l.push({ax:R,az:D,bx:W,bz:I})}let v=.1*.1;if(l.length>5){let S=[],R=[],D=new Array(l.length).fill(0);for(let I of t){let C=1/0,H=-1;for(let A=0;A<l.length;A++){let k=l[A],O=k.bx-k.ax,N=k.bz-k.az,L=O*O+N*N,B;if(L<1e-8)B=(I.x-k.ax)**2+(I.y-k.az)**2;else{let $=((I.x-k.ax)*O+(I.y-k.az)*N)/L;$=Math.max(0,Math.min(1,$));let G=k.ax+$*O,Q=k.az+$*N;B=(I.x-G)**2+(I.y-Q)**2}if(B<C&&(C=B,H=A),C<=v)break}C<=v&&(R.push(I),S.push(H),D[H]++)}let W=R;if(o.lineDensityMin>0&&o.lineDensityMinLen>0){let I=new Set;for(let C=0;C<l.length;C++){let H=l[C],A=Math.hypot(H.bx-H.ax,H.bz-H.az);if(A>=o.lineDensityMinLen)continue;(A>.01?D[C]/A:0)<o.lineDensityMin&&I.add(C)}if(I.size>0){let C=[];for(let H=0;H<R.length;H++)I.has(S[H])||C.push(R[H]);W=C}}r=W}}catch(v){console.warn("[\u70B9\u4E91\u8F6E\u5ED3] \u7EBF\u6BB5\u8FC7\u6EE4\u5931\u8D25:",v)}let f=Xl(l),d=[];for(let v of r){let S=v.z;S<o.heightMin||S>o.heightMax||d.push({x:v.x,z:v.y})}if(d.length<50)return Qe(e,s);if(o.sparseRadius>0){let v=new Map,S=o.cellSize;for(let I of d){let C=`${Math.round(I.x/S)},${Math.round(I.z/S)}`;v.has(C)||v.set(C,[]),v.get(C).push(I)}let R=[],D=Math.ceil(o.sparseRadius/S);for(let I=-D;I<=D;I++)for(let C=-D;C<=D;C++)R.push(`${I},${C}`);let W=[];for(let I of d){let C=Math.round(I.x/S),H=Math.round(I.z/S),A=0;for(let k of R){let[O,N]=k.split(",").map(Number),L=v.get(`${C+O},${H+N}`);if(L&&(A+=L.length),A>=o.sparseMinNeighbors)break}A>=o.sparseMinNeighbors&&W.push(I)}d.length=0;for(let I=0;I<W.length;I++)d.push(W[I])}if(d.length<50)return Qe(e,s);let u=Date.now(),{cells:c}=fo(d,o.cellSize),a=new Set;if(o.densityRatio>0&&c.size>10){let v=Array.from(c.values()).sort((D,W)=>D-W),S=v[Math.floor(v.length/2)],R=Math.max(o.densityThreshold,Math.ceil(S*o.densityRatio));for(let[D,W]of c)W>=R&&a.add(D);if(a.size<o.minComponentCells){a.clear();for(let[D,W]of c)W>=o.densityThreshold&&a.add(D)}}else for(let[v,S]of c)S>=o.densityThreshold&&a.add(v);if(a.size<o.minComponentCells)return Qe(e,s);let h=a;o.closeIterations>0&&(h=Wn(a,o.closeIterations));let g=Date.now(),x=Jo(h).filter(v=>v.size>=o.minComponentCells);x.sort((v,S)=>S.size-v.size);let b=20;x.length>b&&(x=x.slice(0,b));let m=Date.now(),p=[];for(let v of x){let S=tr(v,o.cellSize);S.length>=4&&p.push(S)}let y=Date.now(),w=p.map(v=>{let S=Cn(v,o.simplifyEpsilon);if(S.length>=7)for(let R=0;R<2;R++){let D=S.length,W=S.map(I=>({x:I.x,z:I.z}));for(let I=0;I<D;I++){let C=S[(I-1+D)%D],H=S[I],A=S[(I+1)%D],k=H.x-C.x,O=H.z-C.z,N=A.x-H.x,L=A.z-H.z,B=Math.sqrt(k*k+O*O),$=Math.sqrt(N*N+L*L);if(B<.001||$<.001)continue;if(Math.abs(Math.atan2(k*L-O*N,k*N+O*L))>1.8){let Q=[-2,-1,0,1,2].map(Y=>S[(I+Y+D)%D]),q=Q.map(Y=>Y.x).sort((Y,it)=>Y-it),X=Q.map(Y=>Y.z).sort((Y,it)=>Y-it);W[I]={x:q[2],z:X[2]}}}S=W}if(S=Qo(S),f.length>0&&S.length>=5)for(let R of f){let D=1/0,W=-1;for(let I=0;I<S.length;I++){let C=S[I].x-R.x,H=S[I].z-R.z,A=C*C+H*H;A<D&&(D=A,W=I)}W>=0&&D<.3*.3&&(S[W]={x:R.x,z:R.z})}if(S.length>2){let R=S[0],D=S[S.length-1];(Math.abs(R.x-D.x)>.001||Math.abs(R.z-D.z)>.001)&&S.push({...R})}return S}),z=o.cellSize/2;function M(v){let S=0;for(let R=0;R<v.length;R++){let D=(R+1)%v.length;S+=v[R].x*v[D].z-v[D].x*v[R].z}return S/2}let P=w.map(v=>{if(v.length<3)return v;let S=M(v)>=0;return v.map((R,D)=>{let W=v[(D-1+v.length)%v.length],I=v[(D+1)%v.length],C=I.x-W.x,H=I.z-W.z;if(Math.sqrt(C*C+H*H)<.001)return{...R};let k=S?H:-H,O=S?-C:C,N=Math.sqrt(k*k+O*O);return N<.001?{...R}:{x:R.x+k/N*z,z:R.z+O/N*z}})}),E=Date.now(),T=[];for(let v=0;v<P.length;v++){let S=P[v];S.length<3||T.push({id:-v-1,points:S,length:Se(S),pointCount:S.length,type:"straight",isMain:!1})}let V=Date.now()-s,_=[];for(let v of w){let S=Us(v);for(let D of S)_.push(D);let R=Gl(v);R&&_.push(R)}return{mainWalls:[],noiseWalls:[],contours:T,curvedSegments:_,filteredPoints:r,stats:{totalRawLines:e?.length??t.length,totalWalls:0,mainCount:0,noiseCount:T.length,elapsedMs:V}}}function Ks(t,e){let n=e?.cellSize??.05,o=e?.closeIterations??2,s=e?.minComponentCells??10,r=e?.simplifyEpsilon??.02,i=Date.now();if(t.length<3)return Qe(t,i);let l=t.map(T=>({x1:T.x1,z1:T.z1,x2:T.x2,z2:T.z2})),{active:f}=Zs(l,n);if(f.size<s)return Qe(t,i);let d=Date.now(),u=Wn(f,o),c=Date.now(),a=Jo(u).filter(T=>T.size>=s);if(a.length===0)return Qe(t,i);let h=a.reduce((T,V)=>T.size>=V.size?T:V),g=Date.now(),x=tr(h,n);if(x.length<4)return Qe(t,i);let b=Date.now(),m=Cn(x,r);if(m=Qo(m),m.length>2){let T=m[0],V=m[m.length-1];(Math.abs(T.x-V.x)>.001||Math.abs(T.z-V.z)>.001)&&m.push({...T})}let p=n/2;function y(T){let V=0;for(let _=0;_<T.length;_++){let v=(_+1)%T.length;V+=T[_].x*T[v].z-T[v].x*T[_].z}return V/2}let w=y(m)>=0,z=m.map((T,V)=>{let _=m[(V-1+m.length)%m.length],v=m[(V+1)%m.length],S=v.x-_.x,R=v.z-_.z;if(Math.sqrt(S*S+R*R)<.001)return{...T};let W=w?R:-R,I=w?-S:S,C=Math.sqrt(W*W+I*I);return C<.001?{...T}:{x:T.x+W/C*p,z:T.z+I/C*p}}),M=Date.now(),P=[];z.length>=3&&P.push({id:-1,points:z,length:Se(z),pointCount:z.length,type:"straight",isMain:!0});let E=Date.now()-i;return{mainWalls:[],noiseWalls:[],contours:P,stats:{totalRawLines:t.length,totalWalls:0,mainCount:0,noiseCount:P.length,elapsedMs:E}}}function Qe(t,e){return{mainWalls:[],noiseWalls:[],stats:{totalRawLines:t?.length??0,totalWalls:0,mainCount:0,noiseCount:0,elapsedMs:Date.now()-e}}}function mo(t,e,n){if(!t.length||n<=1)return t;let o=new Map;for(let l of t){let f=Math.floor(l.x/e),d=Math.floor(l.y/e),u=`${f},${d}`;o.has(u)||o.set(u,[]),o.get(u).push(l)}let s=new Map;for(let[l,f]of o){let[d,u]=l.split(","),c=parseInt(d),a=parseInt(u),h=0;for(let g=-2;g<=2;g++)for(let x=-2;x<=2;x++){let b=`${c+g},${a+x}`;h+=o.get(b)?.length??0}s.set(l,h)}let r=[],i=0;for(let l of t){let f=Math.floor(l.x/e),d=Math.floor(l.y/e),u=`${f},${d}`;(s.get(u)??0)>=n?r.push(l):i++}return r}function go(t,e,n){if(!t.length||n<=1||e<=0)return t;let o=new Map;for(let r of t){let i=Math.floor(r.x/e),l=Math.floor(r.y/e),f=Math.floor(r.z/e),d=`${i},${l},${f}`;o.has(d)||o.set(d,[]),o.get(d).push(r)}let s=[];for(let r of o.values())if(r.length>=n){let i=r.reduce((d,u)=>d+u.x,0)/r.length,l=r.reduce((d,u)=>d+u.y,0)/r.length,f=r.reduce((d,u)=>d+u.z,0)/r.length;s.push({x:i,y:l,z:f})}return s}function Qs(t,e,n){let o=go(t,e,n),s=t.length-o.length;return o}function Js(t){let e=[];for(let d of t){let u=d.originalPoints??d.points??[];if(!Array.isArray(u)||u.length<2)continue;let c=Math.min(u.length,200);for(let a=1;a<c;a++){let h=Math.hypot(u[a].x-u[a-1].x,u[a].y-u[a-1].y,u[a].z-u[a-1].z);h>.001&&e.push(h)}}let n={voxelSize:.08,minPoints:3,minCentroids:3};if(e.length<10)return n;e.sort((d,u)=>d-u);let o=e[Math.floor(e.length/2)],s=Math.max(.03,Math.min(.25,o*3.5));s=Math.round(s*100)/100;let r=Math.pow(s/o,2),i=Math.max(2,Math.min(5,Math.round(r/4))),l=e.length/Math.max(1,t.length),f=Math.max(2,Math.min(4,Math.round(l/50)));return{voxelSize:s,minPoints:i,minCentroids:f}}function ti(t,e,n,o,s=3){if(!t.length||n<=0||o<=1)return{data:t,lines:e,removedCount:0};let r=[],i=[],l=0;for(let f=0;f<t.length;f++){let d=t[f],u=d.originalPoints??d.points??[];if(!Array.isArray(u)||u.length===0){r.push(d),i.push(e[f]);continue}let c=go(u,n,o);c.length>=s?(d.originalPoints&&(d.originalPoints=c),d.points&&(d.points=c),r.push(d),i.push(e[f])):l++}return{data:r,lines:i,removedCount:l}}function ei(t,e,n,o){let s=[],r=[],i=0;for(let l=0;l<t.length;l++){let f=t[l],d=f.originalPoints??f.points??[],c=(Array.isArray(d)?d.filter(b=>b&&b.x!==void 0&&b.y!==void 0):[]).length;if(c===0){s.push(f),r.push({...e[l],id:s.length-1});continue}let a=f.start??f,h=f.end??f,g=Math.hypot(h.x??0-a.x??0,h.y??0-a.y??0);if(g>=o||g<=.01){s.push(f),r.push({...e[l],id:s.length-1});continue}if(c/g<n){i++;continue}s.push(f),r.push({...e[l],id:s.length-1})}return{data:s,lines:r}}function Je(t,e,n,o,s,r){let i=s-n,l=r-o,f=i*i+l*l;if(f===0)return Math.hypot(t-n,e-o);let d=((t-n)*i+(e-o)*l)/f;return d=Math.max(0,Math.min(1,d)),Math.hypot(t-(n+d*i),e-(o+d*l))}function nr(t,e,n=.2){for(let o of e)if(Je(o.x,o.z,t.x1,t.z1,t.x2,t.z2)<=n)return!0;return!1}function ni(t,e,n=.2){let o=1/0,s={x:0,z:0};for(let i of e){let l=Je(i.x,i.z,t.x1,t.z1,t.x2,t.z2);l<o&&(o=l,s=i)}return o<=n}function oi(t,e,n,o=!0){function g(y,w,z,M){let P=z.points[0],E=z.points[z.points.length-1];return Math.hypot(y-P.x,w-P.z)<=M||Math.hypot(y-E.x,w-E.z)<=M}function x(y,w,z,M){for(let P=0;P<z.points.length-1;P++)if(Je(y,w,z.points[P].x,z.points[P].z,z.points[P+1].x,z.points[P+1].z)<=M)return!0;return!1}function b(y,w,z){let M=0,P=y[0],E=y[y.length-1];for(let T of w)if(g(P.x,P.z,T,z)||x(P.x,P.z,T,z)){M++;break}for(let T of w)if(g(E.x,E.z,T,z)||x(E.x,E.z,T,z)){M++;break}return M}function m(y){if(y.length<2)return 0;if(y.length<=30){let P=0;for(let E=0;E<y.length;E++)for(let T=E+1;T<y.length;T++){let V=Math.hypot(y[E].x-y[T].x,y[E].z-y[T].z);V>P&&(P=V)}return P}let w=Math.max(1,Math.floor(y.length/15)),z=[];for(let P=0;P<y.length;P+=w)z.push(y[P]);z[z.length-1]!==y[y.length-1]&&z.push(y[y.length-1]);let M=0;for(let P=0;P<z.length;P++)for(let E=P+1;E<z.length;E++){let T=Math.hypot(z[P].x-z[E].x,z[P].z-z[E].z);T>M&&(M=T)}return M}let p=[];for(let y of t){let w=y.points,z=w.length>=2?m(w):0,M=y.candidateId!==void 0?`#${y.candidateId}`:"#?";if(o&&console.log(`[\u5F27\u6BB5\u5206\u6790] ${M} r=${y.radius.toFixed(3)}m \u5F27\u89D2=${(y.arcAngle*180/Math.PI).toFixed(1)}\xB0 \u5F26\u957F=${z.toFixed(3)}m pts=${w.length}`),y.radius<.2){o&&console.log(` \u2192 \u534A\u5F84<${.2}m \u8FC7\u6EE4`);continue}if(w.length<3){o&&console.log(" \u2192 \u70B9\u6570<3 \u8FC7\u6EE4");continue}let P=z/y.radius,E=z/2,T=0;E<=y.radius?T=y.radius-Math.sqrt(y.radius*y.radius-E*E):T=z;let V=z>.01?T/z:0,_=b(w,e,.8),v=y.arcAngle>1.745&&y.radius<5,S=y.radius>15&&P>.15&&w.length>=10,R=P>.12&&y.radius>1&&y.radius<4&&y.arcAngle>=.35&&w.length>=3;if(o&&console.log(` \u7279\u5F81: \u5F26\u957F/\u534A\u5F84=${P.toFixed(3)} \u5F13\u9AD8/\u5F26\u957F=${V.toFixed(4)} \u8FDE\u63A5=${_}/2${v?" \u5927\u5F27\u89D2\u8C41\u514D":""}${S?" \u5927\u534A\u5F84\u7ED3\u6784\u5F27":""}${R?" \u5408\u7406\u77ED\u5F27\u8C41\u514D":""}`),w.length>20&&y.arcAngle>5.2&&y.radius>.2){o&&console.log(` \u2192 \u8FD1\u95ED\u5408\u5706\u8C41\u514D(\u5F27\u89D2=${(y.arcAngle*180/Math.PI).toFixed(1)}\xB0, ${w.length}pts)`),p.push(y);continue}if(P<.15)if(_>=2&&y.arcAngle>=.35)o&&console.log(` \u2192 \u5F26\u957F/\u534A\u5F84=${P.toFixed(3)} < ${.15}\uFF0C\u4F46\u4E24\u7AEF\u8FDE\u63A5+\u5F27\u89D2>20\xB0\uFF0C\u8C41\u514D`);else{o&&console.log(` \u2192 \u5F26\u957F/\u534A\u5F84=${P.toFixed(3)} < ${.15}\uFF0C\u8F6E\u5ED3\u6296\u52A8\u5047\u5F27 \u8FC7\u6EE4`);continue}let D=_>=2?.025:.035;if(V<D&&!v&&!R&&!S){o&&console.log(` \u2192 \u5F13\u9AD8/\u5F26\u957F=${V.toFixed(4)} < ${D}(${_>=2?"\u5BBD\u677E":"\u6807\u51C6"})\uFF0C\u6781\u6241\u5F27(\u76F4\u7EBF\u6BB5\u566A\u58F0) \u8FC7\u6EE4`);continue}if(!v&&!R&&!S){if(y.arcAngle<.17){o&&console.log(` \u2192 \u5F27\u89D2<${(.17*180/Math.PI).toFixed(0)}\xB0 \u8FC7\u6EE4`);continue}if(y.arcAngle<.35&&_<2){o&&console.log(` \u2192 \u5F27\u89D2<${(.35*180/Math.PI).toFixed(0)}\xB0 \u4E14\u672A\u4E24\u7AEF\u8FDE\u63A5 \u8FC7\u6EE4`);continue}}if(P>2.01){o&&console.log(` \u2192 \u5F26\u957F/\u534A\u5F84=${P.toFixed(3)} > 2.01\uFF0C\u5F26\u957F\u8D85\u8FC7\u76F4\u5F84\uFF0C\u5F02\u5E38 \u8FC7\u6EE4`);continue}if(!v&&!S){let W=_>=2?2.5:1.5,I=Math.floor(w.length/2),C=w[I].x-w[0].x,H=w[I].z-w[0].z,A=w[w.length-1].x-w[I].x,k=w[w.length-1].z-w[I].z,O=Math.atan2(H,C),N=Math.atan2(k,A),L=Math.abs(N-O);if(L>Math.PI&&(L=2*Math.PI-L),L>60*Math.PI/180&&L>y.arcAngle*W){o&&console.log(` \u2192 V\u5F62\u62D0\u89D2\u8FC7\u6EE4 \u8F6C\u89D2=${(L*180/Math.PI).toFixed(1)}\xB0 > \u5F27\u89D2\xD7${W.toFixed(1)}=${(y.arcAngle*180/Math.PI*W).toFixed(1)}\xB0`);continue}}if(n&&n.length>5&&!(y.radius>15&&y.arcAngle>.26)){let W=w[0],I=w[w.length-1],C=.3,H=null,A=1/0,k=null,O=1/0;for(let N of n){let L=Je(W.x,W.z,N.x1,N.z1,N.x2,N.z2),B=Je(I.x,I.z,N.x1,N.z1,N.x2,N.z2);L<C&&L<A&&(H=N,A=L),B<C&&B<O&&(k=N,O=B)}if(!H||!k)console.log(` [\u7EBF\u6BB5\u8F6C\u89D2\u8C03\u8BD5 #${M}] \u672A\u627E\u5230\u5B8C\u6574\u7EBF\u6BB5: \u8D77\u7AEF=${!!H}(d=${A.toFixed(3)}) \u672B\u7AEF=${!!k}(d=${O.toFixed(3)})`);else if(H===k){console.log(" \u2192 \u7EBF\u6BB5\u8F6C\u89D2\u9A8C\u8BC1: \u5F27\u4E24\u7AEF\u5728\u540C\u4E00\u6761\u7EBF\u6BB5\u4E0A, \u76F4\u7EBF\u566A\u58F0\u5047\u5F27 \u8FC7\u6EE4");continue}else{let N=H.x2-H.x1,L=H.z2-H.z1,B=k.x2-k.x1,$=k.z2-k.z1,G=Math.sqrt(N*N+L*L),Q=Math.sqrt(B*B+$*$);if(G>.01&&Q>.01){let q=Math.abs(Math.atan2(N*$-L*B,N*B+L*$)),X=q*180/Math.PI;if(console.log(` [\u7EBF\u6BB5\u8F6C\u89D2\u8C03\u8BD5 #${M}] \u5F27\u4E24\u7AEF\u6BB5\u5939\u89D2=${X.toFixed(1)}\xB0 \u5F27\u89D2=${(y.arcAngle*180/Math.PI).toFixed(1)}\xB0`),q>.35&&q<3.05){let Y=q>2.09;if(!Y||y.arcAngle<.44){console.log(` \u2192 \u7EBF\u6BB5\u8F6C\u89D2\u9A8C\u8BC1: \u5F27\u4E24\u7AEF\u6BB5\u5939\u89D2=${X.toFixed(1)}\xB0\uFF0C${Y?"\u659C\u5899":"\u6298\u5899"}\u78E8\u5706\u5047\u5F27 \u8FC7\u6EE4`);continue}}}}}o&&console.log(" \u2192 \u2713 \u4FDD\u7559"),p.push(y)}return o&&console.log(`[\u56DE\u52A0\u5224\u65AD] ${t.length} \u2192 ${p.length} \u4E2A\u5F27\u6BB5`),p}function ri(t,e){for(let n=0;n<t.length;n++){let o=t[n],s=[];for(let i of e)nr(i,o.points)&&s.push({id:i.id,len:Math.hypot(i.x2-i.x1,i.z2-i.z1)});s.sort((i,l)=>l.len-i.len);let r=s.map(i=>`#${i.id}(${i.len.toFixed(2)}m)`).join(", ");console.log(`[\u5F27\u6BB5\u539F\u59CB\u7EBF\u6BB5] #${n} r=${o.radius.toFixed(3)}m \u2192 ${s.length} \u6761: ${r}`)}}var rr={gridSize:2,connectDist:.8,angleTol:25,minLength:.8,minPointCount:3,hardCornerThreshold:30,minArea:5,minCurvePoints:6,curveStraightDist:.25,longWallMinLength:5};function si(t){if(!t.length)return{rotated:[],mainAngle:0};let e=180,n=new Array(e).fill(0),o=Math.PI/e;for(let u of t){let c=u.x2-u.x1,a=u.z2-u.z1,h=Math.sqrt(c*c+a*a);if(h<.01)continue;let g=Pe(c,a),x=Math.floor(g/o);x>=e&&(x=e-1),n[x]+=h}let s=new Array(e).fill(0),r=5;for(let u=0;u<e;u++){let c=0;for(let a=-r;a<=r;a++){let h=u+a;h<0&&(h+=e),h>=e&&(h-=e),c+=n[h]}s[u]=c}let i=0,l=0;for(let u=0;u<e;u++)s[u]>i&&(i=s[u],l=u);let f=(l+.5)*o;return{rotated:t.map(u=>{let c=Vn(u.x1,u.z1,-f),a=Vn(u.x2,u.z2,-f);return{...u,x1:c.x,z1:c.z,x2:a.x,z2:a.z}}),mainAngle:f}}function ii(t,e){let n=new Map;for(let o of t){let s=(o.x1+o.x2)/2,r=(o.z1+o.z2)/2,i=Math.floor(s/e),l=Math.floor(r/e),f=`${i},${l}`;n.has(f)||n.set(f,[]),n.get(f).push(o)}return n}function ai(t,e,n){if(t.length===0)return[];let o=new Set,s=[];for(let r of t){if(o.has(r.id))continue;let i=[r],l=[],f=new Set([r.id]);o.add(r.id);let d=!0;for(;d;){d=!1;let a=i[i.length-1],h=a.x2,g=a.z2,x=Pe(a.x2-a.x1,a.z2-a.z1),b=null,m=e;for(let p of t){if(o.has(p.id))continue;let y=be(h,g,p.x1,p.z1),w=be(h,g,p.x2,p.z2),z=w<y,M=Math.min(y,w);if(M>m)continue;let P=z?Pe(p.x1-p.x2,p.z1-p.z2):Pe(p.x2-p.x1,p.z2-p.z1);Math.abs(vn(P-x))>n||(b=p,m=M)}if(b){o.add(b.id),f.add(b.id);let p=i[i.length-1],y=be(p.x2,p.z2,b.x1,b.z1),w=be(p.x2,p.z2,b.x2,b.z2);y<=w?i.push(b):i.push({id:b.id,x1:b.x2,z1:b.z2,x2:b.x1,z2:b.z1}),d=!0}}for(d=!0;d;){d=!1;let a=l.length>0?l[l.length-1]:i[0],h=l.length>0?a.x2:a.x1,g=l.length>0?a.z2:a.z1,x=l.length>0?Pe(a.x2-a.x1,a.z2-a.z1):Pe(a.x2-a.x1,a.z2-a.z1),b=null,m=e;for(let p of t){if(o.has(p.id))continue;let y=be(h,g,p.x1,p.z1),w=be(h,g,p.x2,p.z2),z=w<y,M=Math.min(y,w);if(M>m)continue;let P=z?Pe(p.x1-p.x2,p.z1-p.z2):Pe(p.x2-p.x1,p.z2-p.z1);Math.abs(vn(P-x))>n||(b=p,m=M)}if(b){o.add(b.id),f.add(b.id);let p=be(h,g,b.x1,b.z1),y=be(h,g,b.x2,b.z2);p<=y?l.push({id:b.id,x1:b.x2,z1:b.z2,x2:b.x1,z2:b.z1}):l.push({...b}),d=!0}}let u=[];for(let a=l.length-1;a>=0;a--){let h=l[a];a===l.length-1&&u.push({x:h.x1,z:h.z1}),u.push({x:h.x2,z:h.z2})}for(let a=0;a<i.length;a++){let h=i[a];a===0&&u.length===0&&u.push({x:h.x1,z:h.z1}),u.push({x:h.x2,z:h.z2})}let c=[];for(let a of u){if(c.length>0){let h=c[c.length-1];if(Math.abs(a.x-h.x)<.001&&Math.abs(a.z-h.z)<.001)continue}c.push(a)}if(c.length>=2){let a=Se(c);s.push({points:c,length:a,pointCount:i.length+l.length,lineIds:[...f]})}}return s}function li(t){if(t.length<3)return[];let e=[];for(let n=1;n<t.length-1;n++){let o=t[n].x-t[n-1].x,s=t[n].z-t[n-1].z,r=t[n+1].x-t[n].x,i=t[n+1].z-t[n].z,l=Math.atan2(s,o),f=Math.atan2(i,r),d=vn(f-l);e.push(d)}return e}function ci(t,e=6){if(t.length<3)return"straight";let n=t[0],o=t[t.length-1],s=o.x-n.x,r=o.z-n.z;if(Math.sqrt(s*s+r*r)>.1){let u=0;for(let c of t){let a=In(c.x,c.z,n.x,n.z,o.x,o.z);a>u&&(u=a)}if(u<.05)return"straight"}let l=li(t);if(l.reduce((u,c)=>u+Math.abs(c),0)<.1||t.length<e)return"straight";let d=0;for(let u=0;u<l.length-1;u++)l[u]*l[u+1]<0&&d++;return d>0?"S_curve":"C_curve"}function ui(t,e){if(t.length<3)return[t];let n=uo(e),o=li(t),s=[],r=0;for(let i=0;i<o.length;i++)Math.abs(o[i])>n&&(s.push(t.slice(r,i+2)),r=i+1);return r<t.length-1&&s.push(t.slice(r)),s}function fi(t,e,n=6){let o=[],s=0;for(let r of t){let i=ui(r.points,e);for(let l of i){if(l.length<2)continue;let f=ci(l,n),d=Se(l),u=d/(r.length||1),c=Math.max(1,Math.round(r.pointCount*u));o.push({id:s++,points:l,length:d,pointCount:c,lineIds:r.lineIds,type:f,isMain:!1})}}return o}function di(t,e){if(t.length<3)return new Set;let n=.15;function o(d,u){return Math.round(d/n)+"_"+Math.round(u/n)}let s=new Map,r=0;function i(d,u){let c=o(d,u),a=s.get(c);if(a)return a;let h=Math.round(d/n),g=Math.round(u/n),x=null,b=n*n;for(let m=-1;m<=1;m++)for(let p=-1;p<=1;p++){let y=h+m+"_"+(g+p),w=s.get(y);if(!w)continue;let z=w.x-d,M=w.z-u,P=z*z+M*M;P<b&&(b=P,x=w)}return x?(s.set(c,x),x):(a={id:r++,x:d,z:u,edges:[]},s.set(c,a),a)}for(let d of t){if(d.points.length<2)continue;let u=d.points[0],c=d.points[d.points.length-1],a=i(u.x,u.z),h=i(c.x,c.z);if(a.id===h.id)continue;let g={to:h,wallId:d.id,visited:!1,twin:null},x={to:a,wallId:d.id,visited:!1,twin:g};g.twin=x,a.edges.push(g),h.edges.push(x)}for(let d of s.values())d.edges.sort((u,c)=>{let a=Math.atan2(u.to.z-d.z,u.to.x-d.x),h=Math.atan2(c.to.z-d.z,c.to.x-d.x);return a-h});let l=new Set,f=new Set;for(let d of s.values())for(let u of d.edges)f.add(u);for(let d of f){if(d.visited)continue;let u=[],c=d,a=f.size+10;for(;!c.visited&&u.length<a;){c.visited=!0,u.push(c);let h=c.to,g=c.twin,x=h.edges.indexOf(g);if(x<0)break;let b=(x+1)%h.edges.length;c=h.edges[b]}if(u.length>=3){let h=u[0];if(u[u.length-1].to.id===h.from?.id){let x=[],b=new Set,m=null;for(let p of s.values())if(p.edges.includes(u[0])){m=p;break}if(!m)continue;x.push({x:m.x,z:m.z});for(let p of u)b.add(p.wallId),x.push({x:p.to.x,z:p.to.z});if(u[u.length-1].to.id===m.id&&Ko(x)>=e)for(let y of b)l.add(y)}}}return l}function mn(t,e){let n={...rr,...e},o=Date.now(),{rotated:s,mainAngle:r}=si(t),i=Date.now(),l=ii(s,n.gridSize),f=Date.now(),d=uo(n.angleTol),u=[];for(let v of l.values()){let S=v.map(D=>({id:D.id,x1:D.x1,z1:D.z1,x2:D.x2,z2:D.z2})),R=ai(S,n.connectDist,d);u.push(...R)}let c=Date.now(),a=new Set,h=u.filter(v=>{let S=v.length>=n.minLength||v.pointCount>=n.minPointCount;return S&&a.add(v),S}),g=u.filter(v=>!a.has(v)),x=Date.now(),b=fi(h,n.hardCornerThreshold,n.minCurvePoints),m=Date.now(),p=di(b,n.minArea);b.forEach(v=>{v.isMain=p.has(v.id),v.length>=n.longWallMinLength&&(v.isMain=!0)});let y=Date.now();function w(v,S,R=.1){let D=v[0],W=v[v.length-1],I=S[0],C=S[S.length-1];return Math.hypot(D.x-I.x,D.z-I.z)<R||Math.hypot(D.x-C.x,D.z-C.z)<R||Math.hypot(W.x-I.x,W.z-I.z)<R||Math.hypot(W.x-C.x,W.z-C.z)<R}let z=[],M=[];for(let v of b){if(v.type==="straight"&&v.points.length>=2){let S=!1;for(let R of b){if(R.id===v.id||R.type==="straight"||w(v.points,R.points))continue;if(Gs(v.points,R.points)<n.curveStraightDist){S=!0;break}}if(S){z.push({...v,id:-z.length-1});continue}}M.push(v)}let P=Date.now(),E=M,T=[];for(let v=0;v<g.length;v++){let S=g[v];T.push({id:-v-1,points:S.points,length:S.length,pointCount:S.pointCount,lineIds:S.lineIds,type:"straight",isMain:!1})}for(let v of z)T.push(v);let V=v=>v.map(S=>({...S,points:S.points.map(R=>Vn(R.x,R.z,r))})),_=Date.now()-o;return{mainWalls:V(E),noiseWalls:V(T),stats:{totalRawLines:t.length,totalWalls:b.length,mainCount:E.length,noiseCount:T.length,elapsedMs:_}}}function sr(t,e,n){let o={...er,...n},s=Date.now(),r=[];for(let h of t){let g=h.z;g<o.heightMin||g>o.heightMax||r.push({x:h.x,z:h.y})}if(r.length<100)return mn(e);let{cells:i}=fo(r,o.cellSize),l=new Set;for(let[h,g]of i)g>=o.densityThreshold&&l.add(h);let f=Wn(l,o.morphIterations),d=[],u={total:0,lowDensity:0};for(let h of e){let g=h.x1,x=h.z1,b=h.x2,m=h.z2;if(Math.sqrt((b-g)**2+(m-x)**2)<.3){d.push(h);continue}let y=0,w=9;for(let z=0;z<w;z++){let M=z/(w-1),P=g+(b-g)*M,E=x+(m-x)*M,T=Math.floor(P/o.cellSize),V=Math.floor(E/o.cellSize);f.has(T+","+V)&&y++}y>=Math.ceil(w*.5)?d.push(h):u.lowDensity++,u.total++}if(d.length<5)return mn(e);let c=mn(d),a=Date.now()-s;return c}function or(t){return{id:t.id,points:[{x:t.x1,z:t.z1},{x:t.x2,z:t.z2}],length:Math.hypot(t.x2-t.x1,t.z2-t.z1),pointCount:1,type:"straight",isMain:!1}}function ir(t,e,n){let o={outlierEnabled:!0,outlierCellSize:.1,outlierMinNeighbors:3,densityFilterEnabled:!1,...n},s=Date.now(),r=mn(t),i=r.mainWalls,l=r.noiseWalls,f=new Set(i.map(M=>M.id)),d=[];for(let M=0;M<e.length;M++){if(!f.has(M))continue;let P=e[M];if(!(!P||!Array.isArray(P)))for(let E of P)E&&E.x!==void 0&&E.y!==void 0&&E.z!==void 0&&d.push({x:E.x,y:E.y,z:E.z})}let u=d.length,c=d;o.outlierEnabled&&c.length>0&&(c=mo(c,o.outlierCellSize,o.outlierMinNeighbors));let a=[],h=[];if(c.length>=100){let M=o.pcConfig??{},P=ho(c,t,{cellSize:.05,densityThreshold:1,minComponentCells:8,simplifyEpsilon:.008,heightMin:.3,heightMax:2.8,closeIterations:8,densityRatio:.12,...M});a=P.contours??[],h=P.curvedSegments??[]}let g=[];if(h.length>0)for(let M=0;M<h.length;M++){let E=h[M].points;if(E.length<2)continue;let T=1/0,V=-1/0,_=1/0,v=-1/0;for(let D of E)D.x<T&&(T=D.x),D.x>V&&(V=D.x),D.z<_&&(_=D.z),D.z>v&&(v=D.z);let S=[];for(let D of t)ni(D,E,.2)&&S.push(D.id);let R=E.map(D=>({x:D.x,y:D.z,z:0}));g.push({id:M,originalPoints:R,rawLineIds:S})}let x;if(o.densityFilterEnabled&&c.length>0&&i.length>0){let M=new Set(r.mainWalls.map(T=>T.id)),P=t.filter(T=>M.has(T.id));x=sr(c,P).mainWalls}let b=new Set;for(let M of r.mainWalls)if(M.lineIds)for(let P of M.lineIds)b.add(P);let m=new Set;for(let M of r.noiseWalls)if(M.lineIds)for(let P of M.lineIds)m.add(P);let p=t.filter(M=>b.has(M.id)).map(or),y=t.filter(M=>m.has(M.id)).map(or),w;if(x&&x.length>0){let M=new Set;for(let P of x)if(P.lineIds)for(let E of P.lineIds)M.add(E);w=t.filter(P=>M.has(P.id)).map(or)}let z=Date.now()-s;return{mainWalls:p,noiseWalls:y,contours:a,curvedSegments:h,lineCurves:g.length>0?g:void 0,filteredPoints:c,secondMainWalls:w,stats:{totalRawLines:t.length,firstMainCount:p.length,firstNoiseCount:y.length,contourCount:a.length,curvedCount:h.length,secondMainCount:x?.length,mainWallPointCount:u,filteredPointCount:c.length,elapsedMs:z}}}function hi(t,e){let n=Array.isArray(t)?t:t?.data??[],o=[],s=[];for(let l=0;l<n.length;l++){let f=n[l],d=f.start??f,u=f.end??f;o.push({id:l,x1:d.x??0,y1:d.z??0,z1:d.y??0,x2:u.x??0,y2:u.z??0,z2:u.y??0});let c=f.originalPoints??f.points??[],a=Array.isArray(c)?c.filter(h=>h&&h.x!==void 0):[];s.push(a)}let r=ir(o,s,e),i=Array.isArray(t)?{data:t}:{...t};return i.lineCurves=r.lineCurves??[],i.lineCurveNum=r.curvedSegments?.length??0,i}export{rr as CONFIG,no as analyzeDoorQuad,je as analyzeQuad,go as applyVoxelFilter,lo as attachWindows,Ke as calcAngle,qi as checkBeamIsReasonable,Ys as classifyWallByPointCloudPCA,mn as classifyWallShapes,Ya as computeContour,Ye as computeDoorLocalFloorZ,Xe as computeLocalFloorZ,Js as computeVoxelParams,ei as densityPreFilter,un as detectDoorPerpendicularWalls,Hl as detectPerpWalls,Pn as detectPerpendicularWalls,Aa as drawStaircase,oi as filterFalseArcCurves,js as filterWalls,Xs as filterWallsHard,Dn as findDoorWalls,Fs as findMainByLoops,Tn as findWindowWalls,Ni as getBeamLine,Zi as getColLine,Pi as getLineCheckResults,fn as getMatcherAPI,ka as getMergeFloorMeaning,La as getMergeMeaning,Ei as getOneLineCheckResults,Ti as getOneLineClusterResults,Ba as getStaircase,nr as isRawLineNearArc,ri as logArcRawSegments,Cl as matchWalls,$s as mergeCollinear,Ge as mergeCollinearSegments,Ue as mergeDoorCollinearSegments,_l as mergeWallSegments,io as normalizeAngles,$t as pointToDoorSegmentDist,so as pointToSegDist,Je as pointToSegDist2D,Ve as pointToSegmentDist,qo as processData,Zo as processDoorData,sr as processFilteredByPointCloud,ho as processFromPointCloud,Ks as processFromSegments,Bl as processPipeline,hi as processSegments,Wl as processWallData,mo as removeOutlierPoints,Ie as rotateXZ,ir as runMainWallPipeline,Ns as spatialGrid,Rn as splitDoorWallSegment,Al as splitWallSeg,Sn as splitWallSegment,_i as updateStEdPoint,Qs as voxelFilter,ti as voxelFilterLines};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rm-graphical-computing-node",
3
- "version": "1.0.11",
3
+ "version": "1.0.13",
4
4
  "description": "墙体/梁线/点云语义计算库(依赖 Python 与 three.js)",
5
5
  "type": "module",
6
6
  "main": "dist/index.mjs",