rm-graphical-computing-node 1.0.11 → 1.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.mjs +1 -1
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var 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&<.closeSync(this.existSegmentsFdRead),this.newPointsFdRead&<.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 Ri=Object.create;var ps=Object.defineProperty;var Di=Object.getOwnPropertyDescriptor;var vi=Object.getOwnPropertyNames;var Vi=Object.getPrototypeOf,Ci=Object.prototype.hasOwnProperty;var Oe=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var Ii=(t,e,n,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of vi(e))!Ci.call(t,s)&&s!==n&&ps(t,s,{get:()=>e[s],enumerable:!(o=Di(e,s))||o.enumerable});return t};var _i=(t,e,n)=>(n=t!=null?Ri(Vi(t)):{},Ii(e||!t||!t.__esModule?ps(n,"default",{value:t,enumerable:!0}):n,t));var Gs=Oe((Ao,ko)=>{(function(t,e){typeof Ao=="object"&&typeof ko<"u"?ko.exports=e():typeof define=="function"&&define.amd?define(e):(t=t||self,t.RBush=e())})(Ao,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),W=.5*Math.exp(2*V/3),v=.5*Math.sqrt(V*W*(E-W)/E)*(T-E/2<0?-1:1),S=Math.max(z,Math.floor(w-T*W/E+v)),R=Math.min(M,Math.floor(w+(E-T)*W/E+v));e(y,w,S,R,P)}var D=y[w],_=z,C=M;for(n(y,z,w),P(y[M],D)>0&&n(y,z,M);_<C;){for(n(y,_,C),_++,C--;P(y[_],D)<0;)_++;for(;P(y[C],D)>0;)C--}P(y[z],D)===0?n(y,z,C):(C++,n(y,C,M)),C<=w&&(z=C+1),w<=C&&(M=C-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],W=z.leaf?P(V):V;b(w,W)&&(z.leaf?M.push(V):p(w,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||p(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,W,v;M||E.length;){if(M||(M=E.pop(),W=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&&p(M,P)?(E.push(M),T.push(V),V=0,W=M,M=M.children[0]):W?(V++,M=W.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 W=Math.ceil(E/T),v=W*Math.ceil(Math.sqrt(T));x(w,z,M,v,this.compareMinX);for(var S=z;S<=M;S+=v){var R=Math.min(S+v-1,M);x(w,S,R,W,this.compareMinY);for(var D=S;D<=R;D+=W){var _=Math.min(D+W-1,R);V.children.push(this._build(w,D,_,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,W=0;W<z.children.length;W++){var v=z.children[W],S=u(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 W=a(w,0,V,this.toBBox),v=a(w,V,M,this.toBBox),S=g(W,v),R=u(W)+u(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:c,E=w.leaf?this.compareMinY:d,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=a(w,0,z,E),V=a(w,M-z,M,E),W=l(T)+l(V),v=z;v<M-z;v++){var S=w.children[v];f(T,w.leaf?E(S):S),W+=l(T)}for(var R=M-z-1;R>=z;R--){var D=w.children[R];f(V,w.leaf?E(D):D),W+=l(V)}return W},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){a(y,0,y.children.length,w,y)}function a(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 c(y,w){return y.minX-w.minX}function d(y,w){return y.minY-w.minY}function u(y){return(y.maxX-y.minX)*(y.maxY-y.minY)}function l(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 p(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 x(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 Zs=Oe((Lo,Bo)=>{(function(t,e){typeof Lo=="object"&&typeof Bo<"u"?Bo.exports=e():typeof define=="function"&&define.amd?define(e):(t=t||self,t.TinyQueue=e())})(Lo,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,a=r[o];o>0;){var f=o-1>>1,c=r[f];if(i(a,c)>=0)break;r[o]=c,o=f}r[o]=a},t.prototype._down=function(o){for(var s=this,r=s.data,i=s.compare,a=this.length>>1,f=r[o];o<a;){var c=(o<<1)+1,d=r[c],u=c+1;if(u<this.length&&i(r[u],d)<0&&(c=u,d=r[u]),i(d,f)>=0)break;r[o]=d,o=c}r[o]=f};function e(n,o){return n<o?-1:n>o?1:0}return t})});var Us=Oe((Dh,Ys)=>{Ys.exports=function(e,n,o,s){var r=e[0],i=e[1],a=!1;o===void 0&&(o=0),s===void 0&&(s=n.length);for(var f=(s-o)/2,c=0,d=f-1;c<f;d=c++){var u=n[o+c*2+0],l=n[o+c*2+1],h=n[o+d*2+0],g=n[o+d*2+1],p=l>i!=g>i&&r<(h-u)*(i-l)/(g-l)+u;p&&(a=!a)}return a}});var Qs=Oe((vh,Ks)=>{Ks.exports=function(e,n,o,s){var r=e[0],i=e[1],a=!1;o===void 0&&(o=0),s===void 0&&(s=n.length);for(var f=s-o,c=0,d=f-1;c<f;d=c++){var u=n[c+o][0],l=n[c+o][1],h=n[d+o][0],g=n[d+o][1],p=l>i!=g>i&&r<(h-u)*(i-l)/(g-l)+u;p&&(a=!a)}return a}});var er=Oe((Vh,to)=>{var Js=Us(),tr=Qs();to.exports=function(e,n,o,s){return n.length>0&&Array.isArray(n[0])?tr(e,n,o,s):Js(e,n,o,s)};to.exports.nested=tr;to.exports.flat=Js});var or=Oe((eo,nr)=>{(function(t,e){typeof eo=="object"&&typeof nr<"u"?e(eo):typeof define=="function"&&define.amd?define(["exports"],e):e((t=t||self).predicates={})})(eo,function(t){"use strict";let n=33306690738754706e-32;function o(h,g,p,b,m){let x,y,w,z,M=g[0],P=b[0],E=0,T=0;P>M==P>-M?(x=M,M=g[++E]):(x=P,P=b[++T]);let V=0;if(E<h&&T<p)for(P>M==P>-M?(w=x-((y=M+x)-M),M=g[++E]):(w=x-((y=P+x)-P),P=b[++T]),x=y,w!==0&&(m[V++]=w);E<h&&T<p;)P>M==P>-M?(w=x-((y=x+M)-(z=y-x))+(M-z),M=g[++E]):(w=x-((y=x+P)-(z=y-x))+(P-z),P=b[++T]),x=y,w!==0&&(m[V++]=w);for(;E<h;)w=x-((y=x+M)-(z=y-x))+(M-z),M=g[++E],x=y,w!==0&&(m[V++]=w);for(;T<p;)w=x-((y=x+P)-(z=y-x))+(P-z),P=b[++T],x=y,w!==0&&(m[V++]=w);return x===0&&V!==0||(m[V++]=x),V}function s(h){return new Float64Array(h)}let r=33306690738754716e-32,i=22204460492503146e-32,a=11093356479670487e-47,f=s(4),c=s(8),d=s(12),u=s(16),l=s(4);t.orient2d=function(h,g,p,b,m,x){let y=(g-x)*(p-m),w=(h-m)*(b-x),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,W,v,S){let R,D,_,C,I,H,A,L,O,N,k,B,$,G,Q,q,X,Y,it=P-W,mt=T-W,Tt=E-v,nt=V-v;I=(Q=(L=it-(A=(H=134217729*it)-(H-it)))*(N=nt-(O=(H=134217729*nt)-(H-nt)))-((G=it*nt)-A*O-L*O-A*N))-(k=Q-(X=(L=Tt-(A=(H=134217729*Tt)-(H-Tt)))*(N=mt-(O=(H=134217729*mt)-(H-mt)))-((q=Tt*mt)-A*O-L*O-A*N))),f[0]=Q-(k+I)+(I-X),I=($=G-((B=G+k)-(I=B-G))+(k-I))-(k=$-q),f[1]=$-(k+I)+(I-q),I=(Y=B+k)-B,f[2]=B-(Y-I)+(k-I),f[3]=Y;let zt=(function(It,ot){let dt=ot[0];for(let st=1;st<It;st++)dt+=ot[st];return dt})(4,f),Mt=i*S;if(zt>=Mt||-zt>=Mt||(R=P-(it+(I=P-it))+(I-W),_=T-(mt+(I=T-mt))+(I-W),D=E-(Tt+(I=E-Tt))+(I-v),C=V-(nt+(I=V-nt))+(I-v),R===0&&D===0&&_===0&&C===0)||(Mt=a*S+n*Math.abs(zt),(zt+=it*C+nt*R-(Tt*_+mt*D))>=Mt||-zt>=Mt))return zt;I=(Q=(L=R-(A=(H=134217729*R)-(H-R)))*(N=nt-(O=(H=134217729*nt)-(H-nt)))-((G=R*nt)-A*O-L*O-A*N))-(k=Q-(X=(L=D-(A=(H=134217729*D)-(H-D)))*(N=mt-(O=(H=134217729*mt)-(H-mt)))-((q=D*mt)-A*O-L*O-A*N))),l[0]=Q-(k+I)+(I-X),I=($=G-((B=G+k)-(I=B-G))+(k-I))-(k=$-q),l[1]=$-(k+I)+(I-q),I=(Y=B+k)-B,l[2]=B-(Y-I)+(k-I),l[3]=Y;let vt=o(4,f,4,l,c);I=(Q=(L=it-(A=(H=134217729*it)-(H-it)))*(N=C-(O=(H=134217729*C)-(H-C)))-((G=it*C)-A*O-L*O-A*N))-(k=Q-(X=(L=Tt-(A=(H=134217729*Tt)-(H-Tt)))*(N=_-(O=(H=134217729*_)-(H-_)))-((q=Tt*_)-A*O-L*O-A*N))),l[0]=Q-(k+I)+(I-X),I=($=G-((B=G+k)-(I=B-G))+(k-I))-(k=$-q),l[1]=$-(k+I)+(I-q),I=(Y=B+k)-B,l[2]=B-(Y-I)+(k-I),l[3]=Y;let St=o(vt,c,4,l,d);I=(Q=(L=R-(A=(H=134217729*R)-(H-R)))*(N=C-(O=(H=134217729*C)-(H-C)))-((G=R*C)-A*O-L*O-A*N))-(k=Q-(X=(L=D-(A=(H=134217729*D)-(H-D)))*(N=_-(O=(H=134217729*_)-(H-_)))-((q=D*_)-A*O-L*O-A*N))),l[0]=Q-(k+I)+(I-X),I=($=G-((B=G+k)-(I=B-G))+(k-I))-(k=$-q),l[1]=$-(k+I)+(I-q),I=(Y=B+k)-B,l[2]=B-(Y-I)+(k-I),l[3]=Y;let Et=o(St,d,4,l,u);return u[Et-1]})(h,g,p,b,m,x,M)},t.orient2dfast=function(h,g,p,b,m,x){return(g-x)*(p-m)-(h-m)*(b-x)},Object.defineProperty(t,"__esModule",{value:!0})})});var ur=Oe((Ch,qo)=>{"use strict";var sr=Gs(),oo=Zs(),Wa=er(),Ha=or().orient2d;oo.default&&(oo=oo.default);qo.exports=lr;qo.exports.default=lr;function lr(t,e,n){e=Math.max(0,e===void 0?2:e),n=n||0;var o=Oa(t),s=new sr(16);s.toBBox=function(x){return{minX:x[0],minY:x[1],maxX:x[0],maxY:x[1]}},s.compareMinX=function(x,y){return x[0]-y[0]},s.compareMinY=function(x,y){return x[1]-y[1]},s.load(t);for(var r=[],i=0,a;i<o.length;i++){var f=o[i];s.remove(f),a=ar(f,a),r.push(a)}var c=new sr(16);for(i=0;i<r.length;i++)c.insert(Oo(r[i]));for(var d=e*e,u=n*n;r.length;){var l=r.shift(),h=l.p,g=l.next.p,p=Fo(h,g);if(!(p<u)){var b=p/d;f=Aa(s,l.prev.p,h,g,l.next.next.p,b,c),f&&Math.min(Fo(f,h),Fo(f,g))<=b&&(r.push(l),r.push(ar(f,l)),s.remove(f),c.remove(l),c.insert(Oo(l)),c.insert(Oo(l.next)))}}l=a;var m=[];do m.push(l.p),l=l.next;while(l!==a);return m.push(l.p),m}function Aa(t,e,n,o,s,r,i){for(var a=new oo([],ka),f=t.data;f;){for(var c=0;c<f.children.length;c++){var d=f.children[c],u=f.leaf?No(d,n,o):La(n,o,d);u>r||a.push({node:d,dist:u})}for(;a.length&&!a.peek().node.children;){var l=a.pop(),h=l.node,g=No(h,e,n),p=No(h,o,s);if(l.dist<g&&l.dist<p&&ir(n,h,i)&&ir(o,h,i))return h}f=a.pop(),f&&(f=f.node)}return null}function ka(t,e){return t.dist-e.dist}function La(t,e,n){if(rr(t,n)||rr(e,n))return 0;var o=no(t[0],t[1],e[0],e[1],n.minX,n.minY,n.maxX,n.minY);if(o===0)return 0;var s=no(t[0],t[1],e[0],e[1],n.minX,n.minY,n.minX,n.maxY);if(s===0)return 0;var r=no(t[0],t[1],e[0],e[1],n.maxX,n.minY,n.maxX,n.maxY);if(r===0)return 0;var i=no(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 rr(t,e){return t[0]>=e.minX&&t[0]<=e.maxX&&t[1]>=e.minY&&t[1]<=e.maxY}function ir(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]),a=n.search({minX:o,minY:s,maxX:r,maxY:i}),f=0;f<a.length;f++)if(Ba(a[f].p,a[f].next.p,t,e))return!1;return!0}function dn(t,e,n){return Ha(t[0],t[1],e[0],e[1],n[0],n[1])}function Ba(t,e,n,o){return t!==o&&e!==n&&dn(t,e,n)>0!=dn(t,e,o)>0&&dn(n,o,t)>0!=dn(n,o,e)>0}function Oo(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 Oa(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 a=[e,n,o,s],f=a.slice();for(r=0;r<t.length;r++)Wa(t[r],a)||f.push(t[r]);return Na(f)}function ar(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 Fo(t,e){var n=t[0]-e[0],o=t[1]-e[1];return n*n+o*o}function No(t,e,n){var o=e[0],s=e[1],r=n[0]-o,i=n[1]-s;if(r!==0||i!==0){var a=((t[0]-o)*r+(t[1]-s)*i)/(r*r+i*i);a>1?(o=n[0],s=n[1]):a>0&&(o+=r*a,s+=i*a)}return r=t[0]-o,i=t[1]-s,r*r+i*i}function no(t,e,n,o,s,r,i,a){var f=n-t,c=o-e,d=i-s,u=a-r,l=t-s,h=e-r,g=f*f+c*c,p=f*d+c*u,b=d*d+u*u,m=f*l+c*h,x=d*l+u*h,y=g*b-p*p,w,z,M,P,E=y,T=y;y===0?(z=0,E=1,P=x,T=b):(z=p*x-b*m,P=g*x-p*m,z<0?(z=0,P=x,T=b):z>E&&(z=E,P=x+p,T=b)),P<0?(P=0,-m<0?z=0:-m>g?z=E:(z=-m,E=g)):P>T&&(P=T,-m+p<0?z=0:-m+p>g?z=E:(z=-m+p,E=g)),w=z===0?0:z/E,M=P===0?0:P/T;var V=(1-w)*t+w*n,W=(1-w)*e+w*o,v=(1-M)*s+M*i,S=(1-M)*r+M*a,R=v-V,D=S-W;return R*R+D*D}function Fa(t,e){return t[0]===e[0]?t[1]-e[1]:t[0]-e[0]}function Na(t){t.sort(Fa);for(var e=[],n=0;n<t.length;n++){for(;e.length>=2&&dn(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&&dn(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 Ne from"three";import*as Fe from"three";var At=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,a=n.y,f=n.z;return this.x=s*f-r*a,this.y=r*i-o*f,this.z=o*a-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,a=e.y,f=e.z,c=Math.cos(n),d=Math.sin(n),u=i*o+a*s+f*r;return this.x=i*u*(1-c)+o*c+(-f*s+a*r)*d,this.y=a*u*(1-c)+s*c+(f*o-i*r)*d,this.z=f*u*(1-c)+r*c+(-a*o+i*s)*d,this}},On=class{constructor(e=new At(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 At().subVectors(n,e),r=new At().subVectors(o,e),i=new At().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 At){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}},Bn=()=>typeof performance<"u"&&performance.now?performance.now():Date.now(),Po=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 At(e.start.x,e.start.y,e.start.z),a=new At(e.end.x,e.end.y,e.end.z),f=new At(e.end.x,e.end.y,e.rooftopPz),c=new At(e.start.x,e.start.y,e.rooftopPz),d=[i,a,f,c];for(let P=0;P<d.length;P++)if(!this.isValidVector3(d[P]))return console.error(`\u5899\u4F53\u57FA\u7840\u70B9${P}\u65E0\u6548:`,d[P]),r;let u=i.distanceTo(a),l=Math.abs(e.rooftopPz-e.start.z);if(u===0||l===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",a),console.log(e.length),r;let h=u/o,g=l/n,p=new At().subVectors(a,i).normalize(),b=i.x,m=i.y,x=i.z,y=p.x,w=p.y,z=p.z,M=(P,E)=>new At(b+y*P,m+w*P,x+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 W=V*h,v=(V+1)*h;r.push({points:[M(W,E),M(v,E),M(v,T),M(W,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=Bn(),a=[],f=new Map,c=1/0,d=-1/0,u=1/0,l=-1/0;for(let W=0;W<e.length;W++){let v=e[W];if(v.userData&&v.userData.type==="wallSegment"){let S=this.getWorldVerticesNew(v.points);if(S.length<4)continue;let R=new At().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,_=v.userData.col,C=`row${D}_col${_}`;a.push(v),f.set(C,v),D<c&&(c=D),D>d&&(d=D),_<u&&(u=_),_>l&&(l=_)}}if(this.results.totalSegments=a.length,a.length===0)return this.results.analysisTime=Bn()-i,this.printAnalysisResults(),this.results;let h=`row${c}_col${u}`,g=f.get(h)||a[0];if(!g||!g.vertices||g.vertices.length<4)return this.results.analysisTime=Bn()-i,this.printAnalysisResults(),this.results;let p=g.vertices[0],b=g.vertices[1],m=g.vertices[3],x=new At().subVectors(b,p).normalize(),y=new At().subVectors(m,p).normalize(),w=g.userData.width,z=g.userData.height,M=d-c+1,P=l-u+1,E=new On;E.setFromCoplanarPoints(p,b,m);let T=new At,V=new At;for(let W=0;W<n.length;W+=3){let v=new At(n[W],n[W+1],n[W+2]),S=r?r.projectPoint(v,V):v;if(Math.abs(E.distanceToPoint(S))>o)continue;T.subVectors(S,p);let D=T.dot(x),_=T.dot(y),C=Math.ceil((D-o)/w-1),I=Math.floor((D+o)/w),H=Math.ceil((_-o)/z-1),A=Math.floor((_+o)/z);if(I<0||C>P-1||A<0||H>M-1)continue;let L=Math.max(0,C),O=Math.min(P-1,I),N=Math.max(0,H),k=Math.min(M-1,A);for(let B=N;B<=k;B++){let $=c+B;for(let G=L;G<=O;G++){let Q=u+G,q=`row${$}_col${Q}`;f.has(q)&&(this.results.pointsInSegments.has(q)||this.results.pointsInSegments.set(q,[W]))}}}for(let W of a){let v=`row${W.userData.row}_col${W.userData.col}`,S=this.results.pointsInSegments.has(v)?this.results.pointsInSegments.get(v).length:0,R=S>=1,D={row:W.userData.row,col:W.userData.col,width:W.userData.width,height:W.userData.height,segmentKey:v,vertices:W.vertices,center:W.userData.center,mesh:W,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=Bn()-i,this.printAnalysisResults(),this.results}isPointInWallSegmentOptimized(e,n,o,s,r,i,a,f,c,d,u){if(Math.abs(o.distanceToPoint(e))>u)return!1;let h=new At().subVectors(e,n),g=Math.abs(h.dot(r)),p=Math.abs(h.dot(i));if(g>c&&p>d)return!1;let b=new At().subVectors(e,s),m=b.dot(r),x=b.dot(i),y=m>=-u&&m<=a+u,w=x>=-u&&x<=f+u;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 c of this.results.missingSegments)r.set(c.segmentKey,c),i.has(c.row)||i.set(c.row,new Map),i.get(c.row).set(c.col,{segmentKey:c.segmentKey,isEmpty:!0,visited:!1});for(let c of e)if(c.userData&&c.userData.type==="wallSegment"){let d=`row${c.userData.row}_col${c.userData.col}`,u=r.has(d);i.has(c.userData.row)||i.set(c.userData.row,new Map),i.get(c.userData.row).has(c.userData.col)||i.get(c.userData.row).set(c.userData.col,{segmentKey:d,isEmpty:u,visited:!1})}let a=[],f=[[0,1],[1,0],[0,-1],[-1,0]];for(let[c,d]of r){let u=i.get(d.row)?.get(d.col);if(u&&!u.visited){let l=[],h=[[d.row,d.col]],g=0;for(u.visited=!0;g<h.length;){let p=h[g++],b=p[0],m=p[1],x=`row${b}_col${m}`;r.has(x)&&l.push(r.get(x));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]))}}}l.length>=s&&a.push(l)}}return this.clusterResults={clusters:a.sort((c,d)=>d.length-c.length),totalClusters:a.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)}},xs=(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 a=0;a<r.vertices.length;a++)i.push({x:r.vertices[a].x,y:r.vertices[a].y,z:r.vertices[a].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 a=0;a<r.vertices.length;a++)i.push(new Fe.Vector3(r.vertices[a].x,r.vertices[a].y,r.vertices[a].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 a=0;a<r.vertices.length;a++)i.push(r.vertices[a].x,r.vertices[a].y,r.vertices[a].z);o.push(i)}return n.originalVertices=o,n.allCenterPoints=s,n},Wi=(t,e)=>{let n=new At().copy(t.start).add(t.end).multiplyScalar(.5),o=new At().subVectors(new At(n.x,n.y,n.z+1),n).normalize(),s=new At(t.direction.x,t.direction.y,0);s.applyAxisAngle(o,Math.PI/2);let r=new At().copy(n).add(s.clone().multiplyScalar(t.length)),i=new At().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]}},ys=async(t,e=!0,n="three")=>{for(let o=0;o<t.length;o++){let s=t[o];await So(s,e,n)}},So=(t,e=!0,n="three")=>{if((t.isBayWindow||t.isWindow||t.isBalconyRailing)&&e)return;let o=new On().setFromCoplanarPoints(new At(t.start.x,t.start.y,t.start.z),new At(t.end.x,t.end.y,t.end.z),new At(t.start.x,t.start.y,t.rooftopPz)),s=new At(t.start.x,t.start.y,t.start.z).distanceTo(new At(t.end.x,t.end.y,t.end.z)),r=Math.abs(t.rooftopPz-t.start.z),i=new Po,{horizontalSubdivisions:a,verticalSubdivisions:f}=i.initLimits4(s,r),c=i.createSubdividedWallPlane(t,f,a,null);i.analyzePointDistribution(c,t.originalPoints,.01,{projectPlane:o});let d=i.highlightEmptySegments(c,null,null),u=[];if(d&&d.clusters)for(let g of d.clusters){let p=xs(g,n);p&&u.push(p)}let h=Wi(t,n).direction;if(t.checkResults=u,t.verticalDirection=h,t.saveExistSegments){let g=[],p=xs(i.results.existSegments,n);p&&g.push(p),t.existSegments=g}};var Dt=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,a=n.y,f=n.z;return this.x=s*f-r*a,this.y=r*i-o*f,this.z=o*a-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,a=e.y,f=e.z,c=Math.cos(n),d=Math.sin(n),u=i*o+a*s+f*r;return this.x=i*u*(1-c)+o*c+(-f*s+a*r)*d,this.y=a*u*(1-c)+s*c+(f*o-i*r)*d,this.z=f*u*(1-c)+r*c+(-a*o+i*s)*d,this}},zn=class{constructor(e=new Dt(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 Dt().subVectors(n,e),r=new Dt().subVectors(o,e),i=new Dt().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 Dt){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}},Fn=()=>typeof performance<"u"&&performance.now?performance.now():Date.now(),Nn=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 Dt(e.start.x,e.start.y,e.start.z),a=new Dt(e.end.x,e.end.y,e.end.z),f=new Dt(e.end.x,e.end.y,e.rooftopPz),c=new Dt(e.start.x,e.start.y,e.rooftopPz),d=[i,a,f,c];for(let P=0;P<d.length;P++)if(!this.isValidVector3(d[P]))return console.error(`\u5899\u4F53\u57FA\u7840\u70B9${P}\u65E0\u6548:`,d[P]),r;let u=i.distanceTo(a),l=Math.abs(e.rooftopPz-e.start.z);if(u===0||l===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",a),console.log(e.length),r;let h=u/o,g=l/n,p=new Dt().subVectors(a,i).normalize(),b=i.x,m=i.y,x=i.z,y=p.x,w=p.y,z=p.z,M=(P,E)=>new Dt(b+y*P,m+w*P,x+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 W=V*h,v=(V+1)*h;r.push({points:[M(W,E),M(v,E),M(v,T),M(W,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=Fn(),a=[],f=new Map,c=1/0,d=-1/0,u=1/0,l=-1/0;for(let W=0;W<e.length;W++){let v=e[W];if(v.userData&&v.userData.type==="wallSegment"){let S=this.getWorldVerticesNew(v.points);if(S.length<4)continue;let R=new Dt().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,_=v.userData.col,C=`row${D}_col${_}`;a.push(v),f.set(C,v),D<c&&(c=D),D>d&&(d=D),_<u&&(u=_),_>l&&(l=_)}}if(this.results.totalSegments=a.length,a.length===0)return this.results.analysisTime=Fn()-i,this.printAnalysisResults(),this.results;let h=`row${c}_col${u}`,g=f.get(h)||a[0];if(!g||!g.vertices||g.vertices.length<4)return this.results.analysisTime=Fn()-i,this.printAnalysisResults(),this.results;let p=g.vertices[0],b=g.vertices[1],m=g.vertices[3],x=new Dt().subVectors(b,p).normalize(),y=new Dt().subVectors(m,p).normalize(),w=g.userData.width,z=g.userData.height,M=d-c+1,P=l-u+1,E=new zn;E.setFromCoplanarPoints(p,b,m);let T=new Dt,V=new Dt;for(let W=0;W<n.length;W++){let v=n[W],S=r?r.projectPoint(v,V):v;if(Math.abs(E.distanceToPoint(S))>o)continue;T.subVectors(S,p);let D=T.dot(x),_=T.dot(y),C=Math.ceil((D-o)/w-1),I=Math.floor((D+o)/w),H=Math.ceil((_-o)/z-1),A=Math.floor((_+o)/z);if(I<0||C>P-1||A<0||H>M-1)continue;let L=Math.max(0,C),O=Math.min(P-1,I),N=Math.max(0,H),k=Math.min(M-1,A);for(let B=N;B<=k;B++){let $=c+B;for(let G=L;G<=O;G++){let Q=u+G,q=`row${$}_col${Q}`;f.has(q)&&(this.results.pointsInSegments.has(q)||this.results.pointsInSegments.set(q,[W]))}}}for(let W of a){let v=`row${W.userData.row}_col${W.userData.col}`,S=this.results.pointsInSegments.has(v)?this.results.pointsInSegments.get(v).length:0,R=S>=1,D={row:W.userData.row,col:W.userData.col,width:W.userData.width,height:W.userData.height,segmentKey:v,vertices:W.vertices,center:W.userData.center,mesh:W,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=Fn()-i,this.printAnalysisResults(),this.results}isPointInWallSegmentOptimized(e,n,o,s,r,i,a,f,c,d,u){if(Math.abs(o.distanceToPoint(e))>u)return!1;let h=new Dt().subVectors(e,n),g=Math.abs(h.dot(r)),p=Math.abs(h.dot(i));if(g>c&&p>d)return!1;let b=new Dt().subVectors(e,s),m=b.dot(r),x=b.dot(i),y=m>=-u&&m<=a+u,w=x>=-u&&x<=f+u;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 c of this.results.missingSegments)r.set(c.segmentKey,c),i.has(c.row)||i.set(c.row,new Map),i.get(c.row).set(c.col,{segmentKey:c.segmentKey,isEmpty:!0,visited:!1});for(let c of e)if(c.userData&&c.userData.type==="wallSegment"){let d=`row${c.userData.row}_col${c.userData.col}`,u=r.has(d);i.has(c.userData.row)||i.set(c.userData.row,new Map),i.get(c.userData.row).has(c.userData.col)||i.get(c.userData.row).set(c.userData.col,{segmentKey:d,isEmpty:u,visited:!1})}let a=[],f=[[0,1],[1,0],[0,-1],[-1,0]];for(let[c,d]of r){let u=i.get(d.row)?.get(d.col);if(u&&!u.visited){let l=[],h=[[d.row,d.col]],g=0;for(u.visited=!0;g<h.length;){let p=h[g++],b=p[0],m=p[1],x=`row${b}_col${m}`;r.has(x)&&l.push(r.get(x));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]))}}}l.length>=s&&a.push(l)}}return this.clusterResults={clusters:a.sort((c,d)=>d.length-c.length),totalClusters:a.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)}},bs=(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 a=0;a<r.vertices.length;a++)i.push({x:r.vertices[a].x,y:r.vertices[a].y,z:r.vertices[a].z});o.push(i)}else if(e=="three")for(let r of t){s.push(new Ne.Vector3(r.center.x,r.center.y,r.center.z));let i=[];for(let a=0;a<r.vertices.length;a++)i.push(new Ne.Vector3(r.vertices[a].x,r.vertices[a].y,r.vertices[a].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 a=0;a<r.vertices.length;a++)i.push(r.vertices[a].x,r.vertices[a].y,r.vertices[a].z);o.push(i)}return n.originalVertices=o,n.allCenterPoints=s,n},Hi=(t,e)=>{let n=new Dt().copy(t.start).add(t.end).multiplyScalar(.5),o=new Dt().subVectors(new Dt(n.x,n.y,n.z+1),n).normalize(),s=new Dt(t.direction.x,t.direction.y,0);s.applyAxisAngle(o,Math.PI/2);let r=new Dt().copy(n).add(s.clone().multiplyScalar(t.length)),i=new Dt().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 Ne.Vector3(r.x,r.y,r.z),end:new Ne.Vector3(i.x,i.y,i.z),center:new Ne.Vector3(n.x,n.y,n.z),direction:new Ne.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]}},Ai=(t,e=!0,n="three",o="xyz")=>{o=="xyz"?ws(t,e,n):o=="array"&&So(t,e,n)},ki=(t,e=!0,n="three",o="xyz")=>{o=="xyz"?Li(t,e,n):o=="array"&&ys(t,e,n)},Li=(t,e=!0,n="three")=>{for(let o=0;o<t.length;o++){let s=t[o];ws(s,e,n)}},ws=(t,e=!0,n="three")=>{if((t.isBayWindow||t.isWindow||t.isBalconyRailing)&&e)return;let o=new zn().setFromCoplanarPoints(new Dt(t.start.x,t.start.y,t.start.z),new Dt(t.end.x,t.end.y,t.end.z),new Dt(t.start.x,t.start.y,t.rooftopPz)),s=new Dt(t.start.x,t.start.y,t.start.z).distanceTo(new Dt(t.end.x,t.end.y,t.end.z)),r=Math.abs(t.rooftopPz-t.start.z),i=new Nn,{horizontalSubdivisions:a,verticalSubdivisions:f}=i.initLimits4(s,r),c=i.createSubdividedWallPlane(t,f,a,null);i.analyzePointDistribution(c,t.originalPoints,.01,{projectPlane:o});let d=i.highlightEmptySegments(c,null,null),u=[];if(d&&d.clusters)for(let g of d.clusters){let p=bs(g,n);p&&u.push(p)}let h=Hi(t,n).direction;if(t.checkResults=u,t.verticalDirection=h,t.saveExistSegments){let g=[],p=bs(i.results.existSegments,n);p&&g.push(p),t.existSegments=g}},Bi=t=>{if((t.isBayWindow||t.isWindow||t.isBalconyRailing)&&limit)return;let e=new zn().setFromCoplanarPoints(new Dt(t.start.x,t.start.y,t.start.z),new Dt(t.end.x,t.end.y,t.end.z),new Dt(t.start.x,t.start.y,t.rooftopPz)),n=new Dt(t.start.x,t.start.y,t.start.z).distanceTo(new Dt(t.end.x,t.end.y,t.end.z)),o=Math.abs(t.rooftopPz-t.start.z),s=new Nn,{horizontalSubdivisions:r,verticalSubdivisions:i}=s.initLimits4(n,o),a=s.createSubdividedWallPlane(t,i,r,null);return s.analyzePointDistribution(a,t.originalPoints,.01,{projectPlane:e}),s.highlightEmptySegments(a,null,null)};import*as F from"three";import"three/examples/jsm/utils/BufferGeometryUtils.js";import*as U from"three";import{CSS2DObject as Fc}from"three/examples/jsm/renderers/CSS2DRenderer.js";import"three/examples/jsm/utils/BufferGeometryUtils.js";import ze from"path";import{fileURLToPath as Ni}from"url";import qn from"path";import{fileURLToPath as Oi}from"url";import{Vector3 as bc}from"three";var Fi=Oi(import.meta.url),To=qn.dirname(Fi),wc=qn.resolve(To,"./data/lines.meta.json"),zc=qn.resolve(To,"./data/lines.bin"),Mc=qn.resolve(To,"./data/checks.bin");var qi=Ni(import.meta.url),ve=ze.dirname(qi),Dc=ze.resolve(ve,"./data/lines.tmp.bin"),vc=ze.resolve(ve,"./data/checks.tmp.bin"),Vc=ze.resolve(ve,"./data/lines.new_points.tmp.bin"),Cc=ze.resolve(ve,"./data/lines.new_points.bin"),Ic=ze.resolve(ve,"./data/lines.meta.json"),_c=ze.resolve(ve,"./data/lines.bin"),Wc=ze.resolve(ve,"./data/checks.bin"),Hc=ze.resolve(ve,"./data/lines.exist_segments.bin"),Ac=ze.resolve(ve,"./data/lines.exist_segments.tmp.bin");import{Vector3 as $i}from"three";var $n=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 $i(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 Ms=(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))},Me=(t,e,n,o,s=1e-8)=>{let r=e.x-t.x,i=e.y-t.y,a=o.x-n.x,f=o.y-n.y,c=r*f-i*a;if(Math.abs(c)<s)return null;let d=((n.x-t.x)*f-(n.y-t.y)*a)/c,u=((n.x-t.x)*i-(n.y-t.y)*r)/c;return d<-s||d>1+s||u<-s||u>1+s?null:{point:new U.Vector3(t.x+d*r,t.y+d*i,t.z)}},Es=(t,e,n={})=>{let{fontSize:o=36,fontFamily:s="sans-serif",backgroundColor:r="rgba(0,0,0,0)",textColor:i="#ffffff",padding:a=10,maxWidth:f=256}=n,d=document.createElement("canvas").getContext("2d");d.font=`bold ${o}px ${s}`;let l=d.measureText(t).width,h=Math.min(l+a*2,f),g=o+a*2,p=document.createElement("canvas");p.width=h,p.height=g;let b=p.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",l>f-a*2?ji(b,t,h/2,g/2,f,o):b.fillText(t,h/2,g/2);let m=new U.CanvasTexture(p),x=new U.SpriteMaterial({map:m,depthTest:!1,transparent:!0}),y=new U.Sprite(x);y.position.set(e.x,e.y,e.z);let w=.005;return y.scale.set(h*w,g*w,1),y};function ji(t,e,n,o,s,r){let i=e.split(""),a="",f=r*1.2,c=o;for(let d=0;d<i.length;d++){let u=a+i[d];t.measureText(u).width>s&&d>0?(t.fillText(a,n,c),a=i[d],c+=f):a=u}t.fillText(a,n,c)}var Qt=(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},a=r.x*i.x+r.y*i.y+r.z*i.z;a=Math.max(-1,Math.min(1,a));let f=Math.acos(Math.abs(a)),c=f<=n;return{parallel:c,sameDirection:c?a>0:null,angle:f}};var Ps=(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(),a=new U.Vector3().subVectors(s[3],s[0]).normalize(),f=i.clone().cross(a).normalize(),c=1/0,d=-1/0,u=1/0,l=-1/0;for(let M of s){let P=M.dot(i),E=M.dot(a);P<c&&(c=P),P>d&&(d=P),E<u&&(u=E),E>l&&(l=E)}let h=s[0].dot(f),g=i.clone().multiplyScalar(c).add(a.clone().multiplyScalar(u)).add(f.clone().multiplyScalar(h)),p=i.clone().multiplyScalar(d).add(a.clone().multiplyScalar(u)).add(f.clone().multiplyScalar(h)),b=i.clone().multiplyScalar(d).add(a.clone().multiplyScalar(l)).add(f.clone().multiplyScalar(h)),m=i.clone().multiplyScalar(c).add(a.clone().multiplyScalar(l)).add(f.clone().multiplyScalar(h)),x=[g,p,b,m],y=Qt(new U.Vector3().subVectors(g,p),new U.Vector3(0,0,1));y&&y.parallel&&(x=[g,m,b,p]);let w=0;if(o.length>0){let M=new U.Vector3().subVectors(x[1],x[0]).normalize(),P=M.clone().negate(),E=new U.Vector3().subVectors(x[3],x[0]).normalize(),T=E.clone().negate(),V=x[0].distanceTo(x[1]),W=x[0].distanceTo(x[3]),v=V/e,S=W/n,R=.001;for(let D=0;D<v;D++){let _=x[0],C=0;for(let I=0;I<S;I++){let H=_.clone().addScaledVector(M,e),A=H.clone().addScaledVector(E,n),L=_.clone().addScaledVector(E,n),O=new U.Vector3().add(_).add(H).add(A).add(L).multiplyScalar(.25);for(let N=0;N<r.length;N++)if(r[N].distanceTo(O)<R){C++;break}_=L}if(C>=S/2)break;w+=C,x[0]=x[0].addScaledVector(M,e),x[3]=x[3].addScaledVector(M,e)}V=x[0].distanceTo(x[1]),v=V/e;for(let D=0;D<v;D++){let _=x[1],C=0;for(let I=0;I<S;I++){let H=_.clone().addScaledVector(P,e),A=H.clone().addScaledVector(E,n),L=_.clone().addScaledVector(E,n),O=new U.Vector3().add(_).add(H).add(A).add(L).multiplyScalar(.25);for(let N=0;N<r.length;N++)if(r[N].distanceTo(O)<R){C++;break}_=L}if(C>=S/2)break;w+=C,x[1]=x[1].addScaledVector(P,e),x[2]=x[2].addScaledVector(P,e)}V=x[0].distanceTo(x[1]),v=V/e;for(let D=0;D<S;D++){let _=x[3],C=0;for(let I=0;I<v;I++){let H=_.clone().addScaledVector(M,e),A=H.clone().addScaledVector(T,n),L=_.clone().addScaledVector(T,n),O=new U.Vector3().add(_).add(H).add(A).add(L).multiplyScalar(.25);for(let N=0;N<r.length;N++)if(r[N].distanceTo(O)<R){C++;break}_=H}if(C>=v/2)break;w+=C,x[2]=x[2].addScaledVector(T,n),x[3]=x[3].addScaledVector(T,n)}}let z=x[0].distanceTo(x[1])*x[0].distanceTo(x[3]);return{facePoints:x,boxArea:z,totalInPlaneNum:w}},Zt=(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 a=r.dot(i),f=Math.acos(Math.min(Math.abs(a),1)),c=1-Math.min(f/s,1),d=a>0?"same":"opposite";return{parallelism:c,angle:f,angleDeg:U.MathUtils.radToDeg(f),isParallel:f<s,direction:d,vectors:{v1:r,v2:i}}},ae=(t,e,n,o)=>{let s=new U.Vector3().subVectors(e,t),r=new U.Vector3().subVectors(o,n),i=s.length(),a=r.length();if(i===0||a===0)return{rate:NaN,angle:NaN,isPerpendicular:!1,isParallel:!1};s.normalize(),r.normalize();let f=Math.abs(s.dot(r)),c=Math.min(1,Math.max(0,f)),d=Math.acos(c),u=U.MathUtils.radToDeg(d),l=1-c,h=1e-6;return{rate:l,percent:`${(l*100).toFixed(2)}%`,angle:u,isPerpendicular:Math.abs(u-90)<.01,isParallel:u<.01}},$t=(t,e,n=!1)=>new U.Vector3((t.x+e.x)/2,(t.y+e.y)/2,n?0:(t.z+e.z)/2),be=(t,e,n,o,s={})=>{let{parallelAngleMax:r=U.MathUtils.degToRad(10),collinearAngleMax:i=U.MathUtils.degToRad(7),distanceThreshold:a=2,overlapThreshold:f=.01}=s,c=new U.Vector3().subVectors(e,t),d=new U.Vector3().subVectors(o,n),u=c.clone().normalize(),l=d.clone().normalize(),h=U.MathUtils.clamp(u.dot(l),-1,1),g=Math.acos(Math.abs(h)),p=U.MathUtils.radToDeg(g);if(g>r)return{type:"not_parallel",angleDeg:p,avgPerpendicularDistance:null,maxPerpendicularDistance:null,gap:null,overlap:null,closestDistance:null};h<0&&l.negate();let b=new U.Vector3().addVectors(u,l).normalize(),m=new U.Vector3().addVectors(t,e).multiplyScalar(.5),x=zs(n,m,u),y=zs(o,m,u),w=(x+y)/2,z=Math.max(x,y),M=t.dot(b),P=e.dot(b),E=n.dot(b),T=o.dot(b),V=Math.min(M,P),W=Math.max(M,P),v=Math.min(E,T),S=Math.max(E,T),R=W-V,D=S-v,_=Math.min(R,D),C=Math.min(W,S)-Math.max(V,v),I=C<0?-C:0,H=C>0?C:0,A=_>0?H/_:0,L=Xi(t,e,n,o),O=g<=i&&w<a,N;return O?N=A>.5?"collinear_overlap":"collinear_gap":g<=r&&(N="parallel_offset"),{type:N,angleDeg:p,avgPerpendicularDistance:w,maxPerpendicularDistance:z,gap:I,overlap:H,closestDistance:L}};function zs(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 Xi(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),a=s.dot(s),f=s.dot(r),c=r.dot(r),d=s.dot(i),u=r.dot(i),l=a*c-f*f,h,g;l<1e-10?(h=0,g=c!==0?u/c:0):(h=(f*u-c*d)/l,g=(a*u-f*d)/l),h=U.MathUtils.clamp(h,0,1),g=c!==0?U.MathUtils.clamp((f*h+u)/c,0,1):0,h=a!==0?U.MathUtils.clamp((f*g-d)/a,0,1):0;let p=t.clone().add(s.clone().multiplyScalar(h)),b=n.clone().add(r.clone().multiplyScalar(g));return p.distanceTo(b)}var jn=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}},Mn=(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 a=[],f=[];n.forEach(b=>{let m=new U.Vector3;o.projectPoint(b,m),f.push(m.clone()),m.z=s.z,a.push(m)});let c=new U.Vector3,d=new U.Vector3;o.projectPoint(s,c),o.projectPoint(r,d);let u=new U.Line3(c,d),l=[],h=[],g=[],p=new U.Vector3;return a.forEach((b,m)=>{u.closestPointToPoint(b,!0,p).distanceTo(b)<.001?(l.push(n[m]),h.push(f[m])):g.push(b)}),{newOriginalPoints:l,newProjectPoints:g,newOnLinePoints:h}},Ss=(t,e,n)=>{function o(s,r,i,a,f,c,d,u,l){let h=new U.Line3(s,r),g=new Map,p=new U.Vector3,b=s.clone(),m=r.clone(),x=0;for(;;){let y=new Map,w=0;for(let z=0;z<l.checkResults.length;z++)if(!(l.checkResults[z].allCenterPoints.length/u*100<1))for(let P=0;P<l.checkResults[z].allCenterPoints.length;P++){if(g.has(z)&&g.get(z).removePtsIndex.includes(P))continue;let E=l.checkResults[z].allCenterPoints[P];E=new U.Vector3(E.x,E.y,E.z);let T=h.closestPointToPoint(E,!0,p),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(x==d){s=b,r=m;break}if(w<c/20*19||w==0){y.clear(),d-x<5&&(s=b,r=m,g.clear());break}else{x++;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,a),r=r.addScaledVector(i,a),h.set(s,r)}}if(g.size>0&&x!=d)for(let[y,w]of g){let z=[],M=[];for(let P=0;P<l.checkResults[y].allCenterPoints.length;P++)w.removePtsIndex.includes(P)||(z.push(l.checkResults[y].allCenterPoints[P]),M.push(l.checkResults[y].originalVertices[P]));l.checkResults[y].allCenterPoints=z,l.checkResults[y].originalVertices=M}}for(let s=0;s<t.length;s++){let r=t[s];if(r.length<.5)continue;let i=-1,a=-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 _=0;_<r.checkResults[D].originalVertices.length;_++){let C=Xn(r.checkResults[D].originalVertices[_]);r.checkResults.allCenterPoints.push(C)}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],[_,C,I,H]=D;_=new U.Vector3(_.x,_.y,_.z),C=new U.Vector3(C.x,C.y,C.z),I=new U.Vector3(I.x,I.y,I.z),H=new U.Vector3(H.x,H.y,H.z),i=_.distanceTo(C),a=_.distanceTo(H);let A=new U.Vector3().subVectors(_,C).normalize(),L=Qt(A,new U.Vector3(0,0,1));L&&L.parallel&&([a,i]=[i,a])}if(i<0||a<0)continue;let c=new U.Vector3(r.start.x,r.start.y,r.start.z),d=new U.Vector3(r.end.x,r.end.y,r.end.z),u=c.distanceTo(d),l=r.rooftopPz-r.start.z,h=Math.ceil(u/i),g=Math.ceil(l/a),p=c.clone(),b=d.clone(),m=b.clone().add(new U.Vector3(0,0,l)),x=p.clone().add(new U.Vector3(0,0,l)),y=new U.Vector3().subVectors(b,p).normalize(),w=y.clone().negate(),M=new U.Vector3().subVectors(m,p).normalize().clone().negate(),P=i/2,E=a/2,T=u*l,V=i*a,W=T/V;o(p,x,y,i,P,g,h,W,r),o(b,m,w,i,P,g,h,W,r),r.start=p,r.end=b;let{newOriginalPoints:v}=Mn(p,b,r.originalPoints);r.originalPoints=v,n.stageReplaceCheckResults(r.id,r.checkResults);let R=new $n().vector3ArrToFloat32Array(r.originalPoints);n.stageReplacePoints(r.id,R),r.checkResults=null,r.originalPoints=null}n.commit()},Xt=(t,e)=>new U.Vector3(t.x,t.y,0).distanceTo(new U.Vector3(e.x,e.y,0)),Ro=(t,e,n=1e-6)=>{let o=new U.Vector3;return t.closestPointToPoint(e,!0,o),o.distanceTo(e)<n},on=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 Ts=()=>{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 Do=(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),a=Math.round(s.z/e),f=`${r},${i},${a}`;n.has(f)||(n.set(f,!0),o.push(s))}return o},Rs=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),a=new U.Vector3(s[6],s[7],s[8]).multiplyScalar(n.z);function f(d,u,l){return e.clone().addScaledVector(r,d).addScaledVector(i,u).addScaledVector(a,l)}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)]},vo=(t,e)=>{let n=t[0],o=t[1],s=t[2],r=t[3],i=new U.Vector3().subVectors(o,n),a=new U.Vector3().subVectors(r,n),f=i.length(),c=a.length();i.normalize(),a.normalize();let d=new U.Vector3(0,0,1),l=new U.Vector3().add(n).add(o).add(s).add(r).multiplyScalar(.25).clone().addScaledVector(d,e/2),h=new U.BoxGeometry(f,c,e),g=new U.Matrix4;return g.makeBasis(i,a,d),g.setPosition(l),h.applyMatrix4(g),h.computeVertexNormals(),h},Xn=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 Gt from"three";var Gi=(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 Gt.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,a=new Gt.Vector3(o.start.x,o.start.y,o.start.z),f=new Gt.Vector3(o.end.x,o.end.y,o.end.z),c=new Gt.Vector3().subVectors(f,a).normalize(),d=c.clone().cross(new Gt.Vector3(0,0,1)).normalize(),u=d.clone().negate(),l=[],h=[],g=o.length/r;console.log(g);for(let y=0;y<r;y++){let w=[];w.push(a.clone().addScaledVector(d,i)),w.push(w[0].clone().addScaledVector(c,g)),w.push(w[1].clone().addScaledVector(u,i*2)),w.push(a.clone().addScaledVector(u,g));let z=[];for(let M=0;M<s.length;M++)l.includes(M)||Yi(s[M],w)&&(l.push(M),z.push(s[M]));z.length>0&&h.push(Ui(z)),a=a.addScaledVector(c,g)}let p=new Float32Array(s.length*3);s.forEach((y,w)=>{p[w*3]=y.x,p[w*3+1]=y.y,p[w*3+2]=y.z});let b=new Gt.BufferGeometry;b.setAttribute("position",new Gt.BufferAttribute(p,3)),b.rotateX(-Math.PI/2),e.add(new Gt.Points(b,new Gt.PointsMaterial({color:Ts(),size:.02})));let[m,x]=ta(h,{plane:"xy",trimRatio:0});Ms(m,x,e)}};function Ds(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 Zi(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 Yi(t,e,n="xy"){if(!e||e.length!==4)throw new Error("rectPoints must contain 4 points");let o=Ds(t,n),s=e.map(a=>Ds(a,n)),r=!1,i=!1;for(let a=0;a<4;a++){let f=s[a],c=s[(a+1)%4],d=Zi(f,c,o);if(d>1e-9&&(r=!0),d<-1e-9&&(i=!0),r&&i)return!1}return!0}function Ui(t){if(!t||t.length===0)return null;let e=new Gt.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 Gt.Vector3?t.clone():Array.isArray(t)?new Gt.Vector3(t[0],t[1],t[2]):new Gt.Vector3(t.x,t.y,t.z)}function Qi(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 vs(t,e,n,o="xy"){if(o==="xy")return new Gt.Vector3(t,e,n);if(o==="xz")return new Gt.Vector3(t,n,e);if(o==="yz")return new Gt.Vector3(n,t,e);throw new Error(`Unsupported plane: ${o}`)}function Ji(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)),a=s*.5+i,f=e,c=a-t,d=Math.hypot(f,c);return d<1e-12?{x:1,y:0}:{x:f/d,y:c/d}}function ta(t,e={}){let{plane:n="xy",trimRatio:o=0}=e;if(!t||t.length<2)return null;let s=t.map(C=>Qi(C,n)),r=0,i=0,a=0;for(let C of s)r+=C.x,i+=C.y,a+=C.up;r/=s.length,i/=s.length,a/=s.length;let f=0,c=0,d=0;for(let C of s){let I=C.x-r,H=C.y-i;f+=I*I,c+=I*H,d+=H*H}f/=s.length,c/=s.length,d/=s.length;let u=Ji(f,c,d),l={x:-u.y,y:u.x},h=[];for(let C of s){let I=C.x-r,H=C.y-i,A=I*u.x+H*u.y,L=I*l.x+H*l.y;h.push({s:A,t:L,up:C.up})}h.sort((C,I)=>C.s-I.s);let g=h.length,p=Math.floor(g*o),b=Math.ceil(g*(1-o))-1;p=Math.max(0,Math.min(g-1,p)),b=Math.max(0,Math.min(g-1,b));let m=h[p],x=h[b],y=(()=>{let C=h.map(H=>H.t).sort((H,A)=>H-A),I=Math.floor(C.length/2);return C.length%2===0?(C[I-1]+C[I])*.5:C[I]})(),w=(()=>{let C=h.map(H=>H.up).sort((H,A)=>H-A),I=Math.floor(C.length/2);return C.length%2===0?(C[I-1]+C[I])*.5:C[I]})(),z=m.s,M=x.s,P=y,E=y,T=w,V=w,W=r+u.x*z+l.x*P,v=i+u.y*z+l.y*P,S=r+u.x*M+l.x*E,R=i+u.y*M+l.y*E,D=vs(W,v,T,n),_=vs(S,R,V,n);return[D,_]}import rn from"path";import*as ft from"fs";import{fileURLToPath as ea}from"url";import{Vector3 as sn}from"three";var na=ea(import.meta.url),Pn=rn.dirname(na),En=rn.resolve(Pn,"./data/lines.meta.json"),Vo=rn.resolve(Pn,"./data/lines.bin"),Co=rn.resolve(Pn,"./data/checks.bin"),Vs=rn.resolve(Pn,"./data/lines.new_points.bin"),Io=rn.resolve(Pn,"./data/lines.exist_segments.bin");function Is(t){let e=[],n=0,o=0,s=0,r=ft.openSync(Vo,"w"),i=ft.openSync(Co,"w"),a=ft.openSync(Io,"w");try{for(let c of t){let d=Buffer.alloc(c.originalPoints.length*12),u=new Float32Array(d.buffer,d.byteOffset);for(let g=0,p=0;g<c.originalPoints.length;g++,p+=3){let b=c.originalPoints[g];u[p]=b.x,u[p+1]=b.y,u[p+2]=b.z}ft.writeSync(r,d,0,d.length,n);let l=null;if(Array.isArray(c.checkResults)&&c.checkResults.length>0){let g=[];for(let p of c.checkResults){let b=Cs(p);ft.writeSync(i,b,0,b.length,o),g.push({offset:o,byteLength:b.length,faceCount:p.originalVertices.length,centerCount:p.allCenterPoints.length}),o+=b.length}l={checkResults:g}}let h=null;if(Array.isArray(c.existSegments)&&c.existSegments.length>0){let g=[];for(let p of c.existSegments){let b=Cs(cr);ft.writeSync(a,b,0,b.length,s),g.push({offset:s,byteLength:b.length,faceCount:p.originalVertices.length,centerCount:(p.allCenterPoints||[]).length}),s+=b.length}h={existSegments:g}}e.push({id:c.id,pointCount:c.originalPoints.length,offset:n,...l||{},...h||{},hasNewOriginalPoints:!1}),n+=d.length,c.originalPoints=null,c.checkResults=null,c.existSegments=null}ft.closeSync(r),ft.closeSync(i),ft.closeSync(a);let f=En+".tmp";ft.writeFileSync(f,JSON.stringify(e,null,2)),ft.renameSync(f,En),console.log("\u2705 writeFile \u5B8C\u6210\uFF08\u542B existSegments\uFF09")}catch(f){try{ft.closeSync(r)}catch{}try{ft.closeSync(i)}catch{}try{ft.closeSync(a)}catch{}throw f}}var Gn=class{constructor(e){this.lineStates=new Map;for(let n of e)this.lineStates.set(n.id,n);this.meta=JSON.parse(ft.readFileSync(En,"utf-8")),this.fdRead=ft.openSync(Vo,"r"),this.checkFdRead=ft.openSync(Co,"r"),this.existSegmentsFdRead=ft.existsSync(Io)?ft.openSync(Io,"r"):null,this.newPointsFdRead=ft.existsSync(Vs)?ft.openSync(Vs,"r"):null,this.fdWrite=ft.openSync(Vo,"a"),this.checkFdWrite=ft.openSync(Co,"a"),this.dataEnd=ft.fstatSync(this.fdWrite).size,this.checkEnd=ft.fstatSync(this.checkFdWrite).size}readLine(e){let n=this.meta[e];if(!n)return null;let o=this.lineStates.get(n.id);if(!o)return null;let s=Buffer.alloc(n.pointCount*12);ft.readSync(this.fdRead,s,0,s.length,n.offset);let r=new Float32Array(s.buffer,s.byteOffset,n.pointCount*3),i=n.checkResults?n.checkResults.map(c=>this.createCheckResultView(c,"checkResults")):[],a=n.existSegments&&n.existSegments.length>0?n.existSegments.map(c=>this.createCheckResultView(c)):[],f=null;if(n.hasNewOriginalPoints&&this.newPointsFdRead&&typeof n.newPointsOffset=="number"&&n.newPointsCount>0){let c=Buffer.alloc(n.newPointsCount*12);ft.readSync(this.newPointsFdRead,c,0,c.length,n.newPointsOffset),f=new Float32Array(c.buffer,c.byteOffset,n.newPointsCount*3)}return{...o,originalPoints:r,checkResults:i,existSegments:a,new_originalPoints:f}}*iterate(){for(let e=0;e<this.meta.length;e++)yield this.readLine(e)}readLineById(e){let n=this.meta.find(c=>c.id===e);if(!n)return null;let o=this.lineStates.get(n.id);if(!o)return null;let s=Buffer.alloc(n.pointCount*12);ft.readSync(this.fdRead,s,0,s.length,n.offset);let r=new Float32Array(s.buffer,s.byteOffset,n.pointCount*3),i=n.checkResults?n.checkResults.map(c=>this.createCheckResultView(c,"checkResults")):[],a=n.existSegments&&n.existSegments.length>0?n.existSegments.map(c=>this.createCheckResultView(c)):[],f=null;if(n.hasNewOriginalPoints&&this.newPointsFdRead&&typeof n.newPointsOffset=="number"&&n.newPointsCount>0){let c=Buffer.alloc(n.newPointsCount*12);ft.readSync(this.newPointsFdRead,c,0,c.length,n.newPointsOffset),f=new Float32Array(c.buffer,c.byteOffset,n.newPointsCount*3)}return{...o,originalPoints:r,checkResults:i,existSegments:a,new_originalPoints:f}}getLineCheckReultsById(e){let n=this.meta.find(i=>i.id===e);if(!n)return[];if(!this.lineStates.get(n.id))return[];let s=n.checkResults?n.checkResults.map(i=>this.createCheckResultView(i,"checkResults")):[],r=[];for(let i of s){let a=[],f=[];for(let c=0;c<i.faceCount;c++){let d=i.getFace(c);a.push(d);let u=i.getCenter(c);f.push(u)}r.push({originalVertices:a,allCenterPoints:f})}return r}getLineExistSegmentsById(e){let n=this.meta.find(f=>f.id===e);if(!n)return[];if(!this.lineStates.get(n.id))return[];let s=Buffer.alloc(n.pointCount*12);ft.readSync(this.fdRead,s,0,s.length,n.offset);let r=new Float32Array(s.buffer,s.byteOffset,n.pointCount*3),i=n.existSegments&&n.existSegments.length>0?n.existSegments.map(f=>this.createCheckResultView(f)):[],a=[];for(let f of i){let c=[],d=[];for(let u=0;u<f.faceCount;u++){let l=f.getFace(u);c.push(l);let h=f.getCenter(u);d.push(h)}a.push({originalVertices:c,allCenterPoints:d})}return a}getOriginalPointsById(e){let n=this.meta.find(f=>f.id===e);if(!n||!this.lineStates.get(n.id))return null;let s=Buffer.alloc(n.pointCount*12);ft.readSync(this.fdRead,s,0,s.length,n.offset);let r=new Float32Array(s.buffer,s.byteOffset,n.pointCount*3),i=[],a=r;for(let f=0;f<a.length;f+=3)i.push(new sn(a[f],a[f+1],a[f+2]));return i}replaceOriginalPoints(e,n){let o=this.meta.find(a=>a.id===e);if(!o)throw new Error(`line ${e} not found`);let s=Buffer.alloc(n.length*12);new Float32Array(s.buffer,s.byteOffset).set(n);let i=this.dataEnd;ft.writeSync(this.fdWrite,s,0,s.length,i),this.dataEnd+=s.length,o.pointCount=n.length/3,o.offset=i}replaceAllCheckResults(e,n){let o=this.meta.find(c=>c.id===e);if(!o)throw new Error(`line ${e} not found`);let s=[],r=0,i=n.map(c=>{let d=oa(c.originalVertices,c.allCenterPoints||[]);return r+=d.length,d}),f=this.checkEnd;for(let c=0;c<i.length;c++){let d=i[c];ft.writeSync(this.checkFdWrite,d,0,d.length,f),s.push({offset:f,byteLength:d.length,faceCount:n[c].originalVertices.length,centerCount:(n[c].allCenterPoints||[]).length}),f+=d.length}this.checkEnd+=r,o.checkResults=s}flushMeta(){let e=En+".tmp";ft.writeFileSync(e,JSON.stringify(this.meta,null,2)),ft.renameSync(e,En)}createCheckResultView(e,n){let o=null,s=null,r=()=>{if(o)return;o=Buffer.alloc(e.byteLength);let f=n==="checkResults"?this.checkFdRead:this.existSegmentsFdRead;ft.readSync(f,o,0,e.byteLength,e.offset),s=new Float32Array(o.buffer,o.byteOffset)},i=f=>f*12,a=f=>e.faceCount*12+f*3;return{getFace(f){r();let c=i(f);return[new sn(s[c],s[c+1],s[c+2]),new sn(s[c+3],s[c+4],s[c+5]),new sn(s[c+6],s[c+7],s[c+8]),new sn(s[c+9],s[c+10],s[c+11])]},getCenter(f){r();let c=a(f);return new sn(s[c],s[c+1],s[c+2])},faceCount:e.faceCount,centerCount:e.centerCount}}close(){ft.closeSync(this.fdRead),ft.closeSync(this.checkFdRead),this.existSegmentsFdRead&&ft.closeSync(this.existSegmentsFdRead),this.newPointsFdRead&&ft.closeSync(this.newPointsFdRead),ft.closeSync(this.fdWrite),ft.closeSync(this.checkFdWrite),this.lineStates.clear()}};function Cs(t){let{originalVertices:e,allCenterPoints:n}=t,o=e.length*4*3+n.length*3,s=Buffer.alloc(o*4),r=new Float32Array(s.buffer,s.byteOffset),i=0;for(let a of e)for(let f of a)r[i++]=f.x,r[i++]=f.y,r[i++]=f.z;for(let a of n)r[i++]=a.x,r[i++]=a.y,r[i++]=a.z;return s}function oa(t,e){let n=t.length*4*3+e.length*3,o=Buffer.alloc(n*4),s=new Float32Array(o.buffer,o.byteOffset),r=0;for(let i of t)for(let a of i)s[r++]=a.x,s[r++]=a.y,s[r++]=a.z;for(let i of e)s[r++]=i.x,s[r++]=i.y,s[r++]=i.z;return o}import{randomUUID as sa}from"crypto";function ra(t){for(let e of t)e.id=sa()}var ia=async(t,e,n,o,s)=>{if(Ss(t,o,s),t.length<=0||e.length<=0)return t;n||(n=[]);for(let m of t){let x=[],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(_=>{D.push(new F.Vector3(_.x,_.y,_.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 _=M[R],C=M[D];if(_.some(H=>C.some(A=>H.equals(A)))){let H=T(R),A=T(D);H!==A&&(E[H]=A)}}let V=new Map,W=-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 _=V.get(D),[C,I,H,A]=M[R],L=new F.Vector3().add(C).add(I).add(H).add(A).multiplyScalar(.25);if(_.points.push(...M[R]),_.area+=C.distanceTo(I)*C.distanceTo(A),_.index=w,_.centerPts.push(L),W==-1||v==-1){let O=new F.Vector3().subVectors(C,I).normalize();v=C.distanceTo(A),W=C.distanceTo(I);let N=Qt(O,new F.Vector3(0,0,1));N&&N.parallel&&([v,W]=[W,v])}_.gridWidth=W,_.gridHeight=v}let S=V.values();for(let R of V.values()){let{facePoints:D,boxArea:_,totalInPlaneNum:C}=Ps(R.points,R.gridWidth,R.gridHeight,R.centerPts);R.centerPts=null,R.facePoints=D,R.boxArea=_,R.totalInPlaneNum=C}x.push(...S)}m.checkResults=null,m.mergeCheckRegion=x}}let r=[];for(let m=0;m<n.length;m++){let x=n[m];if(x.isFindBeam=!1,x.category=="door"){let y=[];x.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=$t(y[0],y[3],!0),P=$t(y[1],y[2],!0);r.push({doorStartPt:M,doorEndPt:P,boxPoints:y,minZ:x.coordinatesByArea.heightData.minZ,maxZ:x.coordinatesByArea.heightData.maxZ,index:m,isFind:!1,inWall:!1})}}for(let m=0;m<r.length;m++){let x=r[m];for(let y=0;y<t.length;y++){if(t[y].length<.5)continue;let w=[],z=$t(t[y].start,t[y].end,!0);w.push(z),w.push($t(z,t[y].start,!0)),w.push($t(z,t[y].end,!0));let M=!1,P=x.boxPoints.length;for(let E=0;E<w.length;E++){let T=w[E].x,V=w[E].y;for(let W=0,v=P-1;W<P;v=W++){let S=x.boxPoints[W].x,R=x.boxPoints[W].y,D=x.boxPoints[v].x,_=x.boxPoints[v].y;R>V!=_>V&&T<(D-S)*(V-R)/(_-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=x.doorStartPt.distanceTo(x.doorEndPt),W=E.distanceTo(T),v=Zt(x.doorStartPt,x.doorEndPt,E,T);if(Math.abs(W-V)<.5&&v&&v.angleDeg<15){x.doorStartPt=new F.Vector3(t[y].start.x,t[y].start.y,0),x.doorEndPt=new F.Vector3(t[y].end.x,t[y].end.y,0);break}else if(Math.abs(W-V)>1.3&&v&&v.angleDeg<15){let S=be(x.doorStartPt,x.doorEndPt,E,T,{parallelAngleMax:F.MathUtils.degToRad(15)}),R=x.doorStartPt.distanceTo(E),D=x.doorStartPt.distanceTo(T),_=x.doorEndPt.distanceTo(E),C=x.doorEndPt.distanceTo(T),I=R<.2||D<.2||_<.2||C<.2;if(S&&S.type=="collinear_overlap"&&S.maxPerpendicularDistance<.1&&!I){x.inWall=!0;break}else{let H=new F.Line3(E,T),A=H.closestPointToPoint(x.doorStartPt,!0,new F.Vector3),L=H.closestPointToPoint(x.doorEndPt,!0,new F.Vector3),O=A.distanceTo(x.doorStartPt),N=L.distanceTo(x.doorEndPt);if(O<.1||N<.1){x.inWall=!0;break}}}}else continue}}let i=0,a=[],f=[],c=[],d=[],u=.15;for(let m=0;m<t.length;m++){let x=t[m];if(x.noDetection)continue;let y=o.readLineById(x.id);if(y.originalPoints=o.getOriginalPointsById(x.id),y.checkResults=o.getLineCheckReultsById(x.id),x.originalPoints=y.originalPoints,x.checkResults=y.checkResults,y=null,x.doorAndBeamData=[],x.doorAndBeamIdToCheckResults=[],!x.mergeCheckRegion||x.mergeCheckRegion.length==0)continue;x.completePointAreaPercentage=-1;let w=new F.Box3;w.setFromPoints(x.originalPoints);let z=w.max.z,M=w.min.z,P=new F.Vector3(x.start.x,x.start.y,x.start.z),E=new F.Vector3(x.end.x,x.end.y,x.end.z),T=x.rooftopPz-x.start.z,V=0;for(let v of x.mergeCheckRegion){let S=v.facePoints,R=v.boxArea,D=v.totalInPlaneNum;if(!S||S.length<=0)continue;let _=S[0].distanceTo(S[1]),C=S[0].distanceTo(S[3]),I=v.gridHeight*(C/v.gridHeight/3*2)+v.gridHeight/2,H=new F.Vector3(S[0].x,S[0].y,S[0].z+I),A=new F.Vector3(S[1].x,S[1].y,S[1].z+I),L=new F.Line3(H,A),O=[],N=new F.Vector3;v.points.forEach(q=>{L.closestPointToPoint(q,!0,N).distanceTo(q)<v.gridHeight+.01&&O.push(q)});let k=[],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;k.push(q)}let $=[];for(let q=0;q<k.length;q++){let X={lineSt:new F.Vector3,lineEd:new F.Vector3,facePoints:[]},Y=on(k[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]),mt=Y/x.length*100,Tt=x.rooftopPz-X.facePoints[2].z;if(it<1.5||z<X.facePoints[2].z||Tt>T/3*2)continue;let nt=!1,zt=!1,Mt=!1,vt=new F.Vector3(0,0,0),St=new F.Vector3(0,0,0),Et=!1,It=[],ot=X.facePoints[2].clone(),dt=X.facePoints[3].clone(),st=X.facePoints[0].clone(),tt=X.facePoints[1].clone(),le=!1,wt=-1;if(Math.abs(X.facePoints[0].z-x.start.z)<.25){let te=!1;for(let rt=0;rt<e.length;rt++){let _t=rt+1;if(_t>=e.length)continue;let Nt=new F.Vector3(e[rt].x,e[rt].y,e[rt].z),at=new F.Vector3(e[_t].x,e[_t].y,e[_t].z);if(Me(new F.Vector3(Nt.x,Nt.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){te=!0;break}}let{newOriginalPoints:me}=Mn(st,tt,x.originalPoints),Rt=[],ne=[];if(me.forEach(rt=>{rt.z>=ot.z?Rt.push(rt):rt.z<=st.z&&ne.push(rt)}),Rt.length<20)continue;let et=x.rooftopPz-ot.z,ge=ot.clone();ge.z+=et;let ke=ot.distanceTo(dt),Le=new F.Vector3().subVectors(dt,ot).normalize(),yn=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(ke)))),Be=ke/yn,pe=[],en=[];for(let rt=0;rt<yn;rt++)pe.push(new F.Vector3(ot.x,ot.y,ot.z+et/5).addScaledVector(Le,Be*rt)),pe.push(new F.Vector3(ge.x,ge.y,ge.z-et/5).addScaledVector(Le,Be*rt));let nn=pe.length;for(let rt=0;rt<Rt.length;rt++)for(let _t=0;_t<pe.length;_t++)if(new F.Vector3(Rt[rt].x,Rt[rt].y,Rt[rt].z).distanceTo(pe[_t])<.05){en.push(pe[_t]),pe.splice(_t,1);break}if(en.length/nn<.5)continue;if(Y>.17&&x.length>.5){let rt=Xt(P,st),_t=Xt(P,tt),Nt=Xt(E,st),at=Xt(E,tt),j=.15,Pt=10;if(rt<j||_t<j)if(Rt.length>10){let bt=new F.Vector3(x.start.x,x.start.y,0),ut=new F.Vector3(x.end.x,x.end.y,0),pt=new F.Vector3().subVectors(bt,ut).normalize(),Bt=new F.Vector3,xt=1/0,Ft=-1,yt=!1,ht=!1;for(let J=0;J<t.length;J++){if(J==m)continue;let gt=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=Me(bt,ut,gt,lt,.1),Wt=ae(bt,ut,gt,lt);if(Vt!=null){if(Wt&&Wt.angle>85){let Ht=Vt.point.distanceTo(bt),kt=Vt.point.distanceTo(ut);if(Ht<.3){ht=!0,xt=1/0,Ft=-1;break}}continue}if(Wt&&Wt.angle>85){let kt=new F.Line3(gt,lt).closestPointToPoint(bt,!0,Bt),Ot=Zt(bt,ut,kt,bt);if(!Ot||Ot.direction!="same")continue;let re=bt.clone().addScaledVector(pt,Pt),Kt=ut.clone().addScaledVector(pt.clone().negate(),Pt),ie=new F.Vector3().subVectors(lt,gt).normalize(),ee=gt.clone().addScaledVector(ie.clone().negate(),.03),Re=lt.clone().addScaledVector(ie,.03),ce=Me(re,Kt,ee,Re);if(ce==null)continue;let oe=bt.distanceTo(ce.point);oe<xt&&(xt=oe,Ft=J)}else if(Wt&&Wt.angle<5){let Ht=new F.Vector3(st.x,st.y,0),kt=new F.Vector3(tt.x,tt.y,0),Ot=Xt(Ht,gt),re=Xt(Ht,lt),Kt=Xt(kt,gt),ie=Xt(kt,lt),ee=Zt(bt,ut,gt,Ht),Re=!1,ce=o.readLineById(t[J].id);if(ce.checkResults=o.getLineCheckReultsById(t[J].id),t[J].checkResults=ce.checkResults,ce=null,t[J].checkResults){for(let oe=0;oe<t[J].checkResults.length;oe++){let wn=[];for(let ye=0;ye<t[J].checkResults[oe].originalVertices.length;ye++){let De=Xn(t[J].checkResults[oe].originalVertices[ye]);De.z=0,wn.push(De)}let xe=on(wn);if(xe.length==2){let ye=Xt(Ht,xe[0]),De=Xt(Ht,xe[1]),Mo=Xt(kt,xe[0]),Eo=Xt(kt,xe[1]);if(ye<.2||De<.2||Mo<.2||Eo<.2){Re=!0;break}}}t[J].checkResults=null}if(ee&&ee.direction=="same"&&!Re&&(Ot<.1||re<.1||Kt<.1||ie<.1)){yt=!0,xt=1/0,Ft=-1;break}}}if(xt!=1/0&&xt<2&&(x.length-Y>.2||x.length-Y<.02)&&xt<Y*2)t[Ft].length>.25&&Y+xt>.5&&(le=!0,rt<j?(dt=dt.addScaledVector(pt,xt),st=st.addScaledVector(pt,xt)):(ot=ot.addScaledVector(pt,xt),tt=tt.addScaledVector(pt,xt)));else{if(!yt&&!ht&&x.length-Y>.1)continue;if(!yt&&!ht&&x.length-Y<.1&&x.length<1.8)continue}}else continue;if(Nt<j||at<j)if(Rt.length>10){let bt=new F.Vector3(x.start.x,x.start.y,0),ut=new F.Vector3(x.end.x,x.end.y,0),pt=new F.Vector3().subVectors(ut,bt).normalize(),Bt=new F.Vector3,xt=1/0,Ft=-1,yt=!1,ht=!1;for(let J=0;J<t.length;J++){if(J==m)continue;let gt=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=Me(bt,ut,gt,lt,.03),Wt=ae(bt,ut,gt,lt);if(Vt!=null){if(Wt&&Wt.angle>85){let Ht=Vt.point.distanceTo(bt);if(Vt.point.distanceTo(ut)<.3){ht=!0,xt=1/0,Ft=-1;break}}continue}if(Wt&&Wt.angle>85){let kt=new F.Line3(gt,lt).closestPointToPoint(ut,!0,Bt),Ot=Zt(ut,bt,kt,ut);if(!Ot||Ot.direction!="same")continue;let re=bt.clone().addScaledVector(pt.clone().negate(),Pt),Kt=ut.clone().addScaledVector(pt,Pt),ie=new F.Vector3().subVectors(lt,gt).normalize(),ee=gt.clone().addScaledVector(ie.clone().negate(),.03),Re=lt.clone().addScaledVector(ie,.03),ce=Me(re,Kt,ee,Re);if(ce==null)continue;let oe=ut.distanceTo(ce.point);oe<xt&&(xt=oe,Ft=J)}else if(Wt&&Wt.angle<5){let Ht=new F.Vector3(st.x,st.y,0),kt=new F.Vector3(tt.x,tt.y,0),Ot=Xt(Ht,gt),re=Xt(Ht,lt),Kt=Xt(kt,gt),ie=Xt(kt,lt),ee=Zt(ut,bt,gt,Ht),Re=!1,ce=o.readLineById(t[J].id);if(ce.checkResults=o.getLineCheckReultsById(t[J].id),t[J].checkResults=ce.checkResults,ce=null,t[J].checkResults){for(let oe=0;oe<t[J].checkResults.length;oe++){let wn=[];for(let ye=0;ye<t[J].checkResults[oe].originalVertices.length;ye++){let De=Xn(t[J].checkResults[oe].originalVertices[ye]);De.z=0,wn.push(De)}let xe=on(wn);if(xe.length==2){let ye=Xt(Ht,xe[0]),De=Xt(Ht,xe[1]),Mo=Xt(kt,xe[0]),Eo=Xt(kt,xe[1]);if(ye<.2||De<.2||Mo<.2||Eo<.2){Re=!0;break}}}t[J].checkResults=null}if(ee&&ee.direction=="same"&&!Re&&(Ot<.1||re<.1||Kt<.1||ie<.1)){yt=!0,xt=1/0,Ft=-1;break}}}if(xt!=1/0&&xt<2&&(x.length-Y>.2||x.length-Y<.02)&&xt<Y*2)t[Ft].length>.25&&Y+xt>.5&&(le=!0,Nt<j?(dt=dt.addScaledVector(pt,xt),st=st.addScaledVector(pt,xt)):(ot=ot.addScaledVector(pt,xt),tt=tt.addScaledVector(pt,xt)));else{if(!yt&&!ht&&x.length-Y>.1)continue;if(!yt&&!ht&&x.length-Y<.1&&x.length<1.8)continue}}else continue;Y=dt.distanceTo(ot)}if(mt<85&&Y>.3||Y>.7&&it>T-T/2){if(!x.isLine2){if(Y<3.5)for(let rt=0;rt<r.length;rt++){let _t=new F.Vector3(r[rt].doorStartPt.x,r[rt].doorStartPt.y,0),Nt=new F.Vector3(r[rt].doorEndPt.x,r[rt].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),Pt=X.facePoints[2].z<r[rt].maxZ||Math.abs(X.facePoints[2].z-r[rt].maxZ)<.3,bt=Math.abs(X.facePoints[2].z-r[rt].maxZ)>.2;if(Pt){let ut=be(_t.clone(),Nt.clone(),at.clone(),j.clone(),{distanceThreshold:2});if(ut&&ut.type=="collinear_gap"){let pt=$t(_t,Nt),Bt=new F.Line3(new F.Vector3(x.start.x,x.start.y,0),new F.Vector3(x.end.x,x.end.y,0)),xt=new F.Vector3,Ft=Bt.closestPointToPoint(pt,!0,xt);if(pt.distanceTo(Ft)<.15){let ht=at.distanceTo(_t),J=j.distanceTo(_t);if(ht>.25&&J>.25){let Vt=at.distanceTo(Nt),Wt=j.distanceTo(Nt);if(Vt>.2&&Wt>.2)continue}zt=!0,Et=!0,It.push(r[rt].index),r[rt].isFind=!0,wt=rt,Mt=n[r[rt].index].isFindBeam,n[r[rt].index].isFindBeam=!0;let gt=new F.Vector3().subVectors(at,j).normalize(),lt=_t.distanceTo(Nt)-ut.overlap;J<ht&>.negate(),ht>J?(ot=X.facePoints[2].clone().addScaledVector(gt,lt),dt=X.facePoints[3].clone(),st=dt.clone(),tt=ot.clone(),st.z=tt.z=X.facePoints[0].z):(ot=X.facePoints[2].clone(),dt=X.facePoints[3].clone().addScaledVector(gt,lt),st=dt.clone(),tt=ot.clone(),st.z=tt.z=X.facePoints[0].z)}}else if(ut&&ut.type=="collinear_overlap"&&ut.maxPerpendicularDistance<.35){let pt=at.distanceTo(j),Bt=Nt.distanceTo(_t);if(Math.abs(pt-ut.overlap)<.25||Math.abs(Bt-ut.overlap)<.25){if(Bt>pt&&Math.abs(Bt-ut.overlap)>1){let xt=at.distanceTo(_t),Ft=at.distanceTo(Nt),yt=j.distanceTo(_t),ht=j.distanceTo(Nt),J=xt<Ft?xt:Ft,gt=yt<ht?yt:ht,lt=new F.Vector3().subVectors(at,j).normalize(),Vt=Bt-ut.overlap;J<gt?(lt.negate(),ot=X.facePoints[2].clone().addScaledVector(lt,Vt),dt=X.facePoints[3].clone(),st=dt.clone(),tt=ot.clone(),st.z=tt.z=X.facePoints[0].z):(ot=X.facePoints[2].clone(),dt=X.facePoints[3].clone().addScaledVector(lt,Vt),st=dt.clone(),tt=ot.clone(),st.z=tt.z=X.facePoints[0].z)}Y>1.5&&(zt=!0,Et=!0,It.push(r[rt].index),r[rt].isFind=!0,Mt=n[r[rt].index].isFindBeam,n[r[rt].index].isFindBeam=!0,wt=rt)}}}}if(!Et&&Y<1.5)for(let rt=0;rt<r.length;rt++){if(r[rt].inWall)continue;let _t=new F.Vector3(r[rt].doorStartPt.x,r[rt].doorStartPt.y,0),Nt=new F.Vector3(r[rt].doorEndPt.x,r[rt].doorEndPt.y,0),at=new F.Vector3(dt.x,dt.y,0),j=new F.Vector3(ot.x,ot.y,0),Pt=new F.Vector3().subVectors(_t,Nt).normalize(),bt=new F.Vector3().subVectors(at,j).normalize(),ut=.25,pt=_t.clone().addScaledVector(Pt,ut),Bt=Nt.clone().addScaledVector(Pt.clone().negate(),ut),xt=at.clone().addScaledVector(bt,ut),Ft=j.clone().addScaledVector(bt.clone().negate(),ut);if(Zt(pt,Bt,xt,Ft).isParallel)continue;let ht=Me(pt,Bt,xt,Ft),J=!0,gt=_t.distanceTo(at),lt=_t.distanceTo(j),Vt=Nt.distanceTo(at),Wt=Nt.distanceTo(j);if((gt<u||lt<u||Vt<u||Wt<u||ht)&&J){let kt=new F.Line3(at,j);if(gt<u||Vt<u)if(vt=at.clone(),gt<u){let Ot=kt.closestPointToPoint(Nt,!1,new F.Vector3);St=new F.Vector3().subVectors(Nt,Ot).normalize()}else{let Ot=kt.closestPointToPoint(_t,!1,new F.Vector3);St=new F.Vector3().subVectors(_t,Ot).normalize()}else if(lt<u||Wt<u)if(vt=j.clone(),lt<u){let Ot=kt.closestPointToPoint(Nt,!1,new F.Vector3);St=new F.Vector3().subVectors(Nt,Ot).normalize()}else{let Ot=kt.closestPointToPoint(_t,!1,new F.Vector3);St=new F.Vector3().subVectors(_t,Ot).normalize()}else if(ht){let Ot=ht.point.distanceTo(at),re=ht.point.distanceTo(j),Kt=ht.point.distanceTo(pt),ie=ht.point.distanceTo(Bt);if(Ot<re?vt=at.clone():vt=j.clone(),Kt<ie){let ee=kt.closestPointToPoint(Bt,!1,new F.Vector3);St=new F.Vector3().subVectors(Bt,ee).normalize()}else{let ee=kt.closestPointToPoint(pt,!1,new F.Vector3);St=new F.Vector3().subVectors(pt,ee).normalize()}}Mt=n[r[rt].index].isFindBeam,n[r[rt].index].isFindBeam=!0,zt=!0,r[rt].isFind=!0,wt=rt}}}(zt||te||Math.abs(it-T)>.1&&it>T/3&&Y>.3)&&(nt=!0)}}if(nt){{let at=new F.Vector3().subVectors(st,tt),j=new F.Vector3().subVectors(tt,st),Pt=1/0,bt=1/0,ut=st.clone(),pt=tt.clone(),Bt=[],xt=[],Ft=new F.Line3(ot,dt),yt=new F.Vector3,ht=999999;if(x.originalPoints.forEach(J=>{if(J.z-st.z<it/2+.1&&J.z-st.z>it/2-.1&&Bt.push(J),J.z>ot.z){let gt=Ft.closestPointToPoint(J,!0,yt),lt=new F.Vector3().subVectors(gt,ot),Vt=new F.Vector3().subVectors(gt,dt),Wt=Qt(at,Vt),Ht=Qt(j,lt);Wt&&Wt.parallel&&!Wt.sameDirection&&Ht&&Ht.parallel&&!Ht.sameDirection&&xt.push(J)}}),Bt.length>0){let{newProjectPoints:J}=Mn(st,tt,Bt);for(let gt of J)gt.z=st.z;J.forEach(gt=>{let lt=new F.Vector3(gt.x,gt.y,st.z),Vt=new F.Vector3().subVectors(lt,tt),Wt=new F.Vector3().subVectors(lt,st),Ht=Qt(at,Wt),kt=Qt(j,Vt);if(Ht&&Ht.parallel&&Ht.sameDirection){let Ot=lt.distanceTo(st);Ot<Pt&&(Pt=Ot,ut=lt)}else if(kt&&kt.parallel&&kt.sameDirection){let Ot=lt.distanceTo(tt);Ot<bt&&(bt=Ot,pt=lt)}})}if(ut.equals(st)||(st=ut,dt=new F.Vector3(st.x,st.y,dt.z)),pt.equals(tt)||(tt=pt,ot=new F.Vector3(tt.x,tt.y,ot.z)),xt.length>10){let{newOnLinePoints:J}=Mn(dt,ot,xt);for(let gt=0;gt<J.length;gt++){let Vt=Ft.closestPointToPoint(J[gt],!0,yt).distanceTo(J[gt]);Vt>.02&&ht>Vt&&(ht=Vt)}ot.z+=ht,dt.z+=ht,it+=ht}}let te=!1;for(let at=0;at<c.length;at++){let j=be(c[at].start,c[at].end,st,tt);j&&j.type=="collinear_overlap"&&j.maxPerpendicularDistance<.07&&(te=!0)}if(te){wt!=-1&&(Mt||(n[r[wt].index].isFindBeam=!1,r[wt].isFind=!1));continue}let me=tt.distanceTo(st);if(me<.4&&!zt||me<.3&&zt)continue;f.includes(m)||f.push(m);let Rt="",ne=zt?"singleDoor":"";ne=Et?"pullOutDoor":ne;let et={id:i,beamStart:ot,beamEnd:dt,beamHeight:x.rooftopPz-ot.z,doorStart:st,doorEnd:tt,doorHeight:it,nearId:-1,type:Rt,isExtend:le,isDoor:zt,isPullOutDoor:Et,pcbDoorIndexs:It,beamNearWallVec:new F.Vector3(0,0,0),doorType:ne,doorOpenEndPoint:vt,doorOpenVector:St,lineIsOnlyBeam:!1};if(et.beamHeight<.1)continue;let ge=1/0,ke=!1,Le=new F.Vector3,yn=new F.Vector3,Be=-1,pe=-1,en=-1,nn=!1,bn=!1;if(!ke){let at=new F.Line3(st.clone(),tt.clone()),j=-1;for(let Pt=0;Pt<t.length;Pt++){if(t[Pt].length<.5||Pt==m)continue;let bt=new F.Vector3(t[Pt].start.x,t[Pt].start.y,t[Pt].start.z),ut=new F.Vector3(t[Pt].end.x,t[Pt].end.y,t[Pt].end.z),pt=be(bt,ut,st,tt),Bt=Zt(bt,ut,st,tt);if(pt&&pt.maxPerpendicularDistance<.5){if(Bt&&Bt.isParallel){let lt=new F.Line3(bt,ut),Vt=new F.Vector3(st.x,st.y,bt.z),Wt=lt.closestPointToPoint(Vt,!0,new F.Vector3),Ht=ae(Wt,Vt,st,tt);Ht&&Ht.angle>85&&(et.beamNearWallVec=new F.Vector3().subVectors(Wt,Vt).normalize(),et.beamStart.z>t[Pt].rooftopPz-.03&&Y>1?bn=!0:bn=!1)}let xt=[],Ft=o.readLineById(t[Pt].id);Ft.originalPoints=o.getOriginalPointsById(t[Pt].id),t[Pt].originalPoints=Ft.originalPoints,Ft=null,t[Pt].originalPoints.forEach(lt=>{lt.z>st.z+.2&<.z<st.z+it/2&&xt.push(new F.Vector3(lt.x,lt.y,st.z))}),t[Pt].originalPoints=null;let yt=new F.Vector3,ht=[],J=[];for(let lt=0;lt<xt.length;lt++){let Vt=at.closestPointToPoint(xt[lt],!0,yt);Vt.distanceTo(xt[lt])<.15&&(ht.push(xt[lt]),J.push(Vt.clone()))}for(let lt=0;lt<J.length;lt++)Ro(at,J[lt])&&ht.push(J[lt]);if(ht=J,ht=Do(ht),ht.length<150)continue;let gt=on(ht);if(gt.length==2){let lt=gt[0].distanceTo(gt[1]);if(Math.abs(lt-at.distance())<.3){j=pt.maxPerpendicularDistance;let Vt=new F.Line3(bt,ut),Wt=new F.Vector3(st.x,st.y,bt.z),Ht=Vt.closestPointToPoint(Wt,!0,new F.Vector3);if(et.beamNearWallVec=new F.Vector3().subVectors(Ht,Wt).normalize(),et.beamStart.z>t[Pt].rooftopPz-.03&&Y>1)bn=!0,nn=!0;else if(te=!0,wt!=-1&&(Mt||(n[r[wt].index].isFindBeam=!1,r[wt].isFind=!1)),pe!=-1&&en!=-1){let kt=t[pe].doorAndBeamData[en];kt.nearId=-1}break}}if(te)break}else pt&&pt.type=="collinear_overlap"&&pt.maxPerpendicularDistance>.3&&pt.maxPerpendicularDistance<.7&&(nn=!0)}if(te){if(Y<1.5||j<.08)continue;nn=!0}}let rt=!1;if(Be!=-1)for(let at=0;at<d.length&&!(d[at].length==1&&(d[at][0].id==i?(d[at].push({id:Be,beamStart:Le,beamEnd:yn}),rt=!0):d[at][0].id==Be&&(d[at].push({id:i,beamStart:ot,beamEnd:dt}),rt=!0),rt));at++);rt||d.push([{id:i,beamStart:ot,beamEnd:dt}]);let _t=et.doorStart.distanceTo(et.doorEnd),Nt=jn(x.originalPoints);if(et.lineIsOnlyBeam=Nt.minZ>x.start.z&&Nt.minZ-x.start.z>1,zt?Rt="door":_t>1.5||le?Rt="beam":Rt=nn&&_t>1?"beam":"hole",Rt!="beam"&&t[m].isLine2)continue;et.type=Rt,et.wallBelowBeam=bn;for(let at=0;at<a.length;at++){let j=t[a[at].linesIndex].doorAndBeamData[a[at].doorIndex];if(j.nearId!=-1||et.type=="beam"&&j.type!="beam"||et.type!="beam"&&j.type=="beam")continue;let Pt=Zt(ot.clone(),dt.clone(),j.beamStart.clone(),j.beamEnd.clone());if(Pt&&Pt.isParallel){let bt=ot.distanceTo(dt),ut=j.beamStart.distanceTo(j.beamEnd),pt=new F.Line3(ot.clone(),dt.clone());pt.start.z=0,pt.end.z=0;let Bt=$t(j.beamStart,j.beamEnd,!0);ut>bt&&(pt.start=new F.Vector3(j.beamStart.x,j.beamStart.y,0),pt.end=new F.Vector3(j.beamEnd.x,j.beamEnd.y,0),Bt=$t(ot,dt,!0));let xt=new F.Vector3,Ft=pt.closestPointToPoint(Bt,!0,xt),yt=Ft.distanceTo(Bt),ht=new F.Vector3().subVectors(Bt,Ft).normalize(),J=ht.clone().negate(),gt=Bt.clone().addScaledVector(J,yt+.1),lt=Me(pt.start,pt.end,Bt,gt),Vt=!zt&&!j.isDoor&&(bt>ut*2||ut>bt*2);if(yt<.4&<!=null&&!Vt){let Wt=!1;for(let Kt=0;Kt<x.doorAndBeamData.length;Kt++)if(x.doorAndBeamData[Kt].id==j.id){Wt=!0;break}if(Wt)continue;j.nearId=i,et.nearId=j.id;let Ht=.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 kt=It.some(Kt=>j.pcbDoorIndexs.includes(Kt)),Ot=!1,re=!1;if(et.type=="beam"&&j.type=="beam"){let Kt=o.readLineById(t[a[at].linesIndex].id);Kt.originalPoints=o.getOriginalPointsById(t[a[at].linesIndex].id),t[a[at].linesIndex].originalPoints=Kt.originalPoints,Kt=null;let ie=jn(t[a[at].linesIndex].originalPoints),ee=jn(x.originalPoints);t[a[at].linesIndex].originalPoints=null,ie.minZ>t[a[at].linesIndex].start.z&&ie.minZ-t[a[at].linesIndex].start.z>1&&ee.minZ>x.start.z&&ee.minZ-x.start.z>1&&(Ot=bt>ut,re=bt<ut,ut>bt&&(et.isExtend=!0),bt>ut&&(t[a[at].linesIndex].isExtend=!0))}bt<ut&&!re||Ot?(Ot&&(J=J.negate(),ht=ht.negate()),bt>Ht&&!j.isPullOutDoor?(j.beamStart=ot.clone().addScaledVector(J,yt),j.beamEnd=dt.clone().addScaledVector(J,yt),j.doorStart=st.clone().addScaledVector(J,yt),j.doorEnd=tt.clone().addScaledVector(J,yt),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||Et&&j.isPullOutDoor&&kt?(et.beamStart=j.beamStart.clone().addScaledVector(ht,yt),et.beamEnd=j.beamEnd.clone().addScaledVector(ht,yt),et.doorStart=j.doorStart.clone().addScaledVector(ht,yt),et.doorEnd=j.doorEnd.clone().addScaledVector(ht,yt),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,yt),j.beamEnd=dt.clone().addScaledVector(J,yt),j.doorStart=st.clone().addScaledVector(J,yt),j.doorEnd=tt.clone().addScaledVector(J,yt),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())):(bt>ut&&!Ot||re)&&(re&&(J=J.negate(),ht=ht.negate()),ut>Ht&&!Et?(et.beamStart=j.beamStart.clone().addScaledVector(J,yt),et.beamEnd=j.beamEnd.clone().addScaledVector(J,yt),et.doorStart=j.doorStart.clone().addScaledVector(J,yt),et.doorEnd=j.doorEnd.clone().addScaledVector(J,yt),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||Et&&j.isPullOutDoor&&kt?(j.beamStart=ot.clone().addScaledVector(ht,yt),j.beamEnd=dt.clone().addScaledVector(ht,yt),j.doorStart=st.clone().addScaledVector(ht,yt),j.doorEnd=tt.clone().addScaledVector(ht,yt),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,yt),et.beamEnd=j.beamEnd.clone().addScaledVector(J,yt),et.doorStart=j.doorStart.clone().addScaledVector(J,yt),et.doorEnd=j.doorEnd.clone().addScaledVector(J,yt),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())),Be=et.nearId,Le=j.beamStart.clone(),yn=j.beamEnd.clone(),ke=!0,pe=a[at].linesIndex,en=a[at].doorIndex;break}}}if(et.nearId!=-1&&Rt=="hole"){let at=!1;for(let j=0;j<t.length;j++)if(t[j].doorAndBeamData){for(let Pt=0;Pt<t[j].doorAndBeamData.length;Pt++)if(t[j].doorAndBeamData[Pt].nearId==i&&t[j].doorAndBeamData[Pt].type=="beam"){t[j].doorAndBeamData[Pt].type=Rt,at=!0;break}if(at)break}}if(x.doorAndBeamIdToCheckResults.push([v.index,i]),x.doorAndBeamData.push(et),a.push({linesIndex:m,doorIndex:x.doorAndBeamData.length-1}),c.push({start:st,end:tt}),i++,Et&&Y<2)break}}}let W=x.length*(x.rooftopPz-x.start.z);x.completePointAreaPercentage=V/W*100,x.checkResults=null,x.originalPoints=null,x.mergeCheckRegion=null}if(f.length>1)for(let m=0;m<f.length;m++){let x=[];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(),W=t[f[E]].doorAndBeamData[T].doorEnd.clone();V.z=W.z=0;let v=V.distanceTo(W),S=be(z,M,V,W);if(S.type=="collinear_overlap"&&S.maxPerpendicularDistance<.2){let R=new F.Line3(V,W),D=$t(z,M),_=R.closestPointToPoint(D,!0,new F.Vector3),C=D.distanceTo(_);if(Math.abs(P-S.overlap)<.1&&C<.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||x.push(t[f[m]].doorAndBeamData[y])}x.length!=t[f[m]].doorAndBeamData.length&&(t[f[m]].doorAndBeamData=x)}let l=.65,h=2,g=[],p=[];for(let m=0;m<r.length;m++){if(r[m].isFind||r[m].inWall)continue;let x=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(x,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=x.clone().addScaledVector(w,T),W=y.clone().addScaledVector(w.clone().negate(),T),v=M.clone().addScaledVector(E,T),S=P.clone().addScaledVector(E.clone().negate(),T),R=Me(V,W,v,S),D=Zt(V,W,v,S),_=x.distanceTo(M)>y.distanceTo(M)?y:x,C=_.distanceTo(M),I=_.distanceTo(P);if((C<u||I<u)&&D&&!D.isParallel){let A=x.distanceTo(M),L=x.distanceTo(P),O=A<L?M:P,N=!1;for(let k=0;k<t.length;k++){if(k==z||g.includes(k)||t[k].length<.7)continue;let B=new F.Vector3(t[k].start.x,t[k].start.y,0),$=new F.Vector3(t[k].end.x,t[k].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=ae(M,P,B,$),it=be(M,P,B,$),mt=Me(M,P,q,X),Tt=!0;if(mt!=null&&(Tt=mt.point.distanceTo(M)<u||mt.point.distanceTo(P)<u),(Y&&Y.angle>85||it&&it.type=="collinear_gap")&&Tt){let nt=new F.Line3(M,P),zt=new F.Vector3,Mt=nt.closestPointToPoint(B,!0,zt),vt=nt.closestPointToPoint($,!0,zt),St=Mt.distanceTo(B),Et=vt.distanceTo($),It,ot;if(St>Et&&Et>l)It=$,ot=vt;else if(St<Et&&St>l)It=B,ot=Mt;else continue;if(St=O.distanceTo(B),Et=O.distanceTo($),St>h&&Et>h)continue;let dt=Zt(It,ot,B,$),st=Zt(It,ot,V,W);if(st&&st.isParallel||!dt||!dt.isParallel)continue;let tt=be(x,y,It,ot);if(tt&&tt.type=="collinear_overlap"&&tt.maxPerpendicularDistance<.2)continue;It.z=ot.z=t[k].start.z;let le=!1;for(let Rt=0;Rt<p.length;Rt++){let ne=be(p[Rt].start,p[Rt].end,It,ot);if(ne&&ne.type=="collinear_overlap"&&ne.maxPerpendicularDistance<.2){le=!0;break}}if(le)continue;for(let Rt=0;Rt<t.length;Rt++){if(t[Rt].length<.5)continue;let ne=new F.Vector3(t[Rt].start.x,t[Rt].start.y,t[Rt].start.z),et=new F.Vector3(t[Rt].end.x,t[Rt].end.y,t[Rt].end.z),ge=be(ne,et,It,ot);if(ge&&ge.type=="collinear_overlap"&&ge.maxPerpendicularDistance<.1){le=!0;break}}if(le)continue;p.push({start:It,end:ot}),g.push(k);let wt=t[k].rooftopPz-t[k].start.z,te=t[z].rooftopPz-t[z].start.z,me=wt<te?wt:te;t[k].doorAndBeamData||(t[k].doorAndBeamData=[]),t[k].doorAndBeamData.push({id:i,beamStart:It,beamEnd:ot,beamHeight:me,doorStart:It,doorEnd:ot,doorHeight:me,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,d.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:d}},aa=async t=>{ra(t),Is(t);let e=new Gn(t);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()),a=-1;for(let f=0;f<o.doorAndBeamData.length;f++){let c=o.doorAndBeamData[f],d=c.doorHeight;c.isRebuild=!1;let u=!1,l=!1;if(!(c.nearId!=-1||c.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),p=new F.Vector3(t[h].end.x,t[h].end.y,t[h].end.z),b=be(g,p,s,r),m=Zt(g,p,s,r);if(b&&b.maxPerpendicularDistance<.5){if(m&&m.isParallel){let E=new F.Line3(g,p),T=new F.Vector3(s.x,s.y,g.z),V=E.closestPointToPoint(T,!0,new F.Vector3),W=ae(V,T,s,r);W&&W.angle>85&&(c.beamNearWallVec=new F.Vector3().subVectors(V,T).normalize())}let x=[],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+d/2&&x.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<x.length;E++){let T=i.closestPointToPoint(x[E],!0,w);T.distanceTo(x[E])<.15&&(z.push(x[E]),M.push(T.clone()))}for(let E=0;E<M.length;E++)Ro(i,M[E])&&z.push(M[E]);if(z=M,z=Do(z),z.length<150)continue;let P=on(z);if(P.length==2){let E=P[0].distanceTo(P[1]);if(Math.abs(E-i.distance())<.3){a=b.maxPerpendicularDistance;let T=new F.Line3(g,p),V=new F.Vector3(s.x,s.y,g.z),W=T.closestPointToPoint(V,!0,new F.Vector3);c.beamNearWallVec=new F.Vector3().subVectors(W,V).normalize(),c.beamStart.z>t[h].rooftopPz-.03&&length>1?l=!0:u=!0;break}}if(u)break}else b&&b.type=="collinear_overlap"&&b.maxPerpendicularDistance>.3&&b.maxPerpendicularDistance<.7&&(l=!0)}if(u){if(length<1.8||a<.2)continue;l=!0}l||(c.isRebuild=!0)}}}e.close()};import*as Lt from"three";import"three/examples/jsm/utils/BufferGeometryUtils.js";var _s=(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,x)=>({start:Zn(m.start),end:Zn(m.end),uuid:m.uuid,sourceIndex:x,sourceSegment:m})):la(t,o,n),a=[],f=new Map;function c(m){let x=Math.round(m.x/n),y=Math.round(m.y/n);return`${x},${y}`}function d(m){let x=c(m);if(f.has(x))return f.get(x);let y=a.length;return a.push({id:y,x:m.x,y:m.y}),f.set(x,y),y}let u=[],l=new Map;for(let m of i){let x=o(m.start),y=o(m.end);if(Ws(x,y)<n*n)continue;let w=d(x),z=d(y);if(w===z)continue;let M=w<z?`${w}_${z}`:`${z}_${w}`;if(l.has(M))continue;let P=u.length;u.push({id:P,a:w,b:z,uuid:m.uuid,sourceIndex:m.sourceIndex,sourceSegment:m.sourceSegment||m}),l.set(M,P)}let h=[],g=Array.from({length:a.length},()=>[]);function p(m,x,y,w,z){let M=a[m],P=a[x],E=h.length,T=Math.atan2(P.y-M.y,P.x-M.x),V={id:E,from:m,to:x,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 u){let x=p(m.a,m.b,m.id,m.uuid,m.sourceIndex),y=p(m.b,m.a,m.id,m.uuid,m.sourceIndex);h[x].twin=y,h[y].twin=x}for(let m of g)m.sort((x,y)=>h[x].angle-h[y].angle);for(let m of h){let x=g[m.to],y=m.twin,w=x.indexOf(y);if(w===-1)continue;let z=(w-1+x.length)%x.length;m.next=x[z]}let b=[];for(let m of h){if(m.visited)continue;let x=[],y=[],w=m.id,z=0,M=h.length+10;for(;;){let v=h[w];if(!v||v.visited)break;if(v.visited=!0,x.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(x.length<3)continue;let P=y.map(v=>a[v]),E=ua(P),T=!1;if(r==="positive"?T=E>n:T=E<-n,!T)continue;let V=x.map(v=>h[v].uuid),W=x.map(v=>h[v].sourceIndex);b.push({uuids:V,area:Math.abs(E),lineIndexes:W})}return b};function la(t,e,n=1e-6){let o=[];for(let s=0;s<t.length;s++){let r=t[s],i=e(r.start),a=e(r.end),f=[{t:0,point:Zn(r.start)},{t:1,point:Zn(r.end)}];for(let d=0;d<t.length;d++){if(s===d)continue;let u=t[d],l=e(u.start),h=e(u.end),g=ca(i,a,l,h,n);g&&g.t>n&&g.t<1-n&&f.push({t:g.t,point:fa(r.start,r.end,g.t)})}f.sort((d,u)=>d.t-u.t);let c=[];for(let d of f)(c.length===0||Math.abs(d.t-c[c.length-1].t)>n)&&c.push(d);for(let d=0;d<c.length-1;d++){let u=c[d].point,l=c[d+1].point,h=e(u),g=e(l);Ws(h,g)<n*n||o.push({start:u,end:l,uuid:r.uuid,sourceIndex:s,sourceSegment:r})}}return o}function ca(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},a={x:n.x-t.x,y:n.y-t.y},f=_o(r,i);if(Math.abs(f)<s)return null;let c=_o(a,i)/f,d=_o(a,r)/f;return c>=-s&&c<=1+s&&d>=-s&&d<=1+s?{t:c,u:d,point:{x:t.x+c*r.x,y:t.y+c*r.y}}:null}function _o(t,e){return t.x*e.y-t.y*e.x}function Ws(t,e){let n=t.x-e.x,o=t.y-e.y;return n*n+o*o}function ua(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 fa(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 Zn(t){return t&&typeof t.clone=="function"?t.clone():{x:t.x,y:t.y,z:t.z}}var da=(t,e)=>{if(!t||t.length<=0)return;let n={rectangles:[],threeEdgeRect:[]},o=new Set,s=.1,r=1.2,i=.15,a=2,f=80,c=95;if(!t[0].uuid){let l=1e4;for(let h=0;h<t.length;h++)t[h].uuid=l++}let d=[];for(let l=0;l<t.length;l++)d.push({start:t[l].start,end:t[l].end,uuid:t[l].uuid});let u=_s(d,{eps:1e-5,returnDetail:!0,project:l=>({x:l.x,y:l.y})});for(let l=0;l<u.length;l++){if(u[l].uuids.length<4||u[l].area<i||u[l].area>a)continue;let h=!1;for(let g=0;g<u[l].lineIndexes.length;g++){let p=t[u[l].lineIndexes[g]].length;if(p<s||p>r)break;let b=new Lt.Vector3(t[u[l].lineIndexes[g]].start.x,t[u[l].lineIndexes[g]].start.y,t[u[l].lineIndexes[g]].start.z),m=new Lt.Vector3(t[u[l].lineIndexes[g]].end.x,t[u[l].lineIndexes[g]].end.y,t[u[l].lineIndexes[g]].end.z),x=!1,y=new Lt.Vector3(0,0,0);for(let w=g+1;w<u[l].lineIndexes.length;w++){let z=t[u[l].lineIndexes[w]].length;if(z<s||z>r)break;let M=new Lt.Vector3(t[u[l].lineIndexes[w]].start.x,t[u[l].lineIndexes[w]].start.y,t[u[l].lineIndexes[w]].start.z),P=new Lt.Vector3(t[u[l].lineIndexes[w]].end.x,t[u[l].lineIndexes[w]].end.y,t[u[l].lineIndexes[w]].end.z),E=Zt(b,m,M,P);if(E&&E.isParallel){if(p+z>r){x=!0;break}p+=z;let V=ct(b,M),W=ct(b,P),v=ct(m,M),S=ct(m,P);V?(b=m.clone(),m=P.clone()):W?(b=m.clone(),m=M.clone()):v?m=P.clone():S&&(m=M.clone());continue}let T=ae(b,m,M,P);if(!T||T.angle<f||T.angle>c){x=!0;break}for(let V=w+1;V<u[l].lineIndexes.length;V++){let W=t[u[l].lineIndexes[V]].length;if(W<s||W>r)break;let v=new Lt.Vector3(t[u[l].lineIndexes[V]].start.x,t[u[l].lineIndexes[V]].start.y,t[u[l].lineIndexes[V]].start.z),S=new Lt.Vector3(t[u[l].lineIndexes[V]].end.x,t[u[l].lineIndexes[V]].end.y,t[u[l].lineIndexes[V]].end.z),R=Zt(M,P,v,S);if(R&&R.isParallel){if(z+W>r){x=!0;break}z+=W;let _=ct(M,v),C=ct(M,S),I=ct(P,v),H=ct(P,S);_?(M=P.clone(),P=S.clone()):C?(M=P.clone(),P=v.clone()):I?P=S.clone():H&&(P=v.clone());continue}let D=ae(M,P,v,S);if(!D||D.angle<f||D.angle>c){x=!0;break}for(let _=V+1;_<u[l].lineIndexes.length;_++){let C=t[u[l].lineIndexes[_]].length;if(C<s||C>r)break;let I=new Lt.Vector3(t[u[l].lineIndexes[_]].start.x,t[u[l].lineIndexes[_]].start.y,t[u[l].lineIndexes[_]].start.z),H=new Lt.Vector3(t[u[l].lineIndexes[_]].end.x,t[u[l].lineIndexes[_]].end.y,t[u[l].lineIndexes[_]].end.z),A=Zt(v,S,I,H);if(A&&A.isParallel){if(W+C>r){x=!0;break}W+=C;let $=ct(v,I),G=ct(v,H),Q=ct(S,I),q=ct(S,H);$?(v=S.clone(),S=H.clone()):G?(v=S.clone(),S=I.clone()):Q?S=H.clone():q&&(S=I.clone());continue}let L=ae(v,S,I,H);if(!L||L.angle<f||L.angle>c){x=!0;break}let O=ct(I,b),N=ct(I,m),k=ct(H,b),B=ct(H,m);if(O||N||k||B)h=!0;else for(let $=_+1;$<u[l].lineIndexes.length;$++){let G=t[u[l].lineIndexes[$]].length;if(G<s||G>r)break;let Q=new Lt.Vector3(t[u[l].lineIndexes[$]].start.x,t[u[l].lineIndexes[$]].start.y,t[u[l].lineIndexes[$]].start.z),q=new Lt.Vector3(t[u[l].lineIndexes[$]].end.x,t[u[l].lineIndexes[$]].end.y,t[u[l].lineIndexes[$]].end.z),X=Zt(I,H,Q,q);if(X&&X.isParallel){if(C+G>r){x=!0;break}C+=G;let Y=ct(I,Q),it=ct(I,q),mt=ct(H,Q),Tt=ct(H,q);if(Y)I=H.clone(),H=q.clone();else if(it)I=H.clone(),H=Q.clone();else if(mt)H=q.clone();else if(Tt)H=Q.clone();else continue;if(O=ct(I,b),N=ct(I,m),k=ct(H,b),B=ct(H,m),O||N||k||B){h=!0;break}}}break}if(x)break}if(x)break}if(x)break}h&&n.rectangles.push(u[l].uuids)}for(let l=0;l<t.length;l++){let h=t[l].length;if(o.has(t[l].uuid)||h<s||h>r)continue;let g={uuids:[],missingEdge:{start:new Lt.Vector3,end:new Lt.Vector3}},p=new Lt.Vector3(t[l].start.x,t[l].start.y,t[l].start.z),b=new Lt.Vector3(t[l].end.x,t[l].end.y,t[l].end.z),m=!0,x=!0;for(let z=0;z<t.length;z++){if(z==l)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,p),T=ct(P,p),V=ct(M,b),W=ct(P,b);if(E||T?m=!1:(V||W)&&(x=!1),!m&&!x)break}if(!m&&!x)continue;let y=new Lt.Vector3;m||([p,b]=[b,p]),y=new Lt.Vector3().subVectors(b,p).normalize();let w=y.clone().negate();for(let z=0;z<t.length;z++){let M=t[z].length;if(z==l||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=ae(p,b,P,E);if(!T||T.angle<85)continue;let V=ct(P,b),W=ct(E,b);if(!V&&!W)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==l||R==z||o.has(R)||D<s||D>r)continue;let _=new Lt.Vector3(t[R].start.x,t[R].start.y,t[R].start.z),C=new Lt.Vector3(t[R].end.x,t[R].end.y,t[R].end.z),I=ae(P,E,_,C);if(!I||I.angle<85)continue;let H=ct(_,S),A=ct(C,S);if(!H&&!A)continue;let L=new Lt.Vector3,O=new Lt.Vector3;H?(L=_.clone(),O=C.clone()):(L=C.clone(),O=_.clone());let N=new Lt.Vector3().subVectors(O,L).normalize(),k=Qt(w,N,.1);if(!k||!k.parallel||!k.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,_),it=ct(X,_),mt=ct(q,C),Tt=ct(X,C);if(Y||it?B=!1:(mt||Tt)&&($=!1),!B&&!$)break}if(!B&&!$)continue;let G=h*M;if(!(G<i||G>a)){g.uuids=[t[l].uuid,t[z].uuid,t[R].uuid],g.missingEdge.start=O,g.missingEdge.end=p;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 Ct=11102230246251565e-32,Yt=134217729,Sn=(3+8*Ct)*Ct;function qe(t,e,n,o,s){let r,i,a,f,c=e[0],d=o[0],u=0,l=0;d>c==d>-c?(r=c,c=e[++u]):(r=d,d=o[++l]);let h=0;if(u<t&&l<n)for(d>c==d>-c?(i=c+r,a=r-(i-c),c=e[++u]):(i=d+r,a=r-(i-d),d=o[++l]),r=i,a!==0&&(s[h++]=a);u<t&&l<n;)d>c==d>-c?(i=r+c,f=i-r,a=r-(i-f)+(c-f),c=e[++u]):(i=r+d,f=i-r,a=r-(i-f)+(d-f),d=o[++l]),r=i,a!==0&&(s[h++]=a);for(;u<t;)i=r+c,f=i-r,a=r-(i-f)+(c-f),c=e[++u],r=i,a!==0&&(s[h++]=a);for(;l<n;)i=r+d,f=i-r,a=r-(i-f)+(d-f),d=o[++l],r=i,a!==0&&(s[h++]=a);return(r!==0||h===0)&&(s[h++]=r),h}function Tn(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 ha=(3+16*Ct)*Ct,ma=(2+12*Ct)*Ct,ga=(9+64*Ct)*Ct*Ct,an=K(4),Hs=K(8),As=K(12),ks=K(16),se=K(4);function pa(t,e,n,o,s,r,i){let a,f,c,d,u,l,h,g,p,b,m,x,y,w,z,M,P,E,T=t-s,V=n-s,W=e-r,v=o-r;w=T*v,l=Yt*T,h=l-(l-T),g=T-h,l=Yt*v,p=l-(l-v),b=v-p,z=g*b-(w-h*p-g*p-h*b),M=W*V,l=Yt*W,h=l-(l-W),g=W-h,l=Yt*V,p=l-(l-V),b=V-p,P=g*b-(M-h*p-g*p-h*b),m=z-P,u=z-m,an[0]=z-(m+u)+(u-P),x=w+m,u=x-w,y=w-(x-u)+(m-u),m=y-M,u=y-m,an[1]=y-(m+u)+(u-M),E=x+m,u=E-x,an[2]=x-(E-u)+(m-u),an[3]=E;let S=Tn(4,an),R=ma*i;if(S>=R||-S>=R||(u=t-T,a=t-(T+u)+(u-s),u=n-V,c=n-(V+u)+(u-s),u=e-W,f=e-(W+u)+(u-r),u=o-v,d=o-(v+u)+(u-r),a===0&&f===0&&c===0&&d===0)||(R=ga*i+Sn*Math.abs(S),S+=T*d+v*a-(W*c+V*f),S>=R||-S>=R))return S;w=a*v,l=Yt*a,h=l-(l-a),g=a-h,l=Yt*v,p=l-(l-v),b=v-p,z=g*b-(w-h*p-g*p-h*b),M=f*V,l=Yt*f,h=l-(l-f),g=f-h,l=Yt*V,p=l-(l-V),b=V-p,P=g*b-(M-h*p-g*p-h*b),m=z-P,u=z-m,se[0]=z-(m+u)+(u-P),x=w+m,u=x-w,y=w-(x-u)+(m-u),m=y-M,u=y-m,se[1]=y-(m+u)+(u-M),E=x+m,u=E-x,se[2]=x-(E-u)+(m-u),se[3]=E;let D=qe(4,an,4,se,Hs);w=T*d,l=Yt*T,h=l-(l-T),g=T-h,l=Yt*d,p=l-(l-d),b=d-p,z=g*b-(w-h*p-g*p-h*b),M=W*c,l=Yt*W,h=l-(l-W),g=W-h,l=Yt*c,p=l-(l-c),b=c-p,P=g*b-(M-h*p-g*p-h*b),m=z-P,u=z-m,se[0]=z-(m+u)+(u-P),x=w+m,u=x-w,y=w-(x-u)+(m-u),m=y-M,u=y-m,se[1]=y-(m+u)+(u-M),E=x+m,u=E-x,se[2]=x-(E-u)+(m-u),se[3]=E;let _=qe(D,Hs,4,se,As);w=a*d,l=Yt*a,h=l-(l-a),g=a-h,l=Yt*d,p=l-(l-d),b=d-p,z=g*b-(w-h*p-g*p-h*b),M=f*c,l=Yt*f,h=l-(l-f),g=f-h,l=Yt*c,p=l-(l-c),b=c-p,P=g*b-(M-h*p-g*p-h*b),m=z-P,u=z-m,se[0]=z-(m+u)+(u-P),x=w+m,u=x-w,y=w-(x-u)+(m-u),m=y-M,u=y-m,se[1]=y-(m+u)+(u-M),E=x+m,u=E-x,se[2]=x-(E-u)+(m-u),se[3]=E;let C=qe(_,As,4,se,ks);return ks[C-1]}function ln(t,e,n,o,s,r){let i=(e-r)*(n-s),a=(t-s)*(o-r),f=i-a,c=Math.abs(i+a);return Math.abs(f)>=ha*c?f:-pa(t,e,n,o,s,r,c)}var Yu=(7+56*Ct)*Ct,Uu=(3+28*Ct)*Ct,Ku=(26+288*Ct)*Ct*Ct,Qu=K(4),Ju=K(4),tf=K(4),ef=K(4),nf=K(4),of=K(4),sf=K(4),rf=K(4),af=K(4),lf=K(8),cf=K(8),uf=K(8),ff=K(4),df=K(8),hf=K(8),mf=K(16),gf=K(12),pf=K(192),xf=K(192);var wf=(10+96*Ct)*Ct,zf=(4+48*Ct)*Ct,Mf=(44+576*Ct)*Ct*Ct,Ef=K(4),Pf=K(4),Sf=K(4),Tf=K(4),Rf=K(4),Df=K(4),vf=K(4),Vf=K(4),Cf=K(8),If=K(8),_f=K(8),Wf=K(8),Hf=K(8),Af=K(8),kf=K(8),Lf=K(8),Bf=K(8),Of=K(4),Ff=K(4),Nf=K(4),qf=K(8),$f=K(16),jf=K(16),Xf=K(16),Gf=K(32),Zf=K(32),Yf=K(48),Uf=K(64),Kf=K(1152),Qf=K(1152);var nd=(16+224*Ct)*Ct,od=(5+72*Ct)*Ct,sd=(71+1408*Ct)*Ct*Ct,rd=K(4),id=K(4),ad=K(4),ld=K(4),cd=K(4),ud=K(4),fd=K(4),dd=K(4),hd=K(4),md=K(4),gd=K(24),pd=K(24),xd=K(24),yd=K(24),bd=K(24),wd=K(24),zd=K(24),Md=K(24),Ed=K(24),Pd=K(24),Sd=K(1152),Td=K(1152),Rd=K(1152),Dd=K(1152),vd=K(1152),Vd=K(2304),Cd=K(2304),Id=K(3456),_d=K(5760),Wd=K(8),Hd=K(8),Ad=K(8),kd=K(16),Ld=K(24),Bd=K(48),Od=K(48),Fd=K(96),Nd=K(192),qd=K(384),$d=K(384),jd=K(384),Xd=K(768);var Gd=K(96),Zd=K(96),Yd=K(96),Ud=K(1152);var Bs=Math.pow(2,-52),Yn=new Uint32Array(512),un=class t{static from(e,n=Ma,o=Ea){let s=e.length,r=new Float64Array(s*2);for(let i=0;i<s;i++){let a=e[i];r[2*i]=n(a),r[2*i+1]=o(a)}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,a=1/0,f=1/0,c=-1/0,d=-1/0;for(let T=0;T<i;T++){let V=e[2*T],W=e[2*T+1];V<a&&(a=V),W<f&&(f=W),V>c&&(c=V),W>d&&(d=W),this._ids[T]=T}let u=(a+c)/2,l=(f+d)/2,h=0,g=0,p=0;for(let T=0,V=1/0;T<i;T++){let W=Wo(u,l,e[2*T],e[2*T+1]);W<V&&(h=T,V=W)}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 W=Wo(b,m,e[2*T],e[2*T+1]);W<V&&W>0&&(g=T,V=W)}let x=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=wa(b,m,x,y,e[2*T],e[2*T+1]);V<w&&(p=T,w=V)}let z=e[2*p],M=e[2*p+1];if(w===1/0){for(let W=0;W<i;W++)this._dists[W]=e[2*W]-e[0]||e[2*W+1]-e[1];cn(this._ids,this._dists,0,i-1);let T=new Uint32Array(i),V=0;for(let W=0,v=-1/0;W<i;W++){let S=this._ids[W],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(ln(b,m,x,y,z,M)<0){let T=g,V=x,W=y;g=p,x=z,y=M,p=T,z=V,M=W}let P=za(b,m,x,y,z,M);this._cx=P.x,this._cy=P.y;for(let T=0;T<i;T++)this._dists[T]=Wo(e[2*T],e[2*T+1],P.x,P.y);cn(this._ids,this._dists,0,i-1),this._hullStart=h;let E=3;o[h]=n[p]=g,o[g]=n[h]=p,o[p]=n[g]=h,s[h]=0,s[g]=1,s[p]=2,r.fill(-1),r[this._hashKey(b,m)]=h,r[this._hashKey(x,y)]=g,r[this._hashKey(z,M)]=p,this.trianglesLen=0,this._addTriangle(h,g,p,-1,-1,-1);for(let T=0,V=0,W=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)<=Bs&&Math.abs(R-W)<=Bs||(V=S,W=R,v===h||v===g||v===p))continue;let D=0;for(let A=0,L=this._hashKey(S,R);A<this._hashSize&&(D=r[(L+A)%this._hashSize],!(D!==-1&&D!==o[D]));A++);D=n[D];let _=D,C;for(;C=o[_],ln(S,R,e[2*_],e[2*_+1],e[2*C],e[2*C+1])>=0;)if(_=C,_===D){_=-1;break}if(_===-1)continue;let I=this._addTriangle(_,v,o[_],-1,-1,s[_]);s[v]=this._legalize(I+2),s[_]=I,E++;let H=o[_];for(;C=o[H],ln(S,R,e[2*H],e[2*H+1],e[2*C],e[2*C+1])<0;)I=this._addTriangle(H,v,C,s[v],-1,s[H]),s[v]=this._legalize(I+2),o[H]=H,E--,H=C;if(_===D)for(;C=n[_],ln(S,R,e[2*C],e[2*C+1],e[2*_],e[2*_+1])<0;)I=this._addTriangle(C,v,_,-1,s[_],s[C]),this._legalize(I+2),s[C]=I,o[_]=_,E--,_=C;this._hullStart=n[v]=_,o[_]=n[H]=v,o[v]=H,r[this._hashKey(S,R)]=v,r[this._hashKey(e[2*_],e[2*_+1])]=_}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(ya(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 a=o[e],f=e-e%3;if(i=f+(e+2)%3,a===-1){if(r===0)break;e=Yn[--r];continue}let c=a-a%3,d=f+(e+1)%3,u=c+(a+2)%3,l=n[i],h=n[e],g=n[d],p=n[u];if(ba(s[2*l],s[2*l+1],s[2*h],s[2*h+1],s[2*g],s[2*g+1],s[2*p],s[2*p+1])){n[e]=p,n[a]=l;let m=o[u];if(m===-1){let y=this._hullStart;do{if(this._hullTri[y]===u){this._hullTri[y]=e;break}y=this._hullPrev[y]}while(y!==this._hullStart)}this._link(e,m),this._link(a,o[i]),this._link(i,u);let x=c+(a+1)%3;r<Yn.length&&(Yn[r++]=x)}else{if(r===0)break;e=Yn[--r]}}return i}_link(e,n){this._halfedges[e]=n,n!==-1&&(this._halfedges[n]=e)}_addTriangle(e,n,o,s,r,i){let a=this.trianglesLen;return this._triangles[a]=e,this._triangles[a+1]=n,this._triangles[a+2]=o,this._link(a,s),this._link(a+1,r),this._link(a+2,i),this.trianglesLen+=3,a}};function ya(t,e){let n=t/(Math.abs(t)+Math.abs(e));return(e>0?3-n:1+n)/4}function Wo(t,e,n,o){let s=t-n,r=e-o;return s*s+r*r}function ba(t,e,n,o,s,r,i,a){let f=t-i,c=e-a,d=n-i,u=o-a,l=s-i,h=r-a,g=f*f+c*c,p=d*d+u*u,b=l*l+h*h;return f*(u*b-p*h)-c*(d*b-p*l)+g*(d*h-u*l)<0}function wa(t,e,n,o,s,r){let i=n-t,a=o-e,f=s-t,c=r-e,d=i*i+a*a,u=f*f+c*c,l=.5/(i*c-a*f),h=(c*d-a*u)*l,g=(i*u-f*d)*l;return h*h+g*g}function za(t,e,n,o,s,r){let i=n-t,a=o-e,f=s-t,c=r-e,d=i*i+a*a,u=f*f+c*c,l=.5/(i*c-a*f),h=t+(c*d-a*u)*l,g=e+(i*u-f*d)*l;return{x:h,y:g}}function cn(t,e,n,o){if(o-n<=20)for(let s=n+1;s<=o;s++){let r=t[s],i=e[r],a=s-1;for(;a>=n&&e[t[a]]>i;)t[a+1]=t[a--];t[a+1]=r}else{let s=n+o>>1,r=n+1,i=o;Rn(t,s,r),e[t[n]]>e[t[o]]&&Rn(t,n,o),e[t[r]]>e[t[o]]&&Rn(t,r,o),e[t[n]]>e[t[r]]&&Rn(t,n,r);let a=t[r],f=e[a];for(;;){do r++;while(e[t[r]]<f);do i--;while(e[t[i]]>f);if(i<r)break;Rn(t,r,i)}t[n+1]=t[i],t[i]=a,o-r+1>=i-n?(cn(t,e,r,o),cn(t,e,n,i-1)):(cn(t,e,n,i-1),cn(t,e,r,o))}}function Rn(t,e,n){let o=t[e];t[e]=t[n],t[n]=o}function Ma(t){return t[0]}function Ea(t){return t[1]}var fe=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 _e=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 Dn=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,a=this.circumcenters=this._circumcenters.subarray(0,o.length/3*2);for(let p=0,b=0,m=o.length,x,y;p<m;p+=3,b+=2){let w=o[p]*2,z=o[p+1]*2,M=o[p+2]*2,P=e[w],E=e[w+1],T=e[z],V=e[z+1],W=e[M],v=e[M+1],S=T-P,R=V-E,D=W-P,_=v-E,C=(S*_-R*D)*2;if(Math.abs(C)<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 I=1e9*Math.sign((r-P)*_-(i-E)*D);x=(P+W)/2-I*_,y=(E+v)/2+I*D}else{let I=1/C,H=S*S+R*R,A=D*D+_*_;x=P+(_*H-R*A)*I,y=E+(S*A-D*H)*I}a[b]=x,a[b+1]=y}let f=n[n.length-1],c,d=f*4,u,l=e[2*f],h,g=e[2*f+1];s.fill(0);for(let p=0;p<n.length;++p)f=n[p],c=d,u=l,h=g,d=f*4,l=e[2*f],g=e[2*f+1],s[c+2]=s[d]=h-g,s[c+3]=s[d+1]=l-u}render(e){let n=e==null?e=new fe:void 0,{delaunay:{halfedges:o,inedges:s,hull:r},circumcenters:i,vectors:a}=this;if(r.length<=1)return null;for(let d=0,u=o.length;d<u;++d){let l=o[d];if(l<d)continue;let h=Math.floor(d/3)*2,g=Math.floor(l/3)*2,p=i[h],b=i[h+1],m=i[g],x=i[g+1];this._renderSegment(p,b,m,x,e)}let f,c=r[r.length-1];for(let d=0;d<r.length;++d){f=c,c=r[d];let u=Math.floor(s[c]/3)*2,l=i[u],h=i[u+1],g=f*4,p=this._project(l,h,a[g+2],a[g+3]);p&&this._renderSegment(l,h,p[0],p[1],e)}return n&&n.value()}renderBounds(e){let n=e==null?e=new fe: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 fe: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 _e;return this.renderCell(e,n),n.value()}_renderSegment(e,n,o,s,r){let i,a=this._regioncode(e,n),f=this._regioncode(o,s);a===0&&f===0?(r.moveTo(e,n),r.lineTo(o,s)):(i=this._clipSegment(e,n,o,s,a,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 a=0,f=s.length;a<f;a+=2)if(n[r]===s[a]&&n[r+1]===s[a+1]&&n[(r+2)%i]===s[(a+f-2)%f]&&n[(r+3)%i]===s[(a+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 a=[],f=i;do{let c=Math.floor(f/3);if(a.push(n[c*2],n[c*2+1]),f=f%3===2?f-2:f+1,r[f]!==e)break;f=s[f]}while(f!==i&&f!==-1);return a}_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,a=n[o-2],f=n[o-1],c,d=this._regioncode(a,f),u,l=0;for(let h=0;h<o;h+=2)if(r=a,i=f,a=n[h],f=n[h+1],c=d,d=this._regioncode(a,f),c===0&&d===0)u=l,l=0,s?s.push(a,f):s=[a,f];else{let g,p,b,m,x;if(c===0){if((g=this._clipSegment(r,i,a,f,c,d))===null)continue;[p,b,m,x]=g}else{if((g=this._clipSegment(a,f,r,i,d,c))===null)continue;[m,x,p,b]=g,u=l,l=this._edgecode(p,b),u&&l&&this._edge(e,u,l,s,s.length),s?s.push(p,b):s=[p,b]}u=l,l=this._edgecode(m,x),u&&l&&this._edge(e,u,l,s,s.length),s?s.push(m,x):s=[m,x]}if(s)u=l,l=this._edgecode(s[0],s[1]),u&&l&&this._edge(e,u,l,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 a=r<i;for(a&&([e,n,o,s,r,i]=[o,s,e,n,i,r]);;){if(r===0&&i===0)return a?[o,s,e,n]:[e,n,o,s];if(r&i)return null;let f,c,d=r||i;d&8?(f=e+(o-e)*(this.ymax-n)/(s-n),c=this.ymax):d&4?(f=e+(o-e)*(this.ymin-n)/(s-n),c=this.ymin):d&2?(c=n+(s-n)*(this.xmax-e)/(o-e),f=this.xmax):(c=n+(s-n)*(this.xmin-e)/(o-e),f=this.xmin),r?(e=f,n=c,r=this._regioncode(e,n)):(o=f,s=c,i=this._regioncode(o,s))}}_clipInfinite(e,n,o,s,r,i){let a=Array.from(n),f;if((f=this._project(a[0],a[1],o,s))&&a.unshift(f[0],f[1]),(f=this._project(a[a.length-2],a[a.length-1],r,i))&&a.push(f[0],f[1]),a=this._clipFinite(e,a))for(let c=0,d=a.length,u,l=this._edgecode(a[d-2],a[d-1]);c<d;c+=2)u=l,l=this._edgecode(a[c],a[c+1]),u&&l&&(c=this._edge(e,u,l,a,c),d=a.length);else this.contains(e,(this.xmin+this.xmax)/2,(this.ymin+this.ymax)/2)&&(a=[this.xmin,this.ymin,this.xmax,this.ymin,this.xmax,this.ymax,this.xmin,this.ymax]);return a}_edge(e,n,o,s,r){for(;n!==o;){let i,a;switch(n){case 5:n=4;continue;case 4:n=6,i=this.xmax,a=this.ymin;break;case 6:n=2;continue;case 2:n=10,i=this.xmax,a=this.ymax;break;case 10:n=8;continue;case 8:n=9,i=this.xmin,a=this.ymax;break;case 9:n=1;continue;case 1:n=5,i=this.xmin,a=this.ymin;break}(s[r]!==i||s[r+1]!==a)&&this.contains(e,i,a)&&(s.splice(r,0,i,a),r+=2)}return r}_project(e,n,o,s){let r=1/0,i,a,f;if(s<0){if(n<=this.ymin)return null;(i=(this.ymin-n)/s)<r&&(f=this.ymin,a=e+(r=i)*o)}else if(s>0){if(n>=this.ymax)return null;(i=(this.ymax-n)/s)<r&&(f=this.ymax,a=e+(r=i)*o)}if(o>0){if(e>=this.xmax)return null;(i=(this.xmax-e)/o)<r&&(a=this.xmax,f=n+(r=i)*s)}else if(o<0){if(e<=this.xmin)return null;(i=(this.xmin-e)/o)<r&&(a=this.xmin,f=n+(r=i)*s)}return[a,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 Pa=2*Math.PI,fn=Math.pow;function Sa(t){return t[0]}function Ta(t){return t[1]}function Ra(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 Da(t,e,n){return[t+Math.sin(t+e)*n,e+Math.cos(t-e)*n]}var We=class t{static from(e,n=Sa,o=Ta,s){return new t("length"in e?va(e,n,o,s):Float64Array.from(Va(e,n,o,s)))}constructor(e){this._delaunator=new un(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&&Ra(e)){this.collinear=Int32Array.from({length:n.length/2},(l,h)=>h).sort((l,h)=>n[2*l]-n[2*h]||n[2*l+1]-n[2*h+1]);let f=this.collinear[0],c=this.collinear[this.collinear.length-1],d=[n[2*f],n[2*f+1],n[2*c],n[2*c+1]],u=1e-8*Math.hypot(d[3]-d[1],d[2]-d[0]);for(let l=0,h=n.length/2;l<h;++l){let g=Da(n[2*l],n[2*l+1],u);n[2*l]=g[0],n[2*l+1]=g[1]}this._delaunator=new un(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),a=this._hullIndex.fill(-1);for(let f=0,c=o.length;f<c;++f){let d=r[f%3===2?f-2:f+1];(o[f]===-1||i[d]===-1)&&(i[d]=f)}for(let f=0,c=s.length;f<c;++f)a[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 Dn(this,e)}*neighbors(e){let{inedges:n,hull:o,_hullIndex:s,halfedges:r,triangles:i,collinear:a}=this;if(a){let u=a.indexOf(e);u>0&&(yield a[u-1]),u<a.length-1&&(yield a[u+1]);return}let f=n[e];if(f===-1)return;let c=f,d=-1;do{if(yield d=i[c],c=c%3===2?c-2:c+1,i[c]!==e)return;if(c=r[c],c===-1){let u=o[(s[e]+1)%o.length];u!==d&&(yield u);return}}while(c!==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:a,triangles:f,points:c}=this;if(s[e]===-1||!c.length)return(e+1)%(c.length>>1);let d=e,u=fn(n-c[e*2],2)+fn(o-c[e*2+1],2),l=s[e],h=l;do{let g=f[h],p=fn(n-c[g*2],2)+fn(o-c[g*2+1],2);if(p<u&&(u=p,d=g),h=h%3===2?h-2:h+1,f[h]!==e)break;if(h=a[h],h===-1){if(h=r[(i[e]+1)%r.length],h!==g&&fn(n-c[h*2],2)+fn(o-c[h*2+1],2)<u)return h;break}}while(h!==l);return d}render(e){let n=e==null?e=new fe:void 0,{points:o,halfedges:s,triangles:r}=this;for(let i=0,a=s.length;i<a;++i){let f=s[i];if(f<i)continue;let c=r[i]*2,d=r[f]*2;e.moveTo(o[c],o[c+1]),e.lineTo(o[d],o[d+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 fe:void 0,{points:s}=this;for(let r=0,i=s.length;r<i;r+=2){let a=s[r],f=s[r+1];e.moveTo(a+n,f),e.arc(a,f,n,0,Pa)}return o&&o.value()}renderHull(e){let n=e==null?e=new fe:void 0,{hull:o,points:s}=this,r=o[0]*2,i=o.length;e.moveTo(s[r],s[r+1]);for(let a=1;a<i;++a){let f=2*o[a];e.lineTo(s[f],s[f+1])}return e.closePath(),n&&n.value()}hullPolygon(){let e=new _e;return this.renderHull(e),e.value()}renderTriangle(e,n){let o=n==null?n=new fe:void 0,{points:s,triangles:r}=this,i=r[e*=3]*2,a=r[e+1]*2,f=r[e+2]*2;return n.moveTo(s[i],s[i+1]),n.lineTo(s[a],s[a+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 _e;return this.renderTriangle(e,n),n.value()}};function va(t,e,n,o){let s=t.length,r=new Float64Array(s*2);for(let i=0;i<s;++i){let a=t[i];r[i*2]=e.call(o,a,i,t),r[i*2+1]=n.call(o,a,i,t)}return r}function*Va(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 Ho(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 Os(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 p=0;p<t.length;p++){let b=t[p],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 p=0,b=0;p<o;p++){let m=n[p];s[b++]=m[0],s[b++]=m[1]}let r=new We(s),{triangles:i}=r;if(!i.length)return[];let a=new Map;for(let p=0;p<i.length;p+=3){let b=i[p],m=i[p+1],x=i[p+2],y=b*2,w=m*2,z=x*2,M=s[y],P=s[y+1],E=s[w],T=s[w+1],V=s[z],W=s[z+1],v=M-E,S=P-T,R=M-V,D=P-W,_=E-V,C=T-W,I=_*_+C*C,H=R*R+D*D,A=v*v+S*S,L=(E-M)*(W-P)-(V-M)*(T-P);if(L===0)continue;let O=L*L,k=M===0||E===0||V===0?O:4*O;I*H*A<=k&&(Ho(a,o,b,m),Ho(a,o,m,x),Ho(a,o,x,b))}if(!a.size)return[];let f=new Map,c=0,d=-1;for(let[p,b]of a){if(b!==1)continue;let m=Math.floor(p/o),x=p-m*o;d===-1&&(d=m),Os(f,m,x),Os(f,x,m),c++}if(c===0)return[];let u=[],l=new Uint8Array(o),h=d,g=-1;do{u.push(n[h]),l[h]=1;let p=f.get(h)||[],b=-1;for(let m=0;m<p.length;m++){let x=p[m];if(x!==g&&!l[x]){b=x;break}}if(b===-1)for(let m=0;m<p.length;m++){let x=p[m];if(x!==g){b=x;break}}if(b===-1)break;g=h,h=b}while(h!==d&&u.length<=c+1);return u.length>0&&u.push(u[0]),u}import*as qt from"three";import{OBB as Ya}from"three/examples/jsm/math/OBB.js";var Ut=63710088e-1,Ns={centimeters:Ut*100,centimetres:Ut*100,degrees:360/(2*Math.PI),feet:Ut*3.28084,inches:Ut*39.37,kilometers:Ut/1e3,kilometres:Ut/1e3,meters:Ut,metres:Ut,miles:Ut/1609.344,millimeters:Ut*1e3,millimetres:Ut*1e3,nauticalmiles:Ut/1852,radians:1,yards:Ut*1.0936};function qs(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 Un(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(!Fs(t[0])||!Fs(t[1]))throw new Error("coordinates must contain numbers");return qs({type:"Point",coordinates:t},e,n)}function Kn(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 qs({type:"Polygon",coordinates:t},e,n)}function Ca(t,e="kilometers"){let n=Ns[e];if(!n)throw new Error(e+" units is invalid");return t*n}function Ia(t,e="kilometers"){let n=Ns[e];if(!n)throw new Error(e+" units is invalid");return t/n}function Qn(t){return t%(2*Math.PI)*180/Math.PI}function de(t){return t%360*Math.PI/180}function Jn(t,e="kilometers",n="kilometers"){if(!(t>=0))throw new Error("length must be a positive number");return Ca(Ia(t,e),n)}function Fs(t){return!isNaN(t)&&t!==null&&!Array.isArray(t)}function $s(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Ee(t,e,n){if(t!==null)for(var o,s,r,i,a,f,c,d=0,u=0,l,h=t.type,g=h==="FeatureCollection",p=h==="Feature",b=g?t.features.length:1,m=0;m<b;m++){c=g?t.features[m].geometry:p?t.geometry:t,l=c?c.type==="GeometryCollection":!1,a=l?c.geometries.length:1;for(var x=0;x<a;x++){var y=0,w=0;if(i=l?c.geometries[x]:c,i!==null){f=i.coordinates;var z=i.type;switch(d=n&&(z==="Polygon"||z==="MultiPolygon")?1:0,z){case null:break;case"Point":if(e(f,u,m,y,w)===!1)return!1;u++,y++;break;case"LineString":case"MultiPoint":for(o=0;o<f.length;o++){if(e(f[o],u,m,y,w)===!1)return!1;u++,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-d;s++){if(e(f[o][s],u,m,y,w)===!1)return!1;u++}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-d;r++){if(e(f[o][s][r],u,m,y,w)===!1)return!1;u++}w++}y++}break;case"GeometryCollection":for(o=0;o<i.geometries.length;o++)if(Ee(i.geometries[o],e,n)===!1)return!1;break;default:throw new Error("Unknown Geometry Type")}}}}}function js(t){var e=[];return Ee(t,function(n){e.push(n)}),e}function _a(t,e){var n,o,s,r,i,a,f,c,d,u,l=0,h=t.type==="FeatureCollection",g=t.type==="Feature",p=h?t.features.length:1;for(n=0;n<p;n++){for(a=h?t.features[n].geometry:g?t.geometry:t,c=h?t.features[n].properties:g?t.properties:{},d=h?t.features[n].bbox:g?t.bbox:void 0,u=h?t.features[n].id:g?t.id:void 0,f=a?a.type==="GeometryCollection":!1,i=f?a.geometries.length:1,s=0;s<i;s++){if(r=f?a.geometries[s]:a,r===null){if(e(null,l,c,d,u)===!1)return!1;continue}switch(r.type){case"Point":case"LineString":case"MultiPoint":case"Polygon":case"MultiLineString":case"MultiPolygon":{if(e(r,l,c,d,u)===!1)return!1;break}case"GeometryCollection":{for(o=0;o<r.geometries.length;o++)if(e(r.geometries[o],l,c,d,u)===!1)return!1;break}default:throw new Error("Unknown Geometry Type")}}l++}}function Xs(t,e,n){var o=n;return _a(t,function(s,r,i,a,f){r===0&&n===void 0?o=s:o=e(o,s,r,i,a,f)}),o}var fr=_i(ur(),1);function dr(t,e={}){e.concavity=e.concavity||1/0;let n=[];if(Ee(t,s=>{n.push([s[0],s[1]])}),!n.length)return null;let o=(0,fr.default)(n,e.concavity);return o.length>3?Kn([o]):null}function so(t,e={}){let n=0,o=0,s=0;return Ee(t,function(r){n+=r[0],o+=r[1],s++},!0),Un([n/s,o/s],e.properties)}function ue(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 hr(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 gr(t,e,n={}){let o;return n.final?o=mr(ue(e),ue(t)):o=mr(ue(t),ue(e)),o>180?-(360-o):o}function mr(t,e){let n=de(t[1]),o=de(e[1]),s=de(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(Qn(i)+360)%360}function pr(t,e,n={}){let o=ue(t),s=ue(e);s[0]+=s[0]-o[0]>180?-360:o[0]-s[0]>180?360:0;let r=qa(o,s);return Jn(r,"meters",n.units)}function qa(t,e,n){n=n===void 0?Ut:Number(n);let o=n,s=t[1]*Math.PI/180,r=e[1]*Math.PI/180,i=r-s,a=Math.abs(e[0]-t[0])*Math.PI/180;a>Math.PI&&(a-=2*Math.PI);let f=Math.log(Math.tan(r/2+Math.PI/4)/Math.tan(s/2+Math.PI/4)),c=Math.abs(f)>1e-11?i/f:Math.cos(s);return Math.sqrt(i*i+c*c*a*a)*o}function xr(t,e,n,o={}){let s=e<0,r=Jn(Math.abs(e),o.units,"meters");s&&(r=-Math.abs(r));let i=ue(t),a=$a(i,r,n);return a[0]+=a[0]-i[0]>180?-360:i[0]-a[0]>180?360:0,Un(a,o.properties)}function $a(t,e,n,o){o=o===void 0?Ut:Number(o);let s=e/o,r=t[0]*Math.PI/180,i=de(t[1]),a=de(n),f=s*Math.cos(a),c=i+f;Math.abs(c)>Math.PI/2&&(c=c>0?Math.PI-c:-Math.PI-c);let d=Math.log(Math.tan(c/2+Math.PI/4)/Math.tan(i/2+Math.PI/4)),u=Math.abs(d)>1e-11?f/d:Math.cos(i),l=s*Math.sin(a)/u;return[((r+l)*180/Math.PI+540)%360-180,c*180/Math.PI]}function yr(t){if(!t)throw new Error("geojson is required");switch(t.type){case"Feature":return br(t);case"FeatureCollection":return ja(t);case"Point":case"LineString":case"Polygon":case"MultiPoint":case"MultiLineString":case"MultiPolygon":case"GeometryCollection":return $o(t);default:throw new Error("unknown GeoJSON type")}}function br(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=wr(t.properties),t.geometry==null?e.geometry=null:e.geometry=$o(t.geometry),e}function wr(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]=wr(o):e[n]=o}),e}function ja(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=>br(n)),e}function $o(t){let e={type:t.type};return t.bbox&&(e.bbox=t.bbox),t.type==="GeometryCollection"?(e.geometries=t.geometries.map(n=>$o(n)),e):(e.coordinates=zr(t.coordinates),e)}function zr(t){let e=t;return typeof e[0]!="object"?e.slice():e.map(n=>zr(n))}function jo(t,e,n){if(n=n||{},!$s(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??so(t);return(s===!1||s===void 0)&&(t=yr(t)),Ee(t,function(i){let f=gr(r,i)+e,c=pr(r,i),d=hr(xr(r,c,f));i[0]=d[0],i[1]=d[1]}),t}function Xo(t,e,n={}){if(n.final===!0)return Xa(t,e);let o=ue(t),s=ue(e),r=de(o[0]),i=de(s[0]),a=de(o[1]),f=de(s[1]),c=Math.sin(i-r)*Math.cos(f),d=Math.cos(a)*Math.sin(f)-Math.sin(a)*Math.cos(f)*Math.cos(i-r);return Qn(Math.atan2(c,d))}function Xa(t,e){let n=Xo(e,t);return n=(n+180)%360,n}function Mr(t,e={}){if(t.bbox!=null&&e.recompute!==!0)return t.bbox;let n=[1/0,1/0,-1/0,-1/0];return Ee(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 Er(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 Kn([[i,[s,o],[s,r],[n,r],i]],e.properties,{bbox:t,id:e.id})}function Pr(t){return Er(Mr(t))}function Rr(t){return Xs(t,(e,n)=>e+Ga(n),0)}function Ga(t){let e=0,n;switch(t.type){case"Polygon":return Sr(t.coordinates);case"MultiPolygon":for(n=0;n<t.coordinates.length;n++)e+=Sr(t.coordinates[n]);return e;case"Point":case"MultiPoint":case"LineString":case"MultiLineString":return 0}return 0}function Sr(t){let e=0;if(t&&t.length>0){e+=Math.abs(Tr(t[0]));for(let n=1;n<t.length;n++)e-=Math.abs(Tr(t[n]))}return e}var Za=Ut*Ut/2,Go=Math.PI/180;function Tr(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],a=s[0]*Go,f=r[1]*Go,c=i[0]*Go;n+=(c-a)*Math.sin(f),o++}return n*Za}function Dr(t){let e=dr(t);if(!e)throw new Error("Can't calculate smallestSurroundingRectangleByArea for given geometry");let n=so(e),o=js(e),s=Number.MAX_SAFE_INTEGER,r=null;for(let i=0;i<o.length-1;i++){let a=Xo(o[i],o[i+1]),f=jo(e,-1*a,{pivot:n}),c=Pr(f),d=Rr(c);d<s&&(s=d,r=jo(c,a,{pivot:n}))}return r}function vr(t,e){let n=e[0]-t[0],o=e[1]-t[1];return Math.sqrt(n*n+o*o)}function Ua(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 io=class t extends Ya{getBoxMesh(){He.identity(),He.setFromMatrix3(this.rotation),He.decompose(ro,$e,new qt.Vector3);let e=this.halfSize.clone().multiplyScalar(2),n=new qt.Mesh(new qt.BoxGeometry(e.x,e.y,e.z));return n.position.copy(this.center),n.rotation.setFromQuaternion($e),n}getBoxEdge(e=16776960){let n=this.getBoxMesh();Qa.setFromObject(n);let o=new qt.EdgesGeometry(n.geometry.clone().applyMatrix4(n.matrixWorld));return new qt.LineSegments(o,new qt.LineBasicMaterial({color:e,toneMapped:!1}))}toJson(){return He.identity(),He.setFromMatrix3(this.rotation),He.decompose(ro,$e,new qt.Vector3),{size:this.halfSize.toArray(),center:this.center.toArray(),quaternion:$e.toArray()}}static from(e,n,o,s=new t){if(o instanceof qt.Euler)$e.setFromEuler(o);else if(o instanceof qt.Quaternion)$e.copy(o);else throw new Error("\u4F20\u5165\u7684\u65CB\u8F6C\u4E0D\u662F\u6B27\u62C9\u89D2\u6216\u8005\u56DB\u5143\u6570");return He.compose(n,$e,Ka),s.center.copy(n),s.halfSize.copy(e.multiplyScalar(.5)),s.rotation.setFromMatrix4(He),s}static fromByPath2D(e,n,o,s=new t){let r=Dr({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],a=vr(i[0],i[1]),f=vr(i[1],i[2]),c=Math.atan2(i[1][1]-i[0][1],i[1][0]-i[0][0]);ro.set(a,f,o),Vr.set(0,0,c);let[d,u]=Ua(i);return n.x=d,n.y=u,this.from(ro,n,Vr,s)}},He=new qt.Matrix4,$e=new qt.Quaternion,Vr=new qt.Euler,Ka=new qt.Vector3(1,1,1),ro=new qt.Vector3,Qa=new qt.Box3;import"three";function Ja(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,a=(u,l,h)=>`${Math.floor(u/s)},${Math.floor(l/s)},${Math.floor(h/s)}`;for(let u of e){let l=a(u.x,u.y,u.z);i.has(l)||i.set(l,[]),i.get(l).push(u)}let f=0,c=Math.ceil(n/s)+1,d=[];for(let u=-c;u<=c;u++)for(let l=-c;l<=c;l++)for(let h=-c;h<=c;h++)u*u+l*l+h*h<=c*c&&d.push([u,l,h]);for(let u of t){let l=Math.floor(u.x/s),h=Math.floor(u.y/s),g=Math.floor(u.z/s),p=!1;for(let[b,m,x]of d){let y=`${l+b},${h+m},${g+x}`;if(i.has(y)){for(let w of i.get(y))if(u.distanceToSquared(w)<r){p=!0;break}if(p)break}}if(p&&(f++,f/t.length>o))return f/t.length}return f/t.length}function Ae(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 Zo(t,e,n,o){if(t.intersectsOBB(e))return!0;{let r=Jt(t,o),i=Jt(e,n);if(r||i)return!0}return!1}function Yo(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 Jt(t,e){let n=!0;for(let o=0;o<e.length;o++)if(!t.containsPoint(e[o])){n=!1;break}return n}function he(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 Pe(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=io.fromByPath2D(s,e,n);return r.center.z=o,r}var tl=(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 p=0;p<t[s].path.length;p++)r.push(new Z.Vector3(t[s].path[p][0],t[s].path[p][1],0));if(r.length==0)continue;n.add(t[s].obb.getBoxEdge());let i=new Z.BufferGeometry;i.setFromPoints(r);let a="green",f=new Z.LineBasicMaterial({color:a,depthTest:!1,depthWrite:!1}),c=new Z.Line(i,f);c.position.z=t[s].maxz,n.add(c);let d=t[s].obb.center.clone(),u=Es(t[s].type,d),l=t[s].stairBottomPt1.clone(),h=t[s].stairBottomPt2.clone();for(let p=0;p<t[s].stairStepNum;p++){let b=[l,h];b.push(h.clone().addScaledVector(t[s].vecStepWidth,t[s].stairStepWidth)),b.push(l.clone().addScaledVector(t[s].vecStepWidth,t[s].stairStepWidth));let m=vo(b,t[s].stairStepHeight),x=new Z.Mesh(m,o);n.add(x),l=l.addScaledVector(t[s].vecStepWidth,t[s].stairStepWidth),l=l.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 p=[t[s].stairBottomPt1,t[s].stairBottomPt2,t[s].rectPt2,t[s].rectPt1],b=vo(p,t[s].stairStepHeight),m=new Z.Mesh(b,o);n.add(m)}let g=new Z.MeshBasicMaterial({color:16776960});for(let p=0;p<t[s].stairBottom1BalconyRailing.length;p++){let b=new Z.CylinderGeometry(.03,.03,t[s].balconyRailingHeight,32),m=new Z.Mesh(b,g);m.position.set(t[s].stairBottom1BalconyRailing[p].x,t[s].stairBottom1BalconyRailing[p].z+t[s].balconyRailingHeight/2,-t[s].stairBottom1BalconyRailing[p].y),e.add(m)}for(let p=0;p<t[s].stairBottom2BalconyRailing.length;p++){let b=new Z.CylinderGeometry(.03,.03,t[s].balconyRailingHeight,32),m=new Z.Mesh(b,g);m.position.set(t[s].stairBottom2BalconyRailing[p].x,t[s].stairBottom2BalconyRailing[p].z+t[s].balconyRailingHeight/2,-t[s].stairBottom2BalconyRailing[p].y),e.add(m)}}return n},el=(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]),a=t[r].obj_id;a=a.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=a.split("_").slice(1,3).join("_").split(".")[0].split("_")[0],c=a.indexOf("_")+1,d=a.lastIndexOf("_"),u=a.substring(c,d);if(u.includes("top")&&(c=u.indexOf("top")+4,u=u.substring(c,d)),u.includes("left")&&(c=u.indexOf("left")+5,u=u.substring(c,d)),u.includes("right")&&(c=u.indexOf("right")+6,u=u.substring(c,d)),u.includes("front")&&(c=u.indexOf("front")+6,u=u.substring(c,d)),u==="wall"||u==="stair guardrail")continue;let l=[];for(let m=0;m<t[r].points.length;m++)l.push(new Z.Vector3(t[r].points[m].x,t[r].points[m].y,t[r].points[m].z));let h=-99999;if(u==="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 x=[...m.entries()].reduce((y,w)=>w[1].num>y[1].num?w:y);i=[],i=x[1].points.map(y=>[y.x,y.y]),l=[],l=x[1].points.map(y=>new Z.Vector3(y.x,y.y,y.z)),h=x[0]}let g=he(l),p={points:l,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:u,averagePz:e,obb:null,isDel:!1,obj_id:a,positionArr:[t[r].position]};if(p.obb=Pe(p.path,p.center,p.h,(p.maxz+p.minz)/2),p.obb==null)continue;let b=-1;for(let m=0;m<n.length;m++)if(n[m].type==u){b=m;break}b!=-1?n[b].array.push(p):n.push({type:u,array:[p]})}for(let r=0;r<n.length;r++){let i=n[r].array,a=new Set,f=[];for(let d=0;d<i.length;d++){if(i[d].obb==null||a.has(d))continue;let u={...i[d],obb:i[d].obb.clone()};for(let l=d+1;l<i.length;l++){if(i[l].obb==null||a.has(l))continue;let h=u.obb.intersectsOBB(i[l].obb,.01);if(h||(h=ll(u.obb,i[l].obb)),h){a.add(l);for(let b=0;b<i[l].points.length;b++)(i[l].points[b].z>e&&i[l].points[b].z-e>.1||u.type=="floor"||u.type=="Staircase")&&u.points.push(i[l].points[b]);let g=u.points.map(b=>[b.x,b.y]);u.path=Ve(g);let p=he(u.points);u.h=p.h,u.minz=p.minz,u.maxz=p.maxz,u.center={x:p.x,y:p.y,z:p.z},u.obb=Pe(u.path,u.center,u.h,(u.maxz+u.minz)/2),u.positionArr.push(...i[l].positionArr),l=d}}u.path.length>i[d].path.length&&(a.add(d),f.push(u))}let c=[];for(let d=0;d<i.length;d++)a.has(d)||c.push(i[d]);c.push(...f),n[r].array=c}for(let r=0;r<n.length;r++){let i=n[r].type;if(i==="people"||i==="floor")continue;let a=n[r].array;for(let f=0;f<a.length;f++){let c=a[f].obb,d=a[f].minz,u=a[f].maxz,l=a[f].averagePz;if(i==="window"||i==="door"||i==="tv"||i==="chair"||i==="cabinet"||i==="table"){let h=new Z.Vector3;c.getSize(h);let g=[h.x,h.y,h.z],p=0;for(let b of g)if(b<.2&&(p++,p===2)){a[f].isDel=!0;break}}if(!a[f].isDel)for(let h=r+1;h<n.length;h++){let g=n[h].type;if(g==="people")continue;let p=n[h].array;for(let b=0;b<p.length;b++){if(p[b].isDel)continue;let m=p[b].obb,x=p[b].minz,y=p[b].maxz;if(c.intersectsOBB(m)){let w=Ae(p[b].points,c),z=Ae(a[f].points,m),M=Yo(c,m);if(z>=.5&&M==-1&&i!=="Staircase"&&g!=="Staircase"){a[f].isDel=!0;break}if(i!=="wall"&&i!=="floor"&&i!=="roof"){if(i==="window"){if(g==="balcony railing"&&Jt(c,p[b].points)){p[b].isDel=!0;continue}if(g==="balcony railing"&&Jt(m,a[f].points)){a[f].isDel=!0;break}if(g==="balcony railing"&&Zo(c,m,a[f].points,p[b].points)&&(Math.abs(d-x)<.1||Math.abs(x-l)>.3)){p[b].isDel=!0;continue}if(g==="door"&&Jt(c,p[b].points)){p[b].isDel=!0;continue}if(g==="door"&&Jt(m,a[f].points)){p[b].isDel=!0;continue}if(g==="window sill")continue}else if(i==="balcony railing"){if(g==="window"&&Jt(c,p[b].points)){p[b].isDel=!0;continue}if(g==="window"&&Jt(m,a[f].points)){a[f].isDel=!0;break}if(g==="window"&&Zo(c,m,a[f].points,p[b].points)&&(Math.abs(d-x)<.1||Math.abs(d-l)>.3)){a[f].isDel=!0;break}if(g==="Staircase"&&Jt(c,p[b].points)){a[f].isStaircaseBalconyRailing=!0;break}if(g==="Staircase"&&Jt(m,a[f].points)){a[f].isStaircaseBalconyRailing=!0;break}if(g==="Staircase"&&c.intersectsOBB(m)){a[f].isStaircaseBalconyRailing=!0;break}}else if(i==="door"){if(g==="window"&&Jt(c,p[b].points)){a[f].isDel=!0;break}if(g==="window"&&Jt(m,a[f].points)){a[f].isDel=!0;break}if(g==="window sill"&&Jt(c,p[b].points)){a[f].isDel=!0;break}if(g==="window sill"&&Jt(m,a[f].points)){a[f].isDel=!0;break}}else if(i==="window sill"){if(g==="window")continue;if(g==="floor"&&Jt(c,p[b].points)){p[b].isDel=!0;continue}if(g==="door"&&Jt(c,p[b].points)){p[b].isDel=!0;continue}if(g==="door"&&Jt(m,a[f].points)){p[b].isDel=!0;continue}}else if(i==="Staircase"){if(g==="balcony railing"&&Jt(c,p[b].points)){p[b].isStaircaseBalconyRailing=!0;continue}if(g==="balcony railing"&&Jt(m,a[f].points)){p[b].isStaircaseBalconyRailing=!0;continue}if(g==="balcony railing"&&c.intersectsOBB(m)){p[b].isStaircaseBalconyRailing=!0;continue}}let P=!1,E=[],T=[],V=a[f].points,W=p[b].points;if(V.length>W.length?(P=!0,E=V,T=W):(E=W,T=V),Ja(T,E,.03,.5)>.5)if(P)p[b].isDel=!0;else{a[f].isDel=!0;break}else if(Zo(c,m,a[f].points,p[b].points)){let S=Yo(c,m);if(S===1||S===0){if(g==="switch"||g==="Staircase")continue;V.length>W.length?Ae(T,c)>=.5&&(p[b].isDel=!0):Ae(E,c)>=.5&&(p[b].isDel=!0)}else{if(i==="switch"||i==="Staircase")continue;if(V.length>W.length){if(Ae(E,m)>=.5){a[f].isDel=!0;break}}else if(Ae(T,m)>=.5){a[f].isDel=!0;break}}}}}}if(a[f].isDel)break}}}for(let r=0;r<n.length;r++){let i=n[r].type,a=n[r].array;for(let f=0;f<a.length;f++){let c=a[f].maxz,d=a[f].minz,u=i==="switch"?.1:.3;if(Math.abs(c-e)<u&&i!="floor"){a[f].isDel=!0;continue}if(i==="window"||i==="door"||i==="tv"){let l=Math.abs(c-e),h=Math.abs(d-e);(i==="tv"&&h<1.6||i!=="window"&&l<1.6)&&(a[f].isDel=!0),i==="window"&&l<1&&(a[f].isDel=!0),i==="door"&&h>1&&(a[f].isDel=!0)}if(i==="chair"){let l=new Z.Vector3;a[f].obb.getSize(l),(l.x<.1||l.y<.1||l.z<.2)&&(a[f].isDel=!0)}if(i==="balcony railing"&&(Math.abs(c-d)<.4&&(a[f].isDel=!0),(d<e&&Math.abs(d-e)>1||d>e&&Math.abs(d-e)>1)&&(a[f].isDel=!0),c<e&&(a[f].isDel=!0)),i==="people"&&(Math.abs(c-d)<1&&(a[f].isDel=!0),d>e&&d-e>.3&&(a[f].isDel=!0),c<e&&(a[f].isDel=!0)),i==="floor"){let l=new Z.Vector3;a[f].obb.getSize(l),(l.x<.1||l.y<.1)&&(a[f].isDel=!0)}i==="stair guardrail"&&a[f].points.length<100&&(a[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 a=0;a<i.length;a++)s.push({obbBox:i[a].obb,box:new Z.Box3().setFromPoints(i[a].points),category:i[a].type,center:{x:i[a].center.x,y:i[a].center.y,z:(i[a].minz+i[a].maxz)/2},name:i[a].obj_id,obj_id:i[a].obj_id,pcdPoints:i[a].points,positionArr:i[a].positionArr})}return s},nl=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 a=i.split("_").slice(1,3).join("_").split(".")[0].split("_")[0],f=i.indexOf("_")+1,c=i.lastIndexOf("_"),d=i.substring(f,c);if(d!=="floor")continue;let u=[];for(let b=0;b<t[s].points.length;b++)u.push(new Z.Vector3(t[s].points[b].x,t[s].points[b].y,t[s].points[b].z));let l=-99999;if(d==="floor"){let b=new Map;for(let x=0;x<t[s].points.length;x++){let y=t[s].points[x].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[x]),b.set(y,w)}else b.set(y,{num:1,points:[t[s].points[x]]})}let m=[...b.entries()].reduce((x,y)=>y[1].num>x[1].num?y:x);r=[],r=m[1].points.map(x=>[x.x,x.y]),u=[],u=m[1].points.map(x=>new Z.Vector3(x.x,x.y,x.z)),l=m[0]}let h=he(u),g={points:u,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:d,obb:null,isDel:!1,obj_id:i,positionArr:[t[s].position]};if(g.obb=Pe(g.path,g.center,g.h,(g.maxz+g.minz)/2),g.obb==null)continue;let p=-1;for(let b=0;b<e.length;b++)if(e[b].type==d){p=b;break}if(p!=-1?e[p].array.push(g):e.push({type:d,array:[g]}),d=="floor"&&l!=-99999)if(n.has(l)){let b=n.get(l);b.num+=g.points.length,b.datas.push(g),n.set(l,b)}else n.set(l,{num:g.points.length,datas:[g]})}for(let s=0;s<e.length;s++){let r=e[s].array,i=[],a=[];for(let c=0;c<r.length;c++){if(r[c].obb==null||i.includes(c))continue;let d={...r[c],obb:r[c].obb.clone()};for(let u=c+1;u<r.length;u++){if(r[u].obb==null||i.includes(u))continue;if(d.obb.intersectsOBB(r[u].obb)){i.push(u);for(let p=0;p<r[u].points.length;p++)d.points.push(r[u].points[p]);let h=d.points.map(p=>[p.x,p.y]);d.path=Ve(h);let g=he(d.points);d.h=g.h,d.minz=g.minz,d.maxz=g.maxz,d.center={x:g.x,y:g.y,z:g.z},d.obb=Pe(d.path,d.center,d.h,(d.maxz+d.minz)/2),d.positionArr.push(...r[u].positionArr),u=c}}d.path.length>r[c].path.length&&(i.push(c),a.push(d))}let f=[];for(let c=0;c<r.length;c++)i.includes(c)||f.push(r[c]);f.push(...a),e[s].array=f}for(let s=0;s<e.length;s++){let r=e[s].type,i=e[s].array;for(let a=0;a<i.length;a++)r==="floor"&&i[a].points.length<500&&(i[a].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},ol=(t,e)=>{if(!t||!t.splitFloorProjectsResults||!t.trajectoryResults)return[];let n=t.splitFloorProjectsResults,o=t.trajectoryResults,s=new Map;for(let l=0;l<o.length;l++){let h=o[l].floor;s.has(h)?s.get(h).push(o[l]):s.set(h,[o[l]])}let r=new Map,i=[];for(let l=0;l<n.length;l++){let h=[],g=n[l];for(let p=0;p<g.length;p++){let b=g[p].points.map(T=>[T.x,T.y]),m=g[p].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 x=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[p].points.length;T++)M.push(new Z.Vector3(g[p].points[T].x,g[p].points[T].y,g[p].points[T].z));let P=he(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[p].obj_id,type:z,averagePz:0,obb:null,isDel:!1,obj_id:m,positionArr:[g[p].position],aabbBox:new Z.Box3().setFromPoints(M)};E.obb=Pe(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(l+1,h)}let a=[];for(let[l,h]of r){let g={floor:l,findTrajectoryResults:[],otherTrajectoryResults:[],lastTrajectoryResults:[]},p=s.get(l);if(!p){g.otherTrajectoryResults=h,a.push(g);continue}let b=[],m=[],x=[];for(let y=0;y<p.length;y++){let w=[];for(let M=0;M<p[y].points.length;M++){let P=[new Z.Vector3(p[y].points[M].x,p[y].points[M].y,p[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++)!x.includes(M)&&h[M].aabbBox.intersectsBox(w[P])&&(x.push(M),z.push(h[M]));z.length>0&&m.push(z)}for(let y=0;y<h.length;y++)x.includes(y)||b.push(h[y]);g.findTrajectoryResults=m,g.otherTrajectoryResults=b,a.push(g)}function f(l,h){let g=l,p=[],b=[];for(let x=0;x<l.length;x++){if(l[x].obb==null||p.includes(x))continue;let y={...l[x],obb:l[x].obb.clone()};for(let w=x+1;w<l.length;w++){if(l[w].obb==null||p.includes(w))continue;if(y.obb.intersectsOBB(l[w].obb)||h){p.push(w);for(let E=0;E<l[w].points.length;E++)y.points.push(l[w].points[E]);let M=y.points.map(E=>[E.x,E.y]);y.path=Ve(M);let P=he(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=Pe(y.path,y.center,y.h,(y.maxz+y.minz)/2),y.positionArr.push(...l[w].positionArr),w=x}}y.path.length>l[x].path.length&&(p.push(x),b.push(y))}let m=[];for(let x=0;x<l.length;x++)p.includes(x)||m.push(l[x]);return m.push(...b),l=m,l}for(let l=0;l<a.length;l++){for(let h=0;h<a[l].findTrajectoryResults.length;h++)a[l].findTrajectoryResults[h]=f(a[l].findTrajectoryResults[h],!0);a[l].otherTrajectoryResults=f(a[l].otherTrajectoryResults,!1)}for(let l=0;l<a.length;l++){for(let h=0;h<a[l].findTrajectoryResults.length;h++){for(let g=0;g<a[l].findTrajectoryResults[h].length;g++){let p=Cr(a[l].findTrajectoryResults[h][g].points,{binCount:100,minBinPoints:5,sideK:2.2,zK:2.2,minSideRange:.2,minZRange:.2,lowerZScale:.4,upperZScale:1.8}),b=Ir(p.keep,{radius:.1,minClusterSize:50,lowPercent:.45});if(b.keep.length==0){a[l].findTrajectoryResults[h][g].isDel=!0;continue}a[l].findTrajectoryResults[h][g].points=b.keep;let m=a[l].findTrajectoryResults[h][g].points.map(y=>[y.x,y.y]);a[l].findTrajectoryResults[h][g].path=Ve(m);let x=he(a[l].findTrajectoryResults[h][g].points);a[l].findTrajectoryResults[h][g].h=x.h,a[l].findTrajectoryResults[h][g].minz=x.minz,a[l].findTrajectoryResults[h][g].maxz=x.maxz,a[l].findTrajectoryResults[h][g].center={x:x.x,y:x.y,z:x.z},a[l].findTrajectoryResults[h][g].obb=Pe(a[l].findTrajectoryResults[h][g].path,a[l].findTrajectoryResults[h][g].center,a[l].findTrajectoryResults[h][g].h,(a[l].findTrajectoryResults[h][g].maxz+a[l].findTrajectoryResults[h][g].minz)/2)}a[l].findTrajectoryResults[h]=a[l].findTrajectoryResults[h].filter(g=>!g.isDel)}for(let h=0;h<a[l].otherTrajectoryResults.length;h++){let g=Cr(a[l].otherTrajectoryResults[h].points,{binCount:100,minBinPoints:5,sideK:2.2,zK:2.2,minSideRange:.2,minZRange:.2,lowerZScale:.4,upperZScale:1.8}),p=Ir(g.keep,{radius:.1,minClusterSize:50,lowPercent:.45});if(p.keep.length==0){a[l].otherTrajectoryResults[h].isDel=!0;continue}a[l].otherTrajectoryResults[h].points=p.keep;let b=a[l].otherTrajectoryResults[h].points.map(x=>[x.x,x.y]);a[l].otherTrajectoryResults[h].path=Ve(b);let m=he(a[l].otherTrajectoryResults[h].points);a[l].otherTrajectoryResults[h].h=m.h,a[l].otherTrajectoryResults[h].minz=m.minz,a[l].otherTrajectoryResults[h].maxz=m.maxz,a[l].otherTrajectoryResults[h].center={x:m.x,y:m.y,z:m.z},a[l].otherTrajectoryResults[h].obb=Pe(a[l].otherTrajectoryResults[h].path,a[l].otherTrajectoryResults[h].center,a[l].otherTrajectoryResults[h].h,(a[l].otherTrajectoryResults[h].maxz+a[l].otherTrajectoryResults[h].minz)/2)}a[l].otherTrajectoryResults.filter(h=>!h.isDel)}function c(l){for(let h=0;h<l.length;h++){let g=l[h].obb;for(let p=h+1;p<l.length;p++){let b=l[p].obb;if(!l[p].isDel){if(g.intersectsOBB(b)){let m=Ae(l[p].points,g),x=Ae(l[h].points,b),y=Yo(g,b);if(m>=.5&&(y==1||y==0)&&(l[p].isDel=!0),x>=.5&&y==-1){l[h].isDel=!0;break}}if(l[h].isDel)break}}}return l=l.filter(h=>!h.isDel),l}for(let l=0;l<a.length;l++){let h=[];for(let g=0;g<a[l].findTrajectoryResults.length;g++)h.push(...a[l].findTrajectoryResults[g]);h.push(...a[l].otherTrajectoryResults),a[l].lastTrajectoryResults=c(h)}function d(l){let h=[];if(l.length>0){let g=.3,p=.5,b=.5,m=.2;for(let x=0;x<l.length;x++){let y=l[x].obb.halfSize.clone().multiplyScalar(2),w=l[x].points,z=y.x,M=y.y,P=y.z;if(z>M&&([z,M]=[M,z]),z<p||M<g||P<b)continue;let E=Rs(l[x].obb);if(E.length!=8)continue;let T=new Z.Line3(E[0],E[1]),V=new Z.Line3(E[1],E[2]),W=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]),_=new Z.Line3(E[7],E[4]),C=[],I=[],H=[],A=[],L=[],O=[],N=[],k=[];for(let wt=0;wt<w.length;wt++){let te=T.closestPointToPoint(w[wt],!0,new Z.Vector3),me=V.closestPointToPoint(w[wt],!0,new Z.Vector3),Rt=W.closestPointToPoint(w[wt],!0,new Z.Vector3),ne=v.closestPointToPoint(w[wt],!0,new Z.Vector3),et=S.closestPointToPoint(w[wt],!0,new Z.Vector3),ge=R.closestPointToPoint(w[wt],!0,new Z.Vector3),ke=D.closestPointToPoint(w[wt],!0,new Z.Vector3),Le=_.closestPointToPoint(w[wt],!0,new Z.Vector3);te.distanceTo(w[wt])<m&&C.push(w[wt]),me.distanceTo(w[wt])<m&&I.push(w[wt]),Rt.distanceTo(w[wt])<m&&H.push(w[wt]),ne.distanceTo(w[wt])<m&&A.push(w[wt]),et.distanceTo(w[wt])<m&&L.push(w[wt]),ge.distanceTo(w[wt])<m&&O.push(w[wt]),ke.distanceTo(w[wt])<m&&N.push(w[wt]),Le.distanceTo(w[wt])<m&&k.push(w[wt])}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?C.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()):I.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 mt=E[4].distanceTo(E[5]),Tt=E[5].distanceTo(E[6]),nt=E[6].distanceTo(E[7]),zt=E[7].distanceTo(E[4]),Mt=new Z.Vector3,vt=new Z.Vector3,St=new Z.Vector3(q.x,q.y,E[4].z),Et=new Z.Vector3(X.x,X.y,E[4].z);(ct(E[4],St)||ct(E[4],Et))&&(ct(E[5],St)||ct(E[5],Et))?(Mt=E[6].clone(),vt=E[7].clone()):(ct(E[5],St)||ct(E[5],Et))&&(ct(E[6],St)||ct(E[6],Et))?(Mt=E[7].clone(),vt=E[4].clone()):(ct(E[6],St)||ct(E[6],Et))&&(ct(E[7],St)||ct(E[7],Et))?(Mt=E[4].clone(),vt=E[5].clone()):(ct(E[7],St)||ct(E[7],Et))&&(ct(E[4],St)||ct(E[4],Et))&&(Mt=E[5].clone(),vt=E[6].clone());let It=q.distanceTo(X),ot=Mt.distanceTo(vt),dt=new Z.Vector3().subVectors(new Z.Vector3(q.x,q.y,Mt.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 st=Math.sqrt(It*It+ot*ot),tt=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(st)))),le={stairStepHeight:P/tt,stairStepWidth:M/tt,staitWidth:z,stairLength:M,stairHeigth:P,stairStepNum:tt,stairBottomPt1:q,stairBottomPt2:X,stairTopPt1:Mt,stairTopPt2:vt,vecStepLength:Y,vecStepWidth:it,vecStepHeight:dt,path:l[x].path,obb:l[x].obb,maxz:l[x].maxz,points:l[x].points,rectPt1:new Z.Vector3(0,0,0),rectPt2:new Z.Vector3(0,0,0)};h.push(le)}}return h}let u=[];for(let l=0;l<a.length;l++)u.push(...d(a[l].lastTrajectoryResults));for(let l=0;l<u.length;l++){let h=u[l].stairTopPt1.clone(),g=u[l].stairTopPt2.clone(),p=u[l].stairBottomPt1.clone(),b=u[l].stairBottomPt2.clone(),m=h.clone(),x=g.clone(),y=p.clone(),w=b.clone();m.z=x.z=y.z=w.z=0;let z=$t(h,g,!0),M=$t(p,b,!0),P=$t(z,M),E=new Z.Vector3().subVectors(z,P).normalize(),T=new Z.Vector3().subVectors(M,P).normalize(),V=z.distanceTo(M),W=!1,v=!1;for(let S=0;S<u.length;S++){if(l==S)continue;let R=u[S].stairTopPt1.clone(),D=u[S].stairTopPt2.clone(),_=u[S].stairBottomPt1.clone(),C=u[S].stairBottomPt2.clone(),I=new Z.Vector3().subVectors(R,D).normalize(),H=new Z.Vector3().subVectors(_,C).normalize(),A=R.clone(),L=D.clone(),O=_.clone(),N=C.clone();A.z=L.z=O.z=N.z=0;let k=$t(R,D,!0),B=$t(_,C,!0),$=k.distanceTo(B),G=Zt(z,M,k,B),Q=!1;if(G&&G.isParallel&&R.z<=p.z&&p.z-R.z<.3){Q=!0,v=!0;let q=A.addScaledVector(I.clone().negate(),100),X=L.addScaledVector(I,100),Y=O.addScaledVector(H.clone().negate(),100),it=N.addScaledVector(H,100),mt=new Z.Line3(q,X),Tt=new Z.Line3(Y,it),nt=mt.closestPointToPoint(P,!0,new Z.Vector3),zt=Tt.closestPointToPoint(P,!0,new Z.Vector3),Mt=new Z.Vector3().subVectors(nt,P),vt=new Z.Vector3().subVectors(zt,P),St=Mt.length(),Et=vt.length();vt=vt.normalize(),Mt=Mt.normalize();let It=Qt(E,Mt,.1),ot=Qt(T,Mt,.1),dt=Qt(T,vt,.1),st=Qt(E,vt,.1);if(It&&It.sameDirection&&St>V/2){let tt=St-V/2;u[l].stairBottomPt1=u[l].stairBottomPt1.addScaledVector(T,tt),u[l].stairBottomPt2=u[l].stairBottomPt2.addScaledVector(T,tt)}else if(ot&&ot.sameDirection&&St>V/2){let tt=St-V/2;u[l].stairBottomPt1=u[l].stairBottomPt1.addScaledVector(T,tt),u[l].stairBottomPt2=u[l].stairBottomPt2.addScaledVector(T,tt)}if(dt&&dt.sameDirection&&Et>V/2){let tt=Et-V/2;u[l].stairTopPt1=u[l].stairTopPt1.addScaledVector(E,tt),u[l].stairTopPt2=u[l].stairTopPt2.addScaledVector(E,tt)}else if(st&&st.sameDirection&&Et>V/2){let tt=Et-V/2;u[l].stairTopPt1=u[l].stairTopPt1.addScaledVector(E,tt),u[l].stairTopPt2=u[l].stairTopPt2.addScaledVector(E,tt)}}else if(G&&G.isParallel&&h.z<_.z&&_.z-h.z<.2){Q=!0,W=!0;let q=A.addScaledVector(I.clone().negate(),100),X=L.addScaledVector(I,100),Y=O.addScaledVector(H.clone().negate(),100),it=N.addScaledVector(H,100),mt=new Z.Line3(q,X),Tt=new Z.Line3(Y,it),nt=mt.closestPointToPoint(P,!1,new Z.Vector3),zt=Tt.closestPointToPoint(P,!1,new Z.Vector3),Mt=new Z.Vector3().subVectors(nt,P),vt=new Z.Vector3().subVectors(zt,P),St=Mt.length(),Et=vt.length();vt=vt.normalize(),Mt=Mt.normalize();let It=Qt(E,Mt,.1),ot=Qt(T,Mt,.1),dt=Qt(T,vt,.1),st=Qt(E,vt,.1);if(It&&It.sameDirection&&St>V/2){let tt=St-V/2;u[l].stairBottomPt1=u[l].stairBottomPt1.addScaledVector(T,tt),u[l].stairBottomPt2=u[l].stairBottomPt2.addScaledVector(T,tt)}else if(ot&&ot.sameDirection&&St>V/2){let tt=St-V/2;u[l].stairBottomPt1=u[l].stairBottomPt1.addScaledVector(T,tt),u[l].stairBottomPt2=u[l].stairBottomPt2.addScaledVector(T,tt)}if(dt&&dt.sameDirection&&Et>V/2){let tt=Et-V/2;u[l].stairTopPt1=u[l].stairTopPt1.addScaledVector(E,tt),u[l].stairTopPt2=u[l].stairTopPt2.addScaledVector(E,tt)}else if(st&&st.sameDirection&&Et>V/2){let tt=Et-V/2;u[l].stairTopPt1=u[l].stairTopPt1.addScaledVector(E,tt),u[l].stairTopPt2=u[l].stairTopPt2.addScaledVector(E,tt)}u[l].stairTopPt1.z=u[l].stairTopPt2.z=_.z}if(Q&&(h=u[l].stairTopPt1.clone(),g=u[l].stairTopPt2.clone(),p=u[l].stairBottomPt1.clone(),b=u[l].stairBottomPt2.clone(),m=h.clone(),x=g.clone(),y=p.clone(),w=b.clone(),m.z=x.z=y.z=w.z=0,z=$t(h,g,!0),M=$t(p,b,!0),P=$t(z,M),E=new Z.Vector3().subVectors(z,P).normalize(),T=new Z.Vector3().subVectors(M,P).normalize(),V=z.distanceTo(M)),v&&W)break}if(v||W){let S=u[l].stairTopPt1.clone(),R=u[l].stairTopPt2.clone(),D=u[l].stairBottomPt1.clone(),_=u[l].stairBottomPt2.clone(),C=$t(S,R,!0),I=$t(D,_,!0),H=C.distanceTo(I),A=u[l].stairTopPt1.distanceTo(u[l].stairTopPt2),L=u[l].stairBottomPt1.distanceTo(u[l].stairBottomPt2),O=Math.sqrt(A*A+L*L),N=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(O))));u[l].stairStepNum=N,u[l].stairHeigth=u[l].stairTopPt1.z-u[l].stairBottomPt1.z,u[l].stairStepHeight=u[l].stairHeigth/u[l].stairStepNum,u[l].stairStepWidth=H/u[l].stairStepNum}}for(let l=0;l<u.length;l++){let h=u[l].stairTopPt1,g=u[l].stairTopPt2,p=u[l].stairBottomPt1.clone(),b=u[l].stairBottomPt2.clone(),m=new Z.Vector3(h.x,h.y,p.z),x=u[l].vecStepWidth;for(let y=0;y<u.length;y++){if(l==y)continue;let w=u[y].stairTopPt1,z=u[y].stairTopPt2,M=u[y].stairBottomPt1.clone(),P=u[y].stairBottomPt2.clone(),E=new Z.Vector3(w.x,w.y,M.z),T=u[y].vecStepWidth;if(Math.abs(h.z-M.z)<.3&&M.z>p.z&&u[l].obb.intersectsOBB(u[y].obb)){let V=ae(m,p,E,M);if(V&&V.angle>75){let W=M.distanceTo(h),v=M.distanceTo(g),S=P.distanceTo(h),R=P.distanceTo(g),D=h.clone(),_=D.clone().addScaledVector(x,u[y].staitWidth),C=new Z.Vector3().subVectors(g,h).normalize(),I=h.distanceTo(g),H=D.clone().addScaledVector(C,I),A=_.clone().addScaledVector(C,I),L=D.clone().addScaledVector(C,u[y].stairLength),O=_.clone().addScaledVector(C,u[y].stairLength),N=W;(N>v||N>R)&&(N=v,D=g.clone(),_=D.clone().addScaledVector(x,u[y].staitWidth),C=new Z.Vector3().subVectors(h,g).normalize(),I=h.distanceTo(g),H=D.clone().addScaledVector(C,I),A=_.clone().addScaledVector(C,I),L=D.clone().addScaledVector(C,u[y].stairLength),O=_.clone().addScaledVector(C,u[y].stairLength));let k=new Z.Vector3().subVectors(L,H).normalize(),B=L.distanceTo(H);L.z=O.z=u[y].maxz,u[y].stairBottomPt1=H,u[y].stairBottomPt2=A,u[y].stairTopPt1=L,u[y].stairTopPt2=O,u[y].rectPt1=D,u[y].rectPt2=_;let $=H.distanceTo(A),G=L.distanceTo(O),Q=Math.sqrt(B*B+u[y].stairHeigth*u[y].stairHeigth),q=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(Q))));u[y].stairStepNum=q,u[y].stairHeigth=L.z-H.z,u[y].stairStepHeight=u[y].stairHeigth/u[y].stairStepNum,u[y].stairStepWidth=B/u[y].stairStepNum,u[y].vecStepLength=C.clone().negate(),u[y].vecStepWidth=k;break}}}}return sl(u,i,e),u},sl=(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(),a=t[r].stairBottomPt2.clone(),f=t[r].stairBottomPt1.clone(),c=t[r].stairBottomPt2.clone(),d=new Z.Vector3().subVectors(a,i).normalize();i=i.addScaledVector(d,.05),a=a.addScaledVector(d.clone().negate(),.05);let u=[],l=[];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 p=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=he(g),m=Pe(p,{x:b.x,y:b.y,z:b.z},b.h,(b.maxz+b.minz)/2),x=[],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&&x.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=he(x).maxz),y){let z=$t(g[1],g[2]);z.z+=t[r].stairStepHeight,u.push(z)}g=[],g=[a,c],g.push(g[1].clone().addScaledVector(t[r].vecStepWidth,t[r].stairStepWidth)),g.push(g[0].clone().addScaledVector(t[r].vecStepWidth,t[r].stairStepWidth)),p=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=he(g),m=Pe(p,{x:b.x,y:b.y,z:b.z},b.h,(b.maxz+b.minz)/2),x=[],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&&x.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=he(x).maxz),y){let z=$t(g[1],g[2]);z.z+=t[r].stairStepHeight,l.push(z)}i=i.addScaledVector(t[r].vecStepWidth,t[r].stairStepWidth),i=i.addScaledVector(t[r].vecStepHeight,t[r].stairStepHeight),a=a.addScaledVector(t[r].vecStepWidth,t[r].stairStepWidth),a=a.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),c=c.addScaledVector(t[r].vecStepWidth,t[r].stairStepWidth),c=c.addScaledVector(t[r].vecStepHeight,t[r].stairStepHeight)}u.length>t[r].stairStepNum-3&&(t[r].stairBottom1BalconyRailing=u),l.length>t[r].stairStepNum-3&&(t[r].stairBottom2BalconyRailing=l),t[r].balconyRailingHeight=s}};function Cr(t,e={}){let{binCount:n=80,minBinPoints:o=5,sideK:s=3,zK:r=3,minSideRange:i=.2,minZRange:a=.2,maxSearchBins:f=3,lowerZScale:c=1,upperZScale:d=1}=e;if(!t||t.length===0)return[];let u=t.map((H,A)=>({index:A,x:H.x,y:H.y,z:H.z,raw:H})),l=0,h=0;for(let H of u)l+=H.x,h+=H.y;l/=u.length,h/=u.length;let g=0,p=0,b=0;for(let H of u){let A=H.x-l,L=H.y-h;g+=A*A,p+=A*L,b+=L*L}g/=u.length,p/=u.length,b/=u.length;let m=g+b,x=Math.sqrt((g-b)*(g-b)+4*p*p),y=(m+x)/2,w,z;Math.abs(p)>1e-8?(w=y-b,z=p):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,W=u.map(H=>{let A=H.x-l,L=H.y-h,O=A*w+L*z,N=A*P+L*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 W){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 L=A.map(q=>q.side).sort((q,X)=>q-X),O=A.map(q=>q.z).sort((q,X)=>q-X),N=ao(L),k=ao(O),B=ao(L.map(q=>Math.abs(q-N)).sort((q,X)=>q-X)),$=ao(O.map(q=>Math.abs(q-k)).sort((q,X)=>q-X)),G=Math.max(i,B*1.4826*s),Q=Math.max(a,$*1.4826*r);D.set(H,{sideMedian:N,zMedian:k,sideRange:G,zRange:Q})}function _(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 C=[],I=[];for(let H of W){let A=Math.floor((H.t-T)/S);A<0&&(A=0),A>=n&&(A=n-1);let L=_(A);if(!L){I.push(H.raw);continue}let O=Math.abs(H.side-L.sideMedian)<=L.sideRange,N=L.zMedian-L.zRange*c,k=L.zMedian+L.zRange*d,B=H.z>=N&&H.z<=k;O&&B?C.push(H.raw):I.push(H.raw)}return{keep:C,removed:I,debug:{meanX:l,meanY:h,dirX:w,dirY:z,sideX:P,sideY:E,minT:T,maxT:V,binSize:S,stats:D}}}function ao(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 rl(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),a=Math.floor(s.z/e),f=`${r},${i},${a}`;n.has(f)||n.set(f,[]),n.get(f).push(o)}return n}function il(t,e,n,o,s){let r=t[n],i=Math.floor(r.x/o),a=Math.floor(r.y/o),f=Math.floor(r.z/o),c=[];for(let d=-1;d<=1;d++)for(let u=-1;u<=1;u++)for(let l=-1;l<=1;l++){let h=`${i+d},${a+u},${f+l}`,g=e.get(h);if(g)for(let p of g){if(p===n)continue;let b=t[p],m=r.x-b.x,x=r.y-b.y,y=r.z-b.z;m*m+x*x+y*y<=s&&c.push(p)}}return c}function Ir(t,e={}){let{radius:n=.35,minClusterSize:o=20,lowPercent:s=.35}=e,r=al(t,{radius:n}),i=t.map(d=>d.z).sort((d,u)=>d-u),a=i[Math.floor(i.length*s)],f=[],c=[];for(let d of r.clusters){let u=d.map(g=>r.points[g]),l=u.reduce((g,p)=>g+p.z,0)/u.length;u.length<o&&l<=a?c.push(...u.map(g=>g.raw)):f.push(...u.map(g=>g.raw))}return{keep:f,removed:c}}function al(t,e={}){let{radius:n=.35}=e,o=t.map((f,c)=>({index:c,x:f.x,y:f.y,z:f.z,raw:f})),s=rl(o,n),r=n*n,i=new Array(o.length).fill(!1),a=[];for(let f=0;f<o.length;f++){if(i[f])continue;let c=[],d=[f];for(i[f]=!0;d.length>0;){let u=d.shift();c.push(u);let l=il(o,s,u,n,r);for(let h of l)i[h]||(i[h]=!0,d.push(h))}a.push(c)}return{points:o,clusters:a}}function ll(t,e,n=1e-6){let o=cl(e);for(let s of o)if(!ul(t,s,n))return!1;return!0}function cl(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),a=[];for(let f of[-1,1])for(let c of[-1,1])for(let d of[-1,1]){let u=e.clone().addScaledVector(s,f).addScaledVector(r,c).addScaledVector(i,d);a.push(u)}return a}function ul(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]),a=new Z.Vector3(s[3],s[4],s[5]),f=new Z.Vector3(s[6],s[7],s[8]),c=o.dot(i),d=o.dot(a),u=o.dot(f);return Math.abs(c)<=r.x+n&&Math.abs(d)<=r.y+n&&Math.abs(u)<=r.z+n}function fl(t,e,n,o){return 1+(t[e][0]===0||t[n][0]===0||t[o][0]===0?1:0)}function dl(t,e,n,o,s,r){let i=Math.hypot(n-s,o-r),a=Math.hypot(t-s,e-r),f=Math.hypot(t-n,e-o),c=Math.abs((n-t)*(r-e)-(s-t)*(o-e))/2;return c===0?1/0:i*a*f/(4*c)}function hl(t){if(!t||t.length<3)return[];let e=new Set,n=[];for(let g of t){let p=`${g[0]}_${g[1]}`;e.has(p)||(e.add(p),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,p)=>g<p?`${g}_${p}`:`${p}_${g}`;for(let g=0;g<s.length;g+=3){let p=s[g],b=s[g+1],m=s[g+2],[x,y]=n[p],[w,z]=n[b],[M,P]=n[m],E=dl(x,y,w,z,M,P),T=fl(n,p,b,m);if(E<=1/T)for(let[V,W]of[[p,b],[b,m],[m,p]]){let v=i(V,W);r.set(v,(r.get(v)||0)+1)}}let a=[];for(let[g,p]of r)p===1&&a.push(g.split("_").map(Number));if(!a.length)return[];let f=new Map;for(let[g,p]of a)(f.get(g)||f.set(g,[]).get(g)).push(p),(f.get(p)||f.set(p,[]).get(p)).push(g);let c=a[0][0],d=[],u=new Set,l=c,h=-1;do{d.push(n[l]),u.add(l);let g=f.get(l)||[],p=g.find(b=>b!==h&&!u.has(b));if(p===void 0&&(p=g.find(b=>b!==h)),p===void 0)break;h=l,l=p}while(l!==c&&d.length<=a.length+1);return d.length>0&&d.push(d[0]),d}function je(t,e){let n=t.x-e.x,o=t.y-e.y;return Math.sqrt(n*n+o*o)}function Xe(t){let e=0,n=0,o=0;for(let s=0;s<4;s++){let r=t[s],i=t[(s+1)%4],a=i.x-r.x,f=i.y-r.y,c=Math.sqrt(a*a+f*f);c>e&&(e=c,n=a/c,o=f/c)}return{longSide:e,dirX:n,dirY:o}}function Ge(t,e,n){let s=[];for(let r of t){let i=(r.start.x+r.end.x)/2,a=(r.start.y+r.end.y)/2,f=i-e,c=a-n;f*f+c*c<=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,a)=>i-a),r[Math.floor(r.length/2)]):-1/0}return s.sort((r,i)=>r-i),s[Math.floor(s.length/2)]}function Ce(t,e,n,o,s,r){let i=s-n,a=r-o,f=i*i+a*a;if(f<1e-12)return{dist:Math.sqrt((t-n)**2+(e-o)**2),t:0};let c=t-n,d=e-o,u=(c*i+d*a)/f,l=n+u*i,h=o+u*a;return{dist:Math.sqrt((t-l)**2+(e-h)**2),t:u}}function Uo(t,e,n){let o=0;for(let s=0;s<4;s++){let r=n[s],i=n[(s+1)%4],a=(i.x-r.x)*(e-r.y)-(i.y-r.y)*(t-r.x);if(Math.abs(a)<1e-12)continue;let f=a>0?1:-1;if(o===0)o=f;else if(o!==f)return!1}return!0}function _r(t,e,n,o,s,r,i,a){let f=n-t,c=o-e,d=i-s,u=a-r,l=f*u-c*d;if(Math.abs(l)<1e-12)return null;let h=((s-t)*u-(r-e)*d)/l,g=((s-t)*c-(r-e)*f)/l;return h<-1e-12||h>1+1e-12||g<-1e-12||g>1+1e-12?null:Math.max(0,Math.min(1,h))}function Wr(t,e,n,o,s){let r=[];Uo(t,e,s)&&r.push(0),Uo(n,o,s)&&r.push(1);for(let f=0;f<4;f++){let c=s[f],d=s[(f+1)%4],u=_r(t,e,n,o,c.x,c.y,d.x,d.y);u!==null&&r.push(u)}if(r.length<2)return 0;r.sort((f,c)=>f-c);let i=Math.sqrt((n-t)**2+(o-e)**2),a=0;for(let f=0;f<r.length-1;f++){let c=r[f],d=r[f+1],u=(c+d)/2,l=t+u*(n-t),h=e+u*(o-e);Uo(l,h,s)&&(a+=(d-c)*i)}return a}function Hr(t,e,n=1e-6){let o=[],s=t.start.x,r=t.start.y,i=t.end.x,a=t.end.y;for(let d of e){if(d===t)continue;let u=_r(s,r,i,a,d.start.x,d.start.y,d.end.x,d.end.y);u!==null&&u>n&&u<1-n&&o.push(u)}o.sort((d,u)=>d-u);let f=[],c=-1/0;for(let d of o)d-c>n&&(f.push(d),c=d);return f}function Ar(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),a=t.start.y+r*(t.end.y-t.start.y),f=t.start.z+r*(t.end.z-t.start.z),c=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)},d={...t,start:c,end:{x:i,y:a,z:f},length:t.length*(r-o)};d.drawWindow=void 0,d.isWindow=!1,n.push(d),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 ml(t,e,n=.15){let o=0,s=0;for(let i of e)i!==t&&((je(t.start,i.start)<=n||je(t.start,i.end)<=n)&&o++,(je(t.end,i.start)<=n||je(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 gl(t,e){let n=[],{start:o,end:s}=t;for(let a of e){let{dist:f}=Ce(a.x,a.y,o.x,o.y,s.x,s.y);n.push(f)}let r=n.reduce((a,f)=>a+f,0)/n.length,i=n.reduce((a,f)=>a+(f-r)**2,0)/n.length;return i<.01?3:i<.05?2:i<.1?1:0}function pl(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,a=o/r,f=[[],[]];for(let u=0;u<2;u++){let l=u===0?t.start:t.end;for(let h of e){if(h===t)continue;let g=je(l,h.start),p=je(l,h.end),b=null;if(g<=n?b=h.end:p<=n&&(b=h.start),!b)continue;let m=h.end.x-h.start.x,x=h.end.y-h.start.y,y=Math.sqrt(m*m+x*x);if(y<1e-12||Math.abs(o*m+s*x)/(r*y)>=.342)continue;let z=(b.x-l.x)*i+(b.y-l.y)*a;f[u].push(z>0?1:-1)}}if(f[0].length===0||f[1].length===0)return 0;let c=[...f[0],...f[1]];return c.every(u=>u===c[0])?2:1}function kr(t,e,n){let o=ml(t,n),s=gl(t,e),r=pl(t,n);return{score:o.score*3+s*2+r*2,details:{conn:o.score,variance:s,sameSide:r}}}function xl(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 yl(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 bl(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 wl(t,e,n,o,s){let r=[];for(let c of t){let d=c.seg,u=(d.start.x-e.start.x)*n+(d.start.y-e.start.y)*o,l=(d.end.x-e.start.x)*n+(d.end.y-e.start.y)*o;u<=l?r.push({l:u,r:l,idx:c.idx,startPt:d.start,endPt:d.end}):r.push({l,r:u,idx:c.idx,startPt:d.end,endPt:d.start})}r.sort((c,d)=>c.l-d.l);let i=[],a=.2,f=.5;for(let{l:c,r:d,idx:u,startPt:l,endPt:h}of r){if(i.length===0){i.push({l:c,r:d,srcIdxs:[u],startPt:l,endPt:h});continue}let g=i[i.length-1];if(c<=g.r+s){let p=Math.min(g.r,d)-Math.max(g.l,c),b=Math.hypot(g.endPt.x-l.x,g.endPt.y-l.y);p>=f||b<=a?(c<g.l&&(g.l=c,g.startPt=l),d>g.r&&(g.r=d,g.endPt=h),g.srcIdxs.includes(u)||g.srcIdxs.push(u)):i.push({l:c,r:d,srcIdxs:[u],startPt:l,endPt:h})}else i.push({l:c,r:d,srcIdxs:[u],startPt:l,endPt:h})}return i}function zl(t,e,n,o,s,r,i){let a=Math.hypot(n.x-e.x,n.y-e.y),f={...t};return f.start={...e},f.end={...n},f.length=a,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 Ml(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 a=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,c=Math.abs(r.end.x-i.end.x)<.001&&Math.abs(r.end.y-i.end.y)<.001,d=Math.abs(r.start.x-i.start.x)<.001&&Math.abs(r.start.y-i.start.y)<.001;if(!(a||f||c||d)||r.direction.x*i.direction.x+r.direction.y*i.direction.y<.98)continue;let l=r.start,h=r.end;a?h=i.end:f?l=i.start:c?h=i.start:d&&(l=i.end);let g=Math.hypot(h.x-l.x,h.y-l.y),p={...r};p.start=l,p.end=h,p.length=g,p.direction={x:(h.x-l.x)/g,y:(h.y-l.y)/g,z:0},r.rooftopPz!==void 0&&i.rooftopPz!==void 0?p.rooftopPz=Math.max(r.rooftopPz,i.rooftopPz):p.rooftopPz=r.rooftopPz!==void 0?r.rooftopPz:i.rooftopPz,p.buildRosource=r.buildRosource||i.buildRosource,p.isRebuild=!1,p.doorAndBeamData||(p.doorAndBeamData=[]),p.insetionArr||(p.insetionArr=[]),t[o]=p,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 Ze(t,e=5,n=.05){if(t.length<=1)return{segments:t,sourceMap:t.map((f,c)=>[c])};let o=t.map((f,c)=>({seg:f,angle:xl(f),idx:c}));o.sort((f,c)=>f.angle-c.angle);let s=yl(o,e),r=[],i=[],a=[];for(let f of s){let c=f[0].seg;for(let m of f)m.seg.length>c.length&&(c=m.seg);let d=c.end.x-c.start.x,u=c.end.y-c.start.y,l=Math.sqrt(d*d+u*u);if(l<1e-12)continue;let h=-u/l,g=d/l,p=f.map(m=>{let x=m.seg.start.x-c.start.x,y=m.seg.start.y-c.start.y;return{seg:m.seg,offset:Math.abs(x*h+y*g),idx:m.idx}});p.sort((m,x)=>m.offset-x.offset);let b=bl(p);for(let m of b){let x=m[0].seg;for(let S of m)S.seg.length>x.length&&(x=S.seg);let y=x.end.x-x.start.x,w=x.end.y-x.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}));a.push({values:[...V],segments:S})}let W=[...new Set(m.map(S=>String(S.seg.buildRosource)))],v=wl(m,x,M,P,n);for(let{l:S,r:R,srcIdxs:D,startPt:_,endPt:C}of v){if(R-S<.01)continue;let I=zl(x,_,C,M,P,T,x.buildRosource);r.push(I),i.push(D)}}}return{...Ml(r,i),debugRPZGroups:a}}function El(t){return{minLengthRatio:.95,maxDistance:.5,angleThreshold:45,projectionMargin:.1,printOnly:!0,minEmbedRatioThreshold:.3,noWallSurroundDistance:.3,minEmbedRatio:.05,...t}}function Pl(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 Sl(t,e,n,o,s,r,i,a,f){if(!["1527725434500","1527725386500","1527726772000","1527725058500"].some(u=>t.includes(u)))return;e.map(u=>{let{start:l,end:h}=u,g=Ce(n,o,l.x,l.y,h.x,h.y),p=s.map(z=>{let M=Ce(z.x,z.y,l.x,l.y,h.x,h.y);return`t=${M.t.toFixed(3)},d=${M.dist.toFixed(3)}`}),b=h.x-l.x,m=h.y-l.y,x=Math.sqrt(b*b+m*m)||1,y=Math.abs(i*(b/x)+a*(m/x)),w=Math.acos(Math.min(y,1))*(180/Math.PI);return{seg:u,lineDist:g.dist,t:g.t,pts:p,angle:w,length:u.length}}).sort((u,l)=>u.lineDist-l.lineDist)}function Tl(t,e,n,o,s,r,i){let a=[{margin:r.projectionMargin,maxDist:r.maxDistance,label:"\u4E25\u683C"},{margin:.4,maxDist:.65,label:"\u5BBD\u677E"}],f=[];for(let c of a){if(f.length>0)break;for(let d of t){let u=!1,l=!1,h=!1,g=e*r.minLengthRatio;if(d.length<g){continue}u=!0;let{start:p,end:b}=d,m=!1,x=1/0;for(let v of s){let{dist:S,t:R}=Ce(v.x,v.y,p.x,p.y,b.x,b.y);R>=-c.margin&&R<=1+c.margin&&S<=c.maxDist&&(m=!0,x=Math.min(x,S))}if(!m){`${c.maxDist}${(-c.margin).toFixed(1)}${(1+c.margin).toFixed(1)}`;continue}l=!0;let y=Ce(s[0].x,s[0].y,p.x,p.y,b.x,b.y);if(y.t<0||y.t>1){`${y.t.toFixed(3)}`;continue}let w=Math.sqrt((b.x-p.x)**2+(b.y-p.y)**2);if(w<1e-12)continue;let z=(b.x-p.x)/w,M=(b.y-p.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=Wr(p.x,p.y,b.x,b.y,T),W=e>0?V/e:0;f.push({seg:d,minDist:x,embedRatio:W,ratio:d.length/e,score:0,details:{conn:0,variance:0,sameSide:0}})}}return f}function Rl(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}=kr(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 Dl(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),a=s/i,f=r/i,c=e.map(P=>{let E=P.x-t.start.x,T=P.y-t.start.y;return(E*a+T*f)/i}),d=Math.min(...c),u=Math.max(...c),l=(u-d)*i,h=(d+u)/2,g=t.start.x+h*s,p=t.start.y+h*r,b=n.box.min.z,m=n.box.max.z,x=Math.abs(m-b),y=Ge(o,t.start.x,t.start.y),w=Math.max(0,b-y),z=d<=0&&u>=1,M=t.start.z+h*(t.end.z-t.start.z);return{p:{x:g,y:p,z:M},width:l,full:z,height:x,groundClearance:w}}function Ko(t,e,n){let o=e.map(d=>n[d]),s=[],r=[],i=[],a=[],f,c;for(let d of o){if(d.originalPoints?.length)for(let u of d.originalPoints)s.push(u);if(d.doorAndBeamData?.length)for(let u of d.doorAndBeamData)r.push(u);if(d.insetionArr?.length)for(let u of d.insetionArr)i.push(u);if(d.drawWindow?.length)for(let u of d.drawWindow)a.push(u);d.boxData&&!f&&(f=d.boxData),d.rooftopPz!==void 0&&(c===void 0||d.rooftopPz>c)&&(c=d.rooftopPz)}s.length&&(t.originalPoints=s),r.length&&(t.doorAndBeamData=r),i.length&&(t.insetionArr=i),a.length&&(t.drawWindow=a),f&&(t.boxData=f),c!==void 0&&(t.rooftopPz=c)}function vn(t,e,n=10,o=.2,s=.2){let r=[];if(!t.drawWindow)return r;let i=t.drawWindow.p,a=t.wallSegment,f=a.end.x-a.start.x,c=a.end.y-a.start.y,d=Math.sqrt(f*f+c*c)||1,u=f/d,l=c/d,h=i.x-a.start.x,g=i.y-a.start.y,p=(h*u+g*l)/d;for(let b of e){if(b===a)continue;let m=b.end.x-b.start.x,x=b.end.y-b.start.y,y=Math.sqrt(m*m+x*x)||1,w=m/y,z=x/y,M=Math.abs(u*w+l*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 W=V.x-a.start.x,v=V.y-a.start.y,S=(W*u+v*l)/d,R=a.start.x+S*d*u,D=a.start.y+S*d*l;if(Math.sqrt((V.x-R)**2+(V.y-D)**2)>s)continue;let C=Math.abs((S-p)*d);if(C<=o){r.push({seg:b,distAlongWall:C,angle:E,endPoint:V});break}}}return r}function Vn(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,a=((e.x-n.x)*s+(e.y-n.y)*r)/(i*i),f=Math.max(0,Math.min(1,a)),c={x:n.x+f*s,y:n.y+f*r,z:n.z+(o.z-n.z)*f||0};function d(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||u(w[w.length-1],c)>1e-6)&&w.push({...c}),(z.length===0||u(z[0],c)>1e-6)&&z.unshift({...c}),[w,z]}function u(y,w){return Math.sqrt((y.x-w.x)**2+(y.y-w.y)**2)}let[l,h]=d(t.originalPoints),g=Math.max(f*i,1e-6),p=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:{...c},length:g,direction:{...b},originalPoints:l.length?l:void 0},x={...t,start:{...c},end:{...o},length:p,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,x.drawWindow=w.length?w:void 0}else m.drawWindow=void 0,x.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 W of w)W.x<z&&(z=W.x),W.y<M&&(M=W.y),W.z!==void 0&&W.z<P&&(P=W.z),W.x>E&&(E=W.x),W.y>T&&(T=W.y),W.z!==void 0&&W.z>V&&(V=W.z);return{isBox3:!0,min:{x:z,y:M,z:P},max:{x:E,y:T,z:V}}};m.boxData=y(l),x.boxData=y(h)}return[m,x]}function Cn(t,e,n,o){let s=El(n),r=[],{segments:i,sourceMap:a}=o??Ze(e),f=i;for(let c of t){let d=c.coordinatesByArea?.coordinates;if(!d||d.length<4)continue;let u=d.slice(0,4),l=u.reduce((V,W)=>V+W.x,0)/4,h=u.reduce((V,W)=>V+W.y,0)/4,{longSide:g,dirX:p,dirY:b}=Xe(u);if(g<.01)continue;let m=u.reduce((V,W)=>V+W.z,0)/4,x=Ge(e,l,h);if(m<x-.3)continue;let y=Pl(u,l,h);Sl(c.name,f,l,h,y,g,p,b,s);let w=Tl(f,g,p,b,y,s,c.name);if(w.length>1&&s.minEmbedRatioThreshold>0){let V=Math.max(...w.map(W=>W.embedRatio));if(V>0){let W=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(W=>W.embedRatio>=s.minEmbedRatio)}w=Rl(w,y,e,c.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,W=u.map(I=>I.x),v=u.map(I=>I.y),S=Math.min(...W)-V,R=Math.max(...W)+V,D=Math.min(...v)-V,_=Math.max(...v)+V,C=!1;for(let I of f){let H=Math.min(I.start.x,I.end.x),A=Math.max(I.start.x,I.end.x),L=Math.min(I.start.y,I.end.y),O=Math.max(I.start.y,I.end.y);if(!(A<S||H>R)&&!(O<D||L>_)){C=!0;break}}C||(z=null)}let T;if(z&&(T=Dl(z,u,c,i),!s.printOnly)){let V=z;V.drawWindow||(V.drawWindow=[]),V.drawWindow.push(T),V.isWindow=!0}if(z){let V={windowName:c.name,windowCategory:c.category,windowCenter:c.center,wallSegment:z,distance:M,wallLengthRatio:P,drawWindow:T};r.push(V)}}for(let c of r){let d=c.wallSegment,u=i.indexOf(d);if(u===-1)continue;let l=a[u];!l||l.length<=1||Ko(d,l,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=Ze(t);r=b.segments,i=b.sourceMap}let a=Cn(s,t,o,{segments:r,sourceMap:i}),f=new Set;for(let b of a){let m=r.indexOf(b.wallSegment);m>=0&&f.add(m)}let c=[],d=new Set;for(let b of f){let m=i[b];if(m){Ko(r[b],m,t);for(let x of m)d.add(x)}c.push(r[b])}for(let b=0;b<t.length;b++)d.has(b)||c.push(t[b]);let u=new Set(a.map(b=>b.windowName));for(let b of e)b&&b.category==="window"&&!b.isBayWindowObj&&(u.has(b.name)?delete b.AbnormalWindow:b.AbnormalWindow=!0);let l=new Map;for(let b of e)b&&b.name&&l.set(b.name,b);let h=new Map;for(let b of a){let m=b.wallSegment;h.has(m)||h.set(m,[]),h.get(m).push(b)}let g=new Map,p=c;for(let[b,m]of h){if(!b.drawWindow||!b.drawWindow.length||g.has(b))continue;let x=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)/(x*x),_=R/x;z.push({left:D-_,right:D+_,match:S})}if(z.length===0)continue;let M=Hr(b,p),P=1e-6,E=new Set,T=!1;for(let S of z){let R=!1,D=!1,_=null;for(let I of M)I<S.left-P&&((_===null||I>_)&&(_=I),R=!0);let C=null;for(let I of M)I>S.right+P&&((C===null||I<C)&&(C=I),D=!0);_!==null&&(E.add(_),T=!0),C!==null&&(E.add(C),T=!0)}if(!T)continue;let V=!1,W=null,v=null;for(let S of z){let R=S.match;if(!R.drawWindow||R.drawWindow.width<=1)continue;let D=l.get(R.windowName);if(!D||!D.positionArr||!D.positionArr.length)continue;let _=vn(R,r);if(_.length<=1)continue;let C=D.positionArr[0],I=R.drawWindow.p,H=C.x-I.x,A=C.y-I.y,L=Math.sqrt(H*H+A*A);if(L<.001)continue;let O=H/L,N=A/L,k=_.filter(B=>{let $=(B.seg.start.x+B.seg.end.x)/2,G=(B.seg.start.y+B.seg.end.y)/2,Q=$-I.x,q=G-I.y;return Q*O+q*N>0});if(k.length){V=!0,W=k[0].endPoint,v=R;break}}if(V&&W&&v){let[S,R]=Vn(b,W);g.set(b,[S,R]);let D=((v.drawWindow.p.x-b.start.x)*y+(v.drawWindow.p.y-b.start.y)*w)/(x*x),_=((W.x-b.start.x)*y+(W.y-b.start.y)*w)/(x*x);D<=_?v.wallSegment=S:v.wallSegment=R}else{let S=Array.from(E).sort((D,_)=>D-_),R=Ar(b,S);for(let D of z){let _=(D.left+D.right)/2,C=0;for(let I of R){let H=I.length/x;if(_>=C-P&&_<=C+H+P){let A=D.match.drawWindow;A&&(I.drawWindow||(I.drawWindow=[]),I.drawWindow.push(A),I.isWindow=!0),D.match.wallSegment=I;break}C+=H}}g.set(b,R)}}if(g.size>0){let b=[];for(let m of c)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:a}}for(let b of c)b.isWindow=!!(b.drawWindow&&b.drawWindow.length>0);return{segments:c,matches:a}}function Ye(t,e){let n=t.x-e.x,o=t.y-e.y;return Math.sqrt(n*n+o*o)}function lo(t){let e=0,n=1/0,o=0,s=0;for(let r=0;r<4;r++){let i=t[r],a=t[(r+1)%4],f=a.x-i.x,c=a.y-i.y,d=Math.sqrt(f*f+c*c);d>e&&(e=d,o=f/d,s=c/d),d<n&&(n=d)}return{longSide:e,shortSide:n===1/0?e:n,dirX:o,dirY:s}}function Ue(t,e,n){let s=[];for(let r of t){let i=(r.start.x+r.end.x)/2,a=(r.start.y+r.end.y)/2,f=i-e,c=a-n;f*f+c*c<=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,a)=>i-a),r[Math.floor(r.length/2)]):-1/0}return s.sort((r,i)=>r-i),s[Math.floor(s.length/2)]}function jt(t,e,n,o,s,r){let i=s-n,a=r-o,f=i*i+a*a;if(f<1e-12)return{dist:Math.sqrt((t-n)**2+(e-o)**2),t:0};let c=t-n,d=e-o,u=(c*i+d*a)/f,l=n+u*i,h=o+u*a;return{dist:Math.sqrt((t-l)**2+(e-h)**2),t:u}}function Jo(t,e,n){let o=0;for(let s=0;s<4;s++){let r=n[s],i=n[(s+1)%4],a=(i.x-r.x)*(e-r.y)-(i.y-r.y)*(t-r.x);if(Math.abs(a)<1e-12)continue;let f=a>0?1:-1;if(o===0)o=f;else if(o!==f)return!1}return!0}function vl(t,e,n,o,s,r,i,a){let f=n-t,c=o-e,d=i-s,u=a-r,l=f*u-c*d;if(Math.abs(l)<1e-12)return null;let h=((s-t)*u-(r-e)*d)/l,g=((s-t)*c-(r-e)*f)/l;return h<-1e-12||h>1+1e-12||g<-1e-12||g>1+1e-12?null:Math.max(0,Math.min(1,h))}function Br(t,e,n,o,s){let r=[];Jo(t,e,s)&&r.push(0),Jo(n,o,s)&&r.push(1);for(let f=0;f<4;f++){let c=s[f],d=s[(f+1)%4],u=vl(t,e,n,o,c.x,c.y,d.x,d.y);u!==null&&r.push(u)}if(r.length<2)return 0;r.sort((f,c)=>f-c);let i=Math.sqrt((n-t)**2+(o-e)**2),a=0;for(let f=0;f<r.length-1;f++){let c=r[f],d=r[f+1],u=(c+d)/2,l=t+u*(n-t),h=e+u*(o-e);Jo(l,h,s)&&(a+=(d-c)*i)}return a}function Or(t){if(!t||t.length<4)return[];let e=[...t].sort((i,a)=>i.z-a.z),n=e.slice(0,2),o=e.slice(2,4),s=[],r=new Set;for(let i of n){let a=-1,f=1/0;for(let c=0;c<o.length;c++){if(r.has(c))continue;let d=o[c].x-i.x,u=o[c].y-i.y,l=Math.sqrt(d*d+u*u);l<f&&(f=l,a=c)}if(a>=0){r.add(a);let c=o[a];s.push({bottom:i,top:c,midX:(i.x+c.x)/2,midY:(i.y+c.y)/2,height:Math.abs(c.z-i.z)})}}return s}function Lr(t,e,n){return jt(t.midX,t.midY,e.x,e.y,n.x,n.y)}function Fr(t,e,n,o=.08){if(!t||t.length<2)return null;let s=Lr(t[0],e,n),r=Lr(t[1],e,n);if(s.dist<=o&&r.dist<=o){let i=s.dist<=r.dist?0:1,a=1-i;return{hingeEdge:t[i],otherEdge:t[a],hingeDist:i===0?s.dist:r.dist,otherDist:a===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,a=1-i;return{hingeEdge:t[i],otherEdge:t[a],hingeDist:i===0?s.dist:r.dist,otherDist:a===0?s.dist:r.dist,isClosed:!1,hingeT:i===0?s.t:r.t}}return null}function Nr(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 ts(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,a=0;return t.centerDir?(i=t.centerDir.x,a=t.centerDir.y):(i=-s/r,a=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:a}}function qr(t,e,n,o=.08){let s=ts(t);if(!s)return null;let r=jt(s.p1.x,s.p1.y,e.x,e.y,n.x,n.y),i=jt(s.p2.x,s.p2.y,e.x,e.y,n.x,n.y);if(r.dist<=o&&i.dist<=o){let a=r.dist<=i.dist;return{hingePoint:a?s.p1:s.p2,otherPoint:a?s.p2:s.p1,hingeDist:a?r.dist:i.dist,otherDist:a?i.dist:r.dist,isClosed:!0,hingeT:a?r.t:i.t}}if(r.dist<=o||i.dist<=o){let a=r.dist<=o;return{hingePoint:a?s.p1:s.p2,otherPoint:a?s.p2:s.p1,hingeDist:a?r.dist:i.dist,otherDist:a?i.dist:r.dist,isClosed:!1,hingeT:a?r.t:i.t}}return null}function co(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,x=b.y-t.start.y,y=(m*o+x*s)/(r*r);i.push(Math.max(0,Math.min(1,y)))}let a=Math.max(1,Math.ceil(r/e)),f=r/a,c=new Array(a).fill(0);for(let b of i){let m=Math.min(a-1,Math.floor(b*a));c[m]++}let d=c.map(b=>b/f),u=c.map((b,m)=>m/a),l=c.map((b,m)=>(m+1)/a),h=d.reduce((b,m)=>b+m,0)/a,g=Math.max(...d),p=Math.min(...d);return{densityProfile:d,binStartT:u,binEndT:l,avgDensity:h,maxDensity:g,minDensity:p,binSize:f}}function $r(t){let{densityProfile:e,avgDensity:n}=t;if(e.length===0||n===0)return 0;let o=e.length,s=e.reduce((i,a)=>i+(a-n)**2,0)/o;return Math.sqrt(s)/n}function jr(t){let e=[];for(let o of t)if(o.originalPoints&&o.originalPoints.length>=50&&o.length>=.5){let s=co(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 es(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 Xr(t,e,n=.5,o=.5,s=3){let{densityProfile:r,avgDensity:i}=t;if(r.length===0||i===0)return[];let a=i*n,f=r.length,c=[],d=!1,u=0,l=0,h=0;for(let g=0;g<f;g++){let p=r[g]<a;if(p&&!d)d=!0,u=g,l=r[g],h=1;else if(p&&d)l+=r[g],h++;else if(!p&&d){d=!1;let b=g-1,m=u/f,x=(b+1)/f,y=(x-m)*e;y>=o&&y<=s&&c.push({startT:m,endT:x,startLen:m*e,endLen:x*e,avgDensity:l/h}),l=0,h=0}}if(d){let g=f-1,p=u/f,b=(g+1)/f,m=(b-p)*e;m>=o&&m<=s&&c.push({startT:p,endT:b,startLen:p*e,endLen:b*e,avgDensity:l/h})}return c}function Vl(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 a=[];for(let m of o){let x=m.x-t.start.x,y=m.y-t.start.y,w=(x*s+y*r)/i;w>=e&&w<=n&&m.z!==void 0&&isFinite(m.z)&&a.push(m.z)}if(a.length<5)return{verticalGapRatio:1,isDoorSized:!0};let f=1/0,c=-1/0;for(let m of o)m.z!==void 0&&isFinite(m.z)&&(m.z<f&&(f=m.z),m.z>c&&(c=m.z));let d=c-f;if(d<.5)return{verticalGapRatio:0,isDoorSized:!1};let u=15,l=new Array(u).fill(!1);for(let m of a){let x=Math.min(u-1,Math.max(0,Math.floor((m-f)/d*u)));l[x]=!0}let h=0,g=0;for(let m=0;m<u;m++)l[m]?(h=Math.max(h,g),g=0):g++;h=Math.max(h,g);let p=h/u,b=p>=.35;return{verticalGapRatio:p,isDoorSized:b}}function Gr(t,e,n,o=.5,s=.5,r=3,i=.35){let a=Xr(e,n,o,s,r),f=[];for(let c of a){let{verticalGapRatio:d,isDoorSized:u}=Vl(t,c.startT,c.endT);f.push({...c,verticalGapRatio:d,isRectangular:u})}return f}function Zr(t,e,n){if(!t||!t.start||!t.end)return null;let o=t.start,s=t.end,r=jt(o.x,o.y,e.x,e.y,n.x,n.y),i=jt(s.x,s.y,e.x,e.y,n.x,n.y),a=r.dist<=i.dist,f=a?o:s,c=a?r.dist:i.dist,d=jt(f.x,f.y,e.x,e.y,n.x,n.y);return{hingeT:Math.max(0,Math.min(1,d.t)),hingeDist:c}}function Yr(t,e,n,o=2e3){let{hingeT:s}=t,r=.25,i=0,a=null,f=0;for(let c of e){let d=(c.startT+c.endT)/2,u=Math.abs(d-s),l=Math.max(0,1-u/r),h=c.isRectangular?1:.3,g=Math.max(0,1-c.avgDensity/o),p=l*.5+h*.3+g*.2;p>i&&(i=p,a=c,f=l)}return{score:i>.5?i:-1,bestRegion:a,bestOverlap:f,bestOpeningStartT:a?.startT??0,bestOpeningEndT:a?.endT??0}}function Cl(t,e,n=.15){let o=0,s=0;for(let i of e)i!==t&&((Ye(t.start,i.start)<=n||Ye(t.start,i.end)<=n)&&o++,(Ye(t.end,i.start)<=n||Ye(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 Il(t,e){let n=[],{start:o,end:s}=t;for(let a of e){let{dist:f}=jt(a.x,a.y,o.x,o.y,s.x,s.y);n.push(f)}let r=n.reduce((a,f)=>a+f,0)/n.length,i=n.reduce((a,f)=>a+(f-r)**2,0)/n.length;return i<.01?3:i<.05?2:i<.1?1:0}function _l(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,a=o/r,f=[[],[]];for(let u=0;u<2;u++){let l=u===0?t.start:t.end;for(let h of e){if(h===t)continue;let g=Ye(l,h.start),p=Ye(l,h.end),b=null;if(g<=n?b=h.end:p<=n&&(b=h.start),!b)continue;let m=h.end.x-h.start.x,x=h.end.y-h.start.y,y=Math.sqrt(m*m+x*x);if(y<1e-12||Math.abs(o*m+s*x)/(r*y)>=.342)continue;let z=(b.x-l.x)*i+(b.y-l.y)*a;f[u].push(z>0?1:-1)}}if(f[0].length===0||f[1].length===0)return 0;let c=[...f[0],...f[1]];return c.every(u=>u===c[0])?2:1}function Ur(t,e,n){let o=Cl(t,n),s=Il(t,e),r=_l(t,n);return{score:o.score*3+s*2+r*2,details:{conn:o.score,variance:s,sameSide:r}}}function Wl(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 Hl(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 Al(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 kl(t,e,n,o,s){let r=[];for(let c of t){let d=c.seg,u=(d.start.x-e.start.x)*n+(d.start.y-e.start.y)*o,l=(d.end.x-e.start.x)*n+(d.end.y-e.start.y)*o;u<=l?r.push({l:u,r:l,idx:c.idx,startPt:d.start,endPt:d.end}):r.push({l,r:u,idx:c.idx,startPt:d.end,endPt:d.start})}r.sort((c,d)=>c.l-d.l);let i=[],a=.01,f=.5;for(let{l:c,r:d,idx:u,startPt:l,endPt:h}of r){if(i.length===0){i.push({l:c,r:d,srcIdxs:[u],startPt:l,endPt:h});continue}let g=i[i.length-1];if(c<=g.r+s){let p=Math.min(g.r,d)-Math.max(g.l,c),b=Math.hypot(g.endPt.x-l.x,g.endPt.y-l.y);p>=f||b<=a?(c<g.l&&(g.l=c,g.startPt=l),d>g.r&&(g.r=d,g.endPt=h),g.srcIdxs.includes(u)||g.srcIdxs.push(u)):i.push({l:c,r:d,srcIdxs:[u],startPt:l,endPt:h})}else i.push({l:c,r:d,srcIdxs:[u],startPt:l,endPt:h})}return i}function Ll(t,e,n,o,s,r,i){let a=Math.hypot(n.x-e.x,n.y-e.y),f={...t};return f.start={...e},f.end={...n},f.length=a,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 Bl(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 a=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,c=Math.abs(r.end.x-i.end.x)<.001&&Math.abs(r.end.y-i.end.y)<.001,d=Math.abs(r.start.x-i.start.x)<.001&&Math.abs(r.start.y-i.start.y)<.001;if(!(a||f||c||d)||r.direction.x*i.direction.x+r.direction.y*i.direction.y<.98)continue;let l=r.start,h=r.end;a?h=i.end:f?l=i.start:c?h=i.start:d&&(l=i.end);let g=Math.hypot(h.x-l.x,h.y-l.y),p={...r};p.start=l,p.end=h,p.length=g,p.direction={x:(h.x-l.x)/g,y:(h.y-l.y)/g,z:0},r.rooftopPz!==void 0&&i.rooftopPz!==void 0?p.rooftopPz=Math.max(r.rooftopPz,i.rooftopPz):p.rooftopPz=r.rooftopPz!==void 0?r.rooftopPz:i.rooftopPz,p.buildRosource=r.buildRosource||i.buildRosource,p.isRebuild=!1,p.doorAndBeamData||(p.doorAndBeamData=[]),p.insetionArr||(p.insetionArr=[]),t[o]=p,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 Ke(t,e=5,n=.05){if(t.length<=1)return{segments:t,sourceMap:t.map((f,c)=>[c])};let o=t.map((f,c)=>({seg:f,angle:Wl(f),idx:c}));o.sort((f,c)=>f.angle-c.angle);let s=Hl(o,e),r=[],i=[],a=[];for(let f of s){let c=f[0].seg;for(let m of f)m.seg.length>c.length&&(c=m.seg);let d=c.end.x-c.start.x,u=c.end.y-c.start.y,l=Math.sqrt(d*d+u*u);if(l<1e-12)continue;let h=-u/l,g=d/l,p=f.map(m=>{let x=m.seg.start.x-c.start.x,y=m.seg.start.y-c.start.y;return{seg:m.seg,offset:Math.abs(x*h+y*g),idx:m.idx}});p.sort((m,x)=>m.offset-x.offset);let b=Al(p);for(let m of b){let x=m[0].seg;for(let S of m)S.seg.length>x.length&&(x=S.seg);let y=x.end.x-x.start.x,w=x.end.y-x.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}));a.push({values:[...V],segments:S})}let W=[...new Set(m.map(S=>String(S.seg.buildRosource)))],v=kl(m,x,M,P,n);for(let{l:S,r:R,srcIdxs:D,startPt:_,endPt:C}of v){if(R-S<.01)continue;let I=Ll(x,_,C,M,P,T,x.buildRosource);r.push(I),i.push(D)}}}return{...Bl(r,i),debugRPZGroups:a}}function Ol(t){return{minLengthRatio:0,maxDistance:.5,angleThreshold:45,projectionMargin:.1,printOnly:!0,minEmbedRatioThreshold:.3,noWallSurroundDistance:.3,minEmbedRatio:.05,...t}}function Fl(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 Nl(t,e,n,o,s,r,i,a,f){if(!__DEBUG__||!["_008","_002","_014","_015","_020"].some(u=>t.includes(u)))return;e.map(u=>{let{start:l,end:h}=u,g=jt(n,o,l.x,l.y,h.x,h.y),p=s.map(z=>{let M=jt(z.x,z.y,l.x,l.y,h.x,h.y);return`t=${M.t.toFixed(3)},d=${M.dist.toFixed(3)}`}),b=h.x-l.x,m=h.y-l.y,x=Math.sqrt(b*b+m*m)||1,y=Math.abs(i*(b/x)+a*(m/x)),w=Math.acos(Math.min(y,1))*(180/Math.PI);return{seg:u,lineDist:g.dist,t:g.t,pts:p,angle:w,length:u.length}}).sort((u,l)=>u.lineDist-l.lineDist)}function ql(t,e,n,o,s,r,i,a,f){let c=[{margin:r.projectionMargin,maxDist:r.maxDistance,label:"\u4E25\u683C"},{margin:.4,maxDist:.65,label:"\u5BBD\u677E"}],d=[],u=Nr(a)||e;for(let l of c){if(d.length>0)break;for(let h of t){let{start:g,end:p}=h,b=!1,m=1/0;for(let E of s){let{dist:T,t:V}=jt(E.x,E.y,g.x,g.y,p.x,p.y);V>=-l.margin&&V<=1+l.margin&&T<=l.maxDist&&(b=!0,T<m&&(m=T))}if(!b)continue;let x=null;if(f&&(x=qr(f,g,p,.3)),!x||!x.hingePoint){let E=Fr(a,g,p,.1);E&&E.hingeEdge&&(x={...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})}x&&x.hingePoint&&jt(s[0].x,s[0].y,g.x,g.y,p.x,p.y).dist>.3&&(x=null);let y=!1;if(!x||!x.hingePoint){let E=jt(s[0].x,s[0].y,g.x,g.y,p.x,p.y);if(m<.15&&E.dist<.3&&h.originalPoints&&h.originalPoints.length>=50&&h.length>=.5)y=!0;else continue}if(!y&&(x.hingeT<-l.margin||x.hingeT>1+l.margin)){let E=jt(s[0].x,s[0].y,g.x,g.y,p.x,p.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:x.isClosed?1:.5,z=[s[1],s[2],s[3],s[4]],M=Br(g.x,g.y,p.x,p.y,z),P=u>0?M/u:0;d.push({seg:h,minDist:m,embedRatio:P,ratio:h.length/u,score:0,details:{conn:0,variance:0,sameSide:0},hingeInfo:x,hingeScore:w})}}return d}function $l(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}=Ur(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,a=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 jl(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),a=s/i,f=r/i,c=e.map(P=>{let E=P.x-t.start.x,T=P.y-t.start.y;return(E*a+T*f)/i}),d=Math.min(...c),u=Math.max(...c),l=(u-d)*i,h=(d+u)/2,g=t.start.x+h*s,p=t.start.y+h*r,b=n.box.min.z,m=n.box.max.z,x=Math.abs(m-b),y=Ue(o,t.start.x,t.start.y),w=Math.max(0,b-y),z=d<=0&&u>=1,M=t.start.z+h*(t.end.z-t.start.z);return{p:{x:g,y:p,z:M},width:l,full:z,height:x,groundClearance:w,wallTMin:Math.max(0,Math.min(1,d)),wallTMax:Math.max(0,Math.min(1,u))}}function ns(t,e,n){let o=e.map(d=>n[d]),s=[],r=[],i=[],a=[],f,c;for(let d of o){if(d.originalPoints?.length)for(let u of d.originalPoints)s.push(u);if(d.doorAndBeamData?.length)for(let u of d.doorAndBeamData)r.push(u);if(d.insetionArr?.length)for(let u of d.insetionArr)i.push(u);if(d.DrawDoor?.length)for(let u of d.DrawDoor)a.push(u);d.boxData&&!f&&(f=d.boxData),d.rooftopPz!==void 0&&(c===void 0||d.rooftopPz>c)&&(c=d.rooftopPz)}s.length&&(t.originalPoints=s),r.length&&(t.doorAndBeamData=r),i.length&&(t.insetionArr=i),a.length&&(t.DrawDoor=a),f&&(t.boxData=f),c!==void 0&&(t.rooftopPz=c)}function hn(t,e,n=10,o=.2,s=.2){let r=[];if(!t.DrawDoor)return r;let i=t.DrawDoor.p,a=t.wallSegment,f=a.end.x-a.start.x,c=a.end.y-a.start.y,d=Math.sqrt(f*f+c*c)||1,u=f/d,l=c/d,h=i.x-a.start.x,g=i.y-a.start.y,p=(h*u+g*l)/d;for(let b of e){if(b===a)continue;let m=b.end.x-b.start.x,x=b.end.y-b.start.y,y=Math.sqrt(m*m+x*x)||1,w=m/y,z=x/y,M=Math.abs(u*w+l*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 W=V.x-a.start.x,v=V.y-a.start.y,S=(W*u+v*l)/d,R=a.start.x+S*d*u,D=a.start.y+S*d*l;if(Math.sqrt((V.x-R)**2+(V.y-D)**2)>s)continue;let C=Math.abs((S-p)*d);if(C<=o){r.push({seg:b,distAlongWall:C,angle:E,endPoint:V});break}}}return r}function In(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,a=((e.x-n.x)*s+(e.y-n.y)*r)/(i*i),f=Math.max(0,Math.min(1,a)),c={x:n.x+f*s,y:n.y+f*r,z:n.z+(o.z-n.z)*f||0};function d(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||u(w[w.length-1],c)>1e-6)&&w.push({...c}),(z.length===0||u(z[0],c)>1e-6)&&z.unshift({...c}),[w,z]}function u(y,w){return Math.sqrt((y.x-w.x)**2+(y.y-w.y)**2)}let[l,h]=d(t.originalPoints),g=Math.max(f*i,1e-6),p=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:{...c},length:g,direction:{...b},originalPoints:l.length?l:void 0},x={...t,start:{...c},end:{...o},length:p,direction:{...b},originalPoints:h.length?h:void 0};if("isRebuild"in t&&(m.isRebuild=t.isRebuild,x.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,x.DrawDoor=w.length?w:void 0}else m.DrawDoor=void 0,x.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 W of w)W.x<z&&(z=W.x),W.y<M&&(M=W.y),W.z!==void 0&&W.z<P&&(P=W.z),W.x>E&&(E=W.x),W.y>T&&(T=W.y),W.z!==void 0&&W.z>V&&(V=W.z);return{isBox3:!0,min:{x:z,y:M,z:P},max:{x:E,y:T,z:V}}};m.boxData=y(l),x.boxData=y(h)}return[m,x]}function _n(t,e,n,o){let s=Ol(n),r=[],{segments:i,sourceMap:a}=o??Ke(e),f=i,c=jr(f);for(let d of t){let u=d.coordinatesByArea?.coordinates;if(!u||u.length<4)continue;let l=u.slice(0,4),h=ts(d.nline),g=lo(l),p,b,m,x,y;if(h?(p=h.midX,b=h.midY,m=h.length,x=h.dirX,y=h.dirY):(p=l.reduce((k,B)=>k+B.x,0)/4,b=l.reduce((k,B)=>k+B.y,0)/4,m=g.longSide,x=g.dirX,y=g.dirY),m<.01)continue;let w=l.reduce((k,B)=>k+B.z,0)/4,z=Ue(e,p,b);if(w<z-.3)continue;let M=Or(l),P=[...l].sort((k,B)=>k.z-B.z),E=P[0].x-P[1].x,T=P[0].y-P[1].y,V=Math.sqrt(E*E+T*T),W=Fl(l,p,b);Nl(d.name,f,p,b,W,m,x,y,s);let v=ql(f,V,x,y,W,s,d.name,M,d.nline);if(v.length>0)for(let k=0;k<v.length;k++){let B=v[k],$=B.seg,G=!!B.hingeInfo?.hingePoint,Q=B.hingeInfo?.isClosed,q=B.hingeInfo?.hingeDist??-1,X=jt(W[0].x,W[0].y,$.start.x,$.start.y,$.end.x,$.end.y)}if(v=$l(v,W,e,d.name),v.length===0){for(let B of f){let $=B.start.x+(B.end.x-B.start.x)/2-p,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,mt=X/Y,Tt=Math.abs(it*x+mt*y),nt=Math.acos(Math.min(1,Math.abs(Tt)))*180/Math.PI,zt=jt(p,b,B.start.x,B.start.y,B.end.x,B.end.y)}let k=0;for(let B of f)jt(p,b,B.start.x,B.start.y,B.end.x,B.end.y).dist<2&&k++}let S=V;for(let k of v){let B=k.seg;if(B.originalPoints&&B.originalPoints.length>100&&B.length>.5)try{let $=co(B,.1),G=Gr(B,$,B.length,.5,.5,3,.35),Q,q=!1;if(d.nline){let mt=Zr(d.nline,B.start,B.end);if(mt)Q=mt.hingeT,q=mt.hingeDist>.05;else{let Tt=jt(p,b,B.start.x,B.start.y,B.end.x,B.end.y);Q=Math.max(0,Math.min(1,Tt.t))}}else{let mt=jt(p,b,B.start.x,B.start.y,B.end.x,B.end.y);Q=Math.max(0,Math.min(1,mt.t))}let X=$r($),Y,it=X<=.3;it?Y={score:es($.avgDensity,c),bestRegion:null,bestOverlap:0,bestOpeningStartT:0,bestOpeningEndT:1}:(Y=Yr({hingeT:Q,doorWidth:S,isOpenDoor:q},G,B.length,c.medianDensity),Y.score<0&&(Y={score:es($.avgDensity,c),bestRegion:null,bestOverlap:0,bestOpeningStartT:0,bestOpeningEndT:1})),d.name.includes("door_002")&&(window.__doorLog=!0),k.densityScore=Y.score,k.densityOverlap=Y.bestOverlap,k.rectangularRegions=G,k.densityResult=$,k.densityOpeningStartT=Y.bestOpeningStartT,k.densityOpeningEndT=Y.bestOpeningEndT,k.densityCV=X,k.densityUsedGlobalRank=it}catch{k.densityScore=-1}else k.densityScore=-1}if(d.name.includes("door_002"))for(let k=0;k<v.length;k++){let $=v[k].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?a[G]||[]:[];for(let q of Q){let X=e[q]}}if(v.sort((k,B)=>{let $=k.densityScore>=0?k.densityScore:-1/0,G=B.densityScore>=0?B.densityScore:-1/0;if($!==G)return G-$;if(Math.abs($-G)<.3){let X=k.ratio||0,Y=B.ratio||0,it=Math.abs(X-1),mt=Math.abs(Y-1);if(it!==mt)return it-mt}let Q=k.hingeScore||0,q=B.hingeScore||0;return Q!==q?q-Q:k.minDist-B.minDist}),v.length>0)for(let k=0;k<v.length;k++){let B=v[k],$=B.seg,G=B.ratio||$.length/S,Q=Math.abs(G-1)}let R=null,D=1/0,_=0,C=0,I=null,H=-1,A=0,L=0,O=0;if(v.length>0){let k=v[0];R=k.seg,D=k.minDist,_=k.ratio,C=k.embedRatio,I=k.hingeInfo,H=k.densityScore??-1,A=k.densityOverlap??0,L=k.densityOpeningStartT??0,O=k.densityOpeningEndT??0}let N;if(R&&(N=jl(R,l,d,i),N&&O>L&&(N.wallTMin=Math.max(0,Math.min(1,L)),N.wallTMax=Math.max(0,Math.min(1,O))),!s.printOnly)){let k=R;k.DrawDoor||(k.DrawDoor=[]),k.DrawDoor.push(N),k.isDoor=!0}if(R){let k=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:d.name,doorCategory:d.category,doorCenter:d.center,wallSegment:R,distance:D,wallLengthRatio:_,DrawDoor:N,densityScore:H,densityOverlap:A,candidates:k,hingePoint:I?.hingePoint,otherPoint:I?.otherPoint,isClosed:I?.isClosed,doorWidth:N?.width,wallTMin:N?.wallTMin,wallTMax:N?.wallTMax};if(r.push(B),(d.name==="1527727501200_window_001"||d.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,mt=(Y*q+it*X)/Q,Tt=0;for(let nt of i){if(nt===R)continue;let zt=nt.end.x-nt.start.x,Mt=nt.end.y-nt.start.y,vt=Math.sqrt(zt*zt+Mt*Mt)||1,St=zt/vt,Et=Mt/vt,It=Math.abs(q*St+X*Et),ot=Math.acos(Math.min(It,1))*(180/Math.PI);if(Math.abs(ot-90)>10)continue;Tt++;let dt=[nt.start,nt.end],st="";for(let tt of dt){let le=tt.x-R.start.x,wt=tt.y-R.start.y,te=(le*q+wt*X)/Q,me=R.start.x+te*Q*q,Rt=R.start.y+te*Q*X,ne=Math.sqrt((tt.x-me)**2+(tt.y-Rt)**2),et=Math.abs((te-mt)*Q);st+=`\u7AEF(${tt.x.toFixed(2)},${tt.y.toFixed(2)})\u22A5=${ne.toFixed(3)}m \u6CBF\u5899=${et.toFixed(3)}m `}}}if(N&&N.width>1){let $=hn(B,i);$.length>0&&$.forEach((G,Q)=>{})}}}for(let d of r){let u=d.wallSegment,l=i.indexOf(u);if(l===-1)continue;let h=a[l];!h||h.length<=1||ns(u,h,e)}return r}function uo(t){return[t.wallTMin??0,t.wallTMax??1]}function Xl(t,e){let[n,o]=uo(t),[s,r]=uo(e),i=Math.max(0,Math.min(o,r)-Math.max(n,s)),a=Math.min(o-n,r-s);return a>0?i/a:0}function Gl(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 Kr(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 Qr(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 d=0;d<t.length;d++){let l=t[d].wallSegment;i.has(l)||i.set(l,[]),i.get(l).push(d)}let a=0;for(let[d,u]of i){a++;let l=u.map(p=>t[p].doorName).join(", "),h=d.start,g=d.end}for(let[,d]of i){if(d.length<2)continue;let u=[...d].sort((l,h)=>{let g=t[l].densityScore??0;return(t[h].densityScore??0)-g});for(let l=0;l<u.length;l++){let h=u[l];if(r.has(h))continue;let g=t[h];for(let p=l+1;p<u.length;p++){let b=u[p];if(r.has(b))continue;let m=t[b],x=!1,y="",w=Xl(g,m),z=[g.hingePoint,g.otherPoint].filter(Boolean),M=[m.hingePoint,m.otherPoint].filter(Boolean),P=null;for(let _ of z)for(let C of M){let I=Math.sqrt((_.x-C.x)**2+(_.y-C.y)**2);if(I>.25)continue;let H=Kr(_,g.wallSegment),A=Kr(C,m.wallSegment),L=Math.abs(H-A);(!P||I<P.dist)&&(P={dist:I,tDiff:L})}P&&P.tDiff<=.08&&(x=!0,y=`\u6700\u77ED\u8FB9\u8DDD=${P.dist.toFixed(3)}m t\u5DEE=${P.tDiff.toFixed(3)}`);let[E,T]=uo(g),[V,W]=uo(m),v=Gl(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 _ of S)for(let C of R){let I=Math.sqrt((_.x-C.x)**2+(_.y-C.y)**2);I<D&&(D=I)}x&&r.add(b)}}}let f=t.filter((d,u)=>!r.has(u)),c=t.filter((d,u)=>r.has(u)).map(d=>d.doorName);return{matches:f,removed:c}}function os(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,x)=>[x]);else{let m=Ke(t);r=m.segments,i=m.sourceMap}for(let m=0;m<r.length;m++){let x=i[m];x&&!r[m].originalPoints&&ns(r[m],x,t)}let a=_n(s,t,o,{segments:r,sourceMap:i}),c=Qr(a,{minTOverlapRatio:.5}).matches,d=new Set(c.map(m=>m.doorName));for(let m of r){let x=m;if(x.DrawDoor&&x.DrawDoor.length>0){let y=a.filter(z=>z.wallSegment===m).length;c.filter(z=>z.wallSegment===m).length===0&&(x.DrawDoor=[],x.isDoor=!1)}}let u=new Map;for(let m=0;m<c.length;m++){let x=c[m],y=r.indexOf(x.wallSegment);y>=0&&u.set(y,m)}let l=[],h=new Set,g=new Map;for(let m of e)m&&m.name&&g.set(m.name,m);for(let[m,x]of u){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,W=1,v=c[x],R=(v?g.get(v.doorName):void 0)?.coordinatesByArea?.coordinates;if(R&&R.length>=4&&T>0){let I=R.slice(0,4).map(H=>{let A=H.x-w.start.x,L=H.y-w.start.y;return(A*P+L*E)/T});V=Math.max(0,Math.min(1,Math.min(...I))),W=Math.max(0,Math.min(1,Math.max(...I)))}let D,_;T>0&&W>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)},_={x:w.start.x+W*P,y:w.start.y+W*E,z:w.start.z+W*(w.end.z-w.start.z)});let C=!1;for(let I of y){let H=t[I];if(!H)continue;let A=H.end.x-H.start.x,L=H.end.y-H.start.y,O=A*A+L*L,N=Math.sqrt(O);if(O<1e-10||!D||!_){h.add(I),l.push(H);continue}let k=((D.x-H.start.x)*A+(D.y-H.start.y)*L)/O,B=((_.x-H.start.x)*A+(_.y-H.start.y)*L)/O,$=Math.max(0,Math.min(1,Math.min(k,B))),G=Math.max(0,Math.min(1,Math.max(k,B)));if(G-$<.001)continue;h.add(I);let Q=nt=>({x:H.start.x+nt*A,y:H.start.y+nt*L,z:H.start.z+nt*(H.end.z-H.start.z)}),q=Q($),X=Q(G),Y=H.direction||{x:A/N,y:L/N,z:0},it,mt,Tt;if(H.originalPoints&&H.originalPoints.length>0){it=[],mt=[],Tt=[];for(let nt of H.originalPoints){let zt=((nt.x-H.start.x)*A+(nt.y-H.start.y)*L)/O;zt<$-1e-8?it.push(nt):zt>G+1e-8?Tt.push(nt):mt.push(nt)}it.length===0&&(it=void 0),mt.length===0&&(mt=void 0),Tt.length===0&&(Tt=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,l.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=x,nt.length<.01?(nt.isRebuild=!0,nt.originalPoints=[]):nt.originalPoints=mt,!C&&z&&z.length>0){C=!0;let zt=Math.sqrt(T),Mt=zt>0?-E/zt:0,vt=zt>0?P/zt:0,St={pointNum:2,start:D,end:_,n:{x:Mt,y:vt,z:0},height:z[0].height,groundClearance:z[0].groundClearance};nt.drawDoorData=St}l.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=Tt,l.push(nt)}}}for(let m=0;m<t.length;m++)h.has(m)||l.push(t[m]);let p=new Set(c.map(m=>m.doorName));for(let m of e)m&&m.category==="door"&&(p.has(m.name)?delete m.AbnormalDoor:m.AbnormalDoor=!0);let b=new Map;for(let m of c){if(!m.DrawDoor||m.DrawDoor.width<=1)continue;let x=g.get(m.doorName);if(!x||!x.positionArr||!x.positionArr.length)continue;let y=hn(m,r);if(y.length<=1)continue;let w=x.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,W=y.filter(I=>{let H=(I.seg.start.x+I.seg.end.x)/2,A=(I.seg.start.y+I.seg.end.y)/2,L=H-z.x,O=A-z.y;return L*T+O*V>0});if(!W.length)continue;let v=W[0].endPoint,S=m.wallSegment;if(b.has(S))continue;let[R,D]=In(S,v);b.set(S,[R,D]);let _=((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),C=((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);_<=C?m.wallSegment=R:m.wallSegment=D}if(b.size>0){let m=[];for(let x of l)b.has(x)?m.push(...b.get(x)):m.push(x);for(let x of m)x.isDoor=!!(x.DrawDoor&&x.DrawDoor.length>0);return{segments:m,matches:c}}for(let m of l)m.isDoor=!!(m.DrawDoor&&m.DrawDoor.length>0);return{segments:l,matches:c}}var Zl={findWalls:Cn,mergeSegments:Ze,computeFloorZ:Ge,analyzeQuadrangle:Xe,detectPerpWalls:vn,splitSegment:Vn,process:Qo},Yl={findWalls:_n,mergeSegments:Ke,computeFloorZ:Ue,analyzeQuadrangle:Xe,detectPerpWalls:hn,splitSegment:In,process:os};function mn(t){return t==="window"?Zl:Yl}function Ul(t,e,n,o,s){return mn(t).findWalls(e,n,o,s)}function Kl(t,e,n,o){return mn(t).process(e,n,o)}function Ql(t,e){return mn(t).mergeSegments(e)}function Jl(t,e,n){return mn(t).detectPerpWalls(e,n)}function tc(t,e,n){return mn(t).splitSegment(e,n)}function Qe(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 fo(t,e,n,o,s,r){let i=s-n,a=r-o,f=i*i+a*a;if(f<1e-10){let g=t-n,p=e-o;return Math.sqrt(g*g+p*p)}let c=((t-n)*i+(e-o)*a)/f;c=Math.max(0,Math.min(1,c));let d=n+c*i,u=o+c*a,l=t-d,h=e-u;return Math.sqrt(l*l+h*h)}function Jr(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 ss(t){let e=t.x2-t.x1,n=t.z2-t.z1;return Math.sqrt(e*e+n*n)}function ho(t){if(!t.length)return{rotated:[],mainAngle:0};let e=180,n=new Array(e).fill(0),o=Math.PI/e;for(let d of t){let u=d.x2-d.x1,l=d.z2-d.z1,h=Math.sqrt(u*u+l*l);if(h<.01)continue;let g=Qe(u,l),p=Math.floor(g/o);p>=e&&(p=e-1),n[p]+=h}let s=new Array(e).fill(0),r=5;for(let d=0;d<e;d++){let u=0;for(let l=-r;l<=r;l++){let h=d+l;h<0&&(h+=e),h>=e&&(h-=e),u+=n[h]}s[d]=u}let i=0,a=0;for(let d=0;d<e;d++)s[d]>i&&(i=s[d],a=d);let f=(a+.5)*o;return{rotated:t.map(d=>{let u=Ie(d.x1,d.z1,-f),l=Ie(d.x2,d.z2,-f);return{...d,x1:u.x,z1:u.z,x2:l.x,z2:l.z}}),mainAngle:f}}var rs=15*(Math.PI/180);function mo(t,e,n=.15,o=.5){let s=[];for(let d of t){let u=d.x2-d.x1,l=d.z2-d.z1,h=Math.sqrt(u*u+l*l);if(h<.01)continue;let g=Qe(u,l),p;if(e==="X"?p=g<rs||g>Math.PI-rs:p=Math.abs(g-Math.PI/2)<rs,!p)continue;let b,m,x;e==="X"?(b=(d.z1+d.z2)/2,m=Math.min(d.x1,d.x2),x=Math.max(d.x1,d.x2)):(b=(d.x1+d.x2)/2,m=Math.min(d.z1,d.z2),x=Math.max(d.z1,d.z2)),s.push({line:d,offset:b,pStart:m,pEnd:x,length:h})}if(s.length===0)return{groups:[],lineToGroup:new Map};s.sort((d,u)=>d.offset-u.offset);let r=[],i=[s[0]],a=s[0].offset;for(let d=1;d<s.length;d++){let u=s[d];Math.abs(u.offset-a)<n?i.push(u):(r.push(i),i=[u],a=u.offset)}i.length>0&&r.push(i);let f=[],c=new Map;for(let d of r){d.sort((l,h)=>l.pStart-h.pStart);let u=[];for(let l of d){let h=!1;for(let g of u)if(l.pStart<=g.end+o){g.items.push(l),g.end=Math.max(g.end,l.pEnd),h=!0;break}h||u.push({items:[l],end:l.pEnd})}for(let l of u){let h=l.items.map(p=>p.line),g=f.length;f.push(h);for(let p of h)c.set(p.id,g)}}return{groups:f,lineToGroup:c}}function go(t,e,n=.3){let o=new Map;for(let s of t){let r=null,i=1/0;for(let a of e){let f=fo(s.x,s.z,a.x1,a.z1,a.x2,a.z2);f<i&&(i=f,r=a.id)}r!==null&&i<=n&&o.set(s.id,r)}return o}var gn=.15;function ec(t,e){return Math.round(t/gn)+"_"+Math.round(e/gn)}function ti(t,e=5){if(t.length<3)return new Set;let n=new Map,o=0,s=0;function r(f,c){let d=ec(f,c),u=n.get(d);if(u)return u;let l=Math.round(f/gn),h=Math.round(c/gn),g=null,p=gn*gn;for(let b=-1;b<=1;b++)for(let m=-1;m<=1;m++){let x=l+b+"_"+(h+m),y=n.get(x);if(!y)continue;let w=y.x-f,z=y.z-c,M=w*w+z*z;M<p&&(p=M,g=y)}return g?(n.set(d,g),g):(u={id:o++,x:f,z:c,edges:[]},n.set(d,u),u)}let i=[];for(let f of t){let c=r(f.x1,f.z1),d=r(f.x2,f.z2);if(c.id===d.id)continue;let u=Math.atan2(d.z-c.z,d.x-c.x),l=Math.atan2(c.z-d.z,c.x-d.x),h={id:s++,wallId:f.id,from:c,to:d,twin:null,angle:u,visited:!1},g={id:s++,wallId:f.id,from:d,to:c,twin:h,angle:l,visited:!1};h.twin=g,c.edges.push(h),d.edges.push(g),i.push(h,g)}if(i.length<6)return new Set;for(let f of n.values())f.edges.sort((c,d)=>c.angle-d.angle);let a=new Set;for(let f of i){if(f.visited)continue;let c=[],d=f,u=i.length+10;for(;!d.visited&&c.length<u;){d.visited=!0,c.push(d);let l=d.to,h=d.twin,g=l.edges.indexOf(h);if(g<0)break;let p=(g+1)%l.edges.length;d=l.edges[p]}if(c.length>=3){let l=c[0];if(c[c.length-1].to.id===l.from.id){let g=[],p=new Set;for(let m of c)p.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(Jr(g)>=e)for(let m of p)a.add(m)}}}return a}var kg=12*(Math.PI/180);function ei(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),a=Math.floor(r/e),f=`${i},${a}`;n.has(f)||n.set(f,[]),n.get(f).push(o)}return n}var nc=0;function ni(){return++nc}function oi(t,e,n=.15,o=.5){if(!t.length)return[];let s=10*Math.PI/180,r=[];for(let d of t){let u=d.x2-d.x1,l=d.z2-d.z1,h=Math.sqrt(u*u+l*l);if(!(h<.01))if(e==="X"){if(Math.abs(l)>h*Math.sin(s))continue;let g=(d.z1+d.z2)/2,p=Math.min(d.x1,d.x2),b=Math.max(d.x1,d.x2);r.push({line:d,pStart:p,pEnd:b,offset:g,yMin:Math.min(d.y1,d.y2),yMax:Math.max(d.y1,d.y2)})}else{if(Math.abs(u)>h*Math.sin(s))continue;let g=(d.x1+d.x2)/2,p=Math.min(d.z1,d.z2),b=Math.max(d.z1,d.z2);r.push({line:d,pStart:p,pEnd:b,offset:g,yMin:Math.min(d.y1,d.y2),yMax:Math.max(d.y1,d.y2)})}}if(!r.length)return[];r.sort((d,u)=>d.offset-u.offset);let i=[],a=[r[0]],f=r[0].offset;for(let d=1;d<r.length;d++){let u=r[d];Math.abs(u.offset-f)<n?a.push(u):(i.push(a),a=[u],f=u.offset)}i.push(a);let c=[];for(let d of i){d.sort((l,h)=>l.pStart-h.pStart);let u=[];for(let l of d){if(u.length===0){u.push({pStart:l.pStart,pEnd:l.pEnd,offset:l.offset,count:1,yMin:l.yMin,yMax:l.yMax});continue}let h=u[u.length-1];l.pStart<=h.pEnd+o?(h.pEnd=Math.max(h.pEnd,l.pEnd),h.count+=1,h.yMin=Math.min(h.yMin,l.yMin),h.yMax=Math.max(h.yMax,l.yMax),h.offset=(h.offset*(h.count-1)+l.offset)/h.count):u.push({pStart:l.pStart,pEnd:l.pEnd,offset:l.offset,count:1,yMin:l.yMin,yMax:l.yMax})}for(let l of u){let h=l.pEnd-l.pStart;if(h<.01)continue;let g;e==="X"?g={id:ni(),x1:l.pStart,y1:l.yMin,z1:l.offset,x2:l.pEnd,y2:l.yMax,z2:l.offset,length:h,pointCount:l.count,isMain:!1}:g={id:ni(),x1:l.offset,y1:l.yMin,z1:l.pStart,x2:l.offset,y2:l.yMax,z2:l.pEnd,length:h,pointCount:l.count,isMain:!1},c.push(g)}}return c}function si(t,e=.8,n=3){return t.filter(o=>o.length>=e&&o.pointCount>=n)}function ri(t,e=1,n=3){return t.filter(o=>o.length>=e&&o.pointCount>=n)}function oc(t,e,n={}){let{distTol:o=.15,gapTol:s=.5,minLen:r=.2,minGroupLen:i=1,minArea:a=3,maxWinDist:f=.3,minLongWall:c=2}=n,d=performance.now(),{rotated:u,mainAngle:l}=ho(t),h=performance.now(),g=e.map(D=>{let _=Ie(D.x,D.z,-l);return{...D,x:_.x,z:_.z}}),{groups:p}=mo(u,"X",o,s),{groups:b}=mo(u,"Z",o,s),m=[...p,...b],x=performance.now(),y=new Map,w=[];for(let D=0;D<m.length;D++){let _=m[D];if(_.length===0){w.push(0);continue}let C=0;for(let I of _)C+=ss(I),y.set(I.id,D);w.push(C)}let z=performance.now(),M=new Set;for(let D=0;D<m.length;D++)w[D]>=c&&M.add(D);if(M.size>0){let D=[...M];for(;D.length>0;){let _=D.shift(),C=m[_];for(let I=0;I<m.length;I++){if(M.has(I)||w[I]<i)continue;let H=m[I],A=!1;t:for(let L of C)for(let O of H)if(Math.hypot(L.x1-O.x1,L.z1-O.z1)<=po||Math.hypot(L.x1-O.x2,L.z1-O.z2)<=po||Math.hypot(L.x2-O.x1,L.z2-O.z1)<=po||Math.hypot(L.x2-O.x2,L.z2-O.z2)<=po){A=!0;break t}A&&(M.add(I),D.push(I))}}}let P=u.map((D,_)=>{let C=ss(D),I=y.get(D.id),H=I!==void 0&&M.has(I),A=C>=c;return{id:_,x1:D.x1,y1:D.y1,z1:D.z1,x2:D.x2,y2:D.y2,z2:D.z2,length:C,pointCount:1,isMain:H||A}}),E=P.filter(D=>D.isMain),T=P.filter(D=>!D.isMain),V=performance.now(),W=go(g,E,f),v=performance.now(),S=D=>D.map(_=>{let C=Ie(_.x1,_.z1,l),I=Ie(_.x2,_.z2,l);return{..._,x1:C.x,z1:C.z,x2:I.x,z2:I.z}}),R=performance.now();return console.log(`[\u4E3B\u4F53\u67B6\u6784] \u89D2\u5EA6\u5F52\u4E00\u5316: ${(h-d).toFixed(0)}ms`),console.log(`[\u4E3B\u4F53\u67B6\u6784] \u5171\u7EBF\u5206\u7EC4: ${(x-h).toFixed(0)}ms (\u6C34\u5E73${p.length}\u7EC4 \u5782\u76F4${b.length}\u7EC4)`),console.log(`[\u4E3B\u4F53\u67B6\u6784] \u7EC4\u5206\u6790+\u4E3B\u4F53\u5224\u5B9A: ${(R-x).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-d).toFixed(0)}ms`),{mainWalls:S(E),noiseWalls:S(T),windowToWall:W}}var po=.2;function Se(t,e){let n=Math.atan2(e,t);return n<0&&(n+=Math.PI),n>=Math.PI&&(n-=Math.PI),n}function Wn(t){for(;t>Math.PI;)t-=2*Math.PI;for(;t<-Math.PI;)t+=2*Math.PI;return t}function xo(t){return t*Math.PI/180}function Hn(t,e,n){let o=Math.cos(n),s=Math.sin(n);return{x:t*o-e*s,z:t*s+e*o}}function Te(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 is(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 we(t,e,n,o){let s=n-t,r=o-e;return Math.sqrt(s*s+r*r)}function An(t,e,n,o,s,r){let i=s-n,a=r-o,f=i*i+a*a;if(f<1e-6)return we(t,e,n,o);let c=((t-n)*i+(e-o)*a)/f;return c=Math.max(0,Math.min(1,c)),we(t,e,n+c*i,o+c*a)}function as(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 ii(t,e){let n=1/0;for(let o of t)for(let s=0;s<e.length-1;s++){let r=An(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 yo(t,e){let n=new Map,o=1/0,s=-1/0,r=1/0,i=-1/0;for(let a of t){let f=Math.floor(a.x/e),c=Math.floor(a.z/e),d=f+","+c;n.set(d,(n.get(d)||0)+1),f<o&&(o=f),f>s&&(s=f),c<r&&(r=c),c>i&&(i=c)}return{cells:n,minX:o,maxX:s,minZ:r,maxZ:i}}function ai(t,e){let n=new Set,o=1/0,s=-1/0,r=1/0,i=-1/0,a=(f,c)=>{let d=f+","+c;n.add(d),f<o&&(o=f),f>s&&(s=f),c<r&&(r=c),c>i&&(i=c)};for(let f of t){let c=f.x1,d=f.z1,u=f.x2,l=f.z2,h=Math.floor(c/e),g=Math.floor(d/e),p=Math.floor(u/e),b=Math.floor(l/e),m=Math.abs(p-h),x=Math.abs(b-g),y=h<p?1:-1,w=g<b?1:-1,z=m-x,M=Math.max(m,x)*2+5,P=0;for(;P++<M&&(a(h,g),!(h===p&&g===b));){let E=2*z;E>-x&&(z-=x,h+=y),E<m&&(z+=m,g+=w)}}return{active:n,minX:o,maxX:s,minZ:r,maxZ:i}}function Ln(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[a,f]=i.split(",").map(Number);for(let c=-1;c<=1;c++)for(let d=-1;d<=1;d++)c===0&&d===0||s.add(a+c+","+(f+d))}let r=new Set(s);for(let i of s){let[a,f]=i.split(",").map(Number),c=!0;for(let d=-1;d<=1;d++){for(let u=-1;u<=1;u++)if(!s.has(a+d+","+(f+u))){c=!1;break}if(!c)break}c||r.delete(i)}n.clear();for(let i of r)n.add(i)}return n}function ls(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[a,f]=i.split(",").map(Number);for(let c=-1;c<=1;c++)for(let d=-1;d<=1;d++){if(c===0&&d===0)continue;let u=a+c+","+(f+d);t.has(u)&&!n.has(u)&&(n.add(u),r.push(u))}}s.size>=4&&e.push(s)}return e}function cs(t,e){if(t.size<3)return[];let n=new Set,o=(g,p)=>t.has(g+","+p);for(let g of t){let[p,b]=g.split(",").map(Number);(!o(p+1,b)||!o(p-1,b)||!o(p,b+1)||!o(p,b-1))&&n.add(g)}if(n.size<3)return[];let s="",r=1/0,i=1/0;for(let g of n){let[p,b]=g.split(",").map(Number);(b<r||b===r&&p<i)&&(r=b,i=p,s=g)}if(!s)return[];let a=[[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1]],f=[],[c,d]=s.split(",").map(Number),u=0,l=new Set,h=n.size*8;for(let g=0;g<h;g++){let b=c+","+d+"|"+u;if(l.has(b))break;l.add(b),f.push({x:(c+.5)*e,z:(d+.5)*e});let m=(u+3)%8,x=!1;for(let y=0;y<8;y++){let w=(m+y)%8,z=c+a[w][0],M=d+a[w][1];if(n.has(z+","+M)){u=(w+4)%8,c=z,d=M,x=!0;break}}if(!x||c+","+d===s&&f.length>2)break}return f}function kn(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 a=An(t[i].x,t[i].z,s.x,s.z,r.x,r.z);a>n&&(n=a,o=i)}if(n>e){let i=kn(t.slice(0,o+1),e),a=kn(t.slice(o),e);return[...i.slice(0,-1),...a]}return[s,r]}var us={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 pn(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,a=0,f=0,c=0,d=0;for(let m of t){let x=m.x,y=m.z;n+=x,o+=y,s+=x*x,r+=y*y,i+=x*y,a+=x*x*x,f+=y*y*y,c+=x*x*y,d+=x*y*y}let u=2*(e*(s+r)-n*n-o*o);if(Math.abs(u)<1e-10)return{cx:0,cz:0,r:0,rmsResidual:0};let l=(e*(a+d)-n*(s+r))/u,h=(e*(c+f)-o*(s+r))/u,g=Math.sqrt(Math.abs((s+r-2*l*n-2*h*o)/e+l*l+h*h)),p=0;for(let m of t){let y=Math.hypot(m.x-l,m.z-h)-g;p+=y*y}let b=Math.sqrt(p/e);return{cx:l,cz:h,r:g,rmsResidual:b}}function sc(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 a=s+r,f=Math.max(0,(s-r)*(s-r)+4*i*i),c=Math.sqrt(f),d=(a+c)/2,u=(a-c)/2,l=Math.sqrt(d),h=Math.sqrt(u),g=h,p=1,b=0,m=0,x=1;if(Math.abs(i)>1e-12||Math.abs(s-r)>1e-12){let w=i,z=d-s,M=Math.sqrt(w*w+z*z);M>1e-12&&(p=w/M,b=z/M);let P=i,E=u-s,T=Math.sqrt(P*P+E*E);T>1e-12&&(m=P/T,x=E/T)}let y=d>1e-10?u/d:0;return{eigenRatio:y,isLinear:y<.05,spread:g,mx:n,mz:o,v1x:p,v1z:b,v2x:m,v2z:x,s1:l,s2:h}}function li(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:a,v1x:f,v1z:c,v2x:d,v2z:u,s1:l,s2:h}=sc(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 p=rc(t),b=pn(p);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:a,v1x:f,v1z:c,v2x:d,v2z:u,s1:l,s2:h};let x=g>.01?r/g:1;return{type:s&&(r<.05||x<.1)?"straight":"curved",eigenRatio:o,spread:r,cloudUsed:t.length,mx:i,mz:a,v1x:f,v1z:c,v2x:d,v2z:u,s1:l,s2:h}}function rc(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 ic(t,e,n=1.57){if(e<10)return[];let o=[];for(let p=0;p<e;p++){let b=(p+1)%e;o.push(Math.atan2(t[b].z-t[p].z,t[b].x-t[p].x))}let s=[o[0]];for(let p=1;p<e;p++){let b=o[p]-o[p-1];b>Math.PI?b-=2*Math.PI:b<-Math.PI&&(b+=2*Math.PI),s.push(s[p-1]+b)}let r=0;{let p=o[0]-o[e-1];p>Math.PI?p-=2*Math.PI:p<-Math.PI&&(p+=2*Math.PI),r=p}Math.abs(r)<.1;let i=[],a=5;for(let p=0;p<e;p++){let b=0;for(let m=-a;m<=a;m++)b+=s[(p+m+e)%e];i.push(b/(a*2+1))}let f=5,c=[];for(let p=0;p<e;p++){let b=i[(p+f)%e]-i[p];b>Math.PI?b-=2*Math.PI:b<-Math.PI&&(b+=2*Math.PI),c.push(b)}let d=10,u=.003,l=10,h=.05,g=[];for(let p=0;p<e;p++){let b=p,m=p,x=0,y=0,w=p,z=e+10;for(;z-- >0;){let P=c[w],E=Math.abs(P),T=P>0?1:P<0?-1:0;if(E<u){w=(w+1)%e;continue}if(y===0){y=T,x=E,m=w,w=(w+1)%e;continue}if(T!==y){let V=E,W=T,v=(w+1)%e,S=1;for(let R=0;R<l&&S<l*2;R++){let D=c[v],_=Math.abs(D);if(_<u){v=(v+1)%e;continue}(D>0?1:-1)===W?V+=_:(V-=_,V<0&&(W=-W,V=-V)),v=(v+1)%e,S++}if(W===y&&V>h){w=(w+1)%e;continue}break}if(x+=E,m=w,w=(w+1)%e,w===p)break}if((m>b?m-b+1:e-b+m+1)>=d&&x>=n){let P=b,E=(b+f)%e,T=(m-f+e)%e,V=m,W=t[P],v=t[E],S=t[T],R=t[V],D=Math.atan2(v.z-W.z,v.x-W.x),C=Math.atan2(R.z-S.z,R.x-S.x)-D;C>Math.PI?C-=2*Math.PI:C<-Math.PI&&(C+=2*Math.PI);let I=Math.abs(C);if(!g.some(A=>{function L(k,B,$){return k<=B?$>=k&&$<=B:$>=k||$<=B}let O=0,N=0;for(let k=b;N++,L(A.start,A.end,k)&&O++,k!==m;k=(k+1)%e);return N>0&&O/N>.7})){let A=g.findIndex(L=>{function O(B,$,G){return B<=$?G>=B&&G<=$:G>=B||G<=$}let N=0,k=0;for(let B=L.start;k++,O(b,m,B)&&N++,B!==L.end;B=(B+1)%e);return k>0&&N/k>.7});A>=0?x>g[A].cumAngle&&(g[A]={start:b,end:m,cumAngle:x,actualAngle:I}):g.push({start:b,end:m,cumAngle:x,actualAngle:I})}}}return g}function ac(t,e){let r=new Array(e).fill(!1);for(let c=0;c<e;c++){let d=t[c],u=t[(c+15)%e],l=t[(c+30)%e],h=Math.atan2(u.z-d.z,u.x-d.x),g=Math.atan2(l.z-u.z,l.x-u.x),p=Math.abs(g-h);p>Math.PI&&(p=2*Math.PI-p),p>.07&&(r[(c+15)%e]=!0)}let i=new Set,a=[],f=-1;for(let c=0;c<e*2;c++){let d=c%e;if(r[d])f<0&&(f=d);else if(f>=0){let u=(d-1+e)%e,l=0;for(let h=f;l++,h!==u;h=(h+1)%e);if(l>=12){let h=`${f},${u}`;i.has(h)||(i.add(h),a.push({start:f,end:u}))}f=-1}}if(a.length>1){let c=a[0],d=a[a.length-1];d.end>e-3&&c.start<3&&(a[0]={start:d.start,end:c.end},a.pop())}return a}function lc(t,e){let n=[10,15,20,25,30,40],o=.15,s=.15,r=.5,i=3,a=6,f=new Array(e).fill(0);for(let u of n)if(!(u>=e))for(let l=0;l<e;l+=i){let h=l+u;if(h>=e)break;let g=[];for(let w=l;w<=h;w++)g.push(t[w]);if(g.length<u-1)continue;let{cx:p,cz:b,r:m,rmsResidual:x}=pn(g);if(m<.1||x>o||m<r)continue;let y=0;for(let w=1;w<g.length;w++){let z=g[w-1].x-p,M=g[w-1].z-b,P=g[w].x-p,E=g[w].z-b;y+=Math.abs(Math.atan2(z*E-M*P,z*P+M*E))}if(!(y<s))for(let w=l;w<=h;w++)f[w]++}let c=[],d=-1;for(let u=0;u<e*2;u++){let l=u%e;if(f[l]>=2)d<0&&(d=l);else if(d>=0){let h=(l-1+e)%e,g=0;for(let p=d;g++,p!==h;p=(p+1)%e);g>=a&&c.push({start:d,end:h}),d=-1}}if(c.length>1){let u=c[0],l=c[c.length-1];l.end>e-3&&u.start<3&&(c[0]={start:l.start,end:u.end},c.pop())}return c}function cc(t,e,n){function o(h,g){return h<=g?g-h+1:n-h+(g+1)}function s(h,g,p){return h<=g?p>=h&&p<=g:p>=h||p<=g}let r=o(t.start,t.end),i=o(e.start,e.end),a=r<=i?t.start:e.start,f=r<=i?t.end:e.end,c=r<=i?e.start:t.start,d=r<=i?e.end:t.end,u=0;for(let h=a;s(c,d,h)&&u++,h!==f;h=(h+1)%n);let l=r+i-u;return l>0?u/l:0}function uc(t){if(t.length<2)return[];let e=[],n=.15,o=1.22,s=1.92;for(let a=0;a<t.length;a++){let f=t[a];for(let c=a+1;c<t.length;c++){let d=t[c],u=f.bx-f.ax,l=f.bz-f.az,h=d.bx-d.ax,g=d.bz-d.az,p=Math.sqrt(u*u+l*l),b=Math.sqrt(h*h+g*g);if(p<.01||b<.01)continue;let m=Math.abs(Math.atan2(u*g-l*h,u*h+l*g));if(m<o||m>s)continue;let x=[{x:f.ax,z:f.az},{x:f.bx,z:f.bz}],y=[{x:d.ax,z:d.az},{x:d.bx,z:d.bz}];for(let w of x)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 a=0;a<e.length;a++){if(i[a])continue;let f=e[a].x,c=e[a].z,d=1;i[a]=!0;for(let u=a+1;u<e.length;u++){if(i[u])continue;let l=e[u].x-f/d,h=e[u].z-c/d;Math.sqrt(l*l+h*h)<.3&&(f+=e[u].x,c+=e[u].z,d++,i[u]=!0)}r.push({x:f/d,z:c/d})}return r}function ci(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],_=t[(S+1)%o],C=D.x-R.x,I=D.z-R.z,H=_.x-D.x,A=_.z-D.z,L=Math.sqrt(C*C+I*I),O=Math.sqrt(H*H+A*A);if(L<.001||O<.001){s.push(0);continue}s.push(Math.atan2((C*A-I*H)/(L*O),(C*H+I*A)/(L*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 a=.008,f=[],c=-1,d=0,u=new Set;for(let S=0;S<o*2;S++){let R=S%o,D=r[R],_=D>=0?1:-1;if(Math.abs(D)>a&&(d===0||d===_))c<0&&(c=R,d=_);else if(c>=0){let C=(R-1+o)%o,I=0,H=0;for(let A=c;I+=Math.abs(r[A]),H++,A!==C;A=(A+1)%o);if(H>=n.minCurvePoints&&I>n.minCurveAngle){let A=`${c},${C}`;u.has(A)||(u.add(A),f.push({start:c,end:C,sign:d}))}c=-1,d=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(C=>Math.abs(C)>.001).map(C=>Math.abs(C)),R=S.length>0?Math.max(...S):0,D=S.length>0?S.reduce((C,I)=>C+I,0)/S.length:0,_=f.reduce((C,I)=>{let H=0;for(let A=I.start;H++,A!==I.end;A=(A+1)%o);return C+H},0)}let l=ac(t,o),h=lc(t,o),g=[...f,...l.map(S=>({start:S.start,end:S.end,sign:1})),...h.map(S=>({start:S.start,end:S.end,sign:1}))],p=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 _=0;for(let G=1;G<D.length;G++)r[(S.start+G-1)%o]*r[(S.start+G)%o]<-1e-8&&_++;let{cx:C,cz:I,r:H,rmsResidual:A}=pn(D),L=0,O=0;for(let G=1;G<D.length;G++){let Q=D[G-1].x-C,q=D[G-1].z-I,X=D[G].x-C,Y=D[G].z-I,it=Math.atan2(Q*Y-q*X,Q*X+q*Y);L+=Math.abs(it),O+=it}let N=Te(D),k=_===0?.12:.08;if(H>.1&&A>k||H>.1&&H>Math.max(N*15,8)||Math.abs(O)<.05)return null;let B=R<p?"turning":"sliding",$=B!=="turning"?Math.abs(O)>.35?"C_curve":"S_curve":_>0?"S_curve":"C_curve";return{seg:{points:D,type:$,radius:H,centerX:C,centerZ:I,arcAngle:L,arcLength:N},start:S.start,end:S.end,source:B}}).filter(S=>S!==null),x=new Set;function y(S,R){return S<=R?R-S+1:o-S+(R+1)}function w(S,R,D,_){for(let C=S;;C=(C+1)%o){let I;if(D<=_?I=C>=D&&C<=_:I=C>=D||C<=_,!I)return!1;if(C===R)break}return!0}for(let S=0;S<m.length;S++)if(!x.has(S))for(let R=S+1;R<m.length;R++){if(x.has(R))continue;if(cc({start:m[S].start,end:m[S].end},{start:m[R].start,end:m[R].end},o)>.6){let C=(m[S].seg.arcAngle>=m[R].seg.arcAngle?S:R)===S?R:S;if(m[S].seg.arcAngle>=m[R].seg.arcAngle)x.add(R);else{x.add(S);break}}else{let _=y(m[S].start,m[S].end),C=y(m[R].start,m[R].end),I=_<=C?S:R,H=_<=C?R:S;w(m[I].start,m[I].end,m[H].start,m[H].end)&&y(m[I].start,m[I].end)/y(m[H].start,m[H].end)<.7&&x.add(I)}}let z=m.filter((S,R)=>!x.has(R)),M=10,P=10,E=30,T=15,V=[],W=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,_)=>D.start-_.start),R=S[0];for(let D=1;D<S.length;D++){let _=S[D],C=_.start-R.end;C<0&&(R.end>o*.5&&_.start<o*.5?C=_.start+o-R.end:C=0);let I=C===0,H=C<=E&&I;if(!H&&C<=E){let A=Math.sqrt((R.seg.centerX-_.seg.centerX)**2+(R.seg.centerZ-_.seg.centerZ)**2),L=Math.max(R.seg.radius,_.seg.radius),O=Math.min(R.seg.radius,_.seg.radius),N=O>0?L/O:99;H=A<P&&N<M}if(H){let A=Math.min(R.start,_.start),L=Math.max(R.end,_.end),O=[];for(let G=A;O.push({...t[G]}),G!==L;G=(G+1)%o);let{cx:N,cz:k,r:B}=pn(O),$=0;for(let G=1;G<O.length;G++){let Q=O[G-1].x-N,q=O[G-1].z-k,X=O[G].x-N,Y=O[G].z-k;$+=Math.abs(Math.atan2(Q*Y-q*X,Q*X+q*Y))}R={seg:{points:O,type:"C_curve",radius:B,centerX:N,centerZ:k,arcAngle:$,arcLength:Te(O)},start:R.start,end:_.end,source:R.source},W++}else V.push(R),R=_}V.push(R)}{if(V.length>1){let R=V.map((D,_)=>{if(_===0)return 0;let C=D.start-V[_-1].end;return C<0&&(C=D.start+o-V[_-1].end),C})}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],_=V[R].start-D.end;if(_<0&&(_=V[R].start+o-D.end),_<=30){let C=[...D.seg.points];for(let O=(D.end+1)%o;C.push({...t[O]}),O!==V[R].end;O=(O+1)%o);let{cx:I,cz:H,r:A}=pn(C),L=0;for(let O=1;O<C.length;O++){let N=C[O-1].x-I,k=C[O-1].z-H,B=C[O].x-I,$=C[O].z-H;L+=Math.abs(Math.atan2(N*$-k*B,N*B+k*$))}S[S.length-1]={seg:{points:C,type:"C_curve",radius:A,centerX:I,centerZ:H,arcAngle:L,arcLength:Te(C)},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 fc(t){let e=t.length;if(e<6)return null;let n=ic(t,e,.35);if(n.length===0)return null;let o=n.filter(l=>l.actualAngle!=null&&l.actualAngle>.17);if(o.length===0)return null;o.sort((l,h)=>{let g=l.end>=l.start?l.end-l.start+1:e-l.start+l.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 l=s.start;r.push({...t[l]}),l!==s.end;l=(l+1)%e);if(r.length<10)return null;let{cx:i,cz:a,r:f,rmsResidual:c}=pn(r);if(f>.1&&c>.1)return null;let d=s.actualAngle,u=r.reduce((l,h,g)=>g===0?0:l+Math.hypot(h.x-r[g-1].x,h.z-r[g-1].z),0);return f>.3&&d>.17?{points:r,type:"C_curve",radius:f,centerX:i,centerZ:a,arcAngle:d,arcLength:u}:null}function bo(t,e,n){let o={...us,...n},s=Date.now(),r=t,i=Array.isArray(e)?e:[],a=[];if(i.length>10)try{for(let S of i){let R=S.x1,D=S.z1,_=S.x2,C=S.z2;if(R==null||D==null||_==null||C==null){let I=S.start?.x,H=S.start?.y,A=S.end?.x,L=S.end?.y;if(I==null||H==null||A==null||L==null)continue;a.push({ax:I,az:H,bx:A,bz:L})}else a.push({ax:R,az:D,bx:_,bz:C})}let v=.1*.1;if(a.length>5){let S=[],R=[],D=new Array(a.length).fill(0);for(let C of t){let I=1/0,H=-1;for(let A=0;A<a.length;A++){let L=a[A],O=L.bx-L.ax,N=L.bz-L.az,k=O*O+N*N,B;if(k<1e-8)B=(C.x-L.ax)**2+(C.y-L.az)**2;else{let $=((C.x-L.ax)*O+(C.y-L.az)*N)/k;$=Math.max(0,Math.min(1,$));let G=L.ax+$*O,Q=L.az+$*N;B=(C.x-G)**2+(C.y-Q)**2}if(B<I&&(I=B,H=A),I<=v)break}I<=v&&(R.push(C),S.push(H),D[H]++)}let _=R;if(o.lineDensityMin>0&&o.lineDensityMinLen>0){let C=new Set;for(let I=0;I<a.length;I++){let H=a[I],A=Math.hypot(H.bx-H.ax,H.bz-H.az);if(A>=o.lineDensityMinLen)continue;(A>.01?D[I]/A:0)<o.lineDensityMin&&C.add(I)}if(C.size>0){let I=[];for(let H=0;H<R.length;H++)C.has(S[H])||I.push(R[H]);_=I}}r=_}}catch(v){console.warn("[\u70B9\u4E91\u8F6E\u5ED3] \u7EBF\u6BB5\u8FC7\u6EE4\u5931\u8D25:",v)}let f=uc(a),c=[];for(let v of r){let S=v.z;S<o.heightMin||S>o.heightMax||c.push({x:v.x,z:v.y})}if(c.length<50)return Je(e,s);if(o.sparseRadius>0){let v=new Map,S=o.cellSize;for(let C of c){let I=`${Math.round(C.x/S)},${Math.round(C.z/S)}`;v.has(I)||v.set(I,[]),v.get(I).push(C)}let R=[],D=Math.ceil(o.sparseRadius/S);for(let C=-D;C<=D;C++)for(let I=-D;I<=D;I++)R.push(`${C},${I}`);let _=[];for(let C of c){let I=Math.round(C.x/S),H=Math.round(C.z/S),A=0;for(let L of R){let[O,N]=L.split(",").map(Number),k=v.get(`${I+O},${H+N}`);if(k&&(A+=k.length),A>=o.sparseMinNeighbors)break}A>=o.sparseMinNeighbors&&_.push(C)}c.length=0;for(let C=0;C<_.length;C++)c.push(_[C])}if(c.length<50)return Je(e,s);let d=Date.now(),{cells:u}=yo(c,o.cellSize),l=new Set;if(o.densityRatio>0&&u.size>10){let v=Array.from(u.values()).sort((D,_)=>D-_),S=v[Math.floor(v.length/2)],R=Math.max(o.densityThreshold,Math.ceil(S*o.densityRatio));for(let[D,_]of u)_>=R&&l.add(D);if(l.size<o.minComponentCells){l.clear();for(let[D,_]of u)_>=o.densityThreshold&&l.add(D)}}else for(let[v,S]of u)S>=o.densityThreshold&&l.add(v);if(l.size<o.minComponentCells)return Je(e,s);let h=l;o.closeIterations>0&&(h=Ln(l,o.closeIterations));let g=Date.now(),p=ls(h).filter(v=>v.size>=o.minComponentCells);p.sort((v,S)=>S.size-v.size);let b=20;p.length>b&&(p=p.slice(0,b));let m=Date.now(),x=[];for(let v of p){let S=cs(v,o.cellSize);S.length>=4&&x.push(S)}let y=Date.now(),w=x.map(v=>{let S=kn(v,o.simplifyEpsilon);if(S.length>=7)for(let R=0;R<2;R++){let D=S.length,_=S.map(C=>({x:C.x,z:C.z}));for(let C=0;C<D;C++){let I=S[(C-1+D)%D],H=S[C],A=S[(C+1)%D],L=H.x-I.x,O=H.z-I.z,N=A.x-H.x,k=A.z-H.z,B=Math.sqrt(L*L+O*O),$=Math.sqrt(N*N+k*k);if(B<.001||$<.001)continue;if(Math.abs(Math.atan2(L*k-O*N,L*N+O*k))>1.8){let Q=[-2,-1,0,1,2].map(Y=>S[(C+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);_[C]={x:q[2],z:X[2]}}}S=_}if(S=as(S),f.length>0&&S.length>=5)for(let R of f){let D=1/0,_=-1;for(let C=0;C<S.length;C++){let I=S[C].x-R.x,H=S[C].z-R.z,A=I*I+H*H;A<D&&(D=A,_=C)}_>=0&&D<.3*.3&&(S[_]={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 _=v[(D-1+v.length)%v.length],C=v[(D+1)%v.length],I=C.x-_.x,H=C.z-_.z;if(Math.sqrt(I*I+H*H)<.001)return{...R};let L=S?H:-H,O=S?-I:I,N=Math.sqrt(L*L+O*O);return N<.001?{...R}:{x:R.x+L/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:Te(S),pointCount:S.length,type:"straight",isMain:!1})}let V=Date.now()-s,W=[];for(let v of w){let S=ci(v);for(let D of S)W.push(D);let R=fc(v);R&&W.push(R)}return{mainWalls:[],noiseWalls:[],contours:T,curvedSegments:W,filteredPoints:r,stats:{totalRawLines:e?.length??t.length,totalWalls:0,mainCount:0,noiseCount:T.length,elapsedMs:V}}}function ui(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 Je(t,i);let a=t.map(T=>({x1:T.x1,z1:T.z1,x2:T.x2,z2:T.z2})),{active:f}=ai(a,n);if(f.size<s)return Je(t,i);let c=Date.now(),d=Ln(f,o),u=Date.now(),l=ls(d).filter(T=>T.size>=s);if(l.length===0)return Je(t,i);let h=l.reduce((T,V)=>T.size>=V.size?T:V),g=Date.now(),p=cs(h,n);if(p.length<4)return Je(t,i);let b=Date.now(),m=kn(p,r);if(m=as(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 x=n/2;function y(T){let V=0;for(let W=0;W<T.length;W++){let v=(W+1)%T.length;V+=T[W].x*T[v].z-T[v].x*T[W].z}return V/2}let w=y(m)>=0,z=m.map((T,V)=>{let W=m[(V-1+m.length)%m.length],v=m[(V+1)%m.length],S=v.x-W.x,R=v.z-W.z;if(Math.sqrt(S*S+R*R)<.001)return{...T};let _=w?R:-R,C=w?-S:S,I=Math.sqrt(_*_+C*C);return I<.001?{...T}:{x:T.x+_/I*x,z:T.z+C/I*x}}),M=Date.now(),P=[];z.length>=3&&P.push({id:-1,points:z,length:Te(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 Je(t,e){return{mainWalls:[],noiseWalls:[],stats:{totalRawLines:t?.length??0,totalWalls:0,mainCount:0,noiseCount:0,elapsedMs:Date.now()-e}}}function wo(t,e,n){if(!t.length||n<=1)return t;let o=new Map;for(let a of t){let f=Math.floor(a.x/e),c=Math.floor(a.y/e),d=`${f},${c}`;o.has(d)||o.set(d,[]),o.get(d).push(a)}let s=new Map;for(let[a,f]of o){let[c,d]=a.split(","),u=parseInt(c),l=parseInt(d),h=0;for(let g=-2;g<=2;g++)for(let p=-2;p<=2;p++){let b=`${u+g},${l+p}`;h+=o.get(b)?.length??0}s.set(a,h)}let r=[],i=0;for(let a of t){let f=Math.floor(a.x/e),c=Math.floor(a.y/e),d=`${f},${c}`;(s.get(d)??0)>=n?r.push(a):i++}return r}function zo(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),a=Math.floor(r.y/e),f=Math.floor(r.z/e),c=`${i},${a},${f}`;o.has(c)||o.set(c,[]),o.get(c).push(r)}let s=[];for(let r of o.values())if(r.length>=n){let i=r.reduce((c,d)=>c+d.x,0)/r.length,a=r.reduce((c,d)=>c+d.y,0)/r.length,f=r.reduce((c,d)=>c+d.z,0)/r.length;s.push({x:i,y:a,z:f})}return s}function fi(t,e,n){let o=zo(t,e,n),s=t.length-o.length;return o}function di(t){let e=[];for(let c of t){let d=c.originalPoints??c.points??[];if(!Array.isArray(d)||d.length<2)continue;let u=Math.min(d.length,200);for(let l=1;l<u;l++){let h=Math.hypot(d[l].x-d[l-1].x,d[l].y-d[l-1].y,d[l].z-d[l-1].z);h>.001&&e.push(h)}}let n={voxelSize:.08,minPoints:3,minCentroids:3};if(e.length<10)return n;e.sort((c,d)=>c-d);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))),a=e.length/Math.max(1,t.length),f=Math.max(2,Math.min(4,Math.round(a/50)));return{voxelSize:s,minPoints:i,minCentroids:f}}function hi(t,e,n,o,s=3){if(!t.length||n<=0||o<=1)return{data:t,lines:e,removedCount:0};let r=[],i=[],a=0;for(let f=0;f<t.length;f++){let c=t[f],d=c.originalPoints??c.points??[];if(!Array.isArray(d)||d.length===0){r.push(c),i.push(e[f]);continue}let u=zo(d,n,o);u.length>=s?(c.originalPoints&&(c.originalPoints=u),c.points&&(c.points=u),r.push(c),i.push(e[f])):a++}return{data:r,lines:i,removedCount:a}}function mi(t,e,n,o){let s=[],r=[],i=0;for(let a=0;a<t.length;a++){let f=t[a],c=f.originalPoints??f.points??[],u=(Array.isArray(c)?c.filter(b=>b&&b.x!==void 0&&b.y!==void 0):[]).length;if(u===0){s.push(f),r.push({...e[a],id:s.length-1});continue}let l=f.start??f,h=f.end??f,g=Math.hypot(h.x??0-l.x??0,h.y??0-l.y??0);if(g>=o||g<=.01){s.push(f),r.push({...e[a],id:s.length-1});continue}if(u/g<n){i++;continue}s.push(f),r.push({...e[a],id:s.length-1})}return{data:s,lines:r}}function tn(t,e,n,o,s,r){let i=s-n,a=r-o,f=i*i+a*a;if(f===0)return Math.hypot(t-n,e-o);let c=((t-n)*i+(e-o)*a)/f;return c=Math.max(0,Math.min(1,c)),Math.hypot(t-(n+c*i),e-(o+c*a))}function fs(t,e,n=.2){for(let o of e)if(tn(o.x,o.z,t.x1,t.z1,t.x2,t.z2)<=n)return!0;return!1}function gi(t,e,n=.2){let o=1/0,s={x:0,z:0};for(let i of e){let a=tn(i.x,i.z,t.x1,t.z1,t.x2,t.z2);a<o&&(o=a,s=i)}return o<=n}function pi(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 p(y,w,z,M){for(let P=0;P<z.points.length-1;P++)if(tn(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)||p(P.x,P.z,T,z)){M++;break}for(let T of w)if(g(E.x,E.z,T,z)||p(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 x=[];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,W=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=${W}/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)`),x.push(y);continue}if(P<.15)if(W>=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=W>=2?.025:.035;if(V<D&&!v&&!R&&!S){o&&console.log(` \u2192 \u5F13\u9AD8/\u5F26\u957F=${V.toFixed(4)} < ${D}(${W>=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&&W<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,C=Math.floor(w.length/2),I=w[C].x-w[0].x,H=w[C].z-w[0].z,A=w[w.length-1].x-w[C].x,L=w[w.length-1].z-w[C].z,O=Math.atan2(H,I),N=Math.atan2(L,A),k=Math.abs(N-O);if(k>Math.PI&&(k=2*Math.PI-k),k>60*Math.PI/180&&k>y.arcAngle*_){o&&console.log(` \u2192 V\u5F62\u62D0\u89D2\u8FC7\u6EE4 \u8F6C\u89D2=${(k*180/Math.PI).toFixed(1)}\xB0 > \u5F27\u89D2\xD7${_.toFixed(1)}=${(y.arcAngle*180/Math.PI*_).toFixed(1)}\xB0`);continue}}if(n&&n.length>5&&!(y.radius>15&&y.arcAngle>.26)){let _=w[0],C=w[w.length-1],I=.3,H=null,A=1/0,L=null,O=1/0;for(let N of n){let k=tn(_.x,_.z,N.x1,N.z1,N.x2,N.z2),B=tn(C.x,C.z,N.x1,N.z1,N.x2,N.z2);k<I&&k<A&&(H=N,A=k),B<I&&B<O&&(L=N,O=B)}if(!H||!L)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=${!!L}(d=${O.toFixed(3)})`);else if(H===L){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,k=H.z2-H.z1,B=L.x2-L.x1,$=L.z2-L.z1,G=Math.sqrt(N*N+k*k),Q=Math.sqrt(B*B+$*$);if(G>.01&&Q>.01){let q=Math.abs(Math.atan2(N*$-k*B,N*B+k*$)),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"),x.push(y)}return o&&console.log(`[\u56DE\u52A0\u5224\u65AD] ${t.length} \u2192 ${x.length} \u4E2A\u5F27\u6BB5`),x}function xi(t,e){for(let n=0;n<t.length;n++){let o=t[n],s=[];for(let i of e)fs(i,o.points)&&s.push({id:i.id,len:Math.hypot(i.x2-i.x1,i.z2-i.z1)});s.sort((i,a)=>a.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 hs={gridSize:2,connectDist:.8,angleTol:25,minLength:.8,minPointCount:3,hardCornerThreshold:30,minArea:5,minCurvePoints:6,curveStraightDist:.25,longWallMinLength:5};function yi(t){if(!t.length)return{rotated:[],mainAngle:0};let e=180,n=new Array(e).fill(0),o=Math.PI/e;for(let d of t){let u=d.x2-d.x1,l=d.z2-d.z1,h=Math.sqrt(u*u+l*l);if(h<.01)continue;let g=Se(u,l),p=Math.floor(g/o);p>=e&&(p=e-1),n[p]+=h}let s=new Array(e).fill(0),r=5;for(let d=0;d<e;d++){let u=0;for(let l=-r;l<=r;l++){let h=d+l;h<0&&(h+=e),h>=e&&(h-=e),u+=n[h]}s[d]=u}let i=0,a=0;for(let d=0;d<e;d++)s[d]>i&&(i=s[d],a=d);let f=(a+.5)*o;return{rotated:t.map(d=>{let u=Hn(d.x1,d.z1,-f),l=Hn(d.x2,d.z2,-f);return{...d,x1:u.x,z1:u.z,x2:l.x,z2:l.z}}),mainAngle:f}}function bi(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),a=Math.floor(r/e),f=`${i},${a}`;n.has(f)||n.set(f,[]),n.get(f).push(o)}return n}function wi(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],a=[],f=new Set([r.id]);o.add(r.id);let c=!0;for(;c;){c=!1;let l=i[i.length-1],h=l.x2,g=l.z2,p=Se(l.x2-l.x1,l.z2-l.z1),b=null,m=e;for(let x of t){if(o.has(x.id))continue;let y=we(h,g,x.x1,x.z1),w=we(h,g,x.x2,x.z2),z=w<y,M=Math.min(y,w);if(M>m)continue;let P=z?Se(x.x1-x.x2,x.z1-x.z2):Se(x.x2-x.x1,x.z2-x.z1);Math.abs(Wn(P-p))>n||(b=x,m=M)}if(b){o.add(b.id),f.add(b.id);let x=i[i.length-1],y=we(x.x2,x.z2,b.x1,b.z1),w=we(x.x2,x.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}),c=!0}}for(c=!0;c;){c=!1;let l=a.length>0?a[a.length-1]:i[0],h=a.length>0?l.x2:l.x1,g=a.length>0?l.z2:l.z1,p=a.length>0?Se(l.x2-l.x1,l.z2-l.z1):Se(l.x2-l.x1,l.z2-l.z1),b=null,m=e;for(let x of t){if(o.has(x.id))continue;let y=we(h,g,x.x1,x.z1),w=we(h,g,x.x2,x.z2),z=w<y,M=Math.min(y,w);if(M>m)continue;let P=z?Se(x.x1-x.x2,x.z1-x.z2):Se(x.x2-x.x1,x.z2-x.z1);Math.abs(Wn(P-p))>n||(b=x,m=M)}if(b){o.add(b.id),f.add(b.id);let x=we(h,g,b.x1,b.z1),y=we(h,g,b.x2,b.z2);x<=y?a.push({id:b.id,x1:b.x2,z1:b.z2,x2:b.x1,z2:b.z1}):a.push({...b}),c=!0}}let d=[];for(let l=a.length-1;l>=0;l--){let h=a[l];l===a.length-1&&d.push({x:h.x1,z:h.z1}),d.push({x:h.x2,z:h.z2})}for(let l=0;l<i.length;l++){let h=i[l];l===0&&d.length===0&&d.push({x:h.x1,z:h.z1}),d.push({x:h.x2,z:h.z2})}let u=[];for(let l of d){if(u.length>0){let h=u[u.length-1];if(Math.abs(l.x-h.x)<.001&&Math.abs(l.z-h.z)<.001)continue}u.push(l)}if(u.length>=2){let l=Te(u);s.push({points:u,length:l,pointCount:i.length+a.length,lineIds:[...f]})}}return s}function zi(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,a=Math.atan2(s,o),f=Math.atan2(i,r),c=Wn(f-a);e.push(c)}return e}function Mi(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 d=0;for(let u of t){let l=An(u.x,u.z,n.x,n.z,o.x,o.z);l>d&&(d=l)}if(d<.05)return"straight"}let a=zi(t);if(a.reduce((d,u)=>d+Math.abs(u),0)<.1||t.length<e)return"straight";let c=0;for(let d=0;d<a.length-1;d++)a[d]*a[d+1]<0&&c++;return c>0?"S_curve":"C_curve"}function Ei(t,e){if(t.length<3)return[t];let n=xo(e),o=zi(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 Pi(t,e,n=6){let o=[],s=0;for(let r of t){let i=Ei(r.points,e);for(let a of i){if(a.length<2)continue;let f=Mi(a,n),c=Te(a),d=c/(r.length||1),u=Math.max(1,Math.round(r.pointCount*d));o.push({id:s++,points:a,length:c,pointCount:u,lineIds:r.lineIds,type:f,isMain:!1})}}return o}function Si(t,e){if(t.length<3)return new Set;let n=.15;function o(c,d){return Math.round(c/n)+"_"+Math.round(d/n)}let s=new Map,r=0;function i(c,d){let u=o(c,d),l=s.get(u);if(l)return l;let h=Math.round(c/n),g=Math.round(d/n),p=null,b=n*n;for(let m=-1;m<=1;m++)for(let x=-1;x<=1;x++){let y=h+m+"_"+(g+x),w=s.get(y);if(!w)continue;let z=w.x-c,M=w.z-d,P=z*z+M*M;P<b&&(b=P,p=w)}return p?(s.set(u,p),p):(l={id:r++,x:c,z:d,edges:[]},s.set(u,l),l)}for(let c of t){if(c.points.length<2)continue;let d=c.points[0],u=c.points[c.points.length-1],l=i(d.x,d.z),h=i(u.x,u.z);if(l.id===h.id)continue;let g={to:h,wallId:c.id,visited:!1,twin:null},p={to:l,wallId:c.id,visited:!1,twin:g};g.twin=p,l.edges.push(g),h.edges.push(p)}for(let c of s.values())c.edges.sort((d,u)=>{let l=Math.atan2(d.to.z-c.z,d.to.x-c.x),h=Math.atan2(u.to.z-c.z,u.to.x-c.x);return l-h});let a=new Set,f=new Set;for(let c of s.values())for(let d of c.edges)f.add(d);for(let c of f){if(c.visited)continue;let d=[],u=c,l=f.size+10;for(;!u.visited&&d.length<l;){u.visited=!0,d.push(u);let h=u.to,g=u.twin,p=h.edges.indexOf(g);if(p<0)break;let b=(p+1)%h.edges.length;u=h.edges[b]}if(d.length>=3){let h=d[0];if(d[d.length-1].to.id===h.from?.id){let p=[],b=new Set,m=null;for(let x of s.values())if(x.edges.includes(d[0])){m=x;break}if(!m)continue;p.push({x:m.x,z:m.z});for(let x of d)b.add(x.wallId),p.push({x:x.to.x,z:x.to.z});if(d[d.length-1].to.id===m.id&&is(p)>=e)for(let y of b)a.add(y)}}}return a}function xn(t,e){let n={...hs,...e},o=Date.now(),{rotated:s,mainAngle:r}=yi(t),i=Date.now(),a=bi(s,n.gridSize),f=Date.now(),c=xo(n.angleTol),d=[];for(let v of a.values()){let S=v.map(D=>({id:D.id,x1:D.x1,z1:D.z1,x2:D.x2,z2:D.z2})),R=wi(S,n.connectDist,c);d.push(...R)}let u=Date.now(),l=new Set,h=d.filter(v=>{let S=v.length>=n.minLength||v.pointCount>=n.minPointCount;return S&&l.add(v),S}),g=d.filter(v=>!l.has(v)),p=Date.now(),b=Pi(h,n.hardCornerThreshold,n.minCurvePoints),m=Date.now(),x=Si(b,n.minArea);b.forEach(v=>{v.isMain=x.has(v.id),v.length>=n.longWallMinLength&&(v.isMain=!0)});let y=Date.now();function w(v,S,R=.1){let D=v[0],_=v[v.length-1],C=S[0],I=S[S.length-1];return Math.hypot(D.x-C.x,D.z-C.z)<R||Math.hypot(D.x-I.x,D.z-I.z)<R||Math.hypot(_.x-C.x,_.z-C.z)<R||Math.hypot(_.x-I.x,_.z-I.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(ii(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=>Hn(R.x,R.z,r))})),W=Date.now()-o;return{mainWalls:V(E),noiseWalls:V(T),stats:{totalRawLines:t.length,totalWalls:b.length,mainCount:E.length,noiseCount:T.length,elapsedMs:W}}}function ms(t,e,n){let o={...us,...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 xn(e);let{cells:i}=yo(r,o.cellSize),a=new Set;for(let[h,g]of i)g>=o.densityThreshold&&a.add(h);let f=Ln(a,o.morphIterations),c=[],d={total:0,lowDensity:0};for(let h of e){let g=h.x1,p=h.z1,b=h.x2,m=h.z2;if(Math.sqrt((b-g)**2+(m-p)**2)<.3){c.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=p+(m-p)*M,T=Math.floor(P/o.cellSize),V=Math.floor(E/o.cellSize);f.has(T+","+V)&&y++}y>=Math.ceil(w*.5)?c.push(h):d.lowDensity++,d.total++}if(c.length<5)return xn(e);let u=xn(c),l=Date.now()-s;return u}function ds(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 gs(t,e,n){let o={outlierEnabled:!0,outlierCellSize:.1,outlierMinNeighbors:3,densityFilterEnabled:!1,...n},s=Date.now(),r=xn(t),i=r.mainWalls,a=r.noiseWalls,f=new Set(i.map(M=>M.id)),c=[];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&&c.push({x:E.x,y:E.y,z:E.z})}let d=c.length,u=c;o.outlierEnabled&&u.length>0&&(u=wo(u,o.outlierCellSize,o.outlierMinNeighbors));let l=[],h=[];if(u.length>=100){let M=o.pcConfig??{},P=bo(u,t,{cellSize:.05,densityThreshold:1,minComponentCells:8,simplifyEpsilon:.008,heightMin:.3,heightMax:2.8,closeIterations:8,densityRatio:.12,...M});l=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,W=1/0,v=-1/0;for(let D of E)D.x<T&&(T=D.x),D.x>V&&(V=D.x),D.z<W&&(W=D.z),D.z>v&&(v=D.z);let S=[];for(let D of t)gi(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 p;if(o.densityFilterEnabled&&u.length>0&&i.length>0){let M=new Set(r.mainWalls.map(T=>T.id)),P=t.filter(T=>M.has(T.id));p=ms(u,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 x=t.filter(M=>b.has(M.id)).map(ds),y=t.filter(M=>m.has(M.id)).map(ds),w;if(p&&p.length>0){let M=new Set;for(let P of p)if(P.lineIds)for(let E of P.lineIds)M.add(E);w=t.filter(P=>M.has(P.id)).map(ds)}let z=Date.now()-s;return{mainWalls:x,noiseWalls:y,contours:l,curvedSegments:h,lineCurves:g.length>0?g:void 0,filteredPoints:u,secondMainWalls:w,stats:{totalRawLines:t.length,firstMainCount:x.length,firstNoiseCount:y.length,contourCount:l.length,curvedCount:h.length,secondMainCount:p?.length,mainWallPointCount:d,filteredPointCount:u.length,elapsedMs:z}}}function Ti(t,e){let n=Array.isArray(t)?t:t?.data??[],o=[],s=[];for(let a=0;a<n.length;a++){let f=n[a],c=f.start??f,d=f.end??f;o.push({id:a,x1:c.x??0,y1:c.z??0,z1:c.y??0,x2:d.x??0,y2:d.z??0,z2:d.y??0});let u=f.originalPoints??f.points??[],l=Array.isArray(u)?u.filter(h=>h&&h.x!==void 0):[];s.push(l)}let r=gs(o,s,e),i=Array.isArray(t)?{data:t}:{...t};return i.lineCurves=r.lineCurves??[],i.lineCurveNum=r.curvedSegments?.length??0,i}export{hs as CONFIG,lo as analyzeDoorQuad,Xe as analyzeQuad,zo as applyVoxelFilter,go as attachWindows,Qe as calcAngle,aa as checkBeamIsReasonable,li as classifyWallByPointCloudPCA,xn as classifyWallShapes,hl as computeContour,Ue as computeDoorLocalFloorZ,Ge as computeLocalFloorZ,di as computeVoxelParams,mi as densityPreFilter,hn as detectDoorPerpendicularWalls,Jl as detectPerpWalls,vn as detectPerpendicularWalls,tl as drawStaircase,pi as filterFalseArcCurves,si as filterWalls,ri as filterWallsHard,_n as findDoorWalls,ti as findMainByLoops,Cn as findWindowWalls,ia as getBeamLine,da as getColLine,ki as getLineCheckResults,mn as getMatcherAPI,nl as getMergeFloorMeaning,el as getMergeMeaning,Ai as getOneLineCheckResults,Bi as getOneLineClusterResults,ol as getStaircase,fs as isRawLineNearArc,xi as logArcRawSegments,Ul as matchWalls,oi as mergeCollinear,Ze as mergeCollinearSegments,Ke as mergeDoorCollinearSegments,Ql as mergeWallSegments,ho as normalizeAngles,jt as pointToDoorSegmentDist,fo as pointToSegDist,tn as pointToSegDist2D,Ce as pointToSegmentDist,Qo as processData,os as processDoorData,ms as processFilteredByPointCloud,bo as processFromPointCloud,ui as processFromSegments,oc as processPipeline,Ti as processSegments,Kl as processWallData,wo as removeOutlierPoints,Ie as rotateXZ,gs as runMainWallPipeline,ei as spatialGrid,In as splitDoorWallSegment,tc as splitWallSeg,Vn as splitWallSegment,Gi as updateStEdPoint,fi as voxelFilter,hi as voxelFilterLines};
|