rm-graphical-computing-node 1.0.15 → 1.0.16
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 mi=Object.create;var as=Object.defineProperty;var gi=Object.getOwnPropertyDescriptor;var pi=Object.getOwnPropertyNames;var xi=Object.getPrototypeOf,yi=Object.prototype.hasOwnProperty;var Be=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var bi=(t,e,n,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of pi(e))!yi.call(t,r)&&r!==n&&as(t,r,{get:()=>e[r],enumerable:!(o=gi(e,r))||o.enumerable});return t};var wi=(t,e,n)=>(n=t!=null?mi(xi(t)):{},bi(e||!t||!t.__esModule?as(n,"default",{value:t,enumerable:!0}):n,t));var Hs=Be((Ro,Do)=>{(function(t,e){typeof Ro=="object"&&typeof Do<"u"?Do.exports=e():typeof define=="function"&&define.amd?define(e):(t=t||self,t.RBush=e())})(Ro,function(){"use strict";function t(y,w,z,M,P){e(y,w,z||0,M||y.length-1,P||o)}function e(y,w,z,M,P){for(;M>z;){if(M-z>600){var E=M-z+1,T=w-z+1,V=Math.log(E),_=.5*Math.exp(2*V/3),v=.5*Math.sqrt(V*_*(E-_)/E)*(T-E/2<0?-1:1),S=Math.max(z,Math.floor(w-T*_/E+v)),R=Math.min(M,Math.floor(w+(E-T)*_/E+v));e(y,w,S,R,P)}var D=y[w],W=z,I=M;for(n(y,z,w),P(y[M],D)>0&&n(y,z,M);W<I;){for(n(y,W,I),W++,I--;P(y[W],D)<0;)W++;for(;P(y[I],D)>0;)I--}P(y[z],D)===0?n(y,z,I):(I++,n(y,I,M)),I<=w&&(z=I+1),w<=I&&(M=I-1)}}function n(y,w,z){var M=y[w];y[w]=y[z],y[z]=M}function o(y,w){return y<w?-1:y>w?1:0}var r=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()};r.prototype.all=function(){return this._all(this.data,[])},r.prototype.search=function(w){var z=this.data,M=[];if(!b(w,z))return M;for(var P=this.toBBox,E=[];z;){for(var T=0;T<z.children.length;T++){var V=z.children[T],_=z.leaf?P(V):V;b(w,_)&&(z.leaf?M.push(V):p(w,_)?this._all(V,M):E.push(V))}z=E.pop()}return M},r.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},r.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},r.prototype.insert=function(w){return w&&this._insert(w,this.data.height-1),this},r.prototype.clear=function(){return this.data=m([]),this},r.prototype.remove=function(w,z){if(!w)return this;for(var M=this.data,P=this.toBBox(w),E=[],T=[],V,_,v;M||E.length;){if(M||(M=E.pop(),_=E[E.length-1],V=T.pop(),v=!0),M.leaf){var S=s(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,_=M,M=M.children[0]):_?(V++,M=_.children[V],v=!1):M=null}return this},r.prototype.toBBox=function(w){return w},r.prototype.compareMinX=function(w,z){return w.minX-z.minX},r.prototype.compareMinY=function(w,z){return w.minY-z.minY},r.prototype.toJSON=function(){return this.data},r.prototype.fromJSON=function(w){return this.data=w,this},r.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},r.prototype._build=function(w,z,M,P){var E=M-z+1,T=this._maxEntries,V;if(E<=T)return V=m(w.slice(z,M+1)),i(V,this.toBBox),V;P||(P=Math.ceil(Math.log(E)/Math.log(T)),T=Math.ceil(E/Math.pow(T,P-1))),V=m([]),V.leaf=!1,V.height=P;var _=Math.ceil(E/T),v=_*Math.ceil(Math.sqrt(T));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,_,this.compareMinY);for(var D=S;D<=R;D+=_){var W=Math.min(D+_-1,R);V.children.push(this._build(w,D,W,P-1))}}return i(V,this.toBBox),V},r.prototype._chooseSubtree=function(w,z,M,P){for(;P.push(z),!(z.leaf||P.length-1===M);){for(var E=1/0,T=1/0,V=void 0,_=0;_<z.children.length;_++){var v=z.children[_],S=c(v),R=h(w,v)-S;R<T?(T=R,E=S<E?S:E,V=v):R===T&&S<E&&(E=S,V=v)}z=V||z.children[0]}return z},r.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),u(T,P);z>=0&&E[z].children.length>this._maxEntries;)this._split(E,z),z--;this._adjustParentBBoxes(P,E,z)},r.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)},r.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)},r.prototype._chooseSplitIndex=function(w,z,M){for(var P,E=1/0,T=1/0,V=z;V<=M-z;V++){var _=l(w,0,V,this.toBBox),v=l(w,V,M,this.toBBox),S=g(_,v),R=c(_)+c(v);S<E?(E=S,P=V,T=R<T?R:T):S===E&&R<T&&(T=R,P=V)}return P||M-z},r.prototype._chooseSplitAxis=function(w,z,M){var P=w.leaf?this.compareMinX:d,E=w.leaf?this.compareMinY:f,T=this._allDistMargin(w,z,M,P),V=this._allDistMargin(w,z,M,E);T<V&&w.children.sort(P)},r.prototype._allDistMargin=function(w,z,M,P){w.children.sort(P);for(var E=this.toBBox,T=l(w,0,z,E),V=l(w,M-z,M,E),_=a(T)+a(V),v=z;v<M-z;v++){var S=w.children[v];u(T,w.leaf?E(S):S),_+=a(T)}for(var R=M-z-1;R>=z;R--){var D=w.children[R];u(V,w.leaf?E(D):D),_+=a(V)}return _},r.prototype._adjustParentBBoxes=function(w,z,M){for(var P=M;P>=0;P--)u(z[P],w)},r.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 s(y,w,z){if(!z)return w.indexOf(y);for(var M=0;M<w.length;M++)if(z(y,w[M]))return M;return-1}function i(y,w){l(y,0,y.children.length,w,y)}function l(y,w,z,M,P){P||(P=m(null)),P.minX=1/0,P.minY=1/0,P.maxX=-1/0,P.maxY=-1/0;for(var E=w;E<z;E++){var T=y.children[E];u(P,y.leaf?M(T):T)}return P}function u(y,w){return y.minX=Math.min(y.minX,w.minX),y.minY=Math.min(y.minY,w.minY),y.maxX=Math.max(y.maxX,w.maxX),y.maxY=Math.max(y.maxY,w.maxY),y}function d(y,w){return y.minX-w.minX}function f(y,w){return y.minY-w.minY}function c(y){return(y.maxX-y.minX)*(y.maxY-y.minY)}function a(y){return y.maxX-y.minX+(y.maxY-y.minY)}function h(y,w){return(Math.max(w.maxX,y.maxX)-Math.min(w.minX,y.minX))*(Math.max(w.maxY,y.maxY)-Math.min(w.minY,y.minY))}function g(y,w){var z=Math.max(y.minX,w.minX),M=Math.max(y.minY,w.minY),P=Math.min(y.maxX,w.maxX),E=Math.min(y.maxY,w.maxY);return Math.max(0,P-z)*Math.max(0,E-M)}function 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 r})});var As=Be((vo,Vo)=>{(function(t,e){typeof vo=="object"&&typeof Vo<"u"?Vo.exports=e():typeof define=="function"&&define.amd?define(e):(t=t||self,t.TinyQueue=e())})(vo,function(){"use strict";var t=function(o,r){if(o===void 0&&(o=[]),r===void 0&&(r=e),this.data=o,this.length=this.data.length,this.compare=r,this.length>0)for(var s=(this.length>>1)-1;s>=0;s--)this._down(s)};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],r=this.data.pop();return this.length--,this.length>0&&(this.data[0]=r,this._down(0)),o}},t.prototype.peek=function(){return this.data[0]},t.prototype._up=function(o){for(var r=this,s=r.data,i=r.compare,l=s[o];o>0;){var u=o-1>>1,d=s[u];if(i(l,d)>=0)break;s[o]=d,o=u}s[o]=l},t.prototype._down=function(o){for(var r=this,s=r.data,i=r.compare,l=this.length>>1,u=s[o];o<l;){var d=(o<<1)+1,f=s[d],c=d+1;if(c<this.length&&i(s[c],f)<0&&(d=c,f=s[c]),i(f,u)>=0)break;s[o]=f,o=d}s[o]=u};function e(n,o){return n<o?-1:n>o?1:0}return t})});var ks=Be((Qd,Ls)=>{Ls.exports=function(e,n,o,r){var s=e[0],i=e[1],l=!1;o===void 0&&(o=0),r===void 0&&(r=n.length);for(var u=(r-o)/2,d=0,f=u-1;d<u;f=d++){var c=n[o+d*2+0],a=n[o+d*2+1],h=n[o+f*2+0],g=n[o+f*2+1],p=a>i!=g>i&&s<(h-c)*(i-a)/(g-a)+c;p&&(l=!l)}return l}});var Os=Be((Jd,Bs)=>{Bs.exports=function(e,n,o,r){var s=e[0],i=e[1],l=!1;o===void 0&&(o=0),r===void 0&&(r=n.length);for(var u=r-o,d=0,f=u-1;d<u;f=d++){var c=n[d+o][0],a=n[d+o][1],h=n[f+o][0],g=n[f+o][1],p=a>i!=g>i&&s<(h-c)*(i-a)/(g-a)+c;p&&(l=!l)}return l}});var qs=Be((th,Zn)=>{var Fs=ks(),Ns=Os();Zn.exports=function(e,n,o,r){return n.length>0&&Array.isArray(n[0])?Ns(e,n,o,r):Fs(e,n,o,r)};Zn.exports.nested=Ns;Zn.exports.flat=Fs});var js=Be((Yn,$s)=>{(function(t,e){typeof Yn=="object"&&typeof $s<"u"?e(Yn):typeof define=="function"&&define.amd?define(["exports"],e):e((t=t||self).predicates={})})(Yn,function(t){"use strict";let n=33306690738754706e-32;function o(h,g,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 r(h){return new Float64Array(h)}let s=33306690738754716e-32,i=22204460492503146e-32,l=11093356479670487e-47,u=r(4),d=r(8),f=r(12),c=r(16),a=r(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)>=s*M?z:-(function(P,E,T,V,_,v,S){let R,D,W,I,C,H,A,k,O,N,L,B,$,G,Q,q,X,Y,it=P-_,ht=T-_,St=E-v,nt=V-v;C=(Q=(k=it-(A=(H=134217729*it)-(H-it)))*(N=nt-(O=(H=134217729*nt)-(H-nt)))-((G=it*nt)-A*O-k*O-A*N))-(L=Q-(X=(k=St-(A=(H=134217729*St)-(H-St)))*(N=ht-(O=(H=134217729*ht)-(H-ht)))-((q=St*ht)-A*O-k*O-A*N))),u[0]=Q-(L+C)+(C-X),C=($=G-((B=G+L)-(C=B-G))+(L-C))-(L=$-q),u[1]=$-(L+C)+(C-q),C=(Y=B+L)-B,u[2]=B-(Y-C)+(L-C),u[3]=Y;let wt=(function(It,ot){let ft=ot[0];for(let st=1;st<It;st++)ft+=ot[st];return ft})(4,u),zt=i*S;if(wt>=zt||-wt>=zt||(R=P-(it+(C=P-it))+(C-_),W=T-(ht+(C=T-ht))+(C-_),D=E-(St+(C=E-St))+(C-v),I=V-(nt+(C=V-nt))+(C-v),R===0&&D===0&&W===0&&I===0)||(zt=l*S+n*Math.abs(wt),(wt+=it*I+nt*R-(St*W+ht*D))>=zt||-wt>=zt))return wt;C=(Q=(k=R-(A=(H=134217729*R)-(H-R)))*(N=nt-(O=(H=134217729*nt)-(H-nt)))-((G=R*nt)-A*O-k*O-A*N))-(L=Q-(X=(k=D-(A=(H=134217729*D)-(H-D)))*(N=ht-(O=(H=134217729*ht)-(H-ht)))-((q=D*ht)-A*O-k*O-A*N))),a[0]=Q-(L+C)+(C-X),C=($=G-((B=G+L)-(C=B-G))+(L-C))-(L=$-q),a[1]=$-(L+C)+(C-q),C=(Y=B+L)-B,a[2]=B-(Y-C)+(L-C),a[3]=Y;let Dt=o(4,u,4,a,d);C=(Q=(k=it-(A=(H=134217729*it)-(H-it)))*(N=I-(O=(H=134217729*I)-(H-I)))-((G=it*I)-A*O-k*O-A*N))-(L=Q-(X=(k=St-(A=(H=134217729*St)-(H-St)))*(N=W-(O=(H=134217729*W)-(H-W)))-((q=St*W)-A*O-k*O-A*N))),a[0]=Q-(L+C)+(C-X),C=($=G-((B=G+L)-(C=B-G))+(L-C))-(L=$-q),a[1]=$-(L+C)+(C-q),C=(Y=B+L)-B,a[2]=B-(Y-C)+(L-C),a[3]=Y;let Pt=o(Dt,d,4,a,f);C=(Q=(k=R-(A=(H=134217729*R)-(H-R)))*(N=I-(O=(H=134217729*I)-(H-I)))-((G=R*I)-A*O-k*O-A*N))-(L=Q-(X=(k=D-(A=(H=134217729*D)-(H-D)))*(N=W-(O=(H=134217729*W)-(H-W)))-((q=D*W)-A*O-k*O-A*N))),a[0]=Q-(L+C)+(C-X),C=($=G-((B=G+L)-(C=B-G))+(L-C))-(L=$-q),a[1]=$-(L+C)+(C-q),C=(Y=B+L)-B,a[2]=B-(Y-C)+(L-C),a[3]=Y;let Mt=o(Pt,f,4,a,c);return c[Mt-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 Ks=Be((eh,_o)=>{"use strict";var Xs=Hs(),Kn=As(),pa=qs(),xa=js().orient2d;Kn.default&&(Kn=Kn.default);_o.exports=Us;_o.exports.default=Us;function Us(t,e,n){e=Math.max(0,e===void 0?2:e),n=n||0;var o=Ma(t),r=new Xs(16);r.toBBox=function(x){return{minX:x[0],minY:x[1],maxX:x[0],maxY:x[1]}},r.compareMinX=function(x,y){return x[0]-y[0]},r.compareMinY=function(x,y){return x[1]-y[1]},r.load(t);for(var s=[],i=0,l;i<o.length;i++){var u=o[i];r.remove(u),l=Ys(u,l),s.push(l)}var d=new Xs(16);for(i=0;i<s.length;i++)d.insert(Io(s[i]));for(var f=e*e,c=n*n;s.length;){var a=s.shift(),h=a.p,g=a.next.p,p=Co(h,g);if(!(p<c)){var b=p/f;u=ya(r,a.prev.p,h,g,a.next.next.p,b,d),u&&Math.min(Co(u,h),Co(u,g))<=b&&(s.push(a),s.push(Ys(u,a)),r.remove(u),d.remove(a),d.insert(Io(a)),d.insert(Io(a.next)))}}a=l;var m=[];do m.push(a.p),a=a.next;while(a!==l);return m.push(a.p),m}function ya(t,e,n,o,r,s,i){for(var l=new Kn([],ba),u=t.data;u;){for(var d=0;d<u.children.length;d++){var f=u.children[d],c=u.leaf?Wo(f,n,o):wa(n,o,f);c>s||l.push({node:f,dist:c})}for(;l.length&&!l.peek().node.children;){var a=l.pop(),h=a.node,g=Wo(h,e,n),p=Wo(h,o,r);if(a.dist<g&&a.dist<p&&Zs(n,h,i)&&Zs(o,h,i))return h}u=l.pop(),u&&(u=u.node)}return null}function ba(t,e){return t.dist-e.dist}function wa(t,e,n){if(Gs(t,n)||Gs(e,n))return 0;var o=Un(t[0],t[1],e[0],e[1],n.minX,n.minY,n.maxX,n.minY);if(o===0)return 0;var r=Un(t[0],t[1],e[0],e[1],n.minX,n.minY,n.minX,n.maxY);if(r===0)return 0;var s=Un(t[0],t[1],e[0],e[1],n.maxX,n.minY,n.maxX,n.maxY);if(s===0)return 0;var i=Un(t[0],t[1],e[0],e[1],n.minX,n.maxY,n.maxX,n.maxY);return i===0?0:Math.min(o,r,s,i)}function Gs(t,e){return t[0]>=e.minX&&t[0]<=e.maxX&&t[1]>=e.minY&&t[1]<=e.maxY}function Zs(t,e,n){for(var o=Math.min(t[0],e[0]),r=Math.min(t[1],e[1]),s=Math.max(t[0],e[0]),i=Math.max(t[1],e[1]),l=n.search({minX:o,minY:r,maxX:s,maxY:i}),u=0;u<l.length;u++)if(za(l[u].p,l[u].next.p,t,e))return!1;return!0}function cn(t,e,n){return xa(t[0],t[1],e[0],e[1],n[0],n[1])}function za(t,e,n,o){return t!==o&&e!==n&&cn(t,e,n)>0!=cn(t,e,o)>0&&cn(n,o,t)>0!=cn(n,o,e)>0}function Io(t){var e=t.p,n=t.next.p;return t.minX=Math.min(e[0],n[0]),t.minY=Math.min(e[1],n[1]),t.maxX=Math.max(e[0],n[0]),t.maxY=Math.max(e[1],n[1]),t}function Ma(t){for(var e=t[0],n=t[0],o=t[0],r=t[0],s=0;s<t.length;s++){var i=t[s];i[0]<e[0]&&(e=i),i[0]>o[0]&&(o=i),i[1]<n[1]&&(n=i),i[1]>r[1]&&(r=i)}var l=[e,n,o,r],u=l.slice();for(s=0;s<t.length;s++)pa(t[s],l)||u.push(t[s]);return Pa(u)}function Ys(t,e){var n={p:t,prev:null,next:null,minX:0,minY:0,maxX:0,maxY:0};return e?(n.next=e.next,n.prev=e,e.next.prev=n,e.next=n):(n.prev=n,n.next=n),n}function Co(t,e){var n=t[0]-e[0],o=t[1]-e[1];return n*n+o*o}function Wo(t,e,n){var o=e[0],r=e[1],s=n[0]-o,i=n[1]-r;if(s!==0||i!==0){var l=((t[0]-o)*s+(t[1]-r)*i)/(s*s+i*i);l>1?(o=n[0],r=n[1]):l>0&&(o+=s*l,r+=i*l)}return s=t[0]-o,i=t[1]-r,s*s+i*i}function Un(t,e,n,o,r,s,i,l){var u=n-t,d=o-e,f=i-r,c=l-s,a=t-r,h=e-s,g=u*u+d*d,p=u*f+d*c,b=f*f+c*c,m=u*a+d*h,x=f*a+c*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,_=(1-w)*e+w*o,v=(1-M)*r+M*i,S=(1-M)*s+M*l,R=v-V,D=S-_;return R*R+D*D}function Ea(t,e){return t[0]===e[0]?t[1]-e[1]:t[0]-e[0]}function Pa(t){t.sort(Ea);for(var e=[],n=0;n<t.length;n++){for(;e.length>=2&&cn(e[e.length-2],e[e.length-1],t[n])<=0;)e.pop();e.push(t[n])}for(var o=[],r=t.length-1;r>=0;r--){for(;o.length>=2&&cn(o[o.length-2],o[o.length-1],t[r])<=0;)o.pop();o.push(t[r])}return o.pop(),e.pop(),e.concat(o)}});import*as Fe from"three";import*as Oe from"three";var Ht=class t{constructor(e=0,n=0,o=0){this.x=e,this.y=n,this.z=o}set(e,n,o){return this.x=e,this.y=n,this.z=o,this}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this}clone(){return new t(this.x,this.y,this.z)}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this}subVectors(e,n){return this.x=e.x-n.x,this.y=e.y-n.y,this.z=e.z-n.z,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z}crossVectors(e,n){let o=e.x,r=e.y,s=e.z,i=n.x,l=n.y,u=n.z;return this.x=r*u-s*l,this.y=s*i-o*u,this.z=o*l-r*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,r=this.z-e.z;return n*n+o*o+r*r}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,r=this.y,s=this.z,i=e.x,l=e.y,u=e.z,d=Math.cos(n),f=Math.sin(n),c=i*o+l*r+u*s;return this.x=i*c*(1-d)+o*d+(-u*r+l*s)*f,this.y=l*c*(1-d)+r*d+(u*o-i*s)*f,this.z=u*c*(1-d)+s*d+(-l*o+i*r)*f,this}},Hn=class{constructor(e=new Ht(1,0,0),n=0){this.normal=e,this.constant=n}set(e,n){return this.normal.copy(e),this.constant=n,this}setFromNormalAndCoplanarPoint(e,n){return this.normal.copy(e),this.constant=-n.dot(this.normal),this}setFromCoplanarPoints(e,n,o){let r=new Ht().subVectors(n,e),s=new Ht().subVectors(o,e),i=new Ht().crossVectors(r,s).normalize();return this.normal.copy(i),this.constant=-e.dot(this.normal),this}distanceToPoint(e){return this.normal.dot(e)+this.constant}projectPoint(e,n=new Ht){let o=this.distanceToPoint(e);return n.copy(e),n.x-=this.normal.x*o,n.y-=this.normal.y*o,n.z-=this.normal.z*o,n}},_n=()=>typeof performance<"u"&&performance.now?performance.now():Date.now(),yo=class{constructor(){this.results=null,this.clusterResults=null}initLimits1(e,n){let o,r;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?r=30:n<2?r=40:n<2.5?r=45:n<3?r=60:n<3.6?r=70:r=80,{horizontalSubdivisions:o,verticalSubdivisions:r}}initLimits2(e,n){let s=Math.round(Math.max(5,Math.min(350,e/.08))),i=Math.round(Math.max(30,Math.min(80,n/.06)));return{horizontalSubdivisions:s,verticalSubdivisions:i}}initLimits3(e,n){let o;e<2?o=.06:e<10?o=.1:o=.15;let r=Math.round(Math.max(5,Math.min(350,e/o))),s=Math.round(Math.max(30,Math.min(80,n/.06)));return{horizontalSubdivisions:r,verticalSubdivisions:s}}initLimits4(e,n){let o=Math.round(Math.max(5,Math.min(350,20*Math.sqrt(e)))),r=Math.round(Math.max(30,Math.min(80,20*Math.sqrt(n))));return{horizontalSubdivisions:o,verticalSubdivisions:r}}createSubdividedWallPlane(e,n,o,r=null){let s=[];if(!e||!e.start||!e.end||isNaN(e.rooftopPz))return s;let i=new Ht(e.start.x,e.start.y,e.start.z),l=new Ht(e.end.x,e.end.y,e.end.z),u=new Ht(e.end.x,e.end.y,e.rooftopPz),d=new Ht(e.start.x,e.start.y,e.rooftopPz),f=[i,l,u,d];for(let P=0;P<f.length;P++)if(!this.isValidVector3(f[P]))return console.error(`\u5899\u4F53\u57FA\u7840\u70B9${P}\u65E0\u6548:`,f[P]),s;let c=i.distanceTo(l),a=Math.abs(e.rooftopPz-e.start.z);if(c===0||a===0)return s;let h=c/o,g=a/n,p=new Ht().subVectors(l,i).normalize(),b=i.x,m=i.y,x=i.z,y=p.x,w=p.y,z=p.z,M=(P,E)=>new Ht(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 _=V*h,v=(V+1)*h;s.push({points:[M(_,E),M(v,E),M(v,T),M(_,T)],userData:{type:"wallSegment",row:P,col:V,width:h,height:g}})}}return s}analyzePointDistribution(e,n,o=.01,r={}){let s=r.projectPlane||null;this.results={totalSegments:0,segmentsWithPoints:0,segmentsWithoutPoints:0,missingSegments:[],existSegments:[],pointsInSegments:new Map,segmentsByPoint:new Map,segmentDetails:new Map,tolerance:o,analysisTime:null};let i=_n(),l=[],u=new Map,d=1/0,f=-1/0,c=1/0,a=-1/0;for(let _=0;_<e.length;_++){let v=e[_];if(v.userData&&v.userData.type==="wallSegment"){let S=this.getWorldVerticesNew(v.points);if(S.length<4)continue;let R=new Ht().add(S[0]).add(S[1]).add(S[2]).add(S[3]).multiplyScalar(.25);v.userData.center=R,v.vertices=S;let D=v.userData.row,W=v.userData.col,I=`row${D}_col${W}`;l.push(v),u.set(I,v),D<d&&(d=D),D>f&&(f=D),W<c&&(c=W),W>a&&(a=W)}}if(this.results.totalSegments=l.length,l.length===0)return this.results.analysisTime=_n()-i,this.printAnalysisResults(),this.results;let h=`row${d}_col${c}`,g=u.get(h)||l[0];if(!g||!g.vertices||g.vertices.length<4)return this.results.analysisTime=_n()-i,this.printAnalysisResults(),this.results;let p=g.vertices[0],b=g.vertices[1],m=g.vertices[3],x=new Ht().subVectors(b,p).normalize(),y=new Ht().subVectors(m,p).normalize(),w=g.userData.width,z=g.userData.height,M=f-d+1,P=a-c+1,E=new Hn;E.setFromCoplanarPoints(p,b,m);let T=new Ht,V=new Ht;for(let _=0;_<n.length;_+=3){let v=new Ht(n[_],n[_+1],n[_+2]),S=s?s.projectPoint(v,V):v;if(Math.abs(E.distanceToPoint(S))>o)continue;T.subVectors(S,p);let D=T.dot(x),W=T.dot(y),I=Math.ceil((D-o)/w-1),C=Math.floor((D+o)/w),H=Math.ceil((W-o)/z-1),A=Math.floor((W+o)/z);if(C<0||I>P-1||A<0||H>M-1)continue;let k=Math.max(0,I),O=Math.min(P-1,C),N=Math.max(0,H),L=Math.min(M-1,A);for(let B=N;B<=L;B++){let $=d+B;for(let G=k;G<=O;G++){let Q=c+G,q=`row${$}_col${Q}`;u.has(q)&&(this.results.pointsInSegments.has(q)||this.results.pointsInSegments.set(q,[_]))}}}for(let _ of l){let v=`row${_.userData.row}_col${_.userData.col}`,S=this.results.pointsInSegments.has(v)?this.results.pointsInSegments.get(v).length:0,R=S>=1,D={row:_.userData.row,col:_.userData.col,width:_.userData.width,height:_.userData.height,segmentKey:v,vertices:_.vertices,center:_.userData.center,mesh:_,pointCount:S,hasPointsButNotEnough:S>0&&S<1};R?(this.results.segmentsWithPoints++,this.results.existSegments.push(D)):(this.results.segmentsWithoutPoints++,this.results.missingSegments.push(D))}return this.results.analysisTime=_n()-i,this.printAnalysisResults(),this.results}isPointInWallSegmentOptimized(e,n,o,r,s,i,l,u,d,f,c){if(Math.abs(o.distanceToPoint(e))>c)return!1;let h=new Ht().subVectors(e,n),g=Math.abs(h.dot(s)),p=Math.abs(h.dot(i));if(g>d&&p>f)return!1;let b=new Ht().subVectors(e,r),m=b.dot(s),x=b.dot(i),y=m>=-c&&m<=l+c,w=x>=-c&&x<=u+c;return y&&w}getWorldVerticesNew(e){return e}highlightEmptySegments(e,n=null,o=null,r=1){if(!this.results)return console.warn("\u8BF7\u5148\u8FD0\u884C\u5206\u6790\u51FD\u6570"),null;let s=new Map,i=new Map;for(let d of this.results.missingSegments)s.set(d.segmentKey,d),i.has(d.row)||i.set(d.row,new Map),i.get(d.row).set(d.col,{segmentKey:d.segmentKey,isEmpty:!0,visited:!1});for(let d of e)if(d.userData&&d.userData.type==="wallSegment"){let f=`row${d.userData.row}_col${d.userData.col}`,c=s.has(f);i.has(d.userData.row)||i.set(d.userData.row,new Map),i.get(d.userData.row).has(d.userData.col)||i.get(d.userData.row).set(d.userData.col,{segmentKey:f,isEmpty:c,visited:!1})}let l=[],u=[[0,1],[1,0],[0,-1],[-1,0]];for(let[d,f]of s){let c=i.get(f.row)?.get(f.col);if(c&&!c.visited){let a=[],h=[[f.row,f.col]],g=0;for(c.visited=!0;g<h.length;){let p=h[g++],b=p[0],m=p[1],x=`row${b}_col${m}`;s.has(x)&&a.push(s.get(x));for(let y of u){let w=b+y[0],z=m+y[1];if(i.has(w)&&i.get(w).has(z)){let M=i.get(w).get(z);!M.visited&&M.isEmpty&&(M.visited=!0,h.push([w,z]))}}}a.length>=r&&l.push(a)}}return this.clusterResults={clusters:l.sort((d,f)=>f.length-d.length),totalClusters:l.length},this.clusterResults}getClusterInfo(){if(!this.clusterResults)return null;let e=this.clusterResults.clusters.map(n=>n.length);return{totalClusters:this.clusterResults.totalClusters,clusterSizes:this.clusterResults.clusters.map((n,o)=>({clusterIndex:o,size:n.length,segments:n.map(r=>r.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)}},ls=(t,e)=>{let n={},o=[],r=[];if(!t||t.length===0)return n.originalVertices=o,n.allCenterPoints=r,n;if(e=="xyz")for(let s of t){r.push({x:s.center.x,y:s.center.y,z:s.center.z});let i=[];for(let l=0;l<s.vertices.length;l++)i.push({x:s.vertices[l].x,y:s.vertices[l].y,z:s.vertices[l].z});o.push(i)}else if(e=="three")for(let s of t){r.push(new Oe.Vector3(s.center.x,s.center.y,s.center.z));let i=[];for(let l=0;l<s.vertices.length;l++)i.push(new Oe.Vector3(s.vertices[l].x,s.vertices[l].y,s.vertices[l].z));o.push(i)}else if(e=="array")for(let s of t){r.push(s.center.x),r.push(s.center.y),r.push(s.center.z);let i=[];for(let l=0;l<s.vertices.length;l++)i.push(s.vertices[l].x,s.vertices[l].y,s.vertices[l].z);o.push(i)}return n.originalVertices=o,n.allCenterPoints=r,n},zi=(t,e)=>{let n=new Ht().copy(t.start).add(t.end).multiplyScalar(.5),o=new Ht().subVectors(new Ht(n.x,n.y,n.z+1),n).normalize(),r=new Ht(t.direction.x,t.direction.y,0);r.applyAxisAngle(o,Math.PI/2);let s=new Ht().copy(n).add(r.clone().multiplyScalar(t.length)),i=new Ht().copy(n).sub(r.clone().multiplyScalar(t.length));if(n.z=t.start.z,s.z=t.start.z,i.z=t.start.z,e=="three")return{start:new Oe.Vector3(s.x,s.y,s.z),end:new Oe.Vector3(i.x,i.y,i.z),center:new Oe.Vector3(n.x,n.y,n.z),direction:new Oe.Vector3(r.x,r.y,r.z)};if(e=="xyz")return{start:{x:s.x,y:s.y,z:s.z},end:{x:i.x,y:i.y,z:i.z},center:{x:n.x,y:n.y,z:n.z},direction:{x:r.x,y:r.y,z:r.z}};if(e=="array")return{start:[s.x,s.y,s.z],end:[i.x,i.y,i.z],center:[n.x,n.y,n.z],direction:[r.x,r.y,r.z]}},cs=async(t,e=!0,n="three")=>{for(let o=0;o<t.length;o++){let r=t[o];await bo(r,e,n)}},bo=(t,e=!0,n="three")=>{if((t.isBayWindow||t.isWindow||t.isBalconyRailing)&&e)return;let o=new Hn().setFromCoplanarPoints(new Ht(t.start.x,t.start.y,t.start.z),new Ht(t.end.x,t.end.y,t.end.z),new Ht(t.start.x,t.start.y,t.rooftopPz)),r=new Ht(t.start.x,t.start.y,t.start.z).distanceTo(new Ht(t.end.x,t.end.y,t.end.z)),s=Math.abs(t.rooftopPz-t.start.z),i=new yo,{horizontalSubdivisions:l,verticalSubdivisions:u}=i.initLimits4(r,s),d=i.createSubdividedWallPlane(t,u,l,null);i.analyzePointDistribution(d,t.originalPoints,.01,{projectPlane:o});let f=i.highlightEmptySegments(d,null,null),c=[];if(f&&f.clusters)for(let g of f.clusters){let p=ls(g,n);p&&c.push(p)}let h=zi(t,n).direction;if(t.checkResults=c,t.verticalDirection=h,t.saveExistSegments){let g=[],p=ls(i.results.existSegments,n);p&&g.push(p),t.existSegments=g}};var Rt=class t{constructor(e=0,n=0,o=0){this.x=e,this.y=n,this.z=o}set(e,n,o){return this.x=e,this.y=n,this.z=o,this}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this}clone(){return new t(this.x,this.y,this.z)}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this}subVectors(e,n){return this.x=e.x-n.x,this.y=e.y-n.y,this.z=e.z-n.z,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z}crossVectors(e,n){let o=e.x,r=e.y,s=e.z,i=n.x,l=n.y,u=n.z;return this.x=r*u-s*l,this.y=s*i-o*u,this.z=o*l-r*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,r=this.z-e.z;return n*n+o*o+r*r}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,r=this.y,s=this.z,i=e.x,l=e.y,u=e.z,d=Math.cos(n),f=Math.sin(n),c=i*o+l*r+u*s;return this.x=i*c*(1-d)+o*d+(-u*r+l*s)*f,this.y=l*c*(1-d)+r*d+(u*o-i*s)*f,this.z=u*c*(1-d)+s*d+(-l*o+i*r)*f,this}},yn=class{constructor(e=new Rt(1,0,0),n=0){this.normal=e,this.constant=n}set(e,n){return this.normal.copy(e),this.constant=n,this}setFromNormalAndCoplanarPoint(e,n){return this.normal.copy(e),this.constant=-n.dot(this.normal),this}setFromCoplanarPoints(e,n,o){let r=new Rt().subVectors(n,e),s=new Rt().subVectors(o,e),i=new Rt().crossVectors(r,s).normalize();return this.normal.copy(i),this.constant=-e.dot(this.normal),this}distanceToPoint(e){return this.normal.dot(e)+this.constant}projectPoint(e,n=new Rt){let o=this.distanceToPoint(e);return n.copy(e),n.x-=this.normal.x*o,n.y-=this.normal.y*o,n.z-=this.normal.z*o,n}},An=()=>typeof performance<"u"&&performance.now?performance.now():Date.now(),Ln=class{constructor(){this.results=null,this.clusterResults=null}initLimits1(e,n){let o,r;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?r=30:n<2?r=40:n<2.5?r=45:n<3?r=60:n<3.6?r=70:r=80,{horizontalSubdivisions:o,verticalSubdivisions:r}}initLimits2(e,n){let s=Math.round(Math.max(5,Math.min(350,e/.08))),i=Math.round(Math.max(30,Math.min(80,n/.06)));return{horizontalSubdivisions:s,verticalSubdivisions:i}}initLimits3(e,n){let o;e<2?o=.06:e<10?o=.1:o=.15;let r=Math.round(Math.max(5,Math.min(350,e/o))),s=Math.round(Math.max(30,Math.min(80,n/.06)));return{horizontalSubdivisions:r,verticalSubdivisions:s}}initLimits4(e,n){let o=Math.round(Math.max(5,Math.min(350,20*Math.sqrt(e)))),r=Math.round(Math.max(30,Math.min(80,20*Math.sqrt(n))));return{horizontalSubdivisions:o,verticalSubdivisions:r}}createSubdividedWallPlane(e,n,o,r=null){let s=[];if(!e||!e.start||!e.end||isNaN(e.rooftopPz))return s;let i=new Rt(e.start.x,e.start.y,e.start.z),l=new Rt(e.end.x,e.end.y,e.end.z),u=new Rt(e.end.x,e.end.y,e.rooftopPz),d=new Rt(e.start.x,e.start.y,e.rooftopPz),f=[i,l,u,d];for(let P=0;P<f.length;P++)if(!this.isValidVector3(f[P]))return console.error(`\u5899\u4F53\u57FA\u7840\u70B9${P}\u65E0\u6548:`,f[P]),s;let c=i.distanceTo(l),a=Math.abs(e.rooftopPz-e.start.z);if(c===0||a===0)return s;let h=c/o,g=a/n,p=new Rt().subVectors(l,i).normalize(),b=i.x,m=i.y,x=i.z,y=p.x,w=p.y,z=p.z,M=(P,E)=>new Rt(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 _=V*h,v=(V+1)*h;s.push({points:[M(_,E),M(v,E),M(v,T),M(_,T)],userData:{type:"wallSegment",row:P,col:V,width:h,height:g}})}}return s}analyzePointDistribution(e,n,o=.01,r={}){let s=r.projectPlane||null;this.results={totalSegments:0,segmentsWithPoints:0,segmentsWithoutPoints:0,missingSegments:[],existSegments:[],pointsInSegments:new Map,segmentsByPoint:new Map,segmentDetails:new Map,tolerance:o,analysisTime:null};let i=An(),l=[],u=new Map,d=1/0,f=-1/0,c=1/0,a=-1/0;for(let _=0;_<e.length;_++){let v=e[_];if(v.userData&&v.userData.type==="wallSegment"){let S=this.getWorldVerticesNew(v.points);if(S.length<4)continue;let R=new Rt().add(S[0]).add(S[1]).add(S[2]).add(S[3]).multiplyScalar(.25);v.userData.center=R,v.vertices=S;let D=v.userData.row,W=v.userData.col,I=`row${D}_col${W}`;l.push(v),u.set(I,v),D<d&&(d=D),D>f&&(f=D),W<c&&(c=W),W>a&&(a=W)}}if(this.results.totalSegments=l.length,l.length===0)return this.results.analysisTime=An()-i,this.printAnalysisResults(),this.results;let h=`row${d}_col${c}`,g=u.get(h)||l[0];if(!g||!g.vertices||g.vertices.length<4)return this.results.analysisTime=An()-i,this.printAnalysisResults(),this.results;let p=g.vertices[0],b=g.vertices[1],m=g.vertices[3],x=new Rt().subVectors(b,p).normalize(),y=new Rt().subVectors(m,p).normalize(),w=g.userData.width,z=g.userData.height,M=f-d+1,P=a-c+1,E=new yn;E.setFromCoplanarPoints(p,b,m);let T=new Rt,V=new Rt;for(let _=0;_<n.length;_++){let v=n[_],S=s?s.projectPoint(v,V):v;if(Math.abs(E.distanceToPoint(S))>o)continue;T.subVectors(S,p);let D=T.dot(x),W=T.dot(y),I=Math.ceil((D-o)/w-1),C=Math.floor((D+o)/w),H=Math.ceil((W-o)/z-1),A=Math.floor((W+o)/z);if(C<0||I>P-1||A<0||H>M-1)continue;let k=Math.max(0,I),O=Math.min(P-1,C),N=Math.max(0,H),L=Math.min(M-1,A);for(let B=N;B<=L;B++){let $=d+B;for(let G=k;G<=O;G++){let Q=c+G,q=`row${$}_col${Q}`;u.has(q)&&(this.results.pointsInSegments.has(q)||this.results.pointsInSegments.set(q,[_]))}}}for(let _ of l){let v=`row${_.userData.row}_col${_.userData.col}`,S=this.results.pointsInSegments.has(v)?this.results.pointsInSegments.get(v).length:0,R=S>=1,D={row:_.userData.row,col:_.userData.col,width:_.userData.width,height:_.userData.height,segmentKey:v,vertices:_.vertices,center:_.userData.center,mesh:_,pointCount:S,hasPointsButNotEnough:S>0&&S<1};R?(this.results.segmentsWithPoints++,this.results.existSegments.push(D)):(this.results.segmentsWithoutPoints++,this.results.missingSegments.push(D))}return this.results.analysisTime=An()-i,this.printAnalysisResults(),this.results}isPointInWallSegmentOptimized(e,n,o,r,s,i,l,u,d,f,c){if(Math.abs(o.distanceToPoint(e))>c)return!1;let h=new Rt().subVectors(e,n),g=Math.abs(h.dot(s)),p=Math.abs(h.dot(i));if(g>d&&p>f)return!1;let b=new Rt().subVectors(e,r),m=b.dot(s),x=b.dot(i),y=m>=-c&&m<=l+c,w=x>=-c&&x<=u+c;return y&&w}getWorldVerticesNew(e){return e}highlightEmptySegments(e,n=null,o=null,r=1){if(!this.results)return console.warn("\u8BF7\u5148\u8FD0\u884C\u5206\u6790\u51FD\u6570"),null;let s=new Map,i=new Map;for(let d of this.results.missingSegments)s.set(d.segmentKey,d),i.has(d.row)||i.set(d.row,new Map),i.get(d.row).set(d.col,{segmentKey:d.segmentKey,isEmpty:!0,visited:!1});for(let d of e)if(d.userData&&d.userData.type==="wallSegment"){let f=`row${d.userData.row}_col${d.userData.col}`,c=s.has(f);i.has(d.userData.row)||i.set(d.userData.row,new Map),i.get(d.userData.row).has(d.userData.col)||i.get(d.userData.row).set(d.userData.col,{segmentKey:f,isEmpty:c,visited:!1})}let l=[],u=[[0,1],[1,0],[0,-1],[-1,0]];for(let[d,f]of s){let c=i.get(f.row)?.get(f.col);if(c&&!c.visited){let a=[],h=[[f.row,f.col]],g=0;for(c.visited=!0;g<h.length;){let p=h[g++],b=p[0],m=p[1],x=`row${b}_col${m}`;s.has(x)&&a.push(s.get(x));for(let y of u){let w=b+y[0],z=m+y[1];if(i.has(w)&&i.get(w).has(z)){let M=i.get(w).get(z);!M.visited&&M.isEmpty&&(M.visited=!0,h.push([w,z]))}}}a.length>=r&&l.push(a)}}return this.clusterResults={clusters:l.sort((d,f)=>f.length-d.length),totalClusters:l.length},this.clusterResults}getClusterInfo(){if(!this.clusterResults)return null;let e=this.clusterResults.clusters.map(n=>n.length);return{totalClusters:this.clusterResults.totalClusters,clusterSizes:this.clusterResults.clusters.map((n,o)=>({clusterIndex:o,size:n.length,segments:n.map(r=>r.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)}},us=(t,e)=>{let n={},o=[],r=[];if(!t||t.length===0)return n.originalVertices=o,n.allCenterPoints=r,n;if(e=="xyz")for(let s of t){r.push({x:s.center.x,y:s.center.y,z:s.center.z});let i=[];for(let l=0;l<s.vertices.length;l++)i.push({x:s.vertices[l].x,y:s.vertices[l].y,z:s.vertices[l].z});o.push(i)}else if(e=="three")for(let s of t){r.push(new Fe.Vector3(s.center.x,s.center.y,s.center.z));let i=[];for(let l=0;l<s.vertices.length;l++)i.push(new Fe.Vector3(s.vertices[l].x,s.vertices[l].y,s.vertices[l].z));o.push(i)}else if(e=="array")for(let s of t){r.push(s.center.x),r.push(s.center.y),r.push(s.center.z);let i=[];for(let l=0;l<s.vertices.length;l++)i.push(s.vertices[l].x,s.vertices[l].y,s.vertices[l].z);o.push(i)}return n.originalVertices=o,n.allCenterPoints=r,n},Mi=(t,e)=>{let n=new Rt().copy(t.start).add(t.end).multiplyScalar(.5),o=new Rt().subVectors(new Rt(n.x,n.y,n.z+1),n).normalize(),r=new Rt(t.direction.x,t.direction.y,0);r.applyAxisAngle(o,Math.PI/2);let s=new Rt().copy(n).add(r.clone().multiplyScalar(t.length)),i=new Rt().copy(n).sub(r.clone().multiplyScalar(t.length));if(n.z=t.start.z,s.z=t.start.z,i.z=t.start.z,e=="three")return{start:new Fe.Vector3(s.x,s.y,s.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(r.x,r.y,r.z)};if(e=="xyz")return{start:{x:s.x,y:s.y,z:s.z},end:{x:i.x,y:i.y,z:i.z},center:{x:n.x,y:n.y,z:n.z},direction:{x:r.x,y:r.y,z:r.z}};if(e=="array")return{start:[s.x,s.y,s.z],end:[i.x,i.y,i.z],center:[n.x,n.y,n.z],direction:[r.x,r.y,r.z]}},Ei=(t,e=!0,n="three",o="xyz")=>{o=="xyz"?fs(t,e,n):o=="array"&&bo(t,e,n)},Pi=(t,e=!0,n="three",o="xyz")=>{o=="xyz"?Si(t,e,n):o=="array"&&cs(t,e,n)},Si=(t,e=!0,n="three")=>{for(let o=0;o<t.length;o++){let r=t[o];fs(r,e,n)}},fs=(t,e=!0,n="three")=>{if((t.isBayWindow||t.isWindow||t.isBalconyRailing)&&e)return;let o=new yn().setFromCoplanarPoints(new Rt(t.start.x,t.start.y,t.start.z),new Rt(t.end.x,t.end.y,t.end.z),new Rt(t.start.x,t.start.y,t.rooftopPz)),r=new Rt(t.start.x,t.start.y,t.start.z).distanceTo(new Rt(t.end.x,t.end.y,t.end.z)),s=Math.abs(t.rooftopPz-t.start.z),i=new Ln,{horizontalSubdivisions:l,verticalSubdivisions:u}=i.initLimits4(r,s),d=i.createSubdividedWallPlane(t,u,l,null);i.analyzePointDistribution(d,t.originalPoints,.01,{projectPlane:o});let f=i.highlightEmptySegments(d,null,null),c=[];if(f&&f.clusters)for(let g of f.clusters){let p=us(g,n);p&&c.push(p)}let h=Mi(t,n).direction;if(t.checkResults=c,t.verticalDirection=h,t.saveExistSegments){let g=[],p=us(i.results.existSegments,n);p&&g.push(p),t.existSegments=g}},Ti=t=>{if((t.isBayWindow||t.isWindow||t.isBalconyRailing)&&limit)return;let e=new yn().setFromCoplanarPoints(new Rt(t.start.x,t.start.y,t.start.z),new Rt(t.end.x,t.end.y,t.end.z),new Rt(t.start.x,t.start.y,t.rooftopPz)),n=new Rt(t.start.x,t.start.y,t.start.z).distanceTo(new Rt(t.end.x,t.end.y,t.end.z)),o=Math.abs(t.rooftopPz-t.start.z),r=new Ln,{horizontalSubdivisions:s,verticalSubdivisions:i}=r.initLimits4(n,o),l=r.createSubdividedWallPlane(t,i,s,null);return r.analyzePointDistribution(l,t.originalPoints,.01,{projectPlane:e}),r.highlightEmptySegments(l,null,null)};import*as F from"three";import"three/examples/jsm/utils/BufferGeometryUtils.js";import*as U from"three";import{CSS2DObject as Ec}from"three/examples/jsm/renderers/CSS2DRenderer.js";import"three/examples/jsm/utils/BufferGeometryUtils.js";import we from"path";import{fileURLToPath as vi}from"url";import kn from"path";import{fileURLToPath as Ri}from"url";import{Vector3 as ec}from"three";var Di=Ri(import.meta.url),wo=kn.dirname(Di),nc=kn.resolve(wo,"./data/lines.meta.json"),oc=kn.resolve(wo,"./data/lines.bin"),sc=kn.resolve(wo,"./data/checks.bin");var Vi=vi(import.meta.url),De=we.dirname(Vi),uc=we.resolve(De,"./data/lines.tmp.bin"),fc=we.resolve(De,"./data/checks.tmp.bin"),dc=we.resolve(De,"./data/lines.new_points.tmp.bin"),hc=we.resolve(De,"./data/lines.new_points.bin"),mc=we.resolve(De,"./data/lines.meta.json"),gc=we.resolve(De,"./data/lines.bin"),pc=we.resolve(De,"./data/checks.bin"),xc=we.resolve(De,"./data/lines.exist_segments.bin"),yc=we.resolve(De,"./data/lines.exist_segments.tmp.bin");import{Vector3 as Ii}from"three";var Bn=class{points=[];_tempArr=[0,0,0];constructor(e){}initPoints(e){this.points=e}getPointByIndex(e,n){let o=e*3;return n.x=this.points[o],n.y=this.points[o+1],n.z=this.points[o+2],n}getPointArrByIndex(e){let n=e*3;return[this.points[n],this.points[n+1],this.points[n+2]]}getPoint2ArrByIndex(e){let n=e*3;return[this.points[n],this.points[n+1]]}getIndexsByIndex(e,n){n.length=0,n.push(e*3),n.push(e*3+1),n.push(e*3+2)}pointsToVector3Arr(e){let n=[];for(let o=0;o<e.length/3;o++)n.push(new Ii(e[o*3],e[o*3+1],e[o*3+2]));return n}vector3ArrToPoints(e){let n=[];for(let o=0;o<e.length;o++)n.push(e[o].x,e[o].y,e[o].z);return n}vector3ArrToFloat32Array(e){return new Float32Array(e.flatMap(o=>[o.x,o.y,o.z]))}clsoe(){this.points=[]}};var hs=(t,e,n)=>{let o=new U.LineBasicMaterial({color:"#0011ff"}),r=[];r.push(t),r.push(e);let s=new U.BufferGeometry;s.setFromPoints(r),s.rotateX(-Math.PI/2),n.add(new U.Line(s,o))},ze=(t,e,n,o,r=1e-8)=>{let s=e.x-t.x,i=e.y-t.y,l=o.x-n.x,u=o.y-n.y,d=s*u-i*l;if(Math.abs(d)<r)return null;let f=((n.x-t.x)*u-(n.y-t.y)*l)/d,c=((n.x-t.x)*i-(n.y-t.y)*s)/d;return f<-r||f>1+r||c<-r||c>1+r?null:{point:new U.Vector3(t.x+f*s,t.y+f*i,t.z)}},ms=(t,e,n={})=>{let{fontSize:o=36,fontFamily:r="sans-serif",backgroundColor:s="rgba(0,0,0,0)",textColor:i="#ffffff",padding:l=10,maxWidth:u=256}=n,f=document.createElement("canvas").getContext("2d");f.font=`bold ${o}px ${r}`;let a=f.measureText(t).width,h=Math.min(a+l*2,u),g=o+l*2,p=document.createElement("canvas");p.width=h,p.height=g;let b=p.getContext("2d");b.fillStyle=s,b.fillRect(0,0,h,g),b.fillStyle=i,b.font=`bold ${o}px ${r}`,b.textAlign="center",b.textBaseline="middle",a>u-l*2?Ci(b,t,h/2,g/2,u,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 Ci(t,e,n,o,r,s){let i=e.split(""),l="",u=s*1.2,d=o;for(let f=0;f<i.length;f++){let c=l+i[f];t.measureText(c).width>r&&f>0?(t.fillText(l,n,d),l=i[f],d+=u):l=c}t.fillText(l,n,d)}var Kt=(t,e,n=.01)=>{let o=Math.sqrt(t.x*t.x+t.y*t.y+t.z*t.z),r=Math.sqrt(e.x*e.x+e.y*e.y+e.z*e.z);if(o<1e-10||r<1e-10)return{parallel:!1,sameDirection:null,angle:NaN};let s={x:t.x/o,y:t.y/o,z:t.z/o},i={x:e.x/r,y:e.y/r,z:e.z/r},l=s.x*i.x+s.y*i.y+s.z*i.z;l=Math.max(-1,Math.min(1,l));let u=Math.acos(Math.abs(l)),d=u<=n;return{parallel:d,sameDirection:d?l>0:null,angle:u}};var gs=(t,e,n,o)=>{if(e<1e-4||n<1e-4)return{};let r=t,s=[];if(o&&o.length&&(s=o.map(M=>M.clone())),!r||r.length<4)return{};let i=new U.Vector3().subVectors(r[1],r[0]).normalize(),l=new U.Vector3().subVectors(r[3],r[0]).normalize(),u=i.clone().cross(l).normalize(),d=1/0,f=-1/0,c=1/0,a=-1/0;for(let M of r){let P=M.dot(i),E=M.dot(l);P<d&&(d=P),P>f&&(f=P),E<c&&(c=E),E>a&&(a=E)}let h=r[0].dot(u),g=i.clone().multiplyScalar(d).add(l.clone().multiplyScalar(c)).add(u.clone().multiplyScalar(h)),p=i.clone().multiplyScalar(f).add(l.clone().multiplyScalar(c)).add(u.clone().multiplyScalar(h)),b=i.clone().multiplyScalar(f).add(l.clone().multiplyScalar(a)).add(u.clone().multiplyScalar(h)),m=i.clone().multiplyScalar(d).add(l.clone().multiplyScalar(a)).add(u.clone().multiplyScalar(h)),x=[g,p,b,m],y=Kt(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]),_=x[0].distanceTo(x[3]),v=V/e,S=_/n,R=.001;for(let D=0;D<v;D++){let W=x[0],I=0;for(let C=0;C<S;C++){let H=W.clone().addScaledVector(M,e),A=H.clone().addScaledVector(E,n),k=W.clone().addScaledVector(E,n),O=new U.Vector3().add(W).add(H).add(A).add(k).multiplyScalar(.25);for(let N=0;N<s.length;N++)if(s[N].distanceTo(O)<R){I++;break}W=k}if(I>=S/2)break;w+=I,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 W=x[1],I=0;for(let C=0;C<S;C++){let H=W.clone().addScaledVector(P,e),A=H.clone().addScaledVector(E,n),k=W.clone().addScaledVector(E,n),O=new U.Vector3().add(W).add(H).add(A).add(k).multiplyScalar(.25);for(let N=0;N<s.length;N++)if(s[N].distanceTo(O)<R){I++;break}W=k}if(I>=S/2)break;w+=I,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 W=x[3],I=0;for(let C=0;C<v;C++){let H=W.clone().addScaledVector(M,e),A=H.clone().addScaledVector(T,n),k=W.clone().addScaledVector(T,n),O=new U.Vector3().add(W).add(H).add(A).add(k).multiplyScalar(.25);for(let N=0;N<s.length;N++)if(s[N].distanceTo(O)<R){I++;break}W=H}if(I>=v/2)break;w+=I,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}},Gt=(t,e,n,o,r=U.MathUtils.degToRad(8))=>{let s=new U.Vector3,i=new U.Vector3;s.subVectors(new U.Vector3(e.x,e.y,0),new U.Vector3(t.x,t.y,0)).normalize(),i.subVectors(new U.Vector3(o.x,o.y,0),new U.Vector3(n.x,n.y,0)).normalize();let l=s.dot(i),u=Math.acos(Math.min(Math.abs(l),1)),d=1-Math.min(u/r,1),f=l>0?"same":"opposite";return{parallelism:d,angle:u,angleDeg:U.MathUtils.radToDeg(u),isParallel:u<r,direction:f,vectors:{v1:s,v2:i}}},ie=(t,e,n,o)=>{let r=new U.Vector3().subVectors(e,t),s=new U.Vector3().subVectors(o,n),i=r.length(),l=s.length();if(i===0||l===0)return{rate:NaN,angle:NaN,isPerpendicular:!1,isParallel:!1};r.normalize(),s.normalize();let u=Math.abs(r.dot(s)),d=Math.min(1,Math.max(0,u)),f=Math.acos(d),c=U.MathUtils.radToDeg(f),a=1-d,h=1e-6;return{rate:a,percent:`${(a*100).toFixed(2)}%`,angle:c,isPerpendicular:Math.abs(c-90)<.01,isParallel:c<.01}},qt=(t,e,n=!1)=>new U.Vector3((t.x+e.x)/2,(t.y+e.y)/2,n?0:(t.z+e.z)/2),ye=(t,e,n,o,r={})=>{let{parallelAngleMax:s=U.MathUtils.degToRad(10),collinearAngleMax:i=U.MathUtils.degToRad(7),distanceThreshold:l=2,overlapThreshold:u=.01}=r,d=new U.Vector3().subVectors(e,t),f=new U.Vector3().subVectors(o,n),c=d.clone().normalize(),a=f.clone().normalize(),h=U.MathUtils.clamp(c.dot(a),-1,1),g=Math.acos(Math.abs(h)),p=U.MathUtils.radToDeg(g);if(g>s)return{type:"not_parallel",angleDeg:p,avgPerpendicularDistance:null,maxPerpendicularDistance:null,gap:null,overlap:null,closestDistance:null};h<0&&a.negate();let b=new U.Vector3().addVectors(c,a).normalize(),m=new U.Vector3().addVectors(t,e).multiplyScalar(.5),x=ds(n,m,c),y=ds(o,m,c),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),_=Math.max(M,P),v=Math.min(E,T),S=Math.max(E,T),R=_-V,D=S-v,W=Math.min(R,D),I=Math.min(_,S)-Math.max(V,v),C=I<0?-I:0,H=I>0?I:0,A=W>0?H/W:0,k=Wi(t,e,n,o),O=g<=i&&w<l,N;return O?N=A>.5?"collinear_overlap":"collinear_gap":g<=s&&(N="parallel_offset"),{type:N,angleDeg:p,avgPerpendicularDistance:w,maxPerpendicularDistance:z,gap:C,overlap:H,closestDistance:k}};function ds(t,e,n){let o=new U.Vector3().subVectors(t,e),r=o.dot(n),s=n.clone().multiplyScalar(r);return new U.Vector3().subVectors(o,s).length()}function Wi(t,e,n,o){let r=new U.Vector3().subVectors(e,t),s=new U.Vector3().subVectors(o,n),i=new U.Vector3().subVectors(n,t),l=r.dot(r),u=r.dot(s),d=s.dot(s),f=r.dot(i),c=s.dot(i),a=l*d-u*u,h,g;a<1e-10?(h=0,g=d!==0?c/d:0):(h=(u*c-d*f)/a,g=(l*c-u*f)/a),h=U.MathUtils.clamp(h,0,1),g=d!==0?U.MathUtils.clamp((u*h+c)/d,0,1):0,h=l!==0?U.MathUtils.clamp((u*g-f)/l,0,1):0;let p=t.clone().add(r.clone().multiplyScalar(h)),b=n.clone().add(s.clone().multiplyScalar(g));return p.distanceTo(b)}var On=t=>{let e=999999,n=-999999;for(let o=0;o<t.length;o++)t[o].z>n&&(n=t[o].z),t[o].z<e&&(e=t[o].z);return{minZ:e,maxZ:n}},bn=(t,e,n)=>{let o=new U.Plane,r=new U.Vector3(t.x,t.y,t.z),s=new U.Vector3(e.x,e.y,e.z),i=new U.Vector3(e.x,e.y,e.z+5);o.setFromCoplanarPoints(r,s,i);let l=[],u=[];n.forEach(b=>{let m=new U.Vector3;o.projectPoint(b,m),u.push(m.clone()),m.z=r.z,l.push(m)});let d=new U.Vector3,f=new U.Vector3;o.projectPoint(r,d),o.projectPoint(s,f);let c=new U.Line3(d,f),a=[],h=[],g=[],p=new U.Vector3;return l.forEach((b,m)=>{c.closestPointToPoint(b,!0,p).distanceTo(b)<.001?(a.push(n[m]),h.push(u[m])):g.push(b)}),{newOriginalPoints:a,newProjectPoints:g,newOnLinePoints:h}},ps=(t,e,n)=>{function o(r,s,i,l,u,d,f,c,a){let h=new U.Line3(r,s),g=new Map,p=new U.Vector3,b=r.clone(),m=s.clone(),x=0;for(;;){let y=new Map,w=0;for(let z=0;z<a.checkResults.length;z++)if(!(a.checkResults[z].allCenterPoints.length/c*100<1))for(let P=0;P<a.checkResults[z].allCenterPoints.length;P++){if(g.has(z)&&g.get(z).removePtsIndex.includes(P))continue;let E=a.checkResults[z].allCenterPoints[P];E=new U.Vector3(E.x,E.y,E.z);let T=h.closestPointToPoint(E,!0,p),V=E.distanceTo(T);Math.abs(V-u)<.01&&(w++,y.has(z)?y.get(z).removePtsIndex.push(P):y.set(z,{index:z,removePtsIndex:[P]}))}if(x==f){r=b,s=m;break}if(w<d/20*19||w==0){y.clear(),f-x<5&&(r=b,s=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(),r=r.addScaledVector(i,l),s=s.addScaledVector(i,l),h.set(r,s)}}if(g.size>0&&x!=f)for(let[y,w]of g){let z=[],M=[];for(let P=0;P<a.checkResults[y].allCenterPoints.length;P++)w.removePtsIndex.includes(P)||(z.push(a.checkResults[y].allCenterPoints[P]),M.push(a.checkResults[y].originalVertices[P]));a.checkResults[y].allCenterPoints=z,a.checkResults[y].originalVertices=M}}for(let r=0;r<t.length;r++){let s=t[r];if(s.length<.5)continue;let i=-1,l=-1,u=e.readLineById(s.id);u.checkResults=e.getLineCheckReultsById(s.id),u.originalPoints=e.getOriginalPointsById(s.id),s.originalPoints=u.originalPoints,s.checkResults=u.checkResults,s.checkResults.allCenterPoints=[],u=null;for(let D=0;D<s.checkResults.length;D++)for(let W=0;W<s.checkResults[D].originalVertices.length;W++){let I=Fn(s.checkResults[D].originalVertices[W]);s.checkResults.allCenterPoints.push(I)}if(!s.checkResults||s.checkResults.length<=0)continue;if(s.checkResults[0].originalVertices&&s.checkResults[0].originalVertices.length>0){let D=s.checkResults[0].originalVertices[0],[W,I,C,H]=D;W=new U.Vector3(W.x,W.y,W.z),I=new U.Vector3(I.x,I.y,I.z),C=new U.Vector3(C.x,C.y,C.z),H=new U.Vector3(H.x,H.y,H.z),i=W.distanceTo(I),l=W.distanceTo(H);let A=new U.Vector3().subVectors(W,I).normalize(),k=Kt(A,new U.Vector3(0,0,1));k&&k.parallel&&([l,i]=[i,l])}if(i<0||l<0)continue;let d=new U.Vector3(s.start.x,s.start.y,s.start.z),f=new U.Vector3(s.end.x,s.end.y,s.end.z),c=d.distanceTo(f),a=s.rooftopPz-s.start.z,h=Math.ceil(c/i),g=Math.ceil(a/l),p=d.clone(),b=f.clone(),m=b.clone().add(new U.Vector3(0,0,a)),x=p.clone().add(new U.Vector3(0,0,a)),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=l/2,T=c*a,V=i*l,_=T/V;o(p,x,y,i,P,g,h,_,s),o(b,m,w,i,P,g,h,_,s),s.start=p,s.end=b;let{newOriginalPoints:v}=bn(p,b,s.originalPoints);s.originalPoints=v,n.stageReplaceCheckResults(s.id,s.checkResults);let R=new Bn().vector3ArrToFloat32Array(s.originalPoints);n.stageReplacePoints(s.id,R),s.checkResults=null,s.originalPoints=null}n.commit()},jt=(t,e)=>new U.Vector3(t.x,t.y,0).distanceTo(new U.Vector3(e.x,e.y,0)),zo=(t,e,n=1e-6)=>{let o=new U.Vector3;return t.closestPointToPoint(e,!0,o),o.distanceTo(e)<n},nn=t=>{let e=0,n=[];for(let o=0;o<t.length;o++)for(let r=o+1;r<t.length;r++){let s=t[o].distanceTo(t[r]);s>e&&(e=s,n=[t[o],t[r]])}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 xs=()=>{let t=Math.floor(Math.random()*75+180).toString(16).padStart(2,"0"),e=Math.floor(Math.random()*75+180).toString(16).padStart(2,"0"),n=Math.floor(Math.random()*75+180).toString(16).padStart(2,"0");return`#${t}${e}${n}`};var Mo=(t,e=.001)=>{let n=new Map,o=[];for(let r of t){let s=Math.round(r.x/e),i=Math.round(r.y/e),l=Math.round(r.z/e),u=`${s},${i},${l}`;n.has(u)||(n.set(u,!0),o.push(r))}return o},ys=t=>{let e=t.center,n=t.halfSize,r=t.rotation.elements,s=new U.Vector3(r[0],r[1],r[2]).multiplyScalar(n.x),i=new U.Vector3(r[3],r[4],r[5]).multiplyScalar(n.y),l=new U.Vector3(r[6],r[7],r[8]).multiplyScalar(n.z);function u(f,c,a){return e.clone().addScaledVector(s,f).addScaledVector(i,c).addScaledVector(l,a)}return[u(-1,-1,-1),u(1,-1,-1),u(1,1,-1),u(-1,1,-1),u(-1,-1,1),u(1,-1,1),u(1,1,1),u(-1,1,1)]},Eo=(t,e)=>{let n=t[0],o=t[1],r=t[2],s=t[3],i=new U.Vector3().subVectors(o,n),l=new U.Vector3().subVectors(s,n),u=i.length(),d=l.length();i.normalize(),l.normalize();let f=new U.Vector3(0,0,1),a=new U.Vector3().add(n).add(o).add(r).add(s).multiplyScalar(.25).clone().addScaledVector(f,e/2),h=new U.BoxGeometry(u,d,e),g=new U.Matrix4;return g.makeBasis(i,l,f),g.setPosition(a),h.applyMatrix4(g),h.computeVertexNormals(),h},Fn=t=>{if(!t||t.length===0)return null;let e=new U.Vector3(0,0,0);for(let n of t)Array.isArray(n)?(e.x+=n[0],e.y+=n[1],e.z+=n[2]):(e.x+=n.x,e.y+=n.y,e.z+=n.z);return e.divideScalar(t.length),e};import*as Xt from"three";var _i=(t,e)=>{console.log("lines",t);for(let n=0;n<t.length;n++){let o=t[n],r=[];o.originalPoints.forEach(y=>{let w=new Xt.Vector3(y.x,y.y,0),z=!1;for(let M=0;M<r.length;M++)if(ct(w,r[M],.01)){z=!0;break}z||r.push(w)});let s=Math.round(Math.max(5,Math.min(350,20*Math.sqrt(o.length)))),i=1,l=new Xt.Vector3(o.start.x,o.start.y,o.start.z),u=new Xt.Vector3(o.end.x,o.end.y,o.end.z),d=new Xt.Vector3().subVectors(u,l).normalize(),f=d.clone().cross(new Xt.Vector3(0,0,1)).normalize(),c=f.clone().negate(),a=[],h=[],g=o.length/s;console.log(g);for(let y=0;y<s;y++){let w=[];w.push(l.clone().addScaledVector(f,i)),w.push(w[0].clone().addScaledVector(d,g)),w.push(w[1].clone().addScaledVector(c,i*2)),w.push(l.clone().addScaledVector(c,g));let z=[];for(let M=0;M<r.length;M++)a.includes(M)||Ai(r[M],w)&&(a.push(M),z.push(r[M]));z.length>0&&h.push(Li(z)),l=l.addScaledVector(d,g)}let p=new Float32Array(r.length*3);r.forEach((y,w)=>{p[w*3]=y.x,p[w*3+1]=y.y,p[w*3+2]=y.z});let b=new Xt.BufferGeometry;b.setAttribute("position",new Xt.BufferAttribute(p,3)),b.rotateX(-Math.PI/2),e.add(new Xt.Points(b,new Xt.PointsMaterial({color:xs(),size:.02})));let[m,x]=Fi(h,{plane:"xy",trimRatio:0});hs(m,x,e)}};function bs(t,e="xy"){if(e==="xy")return{x:t.x,y:t.y};if(e==="xz")return{x:t.x,y:t.z};if(e==="yz")return{x:t.y,y:t.z};throw new Error(`Unsupported plane: ${e}`)}function Hi(t,e,n){let o=e.x-t.x,r=e.y-t.y,s=n.x-t.x,i=n.y-t.y;return o*i-r*s}function Ai(t,e,n="xy"){if(!e||e.length!==4)throw new Error("rectPoints must contain 4 points");let o=bs(t,n),r=e.map(l=>bs(l,n)),s=!1,i=!1;for(let l=0;l<4;l++){let u=r[l],d=r[(l+1)%4],f=Hi(u,d,o);if(f>1e-9&&(s=!0),f<-1e-9&&(i=!0),s&&i)return!1}return!0}function Li(t){if(!t||t.length===0)return null;let e=new Xt.Vector3(0,0,0);for(let n of t)Array.isArray(n)?(e.x+=n[0],e.y+=n[1],e.z+=n[2]):(e.x+=n.x,e.y+=n.y,e.z+=n.z);return e.divideScalar(t.length),e}function ki(t){return t instanceof Xt.Vector3?t.clone():Array.isArray(t)?new Xt.Vector3(t[0],t[1],t[2]):new Xt.Vector3(t.x,t.y,t.z)}function Bi(t,e="xy"){let n=ki(t);if(e==="xy")return{x:n.x,y:n.y,up:n.z};if(e==="xz")return{x:n.x,y:n.z,up:n.y};if(e==="yz")return{x:n.y,y:n.z,up:n.x};throw new Error(`Unsupported plane: ${e}`)}function ws(t,e,n,o="xy"){if(o==="xy")return new Xt.Vector3(t,e,n);if(o==="xz")return new Xt.Vector3(t,n,e);if(o==="yz")return new Xt.Vector3(n,t,e);throw new Error(`Unsupported plane: ${o}`)}function Oi(t,e,n){if(Math.abs(e)<1e-12)return t>=n?{x:1,y:0}:{x:0,y:1};let r=t+n,s=t*n-e*e,i=Math.sqrt(Math.max(0,r*r*.25-s)),l=r*.5+i,u=e,d=l-t,f=Math.hypot(u,d);return f<1e-12?{x:1,y:0}:{x:u/f,y:d/f}}function Fi(t,e={}){let{plane:n="xy",trimRatio:o=0}=e;if(!t||t.length<2)return null;let r=t.map(I=>Bi(I,n)),s=0,i=0,l=0;for(let I of r)s+=I.x,i+=I.y,l+=I.up;s/=r.length,i/=r.length,l/=r.length;let u=0,d=0,f=0;for(let I of r){let C=I.x-s,H=I.y-i;u+=C*C,d+=C*H,f+=H*H}u/=r.length,d/=r.length,f/=r.length;let c=Oi(u,d,f),a={x:-c.y,y:c.x},h=[];for(let I of r){let C=I.x-s,H=I.y-i,A=C*c.x+H*c.y,k=C*a.x+H*a.y;h.push({s:A,t:k,up:I.up})}h.sort((I,C)=>I.s-C.s);let g=h.length,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 I=h.map(H=>H.t).sort((H,A)=>H-A),C=Math.floor(I.length/2);return I.length%2===0?(I[C-1]+I[C])*.5:I[C]})(),w=(()=>{let I=h.map(H=>H.up).sort((H,A)=>H-A),C=Math.floor(I.length/2);return I.length%2===0?(I[C-1]+I[C])*.5:I[C]})(),z=m.s,M=x.s,P=y,E=y,T=w,V=w,_=s+c.x*z+a.x*P,v=i+c.y*z+a.y*P,S=s+c.x*M+a.x*E,R=i+c.y*M+a.y*E,D=ws(_,v,T,n),W=ws(S,R,V,n);return[D,W]}var Ni=async(t,e,n,o,r)=>{if(ps(t,o,r),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(W=>{D.push(new F.Vector3(W.x,W.y,W.z))}),M.push(D)});let P=M.length,E=Array.from({length:P},(R,D)=>D);for(let R=0;R<P;R++)for(let D=R+1;D<P;D++){let W=M[R],I=M[D];if(W.some(H=>I.some(A=>H.equals(A)))){let H=T(R),A=T(D);H!==A&&(E[H]=A)}}let V=new Map,_=-1,v=-1;for(let R=0;R<P;R++){let D=T(R);V.has(D)||V.set(D,{points:[],area:0,index:-1,gridWidth:-1,gridHeight:-1,centerPts:[],facePoints:[],boxArea:-1,totalInPlaneNum:-1});let W=V.get(D),[I,C,H,A]=M[R],k=new F.Vector3().add(I).add(C).add(H).add(A).multiplyScalar(.25);if(W.points.push(...M[R]),W.area+=I.distanceTo(C)*I.distanceTo(A),W.index=w,W.centerPts.push(k),_==-1||v==-1){let O=new F.Vector3().subVectors(I,C).normalize();v=I.distanceTo(A),_=I.distanceTo(C);let N=Kt(O,new F.Vector3(0,0,1));N&&N.parallel&&([v,_]=[_,v])}W.gridWidth=_,W.gridHeight=v}let S=V.values();for(let R of V.values()){let{facePoints:D,boxArea:W,totalInPlaneNum:I}=gs(R.points,R.gridWidth,R.gridHeight,R.centerPts);R.centerPts=null,R.facePoints=D,R.boxArea=W,R.totalInPlaneNum=I}x.push(...S)}m.checkResults=null,m.mergeCheckRegion=x}}let s=[];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=qt(y[0],y[3],!0),P=qt(y[1],y[2],!0);s.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<s.length;m++){let x=s[m];for(let y=0;y<t.length;y++){if(t[y].length<.5)continue;let w=[],z=qt(t[y].start,t[y].end,!0);w.push(z),w.push(qt(z,t[y].start,!0)),w.push(qt(z,t[y].end,!0));let M=!1,P=x.boxPoints.length;for(let E=0;E<w.length;E++){let T=w[E].x,V=w[E].y;for(let _=0,v=P-1;_<P;v=_++){let S=x.boxPoints[_].x,R=x.boxPoints[_].y,D=x.boxPoints[v].x,W=x.boxPoints[v].y;R>V!=W>V&&T<(D-S)*(V-R)/(W-R)+S&&(M=!M)}if(M)break}if(M){let E=new F.Vector3(t[y].start.x,t[y].start.y,0),T=new F.Vector3(t[y].end.x,t[y].end.y,0),V=x.doorStartPt.distanceTo(x.doorEndPt),_=E.distanceTo(T),v=Gt(x.doorStartPt,x.doorEndPt,E,T);if(Math.abs(_-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(_-V)>1.3&&v&&v.angleDeg<15){let S=ye(x.doorStartPt,x.doorEndPt,E,T,{parallelAngleMax:F.MathUtils.degToRad(15)}),R=x.doorStartPt.distanceTo(E),D=x.doorStartPt.distanceTo(T),W=x.doorEndPt.distanceTo(E),I=x.doorEndPt.distanceTo(T),C=R<.2||D<.2||W<.2||I<.2;if(S&&S.type=="collinear_overlap"&&S.maxPerpendicularDistance<.1&&!C){x.inWall=!0;break}else{let H=new F.Line3(E,T),A=H.closestPointToPoint(x.doorStartPt,!0,new F.Vector3),k=H.closestPointToPoint(x.doorEndPt,!0,new F.Vector3),O=A.distanceTo(x.doorStartPt),N=k.distanceTo(x.doorEndPt);if(O<.1||N<.1){x.inWall=!0;break}}}}else continue}}let i=0,l=[],u=[],d=[],f=[],c=.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 W=S[0].distanceTo(S[1]),I=S[0].distanceTo(S[3]),C=v.gridHeight*(I/v.gridHeight/3*2)+v.gridHeight/2,H=new F.Vector3(S[0].x,S[0].y,S[0].z+C),A=new F.Vector3(S[1].x,S[1].y,S[1].z+C),k=new F.Line3(H,A),O=[],N=new F.Vector3;v.points.forEach(q=>{k.closestPointToPoint(q,!0,N).distanceTo(q)<v.gridHeight+.01&&O.push(q)});let L=[],B=[];for(;;){let q=[];for(let X=0;X<O.length;X++)B.includes(X)||q.length==0&&(q.push(O[X]),B.push(X));for(let X=0;X<O.length;X++)if(!B.includes(X)){for(let Y=0;Y<q.length;Y++)if(O[X].distanceTo(q[Y])<v.gridWidth+.01){q.push(O[X]),B.push(X),X=-1;break}}if(q.length==0)break;L.push(q)}let $=[];for(let q=0;q<L.length;q++){let X={lineSt:new F.Vector3,lineEd:new F.Vector3,facePoints:[]},Y=nn(L[q]);Array.isArray(Y)&&Y.length==2&&(X.lineSt=Y[0],X.lineEd=Y[1],X.facePoints.push(new F.Vector3(Y[0].x,Y[0].y,S[0].z)),X.facePoints.push(new F.Vector3(Y[1].x,Y[1].y,S[0].z)),X.facePoints.push(new F.Vector3(Y[1].x,Y[1].y,S[2].z)),X.facePoints.push(new F.Vector3(Y[0].x,Y[0].y,S[2].z)),$.push(X))}V+=v.area;let G=0;if(D!=0&&(G=v.gridHeight*v.gridWidth*D),(v.area-G)/R*100>70&&$.length==1||$.length>1)for(let q=0;q<$.length;q++){let X=$[q],Y=X.facePoints[0].distanceTo(X.facePoints[1]),it=X.facePoints[0].distanceTo(X.facePoints[3]),ht=Y/x.length*100,St=x.rooftopPz-X.facePoints[2].z;if(it<1.5||z<X.facePoints[2].z||St>T/3*2)continue;let nt=!1,wt=!1,zt=!1,Dt=new F.Vector3(0,0,0),Pt=new F.Vector3(0,0,0),Mt=!1,It=[],ot=X.facePoints[2].clone(),ft=X.facePoints[3].clone(),st=X.facePoints[0].clone(),tt=X.facePoints[1].clone(),ae=!1,bt=-1;if(Math.abs(X.facePoints[0].z-x.start.z)<.25){let Jt=!1;for(let rt=0;rt<e.length;rt++){let Ct=rt+1;if(Ct>=e.length)continue;let Ft=new F.Vector3(e[rt].x,e[rt].y,e[rt].z),at=new F.Vector3(e[Ct].x,e[Ct].y,e[Ct].z);if(ze(new F.Vector3(Ft.x,Ft.y,0),new F.Vector3(at.x,at.y,0),new F.Vector3(X.facePoints[0].x,X.facePoints[0].y,0),new F.Vector3(X.facePoints[1].x,X.facePoints[1].y,0),.1)!=null){Jt=!0;break}}let{newOriginalPoints:he}=bn(st,tt,x.originalPoints),Tt=[],ee=[];if(he.forEach(rt=>{rt.z>=ot.z?Tt.push(rt):rt.z<=st.z&&ee.push(rt)}),Tt.length<20)continue;let et=x.rooftopPz-ot.z,me=ot.clone();me.z+=et;let Ae=ot.distanceTo(ft),Le=new F.Vector3().subVectors(ft,ot).normalize(),gn=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(Ae)))),ke=Ae/gn,ge=[],tn=[];for(let rt=0;rt<gn;rt++)ge.push(new F.Vector3(ot.x,ot.y,ot.z+et/5).addScaledVector(Le,ke*rt)),ge.push(new F.Vector3(me.x,me.y,me.z-et/5).addScaledVector(Le,ke*rt));let en=ge.length;for(let rt=0;rt<Tt.length;rt++)for(let Ct=0;Ct<ge.length;Ct++)if(new F.Vector3(Tt[rt].x,Tt[rt].y,Tt[rt].z).distanceTo(ge[Ct])<.05){tn.push(ge[Ct]),ge.splice(Ct,1);break}if(tn.length/en<.5)continue;if(Y>.17&&x.length>.5){let rt=jt(P,st),Ct=jt(P,tt),Ft=jt(E,st),at=jt(E,tt),j=.15,Et=10;if(rt<j||Ct<j)if(Tt.length>10){let yt=new F.Vector3(x.start.x,x.start.y,0),ut=new F.Vector3(x.end.x,x.end.y,0),gt=new F.Vector3().subVectors(yt,ut).normalize(),kt=new F.Vector3,pt=1/0,Ot=-1,xt=!1,dt=!1;for(let J=0;J<t.length;J++){if(J==m)continue;let mt=new F.Vector3(t[J].start.x,t[J].start.y,0),lt=new F.Vector3(t[J].end.x,t[J].end.y,0),vt=ze(yt,ut,mt,lt,.1),Wt=ie(yt,ut,mt,lt);if(vt!=null){if(Wt&&Wt.angle>85){let _t=vt.point.distanceTo(yt),At=vt.point.distanceTo(ut);if(_t<.3){dt=!0,pt=1/0,Ot=-1;break}}continue}if(Wt&&Wt.angle>85){let At=new F.Line3(mt,lt).closestPointToPoint(yt,!0,kt),Bt=Gt(yt,ut,At,yt);if(!Bt||Bt.direction!="same")continue;let se=yt.clone().addScaledVector(gt,Et),Ut=ut.clone().addScaledVector(gt.clone().negate(),Et),re=new F.Vector3().subVectors(lt,mt).normalize(),te=mt.clone().addScaledVector(re.clone().negate(),.03),Te=lt.clone().addScaledVector(re,.03),le=ze(se,Ut,te,Te);if(le==null)continue;let ne=yt.distanceTo(le.point);ne<pt&&(pt=ne,Ot=J)}else if(Wt&&Wt.angle<5){let _t=new F.Vector3(st.x,st.y,0),At=new F.Vector3(tt.x,tt.y,0),Bt=jt(_t,mt),se=jt(_t,lt),Ut=jt(At,mt),re=jt(At,lt),te=Gt(yt,ut,mt,_t),Te=!1,le=o.readLineById(t[J].id);if(le.checkResults=o.getLineCheckReultsById(t[J].id),t[J].checkResults=le.checkResults,le=null,t[J].checkResults){for(let ne=0;ne<t[J].checkResults.length;ne++){let xn=[];for(let xe=0;xe<t[J].checkResults[ne].originalVertices.length;xe++){let Re=Fn(t[J].checkResults[ne].originalVertices[xe]);Re.z=0,xn.push(Re)}let pe=nn(xn);if(pe.length==2){let xe=jt(_t,pe[0]),Re=jt(_t,pe[1]),po=jt(At,pe[0]),xo=jt(At,pe[1]);if(xe<.2||Re<.2||po<.2||xo<.2){Te=!0;break}}}t[J].checkResults=null}if(te&&te.direction=="same"&&!Te&&(Bt<.1||se<.1||Ut<.1||re<.1)){xt=!0,pt=1/0,Ot=-1;break}}}if(pt!=1/0&&pt<2&&(x.length-Y>.2||x.length-Y<.02)&&pt<Y*2)t[Ot].length>.25&&Y+pt>.5&&(ae=!0,rt<j?(ft=ft.addScaledVector(gt,pt),st=st.addScaledVector(gt,pt)):(ot=ot.addScaledVector(gt,pt),tt=tt.addScaledVector(gt,pt)));else{if(!xt&&!dt&&x.length-Y>.1)continue;if(!xt&&!dt&&x.length-Y<.1&&x.length<1.8)continue}}else continue;if(Ft<j||at<j)if(Tt.length>10){let yt=new F.Vector3(x.start.x,x.start.y,0),ut=new F.Vector3(x.end.x,x.end.y,0),gt=new F.Vector3().subVectors(ut,yt).normalize(),kt=new F.Vector3,pt=1/0,Ot=-1,xt=!1,dt=!1;for(let J=0;J<t.length;J++){if(J==m)continue;let mt=new F.Vector3(t[J].start.x,t[J].start.y,0),lt=new F.Vector3(t[J].end.x,t[J].end.y,0),vt=ze(yt,ut,mt,lt,.03),Wt=ie(yt,ut,mt,lt);if(vt!=null){if(Wt&&Wt.angle>85){let _t=vt.point.distanceTo(yt);if(vt.point.distanceTo(ut)<.3){dt=!0,pt=1/0,Ot=-1;break}}continue}if(Wt&&Wt.angle>85){let At=new F.Line3(mt,lt).closestPointToPoint(ut,!0,kt),Bt=Gt(ut,yt,At,ut);if(!Bt||Bt.direction!="same")continue;let se=yt.clone().addScaledVector(gt.clone().negate(),Et),Ut=ut.clone().addScaledVector(gt,Et),re=new F.Vector3().subVectors(lt,mt).normalize(),te=mt.clone().addScaledVector(re.clone().negate(),.03),Te=lt.clone().addScaledVector(re,.03),le=ze(se,Ut,te,Te);if(le==null)continue;let ne=ut.distanceTo(le.point);ne<pt&&(pt=ne,Ot=J)}else if(Wt&&Wt.angle<5){let _t=new F.Vector3(st.x,st.y,0),At=new F.Vector3(tt.x,tt.y,0),Bt=jt(_t,mt),se=jt(_t,lt),Ut=jt(At,mt),re=jt(At,lt),te=Gt(ut,yt,mt,_t),Te=!1,le=o.readLineById(t[J].id);if(le.checkResults=o.getLineCheckReultsById(t[J].id),t[J].checkResults=le.checkResults,le=null,t[J].checkResults){for(let ne=0;ne<t[J].checkResults.length;ne++){let xn=[];for(let xe=0;xe<t[J].checkResults[ne].originalVertices.length;xe++){let Re=Fn(t[J].checkResults[ne].originalVertices[xe]);Re.z=0,xn.push(Re)}let pe=nn(xn);if(pe.length==2){let xe=jt(_t,pe[0]),Re=jt(_t,pe[1]),po=jt(At,pe[0]),xo=jt(At,pe[1]);if(xe<.2||Re<.2||po<.2||xo<.2){Te=!0;break}}}t[J].checkResults=null}if(te&&te.direction=="same"&&!Te&&(Bt<.1||se<.1||Ut<.1||re<.1)){xt=!0,pt=1/0,Ot=-1;break}}}if(pt!=1/0&&pt<2&&(x.length-Y>.2||x.length-Y<.02)&&pt<Y*2)t[Ot].length>.25&&Y+pt>.5&&(ae=!0,Ft<j?(ft=ft.addScaledVector(gt,pt),st=st.addScaledVector(gt,pt)):(ot=ot.addScaledVector(gt,pt),tt=tt.addScaledVector(gt,pt)));else{if(!xt&&!dt&&x.length-Y>.1)continue;if(!xt&&!dt&&x.length-Y<.1&&x.length<1.8)continue}}else continue;Y=ft.distanceTo(ot)}if(ht<85&&Y>.3||Y>.7&&it>T-T/2){if(!x.isLine2){if(Y<3.5)for(let rt=0;rt<s.length;rt++){let Ct=new F.Vector3(s[rt].doorStartPt.x,s[rt].doorStartPt.y,0),Ft=new F.Vector3(s[rt].doorEndPt.x,s[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),Et=X.facePoints[2].z<s[rt].maxZ||Math.abs(X.facePoints[2].z-s[rt].maxZ)<.3,yt=Math.abs(X.facePoints[2].z-s[rt].maxZ)>.2;if(Et){let ut=ye(Ct.clone(),Ft.clone(),at.clone(),j.clone(),{distanceThreshold:2});if(ut&&ut.type=="collinear_gap"){let gt=qt(Ct,Ft),kt=new F.Line3(new F.Vector3(x.start.x,x.start.y,0),new F.Vector3(x.end.x,x.end.y,0)),pt=new F.Vector3,Ot=kt.closestPointToPoint(gt,!0,pt);if(gt.distanceTo(Ot)<.15){let dt=at.distanceTo(Ct),J=j.distanceTo(Ct);if(dt>.25&&J>.25){let vt=at.distanceTo(Ft),Wt=j.distanceTo(Ft);if(vt>.2&&Wt>.2)continue}wt=!0,Mt=!0,It.push(s[rt].index),s[rt].isFind=!0,bt=rt,zt=n[s[rt].index].isFindBeam,n[s[rt].index].isFindBeam=!0;let mt=new F.Vector3().subVectors(at,j).normalize(),lt=Ct.distanceTo(Ft)-ut.overlap;J<dt&&mt.negate(),dt>J?(ot=X.facePoints[2].clone().addScaledVector(mt,lt),ft=X.facePoints[3].clone(),st=ft.clone(),tt=ot.clone(),st.z=tt.z=X.facePoints[0].z):(ot=X.facePoints[2].clone(),ft=X.facePoints[3].clone().addScaledVector(mt,lt),st=ft.clone(),tt=ot.clone(),st.z=tt.z=X.facePoints[0].z)}}else if(ut&&ut.type=="collinear_overlap"&&ut.maxPerpendicularDistance<.35){let gt=at.distanceTo(j),kt=Ft.distanceTo(Ct);if(Math.abs(gt-ut.overlap)<.25||Math.abs(kt-ut.overlap)<.25){if(kt>gt&&Math.abs(kt-ut.overlap)>1){let pt=at.distanceTo(Ct),Ot=at.distanceTo(Ft),xt=j.distanceTo(Ct),dt=j.distanceTo(Ft),J=pt<Ot?pt:Ot,mt=xt<dt?xt:dt,lt=new F.Vector3().subVectors(at,j).normalize(),vt=kt-ut.overlap;J<mt?(lt.negate(),ot=X.facePoints[2].clone().addScaledVector(lt,vt),ft=X.facePoints[3].clone(),st=ft.clone(),tt=ot.clone(),st.z=tt.z=X.facePoints[0].z):(ot=X.facePoints[2].clone(),ft=X.facePoints[3].clone().addScaledVector(lt,vt),st=ft.clone(),tt=ot.clone(),st.z=tt.z=X.facePoints[0].z)}Y>1.5&&(wt=!0,Mt=!0,It.push(s[rt].index),s[rt].isFind=!0,zt=n[s[rt].index].isFindBeam,n[s[rt].index].isFindBeam=!0,bt=rt)}}}}if(!Mt&&Y<1.5)for(let rt=0;rt<s.length;rt++){if(s[rt].inWall)continue;let Ct=new F.Vector3(s[rt].doorStartPt.x,s[rt].doorStartPt.y,0),Ft=new F.Vector3(s[rt].doorEndPt.x,s[rt].doorEndPt.y,0),at=new F.Vector3(ft.x,ft.y,0),j=new F.Vector3(ot.x,ot.y,0),Et=new F.Vector3().subVectors(Ct,Ft).normalize(),yt=new F.Vector3().subVectors(at,j).normalize(),ut=.25,gt=Ct.clone().addScaledVector(Et,ut),kt=Ft.clone().addScaledVector(Et.clone().negate(),ut),pt=at.clone().addScaledVector(yt,ut),Ot=j.clone().addScaledVector(yt.clone().negate(),ut);if(Gt(gt,kt,pt,Ot).isParallel)continue;let dt=ze(gt,kt,pt,Ot),J=!0,mt=Ct.distanceTo(at),lt=Ct.distanceTo(j),vt=Ft.distanceTo(at),Wt=Ft.distanceTo(j);if((mt<c||lt<c||vt<c||Wt<c||dt)&&J){let At=new F.Line3(at,j);if(mt<c||vt<c)if(Dt=at.clone(),mt<c){let Bt=At.closestPointToPoint(Ft,!1,new F.Vector3);Pt=new F.Vector3().subVectors(Ft,Bt).normalize()}else{let Bt=At.closestPointToPoint(Ct,!1,new F.Vector3);Pt=new F.Vector3().subVectors(Ct,Bt).normalize()}else if(lt<c||Wt<c)if(Dt=j.clone(),lt<c){let Bt=At.closestPointToPoint(Ft,!1,new F.Vector3);Pt=new F.Vector3().subVectors(Ft,Bt).normalize()}else{let Bt=At.closestPointToPoint(Ct,!1,new F.Vector3);Pt=new F.Vector3().subVectors(Ct,Bt).normalize()}else if(dt){let Bt=dt.point.distanceTo(at),se=dt.point.distanceTo(j),Ut=dt.point.distanceTo(gt),re=dt.point.distanceTo(kt);if(Bt<se?Dt=at.clone():Dt=j.clone(),Ut<re){let te=At.closestPointToPoint(kt,!1,new F.Vector3);Pt=new F.Vector3().subVectors(kt,te).normalize()}else{let te=At.closestPointToPoint(gt,!1,new F.Vector3);Pt=new F.Vector3().subVectors(gt,te).normalize()}}zt=n[s[rt].index].isFindBeam,n[s[rt].index].isFindBeam=!0,wt=!0,s[rt].isFind=!0,bt=rt}}}(wt||Jt||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),Et=1/0,yt=1/0,ut=st.clone(),gt=tt.clone(),kt=[],pt=[],Ot=new F.Line3(ot,ft),xt=new F.Vector3,dt=999999;if(x.originalPoints.forEach(J=>{if(J.z-st.z<it/2+.1&&J.z-st.z>it/2-.1&&kt.push(J),J.z>ot.z){let mt=Ot.closestPointToPoint(J,!0,xt),lt=new F.Vector3().subVectors(mt,ot),vt=new F.Vector3().subVectors(mt,ft),Wt=Kt(at,vt),_t=Kt(j,lt);Wt&&Wt.parallel&&!Wt.sameDirection&&_t&&_t.parallel&&!_t.sameDirection&&pt.push(J)}}),kt.length>0){let{newProjectPoints:J}=bn(st,tt,kt);for(let mt of J)mt.z=st.z;J.forEach(mt=>{let lt=new F.Vector3(mt.x,mt.y,st.z),vt=new F.Vector3().subVectors(lt,tt),Wt=new F.Vector3().subVectors(lt,st),_t=Kt(at,Wt),At=Kt(j,vt);if(_t&&_t.parallel&&_t.sameDirection){let Bt=lt.distanceTo(st);Bt<Et&&(Et=Bt,ut=lt)}else if(At&&At.parallel&&At.sameDirection){let Bt=lt.distanceTo(tt);Bt<yt&&(yt=Bt,gt=lt)}})}if(ut.equals(st)||(st=ut,ft=new F.Vector3(st.x,st.y,ft.z)),gt.equals(tt)||(tt=gt,ot=new F.Vector3(tt.x,tt.y,ot.z)),pt.length>10){let{newOnLinePoints:J}=bn(ft,ot,pt);for(let mt=0;mt<J.length;mt++){let vt=Ot.closestPointToPoint(J[mt],!0,xt).distanceTo(J[mt]);vt>.02&&dt>vt&&(dt=vt)}ot.z+=dt,ft.z+=dt,it+=dt}}let Jt=!1;for(let at=0;at<d.length;at++){let j=ye(d[at].start,d[at].end,st,tt);j&&j.type=="collinear_overlap"&&j.maxPerpendicularDistance<.07&&(Jt=!0)}if(Jt){bt!=-1&&(zt||(n[s[bt].index].isFindBeam=!1,s[bt].isFind=!1));continue}let he=tt.distanceTo(st);if(he<.4&&!wt||he<.3&&wt)continue;u.includes(m)||u.push(m);let Tt="",ee=wt?"singleDoor":"";ee=Mt?"pullOutDoor":ee;let et={id:i,beamStart:ot,beamEnd:ft,beamHeight:x.rooftopPz-ot.z,doorStart:st,doorEnd:tt,doorHeight:it,nearId:-1,type:Tt,isExtend:ae,isDoor:wt,isPullOutDoor:Mt,pcbDoorIndexs:It,beamNearWallVec:new F.Vector3(0,0,0),doorType:ee,doorOpenEndPoint:Dt,doorOpenVector:Pt,lineIsOnlyBeam:!1};if(et.beamHeight<.1)continue;let me=1/0,Ae=!1,Le=new F.Vector3,gn=new F.Vector3,ke=-1,ge=-1,tn=-1,en=!1,pn=!1;if(!Ae){let at=new F.Line3(st.clone(),tt.clone()),j=-1;for(let Et=0;Et<t.length;Et++){if(t[Et].length<.5||Et==m)continue;let yt=new F.Vector3(t[Et].start.x,t[Et].start.y,t[Et].start.z),ut=new F.Vector3(t[Et].end.x,t[Et].end.y,t[Et].end.z),gt=ye(yt,ut,st,tt),kt=Gt(yt,ut,st,tt);if(gt&>.maxPerpendicularDistance<.5){if(kt&&kt.isParallel){let lt=new F.Line3(yt,ut),vt=new F.Vector3(st.x,st.y,yt.z),Wt=lt.closestPointToPoint(vt,!0,new F.Vector3),_t=ie(Wt,vt,st,tt);_t&&_t.angle>85&&(et.beamNearWallVec=new F.Vector3().subVectors(Wt,vt).normalize(),et.beamStart.z>t[Et].rooftopPz-.03&&Y>1?pn=!0:pn=!1)}let pt=[],Ot=o.readLineById(t[Et].id);Ot.originalPoints=o.getOriginalPointsById(t[Et].id),t[Et].originalPoints=Ot.originalPoints,Ot=null,t[Et].originalPoints.forEach(lt=>{lt.z>st.z+.2&<.z<st.z+it/2&&pt.push(new F.Vector3(lt.x,lt.y,st.z))}),t[Et].originalPoints=null;let xt=new F.Vector3,dt=[],J=[];for(let lt=0;lt<pt.length;lt++){let vt=at.closestPointToPoint(pt[lt],!0,xt);vt.distanceTo(pt[lt])<.15&&(dt.push(pt[lt]),J.push(vt.clone()))}for(let lt=0;lt<J.length;lt++)zo(at,J[lt])&&dt.push(J[lt]);if(dt=J,dt=Mo(dt),dt.length<150)continue;let mt=nn(dt);if(mt.length==2){let lt=mt[0].distanceTo(mt[1]);if(Math.abs(lt-at.distance())<.3){j=gt.maxPerpendicularDistance;let vt=new F.Line3(yt,ut),Wt=new F.Vector3(st.x,st.y,yt.z),_t=vt.closestPointToPoint(Wt,!0,new F.Vector3);if(et.beamNearWallVec=new F.Vector3().subVectors(_t,Wt).normalize(),et.beamStart.z>t[Et].rooftopPz-.03&&Y>.8)pn=!0,en=!0;else if(Jt=!0,bt!=-1&&(zt||(n[s[bt].index].isFindBeam=!1,s[bt].isFind=!1)),ge!=-1&&tn!=-1){let At=t[ge].doorAndBeamData[tn];At.nearId=-1}break}}if(Jt)break}else gt&>.type=="collinear_overlap"&>.maxPerpendicularDistance>.3&>.maxPerpendicularDistance<.7&&(en=!0)}if(Jt){if(Y<1.5||j<.08)continue;en=!0}}let rt=!1;if(ke!=-1)for(let at=0;at<f.length&&!(f[at].length==1&&(f[at][0].id==i?(f[at].push({id:ke,beamStart:Le,beamEnd:gn}),rt=!0):f[at][0].id==ke&&(f[at].push({id:i,beamStart:ot,beamEnd:ft}),rt=!0),rt));at++);rt||f.push([{id:i,beamStart:ot,beamEnd:ft}]);let Ct=et.doorStart.distanceTo(et.doorEnd),Ft=On(x.originalPoints);if(et.lineIsOnlyBeam=Ft.minZ>x.start.z&&Ft.minZ-x.start.z>1,wt?Tt="door":Ct>1.5||ae?Tt="beam":Tt=en&&Ct>.8?"beam":"hole",Tt!="beam"&&t[m].isLine2)continue;et.type=Tt,et.wallBelowBeam=pn;for(let at=0;at<l.length;at++){let j=t[l[at].linesIndex].doorAndBeamData[l[at].doorIndex];if(j.nearId!=-1||et.type=="beam"&&j.type!="beam"||et.type!="beam"&&j.type=="beam")continue;let Et=Gt(ot.clone(),ft.clone(),j.beamStart.clone(),j.beamEnd.clone());if(Et&&Et.isParallel){let yt=ot.distanceTo(ft),ut=j.beamStart.distanceTo(j.beamEnd),gt=new F.Line3(ot.clone(),ft.clone());gt.start.z=0,gt.end.z=0;let kt=qt(j.beamStart,j.beamEnd,!0);ut>yt&&(gt.start=new F.Vector3(j.beamStart.x,j.beamStart.y,0),gt.end=new F.Vector3(j.beamEnd.x,j.beamEnd.y,0),kt=qt(ot,ft,!0));let pt=new F.Vector3,Ot=gt.closestPointToPoint(kt,!0,pt),xt=Ot.distanceTo(kt),dt=new F.Vector3().subVectors(kt,Ot).normalize(),J=dt.clone().negate(),mt=kt.clone().addScaledVector(J,xt+.1),lt=ze(gt.start,gt.end,kt,mt),vt=!wt&&!j.isDoor&&(yt>ut*2||ut>yt*2);if(xt<.4&<!=null&&!vt){let Wt=!1;for(let Ut=0;Ut<x.doorAndBeamData.length;Ut++)if(x.doorAndBeamData[Ut].id==j.id){Wt=!0;break}if(Wt)continue;j.nearId=i,et.nearId=j.id;let _t=.8;(j.isDoor||et.isDoor)&&(j.isDoor=!0,et.isDoor=!0),j.doorType!=""?et.doorType=j.doorType:et.doorType!=""&&(j.doorType=et.doorType),j.isPullOutDoor?et.isPullOutDoor=!0:et.isPullOutDoor&&(j.isPullOutDoor=!0);let At=It.some(Ut=>j.pcbDoorIndexs.includes(Ut)),Bt=!1,se=!1;if(et.type=="beam"&&j.type=="beam"){let Ut=o.readLineById(t[l[at].linesIndex].id);Ut.originalPoints=o.getOriginalPointsById(t[l[at].linesIndex].id),t[l[at].linesIndex].originalPoints=Ut.originalPoints,Ut=null;let re=On(t[l[at].linesIndex].originalPoints),te=On(x.originalPoints);t[l[at].linesIndex].originalPoints=null,re.minZ>t[l[at].linesIndex].start.z&&re.minZ-t[l[at].linesIndex].start.z>1&&te.minZ>x.start.z&&te.minZ-x.start.z>1&&(Bt=yt>ut,se=yt<ut,ut>yt&&(et.isExtend=!0),yt>ut&&(t[l[at].linesIndex].isExtend=!0))}yt<ut&&!se||Bt?(Bt&&(J=J.negate(),dt=dt.negate()),yt>_t&&!j.isPullOutDoor?(j.beamStart=ot.clone().addScaledVector(J,xt),j.beamEnd=ft.clone().addScaledVector(J,xt),j.doorStart=st.clone().addScaledVector(J,xt),j.doorEnd=tt.clone().addScaledVector(J,xt),j.doorHeight=et.doorHeight,j.beamStart.z=j.beamEnd.z=j.doorStart.z+j.doorHeight,j.doorOpenEndPoint=et.doorOpenEndPoint.clone(),j.doorOpenVector=et.doorOpenVector.clone()):!Mt||Mt&&j.isPullOutDoor&&At?(et.beamStart=j.beamStart.clone().addScaledVector(dt,xt),et.beamEnd=j.beamEnd.clone().addScaledVector(dt,xt),et.doorStart=j.doorStart.clone().addScaledVector(dt,xt),et.doorEnd=j.doorEnd.clone().addScaledVector(dt,xt),et.doorHeight=j.doorHeight,et.beamStart.z=et.beamEnd.z=et.doorStart.z+et.doorHeight,et.doorOpenEndPoint=j.doorOpenEndPoint.clone(),et.doorOpenVector=j.doorOpenVector.clone()):(j.beamStart=ot.clone().addScaledVector(J,xt),j.beamEnd=ft.clone().addScaledVector(J,xt),j.doorStart=st.clone().addScaledVector(J,xt),j.doorEnd=tt.clone().addScaledVector(J,xt),j.doorHeight=et.doorHeight,j.beamStart.z=j.beamEnd.z=j.doorStart.z+j.doorHeight,j.doorOpenEndPoint=et.doorOpenEndPoint.clone(),j.doorOpenVector=et.doorOpenVector.clone())):(yt>ut&&!Bt||se)&&(se&&(J=J.negate(),dt=dt.negate()),ut>_t&&!Mt?(et.beamStart=j.beamStart.clone().addScaledVector(J,xt),et.beamEnd=j.beamEnd.clone().addScaledVector(J,xt),et.doorStart=j.doorStart.clone().addScaledVector(J,xt),et.doorEnd=j.doorEnd.clone().addScaledVector(J,xt),et.doorHeight=j.doorHeight,et.beamStart.z=et.beamEnd.z=et.doorStart.z+et.doorHeight,et.doorOpenEndPoint=j.doorOpenEndPoint.clone(),et.doorOpenVector=j.doorOpenVector.clone()):!j.isPullOutDoor||Mt&&j.isPullOutDoor&&At?(j.beamStart=ot.clone().addScaledVector(dt,xt),j.beamEnd=ft.clone().addScaledVector(dt,xt),j.doorStart=st.clone().addScaledVector(dt,xt),j.doorEnd=tt.clone().addScaledVector(dt,xt),j.doorHeight=et.doorHeight,j.beamStart.z=j.beamEnd.z=j.doorStart.z+j.doorHeight,j.doorOpenEndPoint=et.doorOpenEndPoint.clone(),j.doorOpenVector=et.doorOpenVector.clone()):(et.beamStart=j.beamStart.clone().addScaledVector(J,xt),et.beamEnd=j.beamEnd.clone().addScaledVector(J,xt),et.doorStart=j.doorStart.clone().addScaledVector(J,xt),et.doorEnd=j.doorEnd.clone().addScaledVector(J,xt),et.doorHeight=j.doorHeight,et.beamStart.z=et.beamEnd.z=et.doorStart.z+et.doorHeight,et.doorOpenEndPoint=j.doorOpenEndPoint.clone(),et.doorOpenVector=j.doorOpenVector.clone())),ke=et.nearId,Le=j.beamStart.clone(),gn=j.beamEnd.clone(),Ae=!0,ge=l[at].linesIndex,tn=l[at].doorIndex;break}}}if(et.nearId!=-1&&Tt=="hole"){let at=!1;for(let j=0;j<t.length;j++)if(t[j].doorAndBeamData){for(let Et=0;Et<t[j].doorAndBeamData.length;Et++)if(t[j].doorAndBeamData[Et].nearId==i&&t[j].doorAndBeamData[Et].type=="beam"){t[j].doorAndBeamData[Et].type=Tt,at=!0;break}if(at)break}}if(x.doorAndBeamIdToCheckResults.push([v.index,i]),x.doorAndBeamData.push(et),l.push({linesIndex:m,doorIndex:x.doorAndBeamData.length-1}),d.push({start:st,end:tt}),i++,Mt&&Y<2)break}}}let _=x.length*(x.rooftopPz-x.start.z);x.completePointAreaPercentage=V/_*100,x.checkResults=null,x.originalPoints=null,x.mergeCheckRegion=null}if(u.length>1)for(let m=0;m<u.length;m++){let x=[];for(let y=0;y<t[u[m]].doorAndBeamData.length;y++){let w=!1;if(t[u[m]].doorAndBeamData[y].type==="beam"&&(t[u[m]].doorAndBeamData[y].beamNearWallVec.x==0&&t[u[m]].doorAndBeamData[y].beamNearWallVec.y==0&&t[u[m]].doorAndBeamData[y].beamNearWallVec.z==0&&t[u[m]].doorAndBeamData[y].nearId==-1||!t[u[m]].doorAndBeamData[y].wallBelowBeam&&t[u[m]].doorAndBeamData[y].nearId==-1)&&(t[u[m]].doorAndBeamData[y].lineIsOnlyBeam?w=!0:t[u[m]].doorAndBeamData[y].type="hole"),!w){let z=t[u[m]].doorAndBeamData[y].doorStart.clone(),M=t[u[m]].doorAndBeamData[y].doorEnd.clone();z.z=M.z=0;let P=z.distanceTo(M);for(let E=0;E<u.length;E++)if(m!=E)for(let T=0;T<t[u[E]].doorAndBeamData.length;T++){let V=t[u[E]].doorAndBeamData[T].doorStart.clone(),_=t[u[E]].doorAndBeamData[T].doorEnd.clone();V.z=_.z=0;let v=V.distanceTo(_),S=ye(z,M,V,_);if(S.type=="collinear_overlap"&&S.maxPerpendicularDistance<.2){let R=new F.Line3(V,_),D=qt(z,M),W=R.closestPointToPoint(D,!0,new F.Vector3),I=D.distanceTo(W);if(Math.abs(P-S.overlap)<.1&&I<.04){t[u[E]].doorAndBeamData[T].nearId==t[u[m]].doorAndBeamData[y].id&&(t[u[E]].doorAndBeamData[T].nearId=-1),w=!0;break}}}}if(w){for(let z=0;z<t[u[m]].doorAndBeamIdToCheckResults.length;z++)if(t[u[m]].doorAndBeamIdToCheckResults[1]==t[u[m]].doorAndBeamData[y].id){t[u[m]].doorAndBeamIdToCheckResults.splice(z,1);break}}w||x.push(t[u[m]].doorAndBeamData[y])}x.length!=t[u[m]].doorAndBeamData.length&&(t[u[m]].doorAndBeamData=x)}let a=.65,h=2,g=[],p=[];for(let m=0;m<s.length;m++){if(s[m].isFind||s[m].inWall)continue;let x=new F.Vector3(s[m].doorStartPt.x,s[m].doorStartPt.y,0),y=new F.Vector3(s[m].doorEndPt.x,s[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),_=y.clone().addScaledVector(w.clone().negate(),T),v=M.clone().addScaledVector(E,T),S=P.clone().addScaledVector(E.clone().negate(),T),R=ze(V,_,v,S),D=Gt(V,_,v,S),W=x.distanceTo(M)>y.distanceTo(M)?y:x,I=W.distanceTo(M),C=W.distanceTo(P);if((I<c||C<c)&&D&&!D.isParallel){let A=x.distanceTo(M),k=x.distanceTo(P),O=A<k?M:P,N=!1;for(let L=0;L<t.length;L++){if(L==z||g.includes(L)||t[L].length<.7)continue;let B=new F.Vector3(t[L].start.x,t[L].start.y,0),$=new F.Vector3(t[L].end.x,t[L].end.y,0),G=new F.Vector3().subVectors(B,$).normalize(),Q=G.clone().negate(),q=B.clone().addScaledVector(G,5),X=$.clone().addScaledVector(Q,5),Y=ie(M,P,B,$),it=ye(M,P,B,$),ht=ze(M,P,q,X),St=!0;if(ht!=null&&(St=ht.point.distanceTo(M)<c||ht.point.distanceTo(P)<c),(Y&&Y.angle>85||it&&it.type=="collinear_gap")&&St){let nt=new F.Line3(M,P),wt=new F.Vector3,zt=nt.closestPointToPoint(B,!0,wt),Dt=nt.closestPointToPoint($,!0,wt),Pt=zt.distanceTo(B),Mt=Dt.distanceTo($),It,ot;if(Pt>Mt&&Mt>a)It=$,ot=Dt;else if(Pt<Mt&&Pt>a)It=B,ot=zt;else continue;if(Pt=O.distanceTo(B),Mt=O.distanceTo($),Pt>h&&Mt>h)continue;let ft=Gt(It,ot,B,$),st=Gt(It,ot,V,_);if(st&&st.isParallel||!ft||!ft.isParallel)continue;let tt=ye(x,y,It,ot);if(tt&&tt.type=="collinear_overlap"&&tt.maxPerpendicularDistance<.2)continue;It.z=ot.z=t[L].start.z;let ae=!1;for(let Tt=0;Tt<p.length;Tt++){let ee=ye(p[Tt].start,p[Tt].end,It,ot);if(ee&&ee.type=="collinear_overlap"&&ee.maxPerpendicularDistance<.2){ae=!0;break}}if(ae)continue;for(let Tt=0;Tt<t.length;Tt++){if(t[Tt].length<.5)continue;let ee=new F.Vector3(t[Tt].start.x,t[Tt].start.y,t[Tt].start.z),et=new F.Vector3(t[Tt].end.x,t[Tt].end.y,t[Tt].end.z),me=ye(ee,et,It,ot);if(me&&me.type=="collinear_overlap"&&me.maxPerpendicularDistance<.1){ae=!0;break}}if(ae)continue;p.push({start:It,end:ot}),g.push(L);let bt=t[L].rooftopPz-t[L].start.z,Jt=t[z].rooftopPz-t[z].start.z,he=bt<Jt?bt:Jt;t[L].doorAndBeamData||(t[L].doorAndBeamData=[]),t[L].doorAndBeamData.push({id:i,beamStart:It,beamEnd:ot,beamHeight:he,doorStart:It,doorEnd:ot,doorHeight:he,nearId:-1,type:"onlyDoor",isDoor:!0,beamNearWallVec:new F.Vector3(0,0,0)}),n[s[m].index].isFindBeam=!0,n[s[m].index].isFindOnlyDoor=!0,f.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:f}},qi=async(t,e)=>{for(let n=0;n<t.length;n++){let o=t[n],r=new F.Vector3(o.start.x,o.start.y,o.start.z),s=new F.Vector3(o.end.x,o.end.y,o.end.z),i=new F.Line3(r.clone(),s.clone()),l=-1;for(let u=0;u<o.doorAndBeamData.length;u++){let d=o.doorAndBeamData[u],f=d.doorHeight;d.isRebuild=!1;let c=!1,a=!1;if(!(d.nearId!=-1||d.type!="beam")){for(let h=0;h<t.length;h++){if(t[h].length<.5||h==n)continue;let g=new F.Vector3(t[h].start.x,t[h].start.y,t[h].start.z),p=new F.Vector3(t[h].end.x,t[h].end.y,t[h].end.z),b=ye(g,p,r,s),m=Gt(g,p,r,s);if(b&&b.maxPerpendicularDistance<.5){if(m&&m.isParallel){let E=new F.Line3(g,p),T=new F.Vector3(r.x,r.y,g.z),V=E.closestPointToPoint(T,!0,new F.Vector3),_=ie(V,T,r,s);_&&_.angle>85&&(d.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>r.z+.2&&E.z<r.z+f/2&&x.push(new F.Vector3(E.x,E.y,r.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++)zo(i,M[E])&&z.push(M[E]);if(z=M,z=Mo(z),z.length<150)continue;let P=nn(z);if(P.length==2){let E=P[0].distanceTo(P[1]);if(Math.abs(E-i.distance())<.3){l=b.maxPerpendicularDistance;let T=new F.Line3(g,p),V=new F.Vector3(r.x,r.y,g.z),_=T.closestPointToPoint(V,!0,new F.Vector3);d.beamNearWallVec=new F.Vector3().subVectors(_,V).normalize(),d.beamStart.z>t[h].rooftopPz-.03&&length>1?a=!0:c=!0;break}}if(c)break}else b&&b.type=="collinear_overlap"&&b.maxPerpendicularDistance>.3&&b.maxPerpendicularDistance<.7&&(a=!0)}if(c){if(length<1.8||l<.2)continue;a=!0}a||(d.isRebuild=!0)}}}};import*as Lt from"three";import"three/examples/jsm/utils/BufferGeometryUtils.js";var zs=(t,e={})=>{let n=e.eps??1e-6,o=e.project??(m=>({x:m.x,y:m.z})),r=e.skipSplit??!1,s=e.insideAreaSign??"positive",i=r?t.map((m,x)=>({start:Nn(m.start),end:Nn(m.end),uuid:m.uuid,sourceIndex:x,sourceSegment:m})):$i(t,o,n),l=[],u=new Map;function d(m){let x=Math.round(m.x/n),y=Math.round(m.y/n);return`${x},${y}`}function f(m){let x=d(m);if(u.has(x))return u.get(x);let y=l.length;return l.push({id:y,x:m.x,y:m.y}),u.set(x,y),y}let c=[],a=new Map;for(let m of i){let x=o(m.start),y=o(m.end);if(Ms(x,y)<n*n)continue;let w=f(x),z=f(y);if(w===z)continue;let M=w<z?`${w}_${z}`:`${z}_${w}`;if(a.has(M))continue;let P=c.length;c.push({id:P,a:w,b:z,uuid:m.uuid,sourceIndex:m.sourceIndex,sourceSegment:m.sourceSegment||m}),a.set(M,P)}let h=[],g=Array.from({length:l.length},()=>[]);function p(m,x,y,w,z){let M=l[m],P=l[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 c){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=>l[v]),E=Xi(P),T=!1;if(s==="positive"?T=E>n:T=E<-n,!T)continue;let V=x.map(v=>h[v].uuid),_=x.map(v=>h[v].sourceIndex);b.push({uuids:V,area:Math.abs(E),lineIndexes:_})}return b};function $i(t,e,n=1e-6){let o=[];for(let r=0;r<t.length;r++){let s=t[r],i=e(s.start),l=e(s.end),u=[{t:0,point:Nn(s.start)},{t:1,point:Nn(s.end)}];for(let f=0;f<t.length;f++){if(r===f)continue;let c=t[f],a=e(c.start),h=e(c.end),g=ji(i,l,a,h,n);g&&g.t>n&&g.t<1-n&&u.push({t:g.t,point:Gi(s.start,s.end,g.t)})}u.sort((f,c)=>f.t-c.t);let d=[];for(let f of u)(d.length===0||Math.abs(f.t-d[d.length-1].t)>n)&&d.push(f);for(let f=0;f<d.length-1;f++){let c=d[f].point,a=d[f+1].point,h=e(c),g=e(a);Ms(h,g)<n*n||o.push({start:c,end:a,uuid:s.uuid,sourceIndex:r,sourceSegment:s})}}return o}function ji(t,e,n,o,r=1e-6){let s={x:e.x-t.x,y:e.y-t.y},i={x:o.x-n.x,y:o.y-n.y},l={x:n.x-t.x,y:n.y-t.y},u=Po(s,i);if(Math.abs(u)<r)return null;let d=Po(l,i)/u,f=Po(l,s)/u;return d>=-r&&d<=1+r&&f>=-r&&f<=1+r?{t:d,u:f,point:{x:t.x+d*s.x,y:t.y+d*s.y}}:null}function Po(t,e){return t.x*e.y-t.y*e.x}function Ms(t,e){let n=t.x-e.x,o=t.y-e.y;return n*n+o*o}function Xi(t){let e=0;for(let n=0;n<t.length;n++){let o=t[n],r=t[(n+1)%t.length];e+=o.x*r.y-r.x*o.y}return e/2}function Gi(t,e,n){return t&&typeof t.clone=="function"&&typeof t.lerp=="function"?t.clone().lerp(e,n):{x:t.x+(e.x-t.x)*n,y:t.y+(e.y-t.y)*n,z:t.z!==void 0&&e.z!==void 0?t.z+(e.z-t.z)*n:void 0}}function Nn(t){return t&&typeof t.clone=="function"?t.clone():{x:t.x,y:t.y,z:t.z}}var Zi=(t,e)=>{if(!t||t.length<=0)return;let n={rectangles:[],threeEdgeRect:[]},o=new Set,r=.1,s=1.2,i=.15,l=2,u=80,d=95;if(!t[0].uuid){let a=1e4;for(let h=0;h<t.length;h++)t[h].uuid=a++}let f=[];for(let a=0;a<t.length;a++)f.push({start:t[a].start,end:t[a].end,uuid:t[a].uuid});let c=zs(f,{eps:1e-5,returnDetail:!0,project:a=>({x:a.x,y:a.y})});for(let a=0;a<c.length;a++){if(c[a].uuids.length<4||c[a].area<i||c[a].area>l)continue;let h=!1;for(let g=0;g<c[a].lineIndexes.length;g++){let p=t[c[a].lineIndexes[g]].length;if(p<r||p>s)break;let b=new Lt.Vector3(t[c[a].lineIndexes[g]].start.x,t[c[a].lineIndexes[g]].start.y,t[c[a].lineIndexes[g]].start.z),m=new Lt.Vector3(t[c[a].lineIndexes[g]].end.x,t[c[a].lineIndexes[g]].end.y,t[c[a].lineIndexes[g]].end.z),x=!1,y=new Lt.Vector3(0,0,0);for(let w=g+1;w<c[a].lineIndexes.length;w++){let z=t[c[a].lineIndexes[w]].length;if(z<r||z>s)break;let M=new Lt.Vector3(t[c[a].lineIndexes[w]].start.x,t[c[a].lineIndexes[w]].start.y,t[c[a].lineIndexes[w]].start.z),P=new Lt.Vector3(t[c[a].lineIndexes[w]].end.x,t[c[a].lineIndexes[w]].end.y,t[c[a].lineIndexes[w]].end.z),E=Gt(b,m,M,P);if(E&&E.isParallel){if(p+z>s){x=!0;break}p+=z;let V=ct(b,M),_=ct(b,P),v=ct(m,M),S=ct(m,P);V?(b=m.clone(),m=P.clone()):_?(b=m.clone(),m=M.clone()):v?m=P.clone():S&&(m=M.clone());continue}let T=ie(b,m,M,P);if(!T||T.angle<u||T.angle>d){x=!0;break}for(let V=w+1;V<c[a].lineIndexes.length;V++){let _=t[c[a].lineIndexes[V]].length;if(_<r||_>s)break;let v=new Lt.Vector3(t[c[a].lineIndexes[V]].start.x,t[c[a].lineIndexes[V]].start.y,t[c[a].lineIndexes[V]].start.z),S=new Lt.Vector3(t[c[a].lineIndexes[V]].end.x,t[c[a].lineIndexes[V]].end.y,t[c[a].lineIndexes[V]].end.z),R=Gt(M,P,v,S);if(R&&R.isParallel){if(z+_>s){x=!0;break}z+=_;let W=ct(M,v),I=ct(M,S),C=ct(P,v),H=ct(P,S);W?(M=P.clone(),P=S.clone()):I?(M=P.clone(),P=v.clone()):C?P=S.clone():H&&(P=v.clone());continue}let D=ie(M,P,v,S);if(!D||D.angle<u||D.angle>d){x=!0;break}for(let W=V+1;W<c[a].lineIndexes.length;W++){let I=t[c[a].lineIndexes[W]].length;if(I<r||I>s)break;let C=new Lt.Vector3(t[c[a].lineIndexes[W]].start.x,t[c[a].lineIndexes[W]].start.y,t[c[a].lineIndexes[W]].start.z),H=new Lt.Vector3(t[c[a].lineIndexes[W]].end.x,t[c[a].lineIndexes[W]].end.y,t[c[a].lineIndexes[W]].end.z),A=Gt(v,S,C,H);if(A&&A.isParallel){if(_+I>s){x=!0;break}_+=I;let $=ct(v,C),G=ct(v,H),Q=ct(S,C),q=ct(S,H);$?(v=S.clone(),S=H.clone()):G?(v=S.clone(),S=C.clone()):Q?S=H.clone():q&&(S=C.clone());continue}let k=ie(v,S,C,H);if(!k||k.angle<u||k.angle>d){x=!0;break}let O=ct(C,b),N=ct(C,m),L=ct(H,b),B=ct(H,m);if(O||N||L||B)h=!0;else for(let $=W+1;$<c[a].lineIndexes.length;$++){let G=t[c[a].lineIndexes[$]].length;if(G<r||G>s)break;let Q=new Lt.Vector3(t[c[a].lineIndexes[$]].start.x,t[c[a].lineIndexes[$]].start.y,t[c[a].lineIndexes[$]].start.z),q=new Lt.Vector3(t[c[a].lineIndexes[$]].end.x,t[c[a].lineIndexes[$]].end.y,t[c[a].lineIndexes[$]].end.z),X=Gt(C,H,Q,q);if(X&&X.isParallel){if(I+G>s){x=!0;break}I+=G;let Y=ct(C,Q),it=ct(C,q),ht=ct(H,Q),St=ct(H,q);if(Y)C=H.clone(),H=q.clone();else if(it)C=H.clone(),H=Q.clone();else if(ht)H=q.clone();else if(St)H=Q.clone();else continue;if(O=ct(C,b),N=ct(C,m),L=ct(H,b),B=ct(H,m),O||N||L||B){h=!0;break}}}break}if(x)break}if(x)break}if(x)break}h&&n.rectangles.push(c[a].uuids)}for(let a=0;a<t.length;a++){let h=t[a].length;if(o.has(t[a].uuid)||h<r||h>s)continue;let g={uuids:[],missingEdge:{start:new Lt.Vector3,end:new Lt.Vector3}},p=new Lt.Vector3(t[a].start.x,t[a].start.y,t[a].start.z),b=new Lt.Vector3(t[a].end.x,t[a].end.y,t[a].end.z),m=!0,x=!0;for(let z=0;z<t.length;z++){if(z==a)continue;let M=new Lt.Vector3(t[z].start.x,t[z].start.y,t[z].start.z),P=new Lt.Vector3(t[z].end.x,t[z].end.y,t[z].end.z),E=ct(M,p),T=ct(P,p),V=ct(M,b),_=ct(P,b);if(E||T?m=!1:(V||_)&&(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==a||o.has(z)||M<r||M>s)continue;let P=new Lt.Vector3(t[z].start.x,t[z].start.y,t[z].start.z),E=new Lt.Vector3(t[z].end.x,t[z].end.y,t[z].end.z),T=ie(p,b,P,E);if(!T||T.angle<85)continue;let V=ct(P,b),_=ct(E,b);if(!V&&!_)continue;let v=new Lt.Vector3,S=new Lt.Vector3;V?(v=P.clone(),S=E.clone()):(v=E.clone(),S=P.clone());for(let R=0;R<t.length;R++){let D=t[R].length;if(R==a||R==z||o.has(R)||D<r||D>s)continue;let W=new Lt.Vector3(t[R].start.x,t[R].start.y,t[R].start.z),I=new Lt.Vector3(t[R].end.x,t[R].end.y,t[R].end.z),C=ie(P,E,W,I);if(!C||C.angle<85)continue;let H=ct(W,S),A=ct(I,S);if(!H&&!A)continue;let k=new Lt.Vector3,O=new Lt.Vector3;H?(k=W.clone(),O=I.clone()):(k=I.clone(),O=W.clone());let N=new Lt.Vector3().subVectors(O,k).normalize(),L=Kt(w,N,.1);if(!L||!L.parallel||!L.sameDirection)continue;let B=!0,$=!0;for(let Q=0;Q<t.length;Q++){if(Q==R)continue;let q=new Lt.Vector3(t[Q].start.x,t[Q].start.y,t[Q].start.z),X=new Lt.Vector3(t[Q].end.x,t[Q].end.y,t[Q].end.z),Y=ct(q,W),it=ct(X,W),ht=ct(q,I),St=ct(X,I);if(Y||it?B=!1:(ht||St)&&($=!1),!B&&!$)break}if(!B&&!$)continue;let G=h*M;if(!(G<i||G>l)){g.uuids=[t[a].uuid,t[z].uuid,t[R].uuid],g.missingEdge.start=O,g.missingEdge.end=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 Vt=11102230246251565e-32,Zt=134217729,wn=(3+8*Vt)*Vt;function Ne(t,e,n,o,r){let s,i,l,u,d=e[0],f=o[0],c=0,a=0;f>d==f>-d?(s=d,d=e[++c]):(s=f,f=o[++a]);let h=0;if(c<t&&a<n)for(f>d==f>-d?(i=d+s,l=s-(i-d),d=e[++c]):(i=f+s,l=s-(i-f),f=o[++a]),s=i,l!==0&&(r[h++]=l);c<t&&a<n;)f>d==f>-d?(i=s+d,u=i-s,l=s-(i-u)+(d-u),d=e[++c]):(i=s+f,u=i-s,l=s-(i-u)+(f-u),f=o[++a]),s=i,l!==0&&(r[h++]=l);for(;c<t;)i=s+d,u=i-s,l=s-(i-u)+(d-u),d=e[++c],s=i,l!==0&&(r[h++]=l);for(;a<n;)i=s+f,u=i-s,l=s-(i-u)+(f-u),f=o[++a],s=i,l!==0&&(r[h++]=l);return(s!==0||h===0)&&(r[h++]=s),h}function zn(t,e){let n=e[0];for(let o=1;o<t;o++)n+=e[o];return n}function K(t){return new Float64Array(t)}var Yi=(3+16*Vt)*Vt,Ui=(2+12*Vt)*Vt,Ki=(9+64*Vt)*Vt*Vt,on=K(4),Es=K(8),Ps=K(12),Ss=K(16),oe=K(4);function Qi(t,e,n,o,r,s,i){let l,u,d,f,c,a,h,g,p,b,m,x,y,w,z,M,P,E,T=t-r,V=n-r,_=e-s,v=o-s;w=T*v,a=Zt*T,h=a-(a-T),g=T-h,a=Zt*v,p=a-(a-v),b=v-p,z=g*b-(w-h*p-g*p-h*b),M=_*V,a=Zt*_,h=a-(a-_),g=_-h,a=Zt*V,p=a-(a-V),b=V-p,P=g*b-(M-h*p-g*p-h*b),m=z-P,c=z-m,on[0]=z-(m+c)+(c-P),x=w+m,c=x-w,y=w-(x-c)+(m-c),m=y-M,c=y-m,on[1]=y-(m+c)+(c-M),E=x+m,c=E-x,on[2]=x-(E-c)+(m-c),on[3]=E;let S=zn(4,on),R=Ui*i;if(S>=R||-S>=R||(c=t-T,l=t-(T+c)+(c-r),c=n-V,d=n-(V+c)+(c-r),c=e-_,u=e-(_+c)+(c-s),c=o-v,f=o-(v+c)+(c-s),l===0&&u===0&&d===0&&f===0)||(R=Ki*i+wn*Math.abs(S),S+=T*f+v*l-(_*d+V*u),S>=R||-S>=R))return S;w=l*v,a=Zt*l,h=a-(a-l),g=l-h,a=Zt*v,p=a-(a-v),b=v-p,z=g*b-(w-h*p-g*p-h*b),M=u*V,a=Zt*u,h=a-(a-u),g=u-h,a=Zt*V,p=a-(a-V),b=V-p,P=g*b-(M-h*p-g*p-h*b),m=z-P,c=z-m,oe[0]=z-(m+c)+(c-P),x=w+m,c=x-w,y=w-(x-c)+(m-c),m=y-M,c=y-m,oe[1]=y-(m+c)+(c-M),E=x+m,c=E-x,oe[2]=x-(E-c)+(m-c),oe[3]=E;let D=Ne(4,on,4,oe,Es);w=T*f,a=Zt*T,h=a-(a-T),g=T-h,a=Zt*f,p=a-(a-f),b=f-p,z=g*b-(w-h*p-g*p-h*b),M=_*d,a=Zt*_,h=a-(a-_),g=_-h,a=Zt*d,p=a-(a-d),b=d-p,P=g*b-(M-h*p-g*p-h*b),m=z-P,c=z-m,oe[0]=z-(m+c)+(c-P),x=w+m,c=x-w,y=w-(x-c)+(m-c),m=y-M,c=y-m,oe[1]=y-(m+c)+(c-M),E=x+m,c=E-x,oe[2]=x-(E-c)+(m-c),oe[3]=E;let W=Ne(D,Es,4,oe,Ps);w=l*f,a=Zt*l,h=a-(a-l),g=l-h,a=Zt*f,p=a-(a-f),b=f-p,z=g*b-(w-h*p-g*p-h*b),M=u*d,a=Zt*u,h=a-(a-u),g=u-h,a=Zt*d,p=a-(a-d),b=d-p,P=g*b-(M-h*p-g*p-h*b),m=z-P,c=z-m,oe[0]=z-(m+c)+(c-P),x=w+m,c=x-w,y=w-(x-c)+(m-c),m=y-M,c=y-m,oe[1]=y-(m+c)+(c-M),E=x+m,c=E-x,oe[2]=x-(E-c)+(m-c),oe[3]=E;let I=Ne(W,Ps,4,oe,Ss);return Ss[I-1]}function sn(t,e,n,o,r,s){let i=(e-s)*(n-r),l=(t-r)*(o-s),u=i-l,d=Math.abs(i+l);return Math.abs(u)>=Yi*d?u:-Qi(t,e,n,o,r,s,d)}var bu=(7+56*Vt)*Vt,wu=(3+28*Vt)*Vt,zu=(26+288*Vt)*Vt*Vt,Mu=K(4),Eu=K(4),Pu=K(4),Su=K(4),Tu=K(4),Ru=K(4),Du=K(4),vu=K(4),Vu=K(4),Iu=K(8),Cu=K(8),Wu=K(8),_u=K(4),Hu=K(8),Au=K(8),Lu=K(16),ku=K(12),Bu=K(192),Ou=K(192);var qu=(10+96*Vt)*Vt,$u=(4+48*Vt)*Vt,ju=(44+576*Vt)*Vt*Vt,Xu=K(4),Gu=K(4),Zu=K(4),Yu=K(4),Uu=K(4),Ku=K(4),Qu=K(4),Ju=K(4),tf=K(8),ef=K(8),nf=K(8),of=K(8),sf=K(8),rf=K(8),af=K(8),lf=K(8),cf=K(8),uf=K(4),ff=K(4),df=K(4),hf=K(8),mf=K(16),gf=K(16),pf=K(16),xf=K(32),yf=K(32),bf=K(48),wf=K(64),zf=K(1152),Mf=K(1152);var Tf=(16+224*Vt)*Vt,Rf=(5+72*Vt)*Vt,Df=(71+1408*Vt)*Vt*Vt,vf=K(4),Vf=K(4),If=K(4),Cf=K(4),Wf=K(4),_f=K(4),Hf=K(4),Af=K(4),Lf=K(4),kf=K(4),Bf=K(24),Of=K(24),Ff=K(24),Nf=K(24),qf=K(24),$f=K(24),jf=K(24),Xf=K(24),Gf=K(24),Zf=K(24),Yf=K(1152),Uf=K(1152),Kf=K(1152),Qf=K(1152),Jf=K(1152),td=K(2304),ed=K(2304),nd=K(3456),od=K(5760),sd=K(8),rd=K(8),id=K(8),ad=K(16),ld=K(24),cd=K(48),ud=K(48),fd=K(96),dd=K(192),hd=K(384),md=K(384),gd=K(384),pd=K(768);var xd=K(96),yd=K(96),bd=K(96),wd=K(1152);var Rs=Math.pow(2,-52),qn=new Uint32Array(512),an=class t{static from(e,n=sa,o=ra){let r=e.length,s=new Float64Array(r*2);for(let i=0;i<r;i++){let l=e[i];s[2*i]=n(l),s[2*i+1]=o(l)}return new t(s)}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:r,_hullHash:s}=this,i=e.length>>1,l=1/0,u=1/0,d=-1/0,f=-1/0;for(let T=0;T<i;T++){let V=e[2*T],_=e[2*T+1];V<l&&(l=V),_<u&&(u=_),V>d&&(d=V),_>f&&(f=_),this._ids[T]=T}let c=(l+d)/2,a=(u+f)/2,h=0,g=0,p=0;for(let T=0,V=1/0;T<i;T++){let _=So(c,a,e[2*T],e[2*T+1]);_<V&&(h=T,V=_)}let b=e[2*h],m=e[2*h+1];for(let T=0,V=1/0;T<i;T++){if(T===h)continue;let _=So(b,m,e[2*T],e[2*T+1]);_<V&&_>0&&(g=T,V=_)}let 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=na(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 _=0;_<i;_++)this._dists[_]=e[2*_]-e[0]||e[2*_+1]-e[1];rn(this._ids,this._dists,0,i-1);let T=new Uint32Array(i),V=0;for(let _=0,v=-1/0;_<i;_++){let S=this._ids[_],R=this._dists[S];R>v&&(T[V++]=S,v=R)}this.hull=T.subarray(0,V),this.triangles=new Uint32Array(0),this.halfedges=new Int32Array(0);return}if(sn(b,m,x,y,z,M)<0){let T=g,V=x,_=y;g=p,x=z,y=M,p=T,z=V,M=_}let P=oa(b,m,x,y,z,M);this._cx=P.x,this._cy=P.y;for(let T=0;T<i;T++)this._dists[T]=So(e[2*T],e[2*T+1],P.x,P.y);rn(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,r[h]=0,r[g]=1,r[p]=2,s.fill(-1),s[this._hashKey(b,m)]=h,s[this._hashKey(x,y)]=g,s[this._hashKey(z,M)]=p,this.trianglesLen=0,this._addTriangle(h,g,p,-1,-1,-1);for(let T=0,V=0,_=0;T<this._ids.length;T++){let v=this._ids[T],S=e[2*v],R=e[2*v+1];if(T>0&&Math.abs(S-V)<=Rs&&Math.abs(R-_)<=Rs||(V=S,_=R,v===h||v===g||v===p))continue;let D=0;for(let A=0,k=this._hashKey(S,R);A<this._hashSize&&(D=s[(k+A)%this._hashSize],!(D!==-1&&D!==o[D]));A++);D=n[D];let W=D,I;for(;I=o[W],sn(S,R,e[2*W],e[2*W+1],e[2*I],e[2*I+1])>=0;)if(W=I,W===D){W=-1;break}if(W===-1)continue;let C=this._addTriangle(W,v,o[W],-1,-1,r[W]);r[v]=this._legalize(C+2),r[W]=C,E++;let H=o[W];for(;I=o[H],sn(S,R,e[2*H],e[2*H+1],e[2*I],e[2*I+1])<0;)C=this._addTriangle(H,v,I,r[v],-1,r[H]),r[v]=this._legalize(C+2),o[H]=H,E--,H=I;if(W===D)for(;I=n[W],sn(S,R,e[2*I],e[2*I+1],e[2*W],e[2*W+1])<0;)C=this._addTriangle(I,v,W,-1,r[W],r[I]),this._legalize(C+2),r[I]=C,o[W]=W,E--,W=I;this._hullStart=n[v]=W,o[W]=n[H]=v,o[v]=H,s[this._hashKey(S,R)]=v,s[this._hashKey(e[2*W],e[2*W+1])]=W}this.hull=new Uint32Array(E);for(let T=0,V=this._hullStart;T<E;T++)this.hull[T]=V,V=o[V];this.triangles=this._triangles.subarray(0,this.trianglesLen),this.halfedges=this._halfedges.subarray(0,this.trianglesLen)}_hashKey(e,n){return Math.floor(ta(e-this._cx,n-this._cy)*this._hashSize)%this._hashSize}_legalize(e){let{_triangles:n,_halfedges:o,coords:r}=this,s=0,i=0;for(;;){let l=o[e],u=e-e%3;if(i=u+(e+2)%3,l===-1){if(s===0)break;e=qn[--s];continue}let d=l-l%3,f=u+(e+1)%3,c=d+(l+2)%3,a=n[i],h=n[e],g=n[f],p=n[c];if(ea(r[2*a],r[2*a+1],r[2*h],r[2*h+1],r[2*g],r[2*g+1],r[2*p],r[2*p+1])){n[e]=p,n[l]=a;let m=o[c];if(m===-1){let y=this._hullStart;do{if(this._hullTri[y]===c){this._hullTri[y]=e;break}y=this._hullPrev[y]}while(y!==this._hullStart)}this._link(e,m),this._link(l,o[i]),this._link(i,c);let x=d+(l+1)%3;s<qn.length&&(qn[s++]=x)}else{if(s===0)break;e=qn[--s]}}return i}_link(e,n){this._halfedges[e]=n,n!==-1&&(this._halfedges[n]=e)}_addTriangle(e,n,o,r,s,i){let l=this.trianglesLen;return this._triangles[l]=e,this._triangles[l+1]=n,this._triangles[l+2]=o,this._link(l,r),this._link(l+1,s),this._link(l+2,i),this.trianglesLen+=3,l}};function ta(t,e){let n=t/(Math.abs(t)+Math.abs(e));return(e>0?3-n:1+n)/4}function So(t,e,n,o){let r=t-n,s=e-o;return r*r+s*s}function ea(t,e,n,o,r,s,i,l){let u=t-i,d=e-l,f=n-i,c=o-l,a=r-i,h=s-l,g=u*u+d*d,p=f*f+c*c,b=a*a+h*h;return u*(c*b-p*h)-d*(f*b-p*a)+g*(f*h-c*a)<0}function na(t,e,n,o,r,s){let i=n-t,l=o-e,u=r-t,d=s-e,f=i*i+l*l,c=u*u+d*d,a=.5/(i*d-l*u),h=(d*f-l*c)*a,g=(i*c-u*f)*a;return h*h+g*g}function oa(t,e,n,o,r,s){let i=n-t,l=o-e,u=r-t,d=s-e,f=i*i+l*l,c=u*u+d*d,a=.5/(i*d-l*u),h=t+(d*f-l*c)*a,g=e+(i*c-u*f)*a;return{x:h,y:g}}function rn(t,e,n,o){if(o-n<=20)for(let r=n+1;r<=o;r++){let s=t[r],i=e[s],l=r-1;for(;l>=n&&e[t[l]]>i;)t[l+1]=t[l--];t[l+1]=s}else{let r=n+o>>1,s=n+1,i=o;Mn(t,r,s),e[t[n]]>e[t[o]]&&Mn(t,n,o),e[t[s]]>e[t[o]]&&Mn(t,s,o),e[t[n]]>e[t[s]]&&Mn(t,n,s);let l=t[s],u=e[l];for(;;){do s++;while(e[t[s]]<u);do i--;while(e[t[i]]>u);if(i<s)break;Mn(t,s,i)}t[n+1]=t[i],t[i]=l,o-s+1>=i-n?(rn(t,e,s,o),rn(t,e,n,i-1)):(rn(t,e,n,i-1),rn(t,e,s,o))}}function Mn(t,e,n){let o=t[e];t[e]=t[n],t[n]=o}function sa(t){return t[0]}function ra(t){return t[1]}var ue=class{constructor(){this._x0=this._y0=this._x1=this._y1=null,this._=""}moveTo(e,n){this._+=`M${this._x0=this._x1=+e},${this._y0=this._y1=+n}`}closePath(){this._x1!==null&&(this._x1=this._x0,this._y1=this._y0,this._+="Z")}lineTo(e,n){this._+=`L${this._x1=+e},${this._y1=+n}`}arc(e,n,o){e=+e,n=+n,o=+o;let r=e+o,s=n;if(o<0)throw new Error("negative radius");this._x1===null?this._+=`M${r},${s}`:(Math.abs(this._x1-r)>1e-6||Math.abs(this._y1-s)>1e-6)&&(this._+="L"+r+","+s),o&&(this._+=`A${o},${o},0,1,1,${e-o},${n}A${o},${o},0,1,1,${this._x1=r},${this._y1=s}`)}rect(e,n,o,r){this._+=`M${this._x0=this._x1=+e},${this._y0=this._y1=+n}h${+o}v${+r}h${-o}Z`}value(){return this._||null}};var Ce=class{constructor(){this._=[]}moveTo(e,n){this._.push([e,n])}closePath(){this._.push(this._[0].slice())}lineTo(e,n){this._.push([e,n])}value(){return this._.length?this._:null}};var En=class{constructor(e,[n,o,r,s]=[0,0,960,500]){if(!((r=+r)>=(n=+n))||!((s=+s)>=(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=r,this.xmin=n,this.ymax=s,this.ymin=o,this._init()}update(){return this.delaunay.update(),this._init(),this}_init(){let{delaunay:{points:e,hull:n,triangles:o},vectors:r}=this,s,i,l=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],_=e[M],v=e[M+1],S=T-P,R=V-E,D=_-P,W=v-E,I=(S*W-R*D)*2;if(Math.abs(I)<1e-9){if(s===void 0){s=i=0;for(let H of n)s+=e[H*2],i+=e[H*2+1];s/=n.length,i/=n.length}let C=1e9*Math.sign((s-P)*W-(i-E)*D);x=(P+_)/2-C*W,y=(E+v)/2+C*D}else{let C=1/I,H=S*S+R*R,A=D*D+W*W;x=P+(W*H-R*A)*C,y=E+(S*A-D*H)*C}l[b]=x,l[b+1]=y}let u=n[n.length-1],d,f=u*4,c,a=e[2*u],h,g=e[2*u+1];r.fill(0);for(let p=0;p<n.length;++p)u=n[p],d=f,c=a,h=g,f=u*4,a=e[2*u],g=e[2*u+1],r[d+2]=r[f]=h-g,r[d+3]=r[f+1]=a-c}render(e){let n=e==null?e=new ue:void 0,{delaunay:{halfedges:o,inedges:r,hull:s},circumcenters:i,vectors:l}=this;if(s.length<=1)return null;for(let f=0,c=o.length;f<c;++f){let a=o[f];if(a<f)continue;let h=Math.floor(f/3)*2,g=Math.floor(a/3)*2,p=i[h],b=i[h+1],m=i[g],x=i[g+1];this._renderSegment(p,b,m,x,e)}let u,d=s[s.length-1];for(let f=0;f<s.length;++f){u=d,d=s[f];let c=Math.floor(r[d]/3)*2,a=i[c],h=i[c+1],g=u*4,p=this._project(a,h,l[g+2],l[g+3]);p&&this._renderSegment(a,h,p[0],p[1],e)}return n&&n.value()}renderBounds(e){let n=e==null?e=new ue:void 0;return e.rect(this.xmin,this.ymin,this.xmax-this.xmin,this.ymax-this.ymin),n&&n.value()}renderCell(e,n){let o=n==null?n=new ue:void 0,r=this._clip(e);if(r===null||!r.length)return;n.moveTo(r[0],r[1]);let s=r.length;for(;r[0]===r[s-2]&&r[1]===r[s-1]&&s>1;)s-=2;for(let i=2;i<s;i+=2)(r[i]!==r[i-2]||r[i+1]!==r[i-1])&&n.lineTo(r[i],r[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 r=this.cellPolygon(n);r&&(r.index=n,yield r)}}cellPolygon(e){let n=new Ce;return this.renderCell(e,n),n.value()}_renderSegment(e,n,o,r,s){let i,l=this._regioncode(e,n),u=this._regioncode(o,r);l===0&&u===0?(s.moveTo(e,n),s.lineTo(o,r)):(i=this._clipSegment(e,n,o,r,l,u))&&(s.moveTo(i[0],i[1]),s.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 r=this._clip(o);if(r){t:for(let s=0,i=n.length;s<i;s+=2)for(let l=0,u=r.length;l<u;l+=2)if(n[s]===r[l]&&n[s+1]===r[l+1]&&n[(s+2)%i]===r[(l+u-2)%u]&&n[(s+3)%i]===r[(l+u-1)%u]){yield o;break t}}}}_cell(e){let{circumcenters:n,delaunay:{inedges:o,halfedges:r,triangles:s}}=this,i=o[e];if(i===-1)return null;let l=[],u=i;do{let d=Math.floor(u/3);if(l.push(n[d*2],n[d*2+1]),u=u%3===2?u-2:u+1,s[u]!==e)break;u=r[u]}while(u!==i&&u!==-1);return l}_clip(e){if(e===0&&this.delaunay.hull.length===1)return[this.xmax,this.ymin,this.xmax,this.ymax,this.xmin,this.ymax,this.xmin,this.ymin];let n=this._cell(e);if(n===null)return null;let{vectors:o}=this,r=e*4;return this._simplify(o[r]||o[r+1]?this._clipInfinite(e,n,o[r],o[r+1],o[r+2],o[r+3]):this._clipFinite(e,n))}_clipFinite(e,n){let o=n.length,r=null,s,i,l=n[o-2],u=n[o-1],d,f=this._regioncode(l,u),c,a=0;for(let h=0;h<o;h+=2)if(s=l,i=u,l=n[h],u=n[h+1],d=f,f=this._regioncode(l,u),d===0&&f===0)c=a,a=0,r?r.push(l,u):r=[l,u];else{let g,p,b,m,x;if(d===0){if((g=this._clipSegment(s,i,l,u,d,f))===null)continue;[p,b,m,x]=g}else{if((g=this._clipSegment(l,u,s,i,f,d))===null)continue;[m,x,p,b]=g,c=a,a=this._edgecode(p,b),c&&a&&this._edge(e,c,a,r,r.length),r?r.push(p,b):r=[p,b]}c=a,a=this._edgecode(m,x),c&&a&&this._edge(e,c,a,r,r.length),r?r.push(m,x):r=[m,x]}if(r)c=a,a=this._edgecode(r[0],r[1]),c&&a&&this._edge(e,c,a,r,r.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 r}_clipSegment(e,n,o,r,s,i){let l=s<i;for(l&&([e,n,o,r,s,i]=[o,r,e,n,i,s]);;){if(s===0&&i===0)return l?[o,r,e,n]:[e,n,o,r];if(s&i)return null;let u,d,f=s||i;f&8?(u=e+(o-e)*(this.ymax-n)/(r-n),d=this.ymax):f&4?(u=e+(o-e)*(this.ymin-n)/(r-n),d=this.ymin):f&2?(d=n+(r-n)*(this.xmax-e)/(o-e),u=this.xmax):(d=n+(r-n)*(this.xmin-e)/(o-e),u=this.xmin),s?(e=u,n=d,s=this._regioncode(e,n)):(o=u,r=d,i=this._regioncode(o,r))}}_clipInfinite(e,n,o,r,s,i){let l=Array.from(n),u;if((u=this._project(l[0],l[1],o,r))&&l.unshift(u[0],u[1]),(u=this._project(l[l.length-2],l[l.length-1],s,i))&&l.push(u[0],u[1]),l=this._clipFinite(e,l))for(let d=0,f=l.length,c,a=this._edgecode(l[f-2],l[f-1]);d<f;d+=2)c=a,a=this._edgecode(l[d],l[d+1]),c&&a&&(d=this._edge(e,c,a,l,d),f=l.length);else this.contains(e,(this.xmin+this.xmax)/2,(this.ymin+this.ymax)/2)&&(l=[this.xmin,this.ymin,this.xmax,this.ymin,this.xmax,this.ymax,this.xmin,this.ymax]);return l}_edge(e,n,o,r,s){for(;n!==o;){let i,l;switch(n){case 5:n=4;continue;case 4:n=6,i=this.xmax,l=this.ymin;break;case 6:n=2;continue;case 2:n=10,i=this.xmax,l=this.ymax;break;case 10:n=8;continue;case 8:n=9,i=this.xmin,l=this.ymax;break;case 9:n=1;continue;case 1:n=5,i=this.xmin,l=this.ymin;break}(r[s]!==i||r[s+1]!==l)&&this.contains(e,i,l)&&(r.splice(s,0,i,l),s+=2)}return s}_project(e,n,o,r){let s=1/0,i,l,u;if(r<0){if(n<=this.ymin)return null;(i=(this.ymin-n)/r)<s&&(u=this.ymin,l=e+(s=i)*o)}else if(r>0){if(n>=this.ymax)return null;(i=(this.ymax-n)/r)<s&&(u=this.ymax,l=e+(s=i)*o)}if(o>0){if(e>=this.xmax)return null;(i=(this.xmax-e)/o)<s&&(l=this.xmax,u=n+(s=i)*r)}else if(o<0){if(e<=this.xmin)return null;(i=(this.xmin-e)/o)<s&&(l=this.xmin,u=n+(s=i)*r)}return[l,u]}_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,r=(n+4)%e.length;(e[n]===e[o]&&e[o]===e[r]||e[n+1]===e[o+1]&&e[o+1]===e[r+1])&&(e.splice(o,2),n-=2)}e.length||(e=null)}return e}};var ia=2*Math.PI,ln=Math.pow;function aa(t){return t[0]}function la(t){return t[1]}function ca(t){let{triangles:e,coords:n}=t;for(let o=0;o<e.length;o+=3){let r=2*e[o],s=2*e[o+1],i=2*e[o+2];if((n[i]-n[r])*(n[s+1]-n[r+1])-(n[s]-n[r])*(n[i+1]-n[r+1])>1e-10)return!1}return!0}function ua(t,e,n){return[t+Math.sin(t+e)*n,e+Math.cos(t-e)*n]}var We=class t{static from(e,n=aa,o=la,r){return new t("length"in e?fa(e,n,o,r):Float64Array.from(da(e,n,o,r)))}constructor(e){this._delaunator=new an(e),this.inedges=new Int32Array(e.length/2),this._hullIndex=new Int32Array(e.length/2),this.points=this._delaunator.coords,this._init()}update(){return this._delaunator.update(),this._init(),this}_init(){let e=this._delaunator,n=this.points;if(e.hull&&e.hull.length>2&&ca(e)){this.collinear=Int32Array.from({length:n.length/2},(a,h)=>h).sort((a,h)=>n[2*a]-n[2*h]||n[2*a+1]-n[2*h+1]);let u=this.collinear[0],d=this.collinear[this.collinear.length-1],f=[n[2*u],n[2*u+1],n[2*d],n[2*d+1]],c=1e-8*Math.hypot(f[3]-f[1],f[2]-f[0]);for(let a=0,h=n.length/2;a<h;++a){let g=ua(n[2*a],n[2*a+1],c);n[2*a]=g[0],n[2*a+1]=g[1]}this._delaunator=new an(n)}else delete this.collinear;let o=this.halfedges=this._delaunator.halfedges,r=this.hull=this._delaunator.hull,s=this.triangles=this._delaunator.triangles,i=this.inedges.fill(-1),l=this._hullIndex.fill(-1);for(let u=0,d=o.length;u<d;++u){let f=s[u%3===2?u-2:u+1];(o[u]===-1||i[f]===-1)&&(i[f]=u)}for(let u=0,d=r.length;u<d;++u)l[r[u]]=u;r.length<=2&&r.length>0&&(this.triangles=new Int32Array(3).fill(-1),this.halfedges=new Int32Array(3).fill(-1),this.triangles[0]=r[0],i[r[0]]=1,r.length===2&&(i[r[1]]=0,this.triangles[1]=r[1],this.triangles[2]=r[1]))}voronoi(e){return new En(this,e)}*neighbors(e){let{inedges:n,hull:o,_hullIndex:r,halfedges:s,triangles:i,collinear:l}=this;if(l){let c=l.indexOf(e);c>0&&(yield l[c-1]),c<l.length-1&&(yield l[c+1]);return}let u=n[e];if(u===-1)return;let d=u,f=-1;do{if(yield f=i[d],d=d%3===2?d-2:d+1,i[d]!==e)return;if(d=s[d],d===-1){let c=o[(r[e]+1)%o.length];c!==f&&(yield c);return}}while(d!==u)}find(e,n,o=0){if(e=+e,e!==e||(n=+n,n!==n))return-1;let r=o,s;for(;(s=this._step(o,e,n))>=0&&s!==o&&s!==r;)o=s;return s}_step(e,n,o){let{inedges:r,hull:s,_hullIndex:i,halfedges:l,triangles:u,points:d}=this;if(r[e]===-1||!d.length)return(e+1)%(d.length>>1);let f=e,c=ln(n-d[e*2],2)+ln(o-d[e*2+1],2),a=r[e],h=a;do{let g=u[h],p=ln(n-d[g*2],2)+ln(o-d[g*2+1],2);if(p<c&&(c=p,f=g),h=h%3===2?h-2:h+1,u[h]!==e)break;if(h=l[h],h===-1){if(h=s[(i[e]+1)%s.length],h!==g&&ln(n-d[h*2],2)+ln(o-d[h*2+1],2)<c)return h;break}}while(h!==a);return f}render(e){let n=e==null?e=new ue:void 0,{points:o,halfedges:r,triangles:s}=this;for(let i=0,l=r.length;i<l;++i){let u=r[i];if(u<i)continue;let d=s[i]*2,f=s[u]*2;e.moveTo(o[d],o[d+1]),e.lineTo(o[f],o[f+1])}return this.renderHull(e),n&&n.value()}renderPoints(e,n){n===void 0&&(!e||typeof e.moveTo!="function")&&(n=e,e=null),n=n==null?2:+n;let o=e==null?e=new ue:void 0,{points:r}=this;for(let s=0,i=r.length;s<i;s+=2){let l=r[s],u=r[s+1];e.moveTo(l+n,u),e.arc(l,u,n,0,ia)}return o&&o.value()}renderHull(e){let n=e==null?e=new ue:void 0,{hull:o,points:r}=this,s=o[0]*2,i=o.length;e.moveTo(r[s],r[s+1]);for(let l=1;l<i;++l){let u=2*o[l];e.lineTo(r[u],r[u+1])}return e.closePath(),n&&n.value()}hullPolygon(){let e=new Ce;return this.renderHull(e),e.value()}renderTriangle(e,n){let o=n==null?n=new ue:void 0,{points:r,triangles:s}=this,i=s[e*=3]*2,l=s[e+1]*2,u=s[e+2]*2;return n.moveTo(r[i],r[i+1]),n.lineTo(r[l],r[l+1]),n.lineTo(r[u],r[u+1]),n.closePath(),o&&o.value()}*trianglePolygons(){let{triangles:e}=this;for(let n=0,o=e.length/3;n<o;++n)yield this.trianglePolygon(n)}trianglePolygon(e){let n=new Ce;return this.renderTriangle(e,n),n.value()}};function fa(t,e,n,o){let r=t.length,s=new Float64Array(r*2);for(let i=0;i<r;++i){let l=t[i];s[i*2]=e.call(o,l,i,t),s[i*2+1]=n.call(o,l,i,t)}return s}function*da(t,e,n,o){let r=0;for(let s of t)yield e.call(o,s,r,t),yield n.call(o,s,r,t),++r}function To(t,e,n,o){let r,s;n<o?(r=n,s=o):(r=o,s=n);let i=r*e+s;t.set(i,(t.get(i)||0)+1)}function Ds(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 r=new Float64Array(o*2);for(let p=0,b=0;p<o;p++){let m=n[p];r[b++]=m[0],r[b++]=m[1]}let s=new We(r),{triangles:i}=s;if(!i.length)return[];let l=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=r[y],P=r[y+1],E=r[w],T=r[w+1],V=r[z],_=r[z+1],v=M-E,S=P-T,R=M-V,D=P-_,W=E-V,I=T-_,C=W*W+I*I,H=R*R+D*D,A=v*v+S*S,k=(E-M)*(_-P)-(V-M)*(T-P);if(k===0)continue;let O=k*k,L=M===0||E===0||V===0?O:4*O;C*H*A<=L&&(To(l,o,b,m),To(l,o,m,x),To(l,o,x,b))}if(!l.size)return[];let u=new Map,d=0,f=-1;for(let[p,b]of l){if(b!==1)continue;let m=Math.floor(p/o),x=p-m*o;f===-1&&(f=m),Ds(u,m,x),Ds(u,x,m),d++}if(d===0)return[];let c=[],a=new Uint8Array(o),h=f,g=-1;do{c.push(n[h]),a[h]=1;let p=u.get(h)||[],b=-1;for(let m=0;m<p.length;m++){let x=p[m];if(x!==g&&!a[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!==f&&c.length<=d+1);return c.length>0&&c.push(c[0]),c}import*as Nt from"three";import{OBB as Ia}from"three/examples/jsm/math/OBB.js";var Yt=63710088e-1,Vs={centimeters:Yt*100,centimetres:Yt*100,degrees:360/(2*Math.PI),feet:Yt*3.28084,inches:Yt*39.37,kilometers:Yt/1e3,kilometres:Yt/1e3,meters:Yt,metres:Yt,miles:Yt/1609.344,millimeters:Yt*1e3,millimetres:Yt*1e3,nauticalmiles:Yt/1852,radians:1,yards:Yt*1.0936};function Is(t,e,n={}){let o={type:"Feature"};return(n.id===0||n.id)&&(o.id=n.id),n.bbox&&(o.bbox=n.bbox),o.properties=e||{},o.geometry=t,o}function $n(t,e,n={}){if(!t)throw new Error("coordinates is required");if(!Array.isArray(t))throw new Error("coordinates must be an Array");if(t.length<2)throw new Error("coordinates must be at least 2 numbers long");if(!vs(t[0])||!vs(t[1]))throw new Error("coordinates must contain numbers");return Is({type:"Point",coordinates:t},e,n)}function jn(t,e,n={}){for(let r of t){if(r.length<4)throw new Error("Each LinearRing of a Polygon must have 4 or more Positions.");if(r[r.length-1].length!==r[0].length)throw new Error("First and last Position are not equivalent.");for(let s=0;s<r[r.length-1].length;s++)if(r[r.length-1][s]!==r[0][s])throw new Error("First and last Position are not equivalent.")}return Is({type:"Polygon",coordinates:t},e,n)}function ha(t,e="kilometers"){let n=Vs[e];if(!n)throw new Error(e+" units is invalid");return t*n}function ma(t,e="kilometers"){let n=Vs[e];if(!n)throw new Error(e+" units is invalid");return t/n}function Xn(t){return t%(2*Math.PI)*180/Math.PI}function fe(t){return t%360*Math.PI/180}function Gn(t,e="kilometers",n="kilometers"){if(!(t>=0))throw new Error("length must be a positive number");return ha(ma(t,e),n)}function vs(t){return!isNaN(t)&&t!==null&&!Array.isArray(t)}function Cs(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Me(t,e,n){if(t!==null)for(var o,r,s,i,l,u,d,f=0,c=0,a,h=t.type,g=h==="FeatureCollection",p=h==="Feature",b=g?t.features.length:1,m=0;m<b;m++){d=g?t.features[m].geometry:p?t.geometry:t,a=d?d.type==="GeometryCollection":!1,l=a?d.geometries.length:1;for(var x=0;x<l;x++){var y=0,w=0;if(i=a?d.geometries[x]:d,i!==null){u=i.coordinates;var z=i.type;switch(f=n&&(z==="Polygon"||z==="MultiPolygon")?1:0,z){case null:break;case"Point":if(e(u,c,m,y,w)===!1)return!1;c++,y++;break;case"LineString":case"MultiPoint":for(o=0;o<u.length;o++){if(e(u[o],c,m,y,w)===!1)return!1;c++,z==="MultiPoint"&&y++}z==="LineString"&&y++;break;case"Polygon":case"MultiLineString":for(o=0;o<u.length;o++){for(r=0;r<u[o].length-f;r++){if(e(u[o][r],c,m,y,w)===!1)return!1;c++}z==="MultiLineString"&&y++,z==="Polygon"&&w++}z==="Polygon"&&y++;break;case"MultiPolygon":for(o=0;o<u.length;o++){for(w=0,r=0;r<u[o].length;r++){for(s=0;s<u[o][r].length-f;s++){if(e(u[o][r][s],c,m,y,w)===!1)return!1;c++}w++}y++}break;case"GeometryCollection":for(o=0;o<i.geometries.length;o++)if(Me(i.geometries[o],e,n)===!1)return!1;break;default:throw new Error("Unknown Geometry Type")}}}}}function Ws(t){var e=[];return Me(t,function(n){e.push(n)}),e}function ga(t,e){var n,o,r,s,i,l,u,d,f,c,a=0,h=t.type==="FeatureCollection",g=t.type==="Feature",p=h?t.features.length:1;for(n=0;n<p;n++){for(l=h?t.features[n].geometry:g?t.geometry:t,d=h?t.features[n].properties:g?t.properties:{},f=h?t.features[n].bbox:g?t.bbox:void 0,c=h?t.features[n].id:g?t.id:void 0,u=l?l.type==="GeometryCollection":!1,i=u?l.geometries.length:1,r=0;r<i;r++){if(s=u?l.geometries[r]:l,s===null){if(e(null,a,d,f,c)===!1)return!1;continue}switch(s.type){case"Point":case"LineString":case"MultiPoint":case"Polygon":case"MultiLineString":case"MultiPolygon":{if(e(s,a,d,f,c)===!1)return!1;break}case"GeometryCollection":{for(o=0;o<s.geometries.length;o++)if(e(s.geometries[o],a,d,f,c)===!1)return!1;break}default:throw new Error("Unknown Geometry Type")}}a++}}function _s(t,e,n){var o=n;return ga(t,function(r,s,i,l,u){s===0&&n===void 0?o=r:o=e(o,r,s,i,l,u)}),o}var Qs=wi(Ks(),1);function Js(t,e={}){e.concavity=e.concavity||1/0;let n=[];if(Me(t,r=>{n.push([r[0],r[1]])}),!n.length)return null;let o=(0,Qs.default)(n,e.concavity);return o.length>3?jn([o]):null}function Qn(t,e={}){let n=0,o=0,r=0;return Me(t,function(s){n+=s[0],o+=s[1],r++},!0),$n([n/r,o/r],e.properties)}function ce(t){if(!t)throw new Error("coord is required");if(!Array.isArray(t)){if(t.type==="Feature"&&t.geometry!==null&&t.geometry.type==="Point")return[...t.geometry.coordinates];if(t.type==="Point")return[...t.coordinates]}if(Array.isArray(t)&&t.length>=2&&!Array.isArray(t[0])&&!Array.isArray(t[1]))return[...t];throw new Error("coord must be GeoJSON Point or an Array of numbers")}function tr(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 nr(t,e,n={}){let o;return n.final?o=er(ce(e),ce(t)):o=er(ce(t),ce(e)),o>180?-(360-o):o}function er(t,e){let n=fe(t[1]),o=fe(e[1]),r=fe(e[0]-t[0]);r>Math.PI&&(r-=2*Math.PI),r<-Math.PI&&(r+=2*Math.PI);let s=Math.log(Math.tan(o/2+Math.PI/4)/Math.tan(n/2+Math.PI/4)),i=Math.atan2(r,s);return(Xn(i)+360)%360}function or(t,e,n={}){let o=ce(t),r=ce(e);r[0]+=r[0]-o[0]>180?-360:o[0]-r[0]>180?360:0;let s=Sa(o,r);return Gn(s,"meters",n.units)}function Sa(t,e,n){n=n===void 0?Yt:Number(n);let o=n,r=t[1]*Math.PI/180,s=e[1]*Math.PI/180,i=s-r,l=Math.abs(e[0]-t[0])*Math.PI/180;l>Math.PI&&(l-=2*Math.PI);let u=Math.log(Math.tan(s/2+Math.PI/4)/Math.tan(r/2+Math.PI/4)),d=Math.abs(u)>1e-11?i/u:Math.cos(r);return Math.sqrt(i*i+d*d*l*l)*o}function sr(t,e,n,o={}){let r=e<0,s=Gn(Math.abs(e),o.units,"meters");r&&(s=-Math.abs(s));let i=ce(t),l=Ta(i,s,n);return l[0]+=l[0]-i[0]>180?-360:i[0]-l[0]>180?360:0,$n(l,o.properties)}function Ta(t,e,n,o){o=o===void 0?Yt:Number(o);let r=e/o,s=t[0]*Math.PI/180,i=fe(t[1]),l=fe(n),u=r*Math.cos(l),d=i+u;Math.abs(d)>Math.PI/2&&(d=d>0?Math.PI-d:-Math.PI-d);let f=Math.log(Math.tan(d/2+Math.PI/4)/Math.tan(i/2+Math.PI/4)),c=Math.abs(f)>1e-11?u/f:Math.cos(i),a=r*Math.sin(l)/c;return[((s+a)*180/Math.PI+540)%360-180,d*180/Math.PI]}function rr(t){if(!t)throw new Error("geojson is required");switch(t.type){case"Feature":return ir(t);case"FeatureCollection":return Ra(t);case"Point":case"LineString":case"Polygon":case"MultiPoint":case"MultiLineString":case"MultiPolygon":case"GeometryCollection":return Ho(t);default:throw new Error("unknown GeoJSON type")}}function ir(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=ar(t.properties),t.geometry==null?e.geometry=null:e.geometry=Ho(t.geometry),e}function ar(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(r=>r):e[n]=ar(o):e[n]=o}),e}function Ra(t){let e={type:"FeatureCollection"};return Object.keys(t).forEach(n=>{switch(n){case"type":case"features":return;default:e[n]=t[n]}}),e.features=t.features.map(n=>ir(n)),e}function Ho(t){let e={type:t.type};return t.bbox&&(e.bbox=t.bbox),t.type==="GeometryCollection"?(e.geometries=t.geometries.map(n=>Ho(n)),e):(e.coordinates=lr(t.coordinates),e)}function lr(t){let e=t;return typeof e[0]!="object"?e.slice():e.map(n=>lr(n))}function Ao(t,e,n){if(n=n||{},!Cs(n))throw new Error("options is invalid");let o=n.pivot,r=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 s=o??Qn(t);return(r===!1||r===void 0)&&(t=rr(t)),Me(t,function(i){let u=nr(s,i)+e,d=or(s,i),f=tr(sr(s,d,u));i[0]=f[0],i[1]=f[1]}),t}function Lo(t,e,n={}){if(n.final===!0)return Da(t,e);let o=ce(t),r=ce(e),s=fe(o[0]),i=fe(r[0]),l=fe(o[1]),u=fe(r[1]),d=Math.sin(i-s)*Math.cos(u),f=Math.cos(l)*Math.sin(u)-Math.sin(l)*Math.cos(u)*Math.cos(i-s);return Xn(Math.atan2(d,f))}function Da(t,e){let n=Lo(e,t);return n=(n+180)%360,n}function cr(t,e={}){if(t.bbox!=null&&e.recompute!==!0)return t.bbox;let n=[1/0,1/0,-1/0,-1/0];return Me(t,o=>{n[0]>o[0]&&(n[0]=o[0]),n[1]>o[1]&&(n[1]=o[1]),n[2]<o[0]&&(n[2]=o[0]),n[3]<o[1]&&(n[3]=o[1])}),n}function ur(t,e={}){let n=Number(t[0]),o=Number(t[1]),r=Number(t[2]),s=Number(t[3]);if(t.length===6)throw new Error("@turf/bbox-polygon does not support BBox with 6 positions");let i=[n,o];return jn([[i,[r,o],[r,s],[n,s],i]],e.properties,{bbox:t,id:e.id})}function fr(t){return ur(cr(t))}function mr(t){return _s(t,(e,n)=>e+va(n),0)}function va(t){let e=0,n;switch(t.type){case"Polygon":return dr(t.coordinates);case"MultiPolygon":for(n=0;n<t.coordinates.length;n++)e+=dr(t.coordinates[n]);return e;case"Point":case"MultiPoint":case"LineString":case"MultiLineString":return 0}return 0}function dr(t){let e=0;if(t&&t.length>0){e+=Math.abs(hr(t[0]));for(let n=1;n<t.length;n++)e-=Math.abs(hr(t[n]))}return e}var Va=Yt*Yt/2,ko=Math.PI/180;function hr(t){let e=t.length-1;if(e<=2)return 0;let n=0,o=0;for(;o<e;){let r=t[o],s=t[o+1===e?0:o+1],i=t[o+2>=e?(o+2)%e:o+2],l=r[0]*ko,u=s[1]*ko,d=i[0]*ko;n+=(d-l)*Math.sin(u),o++}return n*Va}function gr(t){let e=Js(t);if(!e)throw new Error("Can't calculate smallestSurroundingRectangleByArea for given geometry");let n=Qn(e),o=Ws(e),r=Number.MAX_SAFE_INTEGER,s=null;for(let i=0;i<o.length-1;i++){let l=Lo(o[i],o[i+1]),u=Ao(e,-1*l,{pivot:n}),d=fr(u),f=mr(d);f<r&&(r=f,s=Ao(d,l,{pivot:n}))}return s}function pr(t,e){let n=e[0]-t[0],o=e[1]-t[1];return Math.sqrt(n*n+o*o)}function Ca(t){let e=1/0,n=-1/0,o=1/0,r=-1/0;for(let[s,i]of t)s<e&&(e=s),s>n&&(n=s),i<o&&(o=i),i>r&&(r=i);return[(n+e)*.5,(r+o)*.5]}var to=class t extends Ia{getBoxMesh(){_e.identity(),_e.setFromMatrix3(this.rotation),_e.decompose(Jn,qe,new Nt.Vector3);let e=this.halfSize.clone().multiplyScalar(2),n=new Nt.Mesh(new Nt.BoxGeometry(e.x,e.y,e.z));return n.position.copy(this.center),n.rotation.setFromQuaternion(qe),n}getBoxEdge(e=16776960){let n=this.getBoxMesh();_a.setFromObject(n);let o=new Nt.EdgesGeometry(n.geometry.clone().applyMatrix4(n.matrixWorld));return new Nt.LineSegments(o,new Nt.LineBasicMaterial({color:e,toneMapped:!1}))}toJson(){return _e.identity(),_e.setFromMatrix3(this.rotation),_e.decompose(Jn,qe,new Nt.Vector3),{size:this.halfSize.toArray(),center:this.center.toArray(),quaternion:qe.toArray()}}static from(e,n,o,r=new t){if(o instanceof Nt.Euler)qe.setFromEuler(o);else if(o instanceof Nt.Quaternion)qe.copy(o);else throw new Error("\u4F20\u5165\u7684\u65CB\u8F6C\u4E0D\u662F\u6B27\u62C9\u89D2\u6216\u8005\u56DB\u5143\u6570");return _e.compose(n,qe,Wa),r.center.copy(n),r.halfSize.copy(e.multiplyScalar(.5)),r.rotation.setFromMatrix4(_e),r}static fromByPath2D(e,n,o,r=new t){let s=gr({type:"Polygon",coordinates:[e.map(h=>[h.x,h.y])]});if(!s)throw new Error("2d obb \u83B7\u53D6\u5931\u8D25");let i=s.geometry.coordinates[0],l=pr(i[0],i[1]),u=pr(i[1],i[2]),d=Math.atan2(i[1][1]-i[0][1],i[1][0]-i[0][0]);Jn.set(l,u,o),xr.set(0,0,d);let[f,c]=Ca(i);return n.x=f,n.y=c,this.from(Jn,n,xr,r)}},_e=new Nt.Matrix4,qe=new Nt.Quaternion,xr=new Nt.Euler,Wa=new Nt.Vector3(1,1,1),Jn=new Nt.Vector3,_a=new Nt.Box3;import"three";function Ha(t,e,n=.005,o=.2){if(!t.length||!e.length)return 0;let r=Math.max(n,.03),s=n*n,i=new Map,l=(c,a,h)=>`${Math.floor(c/r)},${Math.floor(a/r)},${Math.floor(h/r)}`;for(let c of e){let a=l(c.x,c.y,c.z);i.has(a)||i.set(a,[]),i.get(a).push(c)}let u=0,d=Math.ceil(n/r)+1,f=[];for(let c=-d;c<=d;c++)for(let a=-d;a<=d;a++)for(let h=-d;h<=d;h++)c*c+a*a+h*h<=d*d&&f.push([c,a,h]);for(let c of t){let a=Math.floor(c.x/r),h=Math.floor(c.y/r),g=Math.floor(c.z/r),p=!1;for(let[b,m,x]of f){let y=`${a+b},${h+m},${g+x}`;if(i.has(y)){for(let w of i.get(y))if(c.distanceToSquared(w)<s){p=!0;break}if(p)break}}if(p&&(u++,u/t.length>o))return u/t.length}return u/t.length}function He(t,e,n=.5){let o=0,r=0;for(let s of t)if(e.containsPoint(s)&&(o++,r=o/t.length,r>n))break;return r}function Bo(t,e,n,o){if(t.intersectsOBB(e))return!0;{let s=Qt(t,o),i=Qt(e,n);if(s||i)return!0}return!1}function Oo(t,e){let n=new Z.Vector3,o=new Z.Vector3;t.getSize(n),e.getSize(o);let r=n.x*n.y*n.z,s=o.x*o.y*o.z;return r>s?1:r<s?-1:0}function Qt(t,e){let n=!0;for(let o=0;o<e.length;o++)if(!t.containsPoint(e[o])){n=!1;break}return n}function de(t){if(t.length===0)return{x:0,y:0,z:0,h:0};let e=0,n=0,o=-1/0,r=1/0;for(let s of t)e+=s.x,n+=s.y,o=Math.max(o,s.z),r=Math.min(r,s.z);return{x:e/t.length,y:n/t.length,z:0,maxz:o,minz:r,h:o-r}}function Ee(t,e,n,o){let r=[];for(let i=0;i<t.length;i++)r.push(new Z.Vector3(t[i][0],t[i][1],0));if(r.length==0)return null;let s=to.fromByPath2D(r,e,n);return s.center.z=o,s}var Aa=(t,e)=>{let n=new Z.Group,o=new Z.MeshStandardMaterial({color:16737792,side:Z.DoubleSide});for(let r=0;r<t.length;r++){let s=[];for(let p=0;p<t[r].path.length;p++)s.push(new Z.Vector3(t[r].path[p][0],t[r].path[p][1],0));if(s.length==0)continue;n.add(t[r].obb.getBoxEdge());let i=new Z.BufferGeometry;i.setFromPoints(s);let l="green",u=new Z.LineBasicMaterial({color:l,depthTest:!1,depthWrite:!1}),d=new Z.Line(i,u);d.position.z=t[r].maxz,n.add(d);let f=t[r].obb.center.clone(),c=ms(t[r].type,f),a=t[r].stairBottomPt1.clone(),h=t[r].stairBottomPt2.clone();for(let p=0;p<t[r].stairStepNum;p++){let b=[a,h];b.push(h.clone().addScaledVector(t[r].vecStepWidth,t[r].stairStepWidth)),b.push(a.clone().addScaledVector(t[r].vecStepWidth,t[r].stairStepWidth));let m=Eo(b,t[r].stairStepHeight),x=new Z.Mesh(m,o);n.add(x),a=a.addScaledVector(t[r].vecStepWidth,t[r].stairStepWidth),a=a.addScaledVector(new Z.Vector3(0,0,1),t[r].stairStepHeight),h=h.addScaledVector(t[r].vecStepWidth,t[r].stairStepWidth),h=h.addScaledVector(new Z.Vector3(0,0,1),t[r].stairStepHeight)}if(t[r].rectPt1.x!=0&&t[r].rectPt1.y!=0){let p=[t[r].stairBottomPt1,t[r].stairBottomPt2,t[r].rectPt2,t[r].rectPt1],b=Eo(p,t[r].stairStepHeight),m=new Z.Mesh(b,o);n.add(m)}let g=new Z.MeshBasicMaterial({color:16776960});for(let p=0;p<t[r].stairBottom1BalconyRailing.length;p++){let b=new Z.CylinderGeometry(.03,.03,t[r].balconyRailingHeight,32),m=new Z.Mesh(b,g);m.position.set(t[r].stairBottom1BalconyRailing[p].x,t[r].stairBottom1BalconyRailing[p].z+t[r].balconyRailingHeight/2,-t[r].stairBottom1BalconyRailing[p].y),e.add(m)}for(let p=0;p<t[r].stairBottom2BalconyRailing.length;p++){let b=new Z.CylinderGeometry(.03,.03,t[r].balconyRailingHeight,32),m=new Z.Mesh(b,g);m.position.set(t[r].stairBottom2BalconyRailing[p].x,t[r].stairBottom2BalconyRailing[p].z+t[r].balconyRailingHeight/2,-t[r].stairBottom2BalconyRailing[p].y),e.add(m)}}return n},La=(t,e)=>{if(t.length==0)return[];e||(e=t[0].averagePz);let n=[],o=new Map;for(let s=0;s<t.length;s++){let i=t[s].points.map(m=>[m.x,m.y]),l=t[s].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 u=l.split("_").slice(1,3).join("_").split(".")[0].split("_")[0],d=l.indexOf("_")+1,f=l.lastIndexOf("_"),c=l.substring(d,f);if(c.includes("top")&&(d=c.indexOf("top")+4,c=c.substring(d,f)),c.includes("left")&&(d=c.indexOf("left")+5,c=c.substring(d,f)),c.includes("right")&&(d=c.indexOf("right")+6,c=c.substring(d,f)),c.includes("front")&&(d=c.indexOf("front")+6,c=c.substring(d,f)),c!=="floor")continue;let a=[];for(let m=0;m<t[s].points.length;m++)a.push(new Z.Vector3(t[s].points[m].x,t[s].points[m].y,t[s].points[m].z));let h=-99999;if(c==="floor"){let m=new Map;for(let y=0;y<t[s].points.length;y++){let w=t[s].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[s].points[y]),m.set(w,z)}else m.set(w,{num:1,points:[t[s].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]),a=[],a=x[1].points.map(y=>new Z.Vector3(y.x,y.y,y.z)),h=x[0]}let g=de(a),p={points:a,path:ve(i),h:g.h,minz:g.minz,maxz:g.maxz,center:{x:g.x,y:g.y,z:g.z},obj_id:t[s].obj_id,type:c,averagePz:e,obb:null,isDel:!1,obj_id:l,positionArr:[t[s].position]};if(p.obb=Ee(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==c){b=m;break}if(b!=-1?n[b].array.push(p):n.push({type:c,array:[p]}),c=="floor"&&h!=-99999)if(o.has(h)){let m=o.get(h);m.num+=p.points.length,m.datas.push(p),o.set(h,m)}else o.set(h,{num:p.points.length,datas:[p]})}if(o.size>0){let s=[];for(let[i,l]of o.entries()){let{num:u,datas:d}=l;u>3e3&&s.push(...d)}for(let i=0;i<n.length;i++)if(n[i].type=="floor"){n[i].array=s;break}}for(let s=0;s<n.length;s++){let i=n[s].array,l=new Set,u=[];for(let f=0;f<i.length;f++){if(i[f].obb==null||l.has(f))continue;let c={...i[f],obb:i[f].obb.clone()};for(let a=f+1;a<i.length;a++){if(i[a].obb==null||l.has(a))continue;let h=c.obb.intersectsOBB(i[a].obb,.01);if(h||(h=$a(c.obb,i[a].obb)),h){l.add(a);for(let b=0;b<i[a].points.length;b++)(i[a].points[b].z>e&&i[a].points[b].z-e>.1||c.type=="floor"||c.type=="Staircase")&&c.points.push(i[a].points[b]);let g=c.points.map(b=>[b.x,b.y]);c.path=ve(g);let p=de(c.points);c.h=p.h,c.minz=p.minz,c.maxz=p.maxz,c.center={x:p.x,y:p.y,z:p.z},c.obb=Ee(c.path,c.center,c.h,(c.maxz+c.minz)/2),c.positionArr.push(...i[a].positionArr),a=f}}c.path.length>i[f].path.length&&(l.add(f),u.push(c))}let d=[];for(let f=0;f<i.length;f++)l.has(f)||d.push(i[f]);d.push(...u),n[s].array=d}for(let s=0;s<n.length;s++){let i=n[s].type;if(i==="people"||i==="floor")continue;let l=n[s].array;for(let u=0;u<l.length;u++){let d=l[u].obb,f=l[u].minz,c=l[u].maxz,a=l[u].averagePz;if(i==="window"||i==="door"||i==="tv"||i==="chair"||i==="cabinet"||i==="table"){let h=new Z.Vector3;d.getSize(h);let g=[h.x,h.y,h.z],p=0;for(let b of g)if(b<.2&&(p++,p===2)){l[u].isDel=!0;break}}if(!l[u].isDel)for(let h=s+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(d.intersectsOBB(m)){let w=He(p[b].points,d),z=He(l[u].points,m),M=Oo(d,m);if(z>=.5&&M==-1&&i!=="Staircase"&&g!=="Staircase"){l[u].isDel=!0;break}if(i!=="wall"&&i!=="floor"&&i!=="roof"){if(i==="window"){if(g==="balcony railing"&&Qt(d,p[b].points)){p[b].isDel=!0;continue}if(g==="balcony railing"&&Qt(m,l[u].points)){l[u].isDel=!0;break}if(g==="balcony railing"&&Bo(d,m,l[u].points,p[b].points)&&(Math.abs(f-x)<.1||Math.abs(x-a)>.3)){p[b].isDel=!0;continue}if(g==="door"&&Qt(d,p[b].points)){p[b].isDel=!0;continue}if(g==="door"&&Qt(m,l[u].points)){p[b].isDel=!0;continue}if(g==="window sill")continue}else if(i==="balcony railing"){if(g==="window"&&Qt(d,p[b].points)){p[b].isDel=!0;continue}if(g==="window"&&Qt(m,l[u].points)){l[u].isDel=!0;break}if(g==="window"&&Bo(d,m,l[u].points,p[b].points)&&(Math.abs(f-x)<.1||Math.abs(f-a)>.3)){l[u].isDel=!0;break}if(g==="Staircase"&&Qt(d,p[b].points)){l[u].isStaircaseBalconyRailing=!0;break}if(g==="Staircase"&&Qt(m,l[u].points)){l[u].isStaircaseBalconyRailing=!0;break}if(g==="Staircase"&&d.intersectsOBB(m)){l[u].isStaircaseBalconyRailing=!0;break}}else if(i==="door"){if(g==="window"&&Qt(d,p[b].points)){l[u].isDel=!0;break}if(g==="window"&&Qt(m,l[u].points)){l[u].isDel=!0;break}if(g==="window sill"&&Qt(d,p[b].points)){l[u].isDel=!0;break}if(g==="window sill"&&Qt(m,l[u].points)){l[u].isDel=!0;break}}else if(i==="window sill"){if(g==="window")continue;if(g==="floor"&&Qt(d,p[b].points)){p[b].isDel=!0;continue}if(g==="door"&&Qt(d,p[b].points)){p[b].isDel=!0;continue}if(g==="door"&&Qt(m,l[u].points)){p[b].isDel=!0;continue}}else if(i==="Staircase"){if(g==="balcony railing"&&Qt(d,p[b].points)){p[b].isStaircaseBalconyRailing=!0;continue}if(g==="balcony railing"&&Qt(m,l[u].points)){p[b].isStaircaseBalconyRailing=!0;continue}if(g==="balcony railing"&&d.intersectsOBB(m)){p[b].isStaircaseBalconyRailing=!0;continue}}let P=!1,E=[],T=[],V=l[u].points,_=p[b].points;if(V.length>_.length?(P=!0,E=V,T=_):(E=_,T=V),Ha(T,E,.03,.5)>.5)if(P)p[b].isDel=!0;else{l[u].isDel=!0;break}else if(Bo(d,m,l[u].points,p[b].points)){let S=Oo(d,m);if(S===1||S===0){if(g==="switch"||g==="Staircase")continue;V.length>_.length?He(T,d)>=.5&&(p[b].isDel=!0):He(E,d)>=.5&&(p[b].isDel=!0)}else{if(i==="switch"||i==="Staircase")continue;if(V.length>_.length){if(He(E,m)>=.5){l[u].isDel=!0;break}}else if(He(T,m)>=.5){l[u].isDel=!0;break}}}}}}if(l[u].isDel)break}}}for(let s=0;s<n.length;s++){let i=n[s].type,l=n[s].array;for(let u=0;u<l.length;u++){let d=l[u].maxz,f=l[u].minz,c=i==="switch"?.1:.3;if(Math.abs(d-e)<c&&i!="floor"){l[u].isDel=!0;continue}if(i==="window"||i==="door"||i==="tv"){let a=Math.abs(d-e),h=Math.abs(f-e);(i==="tv"&&h<1.6||i!=="window"&&a<1.6)&&(l[u].isDel=!0),i==="window"&&a<1&&(l[u].isDel=!0),i==="door"&&h>1&&(l[u].isDel=!0)}if(i==="chair"){let a=new Z.Vector3;l[u].obb.getSize(a),(a.x<.1||a.y<.1||a.z<.2)&&(l[u].isDel=!0)}if(i==="balcony railing"&&(Math.abs(d-f)<.4&&(l[u].isDel=!0),(f<e&&Math.abs(f-e)>1||f>e&&Math.abs(f-e)>1)&&(l[u].isDel=!0),d<e&&(l[u].isDel=!0)),i==="people"&&(Math.abs(d-f)<1&&(l[u].isDel=!0),f>e&&f-e>.3&&(l[u].isDel=!0),d<e&&(l[u].isDel=!0)),i==="floor"){let a=new Z.Vector3;l[u].obb.getSize(a),(a.x<.1||a.y<.1)&&(l[u].isDel=!0)}i==="stair guardrail"&&l[u].points.length<100&&(l[u].isDel=!0)}}for(let s=0;s<n.length;s++)n[s].array=n[s].array.filter(i=>!i.isDel);return n},ka=t=>{if(t.length==0)return[];let e=[],n=new Map;for(let r=0;r<t.length;r++){let s=t[r].points.map(b=>[b.x,b.y]),i=t[r].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],u=i.indexOf("_")+1,d=i.lastIndexOf("_"),f=i.substring(u,d);if(f!=="floor")continue;let c=[];for(let b=0;b<t[r].points.length;b++)c.push(new Z.Vector3(t[r].points[b].x,t[r].points[b].y,t[r].points[b].z));let a=-99999;if(f==="floor"){let b=new Map;for(let x=0;x<t[r].points.length;x++){let y=t[r].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[r].points[x]),b.set(y,w)}else b.set(y,{num:1,points:[t[r].points[x]]})}let m=[...b.entries()].reduce((x,y)=>y[1].num>x[1].num?y:x);s=[],s=m[1].points.map(x=>[x.x,x.y]),c=[],c=m[1].points.map(x=>new Z.Vector3(x.x,x.y,x.z)),a=m[0]}let h=de(c),g={points:c,path:ve(s),h:h.h,minz:h.minz,maxz:h.maxz,center:{x:h.x,y:h.y,z:h.z},obj_id:t[r].obj_id,type:f,obb:null,isDel:!1,obj_id:i,positionArr:[t[r].position]};if(g.obb=Ee(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==f){p=b;break}if(p!=-1?e[p].array.push(g):e.push({type:f,array:[g]}),f=="floor"&&a!=-99999)if(n.has(a)){let b=n.get(a);b.num+=g.points.length,b.datas.push(g),n.set(a,b)}else n.set(a,{num:g.points.length,datas:[g]})}for(let r=0;r<e.length;r++){let s=e[r].array,i=[],l=[];for(let d=0;d<s.length;d++){if(s[d].obb==null||i.includes(d))continue;let f={...s[d],obb:s[d].obb.clone()};for(let c=d+1;c<s.length;c++){if(s[c].obb==null||i.includes(c))continue;if(f.obb.intersectsOBB(s[c].obb)){i.push(c);for(let p=0;p<s[c].points.length;p++)f.points.push(s[c].points[p]);let h=f.points.map(p=>[p.x,p.y]);f.path=ve(h);let g=de(f.points);f.h=g.h,f.minz=g.minz,f.maxz=g.maxz,f.center={x:g.x,y:g.y,z:g.z},f.obb=Ee(f.path,f.center,f.h,(f.maxz+f.minz)/2),f.positionArr.push(...s[c].positionArr),c=d}}f.path.length>s[d].path.length&&(i.push(d),l.push(f))}let u=[];for(let d=0;d<s.length;d++)i.includes(d)||u.push(s[d]);u.push(...l),e[r].array=u}for(let r=0;r<e.length;r++){let s=e[r].type,i=e[r].array;for(let l=0;l<i.length;l++)s==="floor"&&i[l].points.length<500&&(i[l].isDel=!0)}for(let r=0;r<e.length;r++)e[r].array=e[r].array.filter(s=>!s.isDel);let o=[];for(let r=0;r<e.length;r++){let s=e[r].array;for(let i=0;i<s.length;i++)o.push({obbBox:s[i].obb,box:new Z.Box3().setFromPoints(s[i].points),category:s[i].type,center:{x:s[i].center.x,y:s[i].center.y,z:(s[i].minz+s[i].maxz)/2},name:s[i].obj_id,obj_id:s[i].obj_id,pcdPoints:s[i].points,positionArr:s[i].positionArr})}return o},Ba=(t,e)=>{if(!t||!t.splitFloorProjectsResults||!t.trajectoryResults)return[];let n=t.splitFloorProjectsResults,o=t.trajectoryResults,r=new Map;for(let a=0;a<o.length;a++){let h=o[a].floor;r.has(h)?r.get(h).push(o[a]):r.set(h,[o[a]])}let s=new Map,i=[];for(let a=0;a<n.length;a++){let h=[],g=n[a];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=de(M),E={points:M,path:ve(b),h:P.h,minz:P.minz,maxz:P.maxz,center:{x:P.x,y:P.y,z:P.z},obj_id:g[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=Ee(E.path,E.center,E.h,(E.maxz+E.minz)/2),E.obb!=null&&(z=="Staircase"?h.push(E):z=="balcony railing"&&i.push(E))}s.set(a+1,h)}let l=[];for(let[a,h]of s){let g={floor:a,findTrajectoryResults:[],otherTrajectoryResults:[],lastTrajectoryResults:[]},p=r.get(a);if(!p){g.otherTrajectoryResults=h,l.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,l.push(g)}function u(a,h){let g=a,p=[],b=[];for(let x=0;x<a.length;x++){if(a[x].obb==null||p.includes(x))continue;let y={...a[x],obb:a[x].obb.clone()};for(let w=x+1;w<a.length;w++){if(a[w].obb==null||p.includes(w))continue;if(y.obb.intersectsOBB(a[w].obb)||h){p.push(w);for(let E=0;E<a[w].points.length;E++)y.points.push(a[w].points[E]);let M=y.points.map(E=>[E.x,E.y]);y.path=ve(M);let P=de(y.points);y.h=P.h,y.minz=P.minz,y.maxz=P.maxz,y.center={x:P.x,y:P.y,z:P.z},y.obb=Ee(y.path,y.center,y.h,(y.maxz+y.minz)/2),y.positionArr.push(...a[w].positionArr),w=x}}y.path.length>a[x].path.length&&(p.push(x),b.push(y))}let m=[];for(let x=0;x<a.length;x++)p.includes(x)||m.push(a[x]);return m.push(...b),a=m,a}for(let a=0;a<l.length;a++){for(let h=0;h<l[a].findTrajectoryResults.length;h++)l[a].findTrajectoryResults[h]=u(l[a].findTrajectoryResults[h],!0);l[a].otherTrajectoryResults=u(l[a].otherTrajectoryResults,!1)}for(let a=0;a<l.length;a++){for(let h=0;h<l[a].findTrajectoryResults.length;h++){for(let g=0;g<l[a].findTrajectoryResults[h].length;g++){let p=yr(l[a].findTrajectoryResults[h][g].points,{binCount:100,minBinPoints:5,sideK:2.2,zK:2.2,minSideRange:.2,minZRange:.2,lowerZScale:.4,upperZScale:1.8}),b=br(p.keep,{radius:.1,minClusterSize:50,lowPercent:.45});if(b.keep.length==0){l[a].findTrajectoryResults[h][g].isDel=!0;continue}l[a].findTrajectoryResults[h][g].points=b.keep;let m=l[a].findTrajectoryResults[h][g].points.map(y=>[y.x,y.y]);l[a].findTrajectoryResults[h][g].path=ve(m);let x=de(l[a].findTrajectoryResults[h][g].points);l[a].findTrajectoryResults[h][g].h=x.h,l[a].findTrajectoryResults[h][g].minz=x.minz,l[a].findTrajectoryResults[h][g].maxz=x.maxz,l[a].findTrajectoryResults[h][g].center={x:x.x,y:x.y,z:x.z},l[a].findTrajectoryResults[h][g].obb=Ee(l[a].findTrajectoryResults[h][g].path,l[a].findTrajectoryResults[h][g].center,l[a].findTrajectoryResults[h][g].h,(l[a].findTrajectoryResults[h][g].maxz+l[a].findTrajectoryResults[h][g].minz)/2)}l[a].findTrajectoryResults[h]=l[a].findTrajectoryResults[h].filter(g=>!g.isDel)}for(let h=0;h<l[a].otherTrajectoryResults.length;h++){let g=yr(l[a].otherTrajectoryResults[h].points,{binCount:100,minBinPoints:5,sideK:2.2,zK:2.2,minSideRange:.2,minZRange:.2,lowerZScale:.4,upperZScale:1.8}),p=br(g.keep,{radius:.1,minClusterSize:50,lowPercent:.45});if(p.keep.length==0){l[a].otherTrajectoryResults[h].isDel=!0;continue}l[a].otherTrajectoryResults[h].points=p.keep;let b=l[a].otherTrajectoryResults[h].points.map(x=>[x.x,x.y]);l[a].otherTrajectoryResults[h].path=ve(b);let m=de(l[a].otherTrajectoryResults[h].points);l[a].otherTrajectoryResults[h].h=m.h,l[a].otherTrajectoryResults[h].minz=m.minz,l[a].otherTrajectoryResults[h].maxz=m.maxz,l[a].otherTrajectoryResults[h].center={x:m.x,y:m.y,z:m.z},l[a].otherTrajectoryResults[h].obb=Ee(l[a].otherTrajectoryResults[h].path,l[a].otherTrajectoryResults[h].center,l[a].otherTrajectoryResults[h].h,(l[a].otherTrajectoryResults[h].maxz+l[a].otherTrajectoryResults[h].minz)/2)}l[a].otherTrajectoryResults.filter(h=>!h.isDel)}function d(a){for(let h=0;h<a.length;h++){let g=a[h].obb;for(let p=h+1;p<a.length;p++){let b=a[p].obb;if(!a[p].isDel){if(g.intersectsOBB(b)){let m=He(a[p].points,g),x=He(a[h].points,b),y=Oo(g,b);if(m>=.5&&(y==1||y==0)&&(a[p].isDel=!0),x>=.5&&y==-1){a[h].isDel=!0;break}}if(a[h].isDel)break}}}return a=a.filter(h=>!h.isDel),a}for(let a=0;a<l.length;a++){let h=[];for(let g=0;g<l[a].findTrajectoryResults.length;g++)h.push(...l[a].findTrajectoryResults[g]);h.push(...l[a].otherTrajectoryResults),l[a].lastTrajectoryResults=d(h)}function f(a){let h=[];if(a.length>0){let g=.3,p=.5,b=.5,m=.2;for(let x=0;x<a.length;x++){let y=a[x].obb.halfSize.clone().multiplyScalar(2),w=a[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=ys(a[x].obb);if(E.length!=8)continue;let T=new Z.Line3(E[0],E[1]),V=new Z.Line3(E[1],E[2]),_=new Z.Line3(E[2],E[3]),v=new Z.Line3(E[3],E[0]),S=new Z.Line3(E[4],E[5]),R=new Z.Line3(E[5],E[6]),D=new Z.Line3(E[6],E[7]),W=new Z.Line3(E[7],E[4]),I=[],C=[],H=[],A=[],k=[],O=[],N=[],L=[];for(let bt=0;bt<w.length;bt++){let Jt=T.closestPointToPoint(w[bt],!0,new Z.Vector3),he=V.closestPointToPoint(w[bt],!0,new Z.Vector3),Tt=_.closestPointToPoint(w[bt],!0,new Z.Vector3),ee=v.closestPointToPoint(w[bt],!0,new Z.Vector3),et=S.closestPointToPoint(w[bt],!0,new Z.Vector3),me=R.closestPointToPoint(w[bt],!0,new Z.Vector3),Ae=D.closestPointToPoint(w[bt],!0,new Z.Vector3),Le=W.closestPointToPoint(w[bt],!0,new Z.Vector3);Jt.distanceTo(w[bt])<m&&I.push(w[bt]),he.distanceTo(w[bt])<m&&C.push(w[bt]),Tt.distanceTo(w[bt])<m&&H.push(w[bt]),ee.distanceTo(w[bt])<m&&A.push(w[bt]),et.distanceTo(w[bt])<m&&k.push(w[bt]),me.distanceTo(w[bt])<m&&O.push(w[bt]),Ae.distanceTo(w[bt])<m&&N.push(w[bt]),Le.distanceTo(w[bt])<m&&L.push(w[bt])}let B=E[0].distanceTo(E[1]),$=E[1].distanceTo(E[2]),G=E[2].distanceTo(E[3]),Q=E[3].distanceTo(E[0]),q=new Z.Vector3,X=new Z.Vector3,Y=new Z.Vector3,it=new Z.Vector3;Math.abs(B-z)<.01?I.length>H.length?(q=E[0].clone(),X=E[1].clone(),Y=new Z.Vector3().subVectors(X,q).normalize(),it=new Z.Vector3().subVectors(E[2],E[1]).normalize()):(q=E[2].clone(),X=E[3].clone(),Y=new Z.Vector3().subVectors(X,q).normalize(),it=new Z.Vector3().subVectors(E[0],E[3]).normalize()):C.length>A.length?(q=E[1].clone(),X=E[2].clone(),Y=new Z.Vector3().subVectors(X,q).normalize(),it=new Z.Vector3().subVectors(E[3],E[2]).normalize()):(q=E[3].clone(),X=E[0].clone(),Y=new Z.Vector3().subVectors(X,q).normalize(),it=new Z.Vector3().subVectors(E[1],E[0]).normalize());let ht=E[4].distanceTo(E[5]),St=E[5].distanceTo(E[6]),nt=E[6].distanceTo(E[7]),wt=E[7].distanceTo(E[4]),zt=new Z.Vector3,Dt=new Z.Vector3,Pt=new Z.Vector3(q.x,q.y,E[4].z),Mt=new Z.Vector3(X.x,X.y,E[4].z);(ct(E[4],Pt)||ct(E[4],Mt))&&(ct(E[5],Pt)||ct(E[5],Mt))?(zt=E[6].clone(),Dt=E[7].clone()):(ct(E[5],Pt)||ct(E[5],Mt))&&(ct(E[6],Pt)||ct(E[6],Mt))?(zt=E[7].clone(),Dt=E[4].clone()):(ct(E[6],Pt)||ct(E[6],Mt))&&(ct(E[7],Pt)||ct(E[7],Mt))?(zt=E[4].clone(),Dt=E[5].clone()):(ct(E[7],Pt)||ct(E[7],Mt))&&(ct(E[4],Pt)||ct(E[4],Mt))&&(zt=E[5].clone(),Dt=E[6].clone());let It=q.distanceTo(X),ot=zt.distanceTo(Dt),ft=new Z.Vector3().subVectors(new Z.Vector3(q.x,q.y,zt.z),q).normalize();if(Math.abs(It-ot)>.01||Math.abs(It-z)>.01){console.log("\u4E0A\u4E0B\u957F\u5EA6\u4E0D\u4E00\u81F4,\u6216\u4E0E\u5BBD\u4E0D\u4E00\u81F4",It,ot,z);continue}let st=Math.sqrt(It*It+ot*ot),tt=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(st)))),ae={stairStepHeight:P/tt,stairStepWidth:M/tt,staitWidth:z,stairLength:M,stairHeigth:P,stairStepNum:tt,stairBottomPt1:q,stairBottomPt2:X,stairTopPt1:zt,stairTopPt2:Dt,vecStepLength:Y,vecStepWidth:it,vecStepHeight:ft,path:a[x].path,obb:a[x].obb,maxz:a[x].maxz,points:a[x].points,rectPt1:new Z.Vector3(0,0,0),rectPt2:new Z.Vector3(0,0,0)};h.push(ae)}}return h}let c=[];for(let a=0;a<l.length;a++)c.push(...f(l[a].lastTrajectoryResults));for(let a=0;a<c.length;a++){let h=c[a].stairTopPt1.clone(),g=c[a].stairTopPt2.clone(),p=c[a].stairBottomPt1.clone(),b=c[a].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=qt(h,g,!0),M=qt(p,b,!0),P=qt(z,M),E=new Z.Vector3().subVectors(z,P).normalize(),T=new Z.Vector3().subVectors(M,P).normalize(),V=z.distanceTo(M),_=!1,v=!1;for(let S=0;S<c.length;S++){if(a==S)continue;let R=c[S].stairTopPt1.clone(),D=c[S].stairTopPt2.clone(),W=c[S].stairBottomPt1.clone(),I=c[S].stairBottomPt2.clone(),C=new Z.Vector3().subVectors(R,D).normalize(),H=new Z.Vector3().subVectors(W,I).normalize(),A=R.clone(),k=D.clone(),O=W.clone(),N=I.clone();A.z=k.z=O.z=N.z=0;let L=qt(R,D,!0),B=qt(W,I,!0),$=L.distanceTo(B),G=Gt(z,M,L,B),Q=!1;if(G&&G.isParallel&&R.z<=p.z&&p.z-R.z<.3){Q=!0,v=!0;let q=A.addScaledVector(C.clone().negate(),100),X=k.addScaledVector(C,100),Y=O.addScaledVector(H.clone().negate(),100),it=N.addScaledVector(H,100),ht=new Z.Line3(q,X),St=new Z.Line3(Y,it),nt=ht.closestPointToPoint(P,!0,new Z.Vector3),wt=St.closestPointToPoint(P,!0,new Z.Vector3),zt=new Z.Vector3().subVectors(nt,P),Dt=new Z.Vector3().subVectors(wt,P),Pt=zt.length(),Mt=Dt.length();Dt=Dt.normalize(),zt=zt.normalize();let It=Kt(E,zt,.1),ot=Kt(T,zt,.1),ft=Kt(T,Dt,.1),st=Kt(E,Dt,.1);if(It&&It.sameDirection&&Pt>V/2){let tt=Pt-V/2;c[a].stairBottomPt1=c[a].stairBottomPt1.addScaledVector(T,tt),c[a].stairBottomPt2=c[a].stairBottomPt2.addScaledVector(T,tt)}else if(ot&&ot.sameDirection&&Pt>V/2){let tt=Pt-V/2;c[a].stairBottomPt1=c[a].stairBottomPt1.addScaledVector(T,tt),c[a].stairBottomPt2=c[a].stairBottomPt2.addScaledVector(T,tt)}if(ft&&ft.sameDirection&&Mt>V/2){let tt=Mt-V/2;c[a].stairTopPt1=c[a].stairTopPt1.addScaledVector(E,tt),c[a].stairTopPt2=c[a].stairTopPt2.addScaledVector(E,tt)}else if(st&&st.sameDirection&&Mt>V/2){let tt=Mt-V/2;c[a].stairTopPt1=c[a].stairTopPt1.addScaledVector(E,tt),c[a].stairTopPt2=c[a].stairTopPt2.addScaledVector(E,tt)}}else if(G&&G.isParallel&&h.z<W.z&&W.z-h.z<.2){Q=!0,_=!0;let q=A.addScaledVector(C.clone().negate(),100),X=k.addScaledVector(C,100),Y=O.addScaledVector(H.clone().negate(),100),it=N.addScaledVector(H,100),ht=new Z.Line3(q,X),St=new Z.Line3(Y,it),nt=ht.closestPointToPoint(P,!1,new Z.Vector3),wt=St.closestPointToPoint(P,!1,new Z.Vector3),zt=new Z.Vector3().subVectors(nt,P),Dt=new Z.Vector3().subVectors(wt,P),Pt=zt.length(),Mt=Dt.length();Dt=Dt.normalize(),zt=zt.normalize();let It=Kt(E,zt,.1),ot=Kt(T,zt,.1),ft=Kt(T,Dt,.1),st=Kt(E,Dt,.1);if(It&&It.sameDirection&&Pt>V/2){let tt=Pt-V/2;c[a].stairBottomPt1=c[a].stairBottomPt1.addScaledVector(T,tt),c[a].stairBottomPt2=c[a].stairBottomPt2.addScaledVector(T,tt)}else if(ot&&ot.sameDirection&&Pt>V/2){let tt=Pt-V/2;c[a].stairBottomPt1=c[a].stairBottomPt1.addScaledVector(T,tt),c[a].stairBottomPt2=c[a].stairBottomPt2.addScaledVector(T,tt)}if(ft&&ft.sameDirection&&Mt>V/2){let tt=Mt-V/2;c[a].stairTopPt1=c[a].stairTopPt1.addScaledVector(E,tt),c[a].stairTopPt2=c[a].stairTopPt2.addScaledVector(E,tt)}else if(st&&st.sameDirection&&Mt>V/2){let tt=Mt-V/2;c[a].stairTopPt1=c[a].stairTopPt1.addScaledVector(E,tt),c[a].stairTopPt2=c[a].stairTopPt2.addScaledVector(E,tt)}c[a].stairTopPt1.z=c[a].stairTopPt2.z=W.z}if(Q&&(h=c[a].stairTopPt1.clone(),g=c[a].stairTopPt2.clone(),p=c[a].stairBottomPt1.clone(),b=c[a].stairBottomPt2.clone(),m=h.clone(),x=g.clone(),y=p.clone(),w=b.clone(),m.z=x.z=y.z=w.z=0,z=qt(h,g,!0),M=qt(p,b,!0),P=qt(z,M),E=new Z.Vector3().subVectors(z,P).normalize(),T=new Z.Vector3().subVectors(M,P).normalize(),V=z.distanceTo(M)),v&&_)break}if(v||_){let S=c[a].stairTopPt1.clone(),R=c[a].stairTopPt2.clone(),D=c[a].stairBottomPt1.clone(),W=c[a].stairBottomPt2.clone(),I=qt(S,R,!0),C=qt(D,W,!0),H=I.distanceTo(C),A=c[a].stairTopPt1.distanceTo(c[a].stairTopPt2),k=c[a].stairBottomPt1.distanceTo(c[a].stairBottomPt2),O=Math.sqrt(A*A+k*k),N=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(O))));c[a].stairStepNum=N,c[a].stairHeigth=c[a].stairTopPt1.z-c[a].stairBottomPt1.z,c[a].stairStepHeight=c[a].stairHeigth/c[a].stairStepNum,c[a].stairStepWidth=H/c[a].stairStepNum}}for(let a=0;a<c.length;a++){let h=c[a].stairTopPt1,g=c[a].stairTopPt2,p=c[a].stairBottomPt1.clone(),b=c[a].stairBottomPt2.clone(),m=new Z.Vector3(h.x,h.y,p.z),x=c[a].vecStepWidth;for(let y=0;y<c.length;y++){if(a==y)continue;let w=c[y].stairTopPt1,z=c[y].stairTopPt2,M=c[y].stairBottomPt1.clone(),P=c[y].stairBottomPt2.clone(),E=new Z.Vector3(w.x,w.y,M.z),T=c[y].vecStepWidth;if(Math.abs(h.z-M.z)<.3&&M.z>p.z&&c[a].obb.intersectsOBB(c[y].obb)){let V=ie(m,p,E,M);if(V&&V.angle>75){let _=M.distanceTo(h),v=M.distanceTo(g),S=P.distanceTo(h),R=P.distanceTo(g),D=h.clone(),W=D.clone().addScaledVector(x,c[y].staitWidth),I=new Z.Vector3().subVectors(g,h).normalize(),C=h.distanceTo(g),H=D.clone().addScaledVector(I,C),A=W.clone().addScaledVector(I,C),k=D.clone().addScaledVector(I,c[y].stairLength),O=W.clone().addScaledVector(I,c[y].stairLength),N=_;(N>v||N>R)&&(N=v,D=g.clone(),W=D.clone().addScaledVector(x,c[y].staitWidth),I=new Z.Vector3().subVectors(h,g).normalize(),C=h.distanceTo(g),H=D.clone().addScaledVector(I,C),A=W.clone().addScaledVector(I,C),k=D.clone().addScaledVector(I,c[y].stairLength),O=W.clone().addScaledVector(I,c[y].stairLength));let L=new Z.Vector3().subVectors(k,H).normalize(),B=k.distanceTo(H);k.z=O.z=c[y].maxz,c[y].stairBottomPt1=H,c[y].stairBottomPt2=A,c[y].stairTopPt1=k,c[y].stairTopPt2=O,c[y].rectPt1=D,c[y].rectPt2=W;let $=H.distanceTo(A),G=k.distanceTo(O),Q=Math.sqrt(B*B+c[y].stairHeigth*c[y].stairHeigth),q=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(Q))));c[y].stairStepNum=q,c[y].stairHeigth=k.z-H.z,c[y].stairStepHeight=c[y].stairHeigth/c[y].stairStepNum,c[y].stairStepWidth=B/c[y].stairStepNum,c[y].vecStepLength=I.clone().negate(),c[y].vecStepWidth=L;break}}}}return Oa(c,i,e),c},Oa=(t,e,n)=>{if(!t||t.length<=0||!e||e.length<=0)return;let o=1.5,r=0;for(let s=0;s<t.length;s++){t[s].stairBottom1BalconyRailing=[],t[s].stairBottom2BalconyRailing=[],t[s].balconyRailingHeight=0;let i=t[s].stairBottomPt1.clone(),l=t[s].stairBottomPt2.clone(),u=t[s].stairBottomPt1.clone(),d=t[s].stairBottomPt2.clone(),f=new Z.Vector3().subVectors(l,i).normalize();i=i.addScaledVector(f,.05),l=l.addScaledVector(f.clone().negate(),.05);let c=[],a=[];for(let h=0;h<t[s].stairStepNum;h++){let g=[i,u];g.push(g[1].clone().addScaledVector(t[s].vecStepWidth,t[s].stairStepWidth)),g.push(g[0].clone().addScaledVector(t[s].vecStepWidth,t[s].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=de(g),m=Ee(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(r==0&&(r=de(x).maxz),y){let z=qt(g[1],g[2]);z.z+=t[s].stairStepHeight,c.push(z)}g=[],g=[l,d],g.push(g[1].clone().addScaledVector(t[s].vecStepWidth,t[s].stairStepWidth)),g.push(g[0].clone().addScaledVector(t[s].vecStepWidth,t[s].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=de(g),m=Ee(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(r==0&&(r=de(x).maxz),y){let z=qt(g[1],g[2]);z.z+=t[s].stairStepHeight,a.push(z)}i=i.addScaledVector(t[s].vecStepWidth,t[s].stairStepWidth),i=i.addScaledVector(t[s].vecStepHeight,t[s].stairStepHeight),l=l.addScaledVector(t[s].vecStepWidth,t[s].stairStepWidth),l=l.addScaledVector(t[s].vecStepHeight,t[s].stairStepHeight),u=u.addScaledVector(t[s].vecStepWidth,t[s].stairStepWidth),u=u.addScaledVector(t[s].vecStepHeight,t[s].stairStepHeight),d=d.addScaledVector(t[s].vecStepWidth,t[s].stairStepWidth),d=d.addScaledVector(t[s].vecStepHeight,t[s].stairStepHeight)}c.length>t[s].stairStepNum-3&&(t[s].stairBottom1BalconyRailing=c),a.length>t[s].stairStepNum-3&&(t[s].stairBottom2BalconyRailing=a),t[s].balconyRailingHeight=r}};function yr(t,e={}){let{binCount:n=80,minBinPoints:o=5,sideK:r=3,zK:s=3,minSideRange:i=.2,minZRange:l=.2,maxSearchBins:u=3,lowerZScale:d=1,upperZScale:f=1}=e;if(!t||t.length===0)return[];let c=t.map((H,A)=>({index:A,x:H.x,y:H.y,z:H.z,raw:H})),a=0,h=0;for(let H of c)a+=H.x,h+=H.y;a/=c.length,h/=c.length;let g=0,p=0,b=0;for(let H of c){let A=H.x-a,k=H.y-h;g+=A*A,p+=A*k,b+=k*k}g/=c.length,p/=c.length,b/=c.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,_=c.map(H=>{let A=H.x-a,k=H.y-h,O=A*w+k*z,N=A*P+k*E;return T=Math.min(T,O),V=Math.max(V,O),{...H,t:O,side:N}}),S=(V-T||1)/n,R=new Map;for(let H of _){let A=Math.floor((H.t-T)/S);A<0&&(A=0),A>=n&&(A=n-1),R.has(A)||R.set(A,[]),R.get(A).push(H)}let D=new Map;for(let[H,A]of R){if(A.length<o)continue;let k=A.map(q=>q.side).sort((q,X)=>q-X),O=A.map(q=>q.z).sort((q,X)=>q-X),N=eo(k),L=eo(O),B=eo(k.map(q=>Math.abs(q-N)).sort((q,X)=>q-X)),$=eo(O.map(q=>Math.abs(q-L)).sort((q,X)=>q-X)),G=Math.max(i,B*1.4826*r),Q=Math.max(l,$*1.4826*s);D.set(H,{sideMedian:N,zMedian:L,sideRange:G,zRange:Q})}function W(H){if(D.has(H))return D.get(H);for(let A=1;A<=u;A++){if(D.has(H-A))return D.get(H-A);if(D.has(H+A))return D.get(H+A)}return null}let I=[],C=[];for(let H of _){let A=Math.floor((H.t-T)/S);A<0&&(A=0),A>=n&&(A=n-1);let k=W(A);if(!k){C.push(H.raw);continue}let O=Math.abs(H.side-k.sideMedian)<=k.sideRange,N=k.zMedian-k.zRange*d,L=k.zMedian+k.zRange*f,B=H.z>=N&&H.z<=L;O&&B?I.push(H.raw):C.push(H.raw)}return{keep:I,removed:C,debug:{meanX:a,meanY:h,dirX:w,dirY:z,sideX:P,sideY:E,minT:T,maxT:V,binSize:S,stats:D}}}function eo(t){if(t.length===0)return 0;let e=Math.floor(t.length/2);return t.length%2===0?(t[e-1]+t[e])/2:t[e]}function Fa(t,e){let n=new Map;for(let o=0;o<t.length;o++){let r=t[o],s=Math.floor(r.x/e),i=Math.floor(r.y/e),l=Math.floor(r.z/e),u=`${s},${i},${l}`;n.has(u)||n.set(u,[]),n.get(u).push(o)}return n}function Na(t,e,n,o,r){let s=t[n],i=Math.floor(s.x/o),l=Math.floor(s.y/o),u=Math.floor(s.z/o),d=[];for(let f=-1;f<=1;f++)for(let c=-1;c<=1;c++)for(let a=-1;a<=1;a++){let h=`${i+f},${l+c},${u+a}`,g=e.get(h);if(g)for(let p of g){if(p===n)continue;let b=t[p],m=s.x-b.x,x=s.y-b.y,y=s.z-b.z;m*m+x*x+y*y<=r&&d.push(p)}}return d}function br(t,e={}){let{radius:n=.35,minClusterSize:o=20,lowPercent:r=.35}=e,s=qa(t,{radius:n}),i=t.map(f=>f.z).sort((f,c)=>f-c),l=i[Math.floor(i.length*r)],u=[],d=[];for(let f of s.clusters){let c=f.map(g=>s.points[g]),a=c.reduce((g,p)=>g+p.z,0)/c.length;c.length<o&&a<=l?d.push(...c.map(g=>g.raw)):u.push(...c.map(g=>g.raw))}return{keep:u,removed:d}}function qa(t,e={}){let{radius:n=.35}=e,o=t.map((u,d)=>({index:d,x:u.x,y:u.y,z:u.z,raw:u})),r=Fa(o,n),s=n*n,i=new Array(o.length).fill(!1),l=[];for(let u=0;u<o.length;u++){if(i[u])continue;let d=[],f=[u];for(i[u]=!0;f.length>0;){let c=f.shift();d.push(c);let a=Na(o,r,c,n,s);for(let h of a)i[h]||(i[h]=!0,f.push(h))}l.push(d)}return{points:o,clusters:l}}function $a(t,e,n=1e-6){let o=ja(e);for(let r of o)if(!Xa(t,r,n))return!1;return!0}function ja(t){let e=t.center,n=t.halfSize,o=t.rotation.elements,r=new Z.Vector3(o[0],o[1],o[2]).multiplyScalar(n.x),s=new Z.Vector3(o[3],o[4],o[5]).multiplyScalar(n.y),i=new Z.Vector3(o[6],o[7],o[8]).multiplyScalar(n.z),l=[];for(let u of[-1,1])for(let d of[-1,1])for(let f of[-1,1]){let c=e.clone().addScaledVector(r,u).addScaledVector(s,d).addScaledVector(i,f);l.push(c)}return l}function Xa(t,e,n=1e-6){let o=new Z.Vector3().subVectors(e,t.center),r=t.rotation.elements,s=t.halfSize,i=new Z.Vector3(r[0],r[1],r[2]),l=new Z.Vector3(r[3],r[4],r[5]),u=new Z.Vector3(r[6],r[7],r[8]),d=o.dot(i),f=o.dot(l),c=o.dot(u);return Math.abs(d)<=s.x+n&&Math.abs(f)<=s.y+n&&Math.abs(c)<=s.z+n}function Ga(t,e,n,o){return 1+(t[e][0]===0||t[n][0]===0||t[o][0]===0?1:0)}function Za(t,e,n,o,r,s){let i=Math.hypot(n-r,o-s),l=Math.hypot(t-r,e-s),u=Math.hypot(t-n,e-o),d=Math.abs((n-t)*(s-e)-(r-t)*(o-e))/2;return d===0?1/0:i*l*u/(4*d)}function Ya(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:r}=o;if(!r.length)return[];let s=new Map,i=(g,p)=>g<p?`${g}_${p}`:`${p}_${g}`;for(let g=0;g<r.length;g+=3){let p=r[g],b=r[g+1],m=r[g+2],[x,y]=n[p],[w,z]=n[b],[M,P]=n[m],E=Za(x,y,w,z,M,P),T=Ga(n,p,b,m);if(E<=1/T)for(let[V,_]of[[p,b],[b,m],[m,p]]){let v=i(V,_);s.set(v,(s.get(v)||0)+1)}}let l=[];for(let[g,p]of s)p===1&&l.push(g.split("_").map(Number));if(!l.length)return[];let u=new Map;for(let[g,p]of l)(u.get(g)||u.set(g,[]).get(g)).push(p),(u.get(p)||u.set(p,[]).get(p)).push(g);let d=l[0][0],f=[],c=new Set,a=d,h=-1;do{f.push(n[a]),c.add(a);let g=u.get(a)||[],p=g.find(b=>b!==h&&!c.has(b));if(p===void 0&&(p=g.find(b=>b!==h)),p===void 0)break;h=a,a=p}while(a!==d&&f.length<=l.length+1);return f.length>0&&f.push(f[0]),f}function $e(t,e){let n=t.x-e.x,o=t.y-e.y;return Math.sqrt(n*n+o*o)}function je(t){let e=0,n=0,o=0;for(let r=0;r<4;r++){let s=t[r],i=t[(r+1)%4],l=i.x-s.x,u=i.y-s.y,d=Math.sqrt(l*l+u*u);d>e&&(e=d,n=l/d,o=u/d)}return{longSide:e,dirX:n,dirY:o}}function Xe(t,e,n){let r=[];for(let s of t){let i=(s.start.x+s.end.x)/2,l=(s.start.y+s.end.y)/2,u=i-e,d=l-n;u*u+d*d<=9&&r.push(s.start.z,s.end.z)}if(r.length===0){let s=[];for(let i of t)s.push(i.start.z,i.end.z);return s.length?(s.sort((i,l)=>i-l),s[Math.floor(s.length/2)]):-1/0}return r.sort((s,i)=>s-i),r[Math.floor(r.length/2)]}function Ve(t,e,n,o,r,s){let i=r-n,l=s-o,u=i*i+l*l;if(u<1e-12)return{dist:Math.sqrt((t-n)**2+(e-o)**2),t:0};let d=t-n,f=e-o,c=(d*i+f*l)/u,a=n+c*i,h=o+c*l;return{dist:Math.sqrt((t-a)**2+(e-h)**2),t:c}}function Fo(t,e,n){let o=0;for(let r=0;r<4;r++){let s=n[r],i=n[(r+1)%4],l=(i.x-s.x)*(e-s.y)-(i.y-s.y)*(t-s.x);if(Math.abs(l)<1e-12)continue;let u=l>0?1:-1;if(o===0)o=u;else if(o!==u)return!1}return!0}function wr(t,e,n,o,r,s,i,l){let u=n-t,d=o-e,f=i-r,c=l-s,a=u*c-d*f;if(Math.abs(a)<1e-12)return null;let h=((r-t)*c-(s-e)*f)/a,g=((r-t)*d-(s-e)*u)/a;return h<-1e-12||h>1+1e-12||g<-1e-12||g>1+1e-12?null:Math.max(0,Math.min(1,h))}function zr(t,e,n,o,r){let s=[];Fo(t,e,r)&&s.push(0),Fo(n,o,r)&&s.push(1);for(let u=0;u<4;u++){let d=r[u],f=r[(u+1)%4],c=wr(t,e,n,o,d.x,d.y,f.x,f.y);c!==null&&s.push(c)}if(s.length<2)return 0;s.sort((u,d)=>u-d);let i=Math.sqrt((n-t)**2+(o-e)**2),l=0;for(let u=0;u<s.length-1;u++){let d=s[u],f=s[u+1],c=(d+f)/2,a=t+c*(n-t),h=e+c*(o-e);Fo(a,h,r)&&(l+=(f-d)*i)}return l}function Mr(t,e,n=1e-6){let o=[],r=t.start.x,s=t.start.y,i=t.end.x,l=t.end.y;for(let f of e){if(f===t)continue;let c=wr(r,s,i,l,f.start.x,f.start.y,f.end.x,f.end.y);c!==null&&c>n&&c<1-n&&o.push(c)}o.sort((f,c)=>f-c);let u=[],d=-1/0;for(let f of o)f-d>n&&(u.push(f),d=f);return u}function Er(t,e){if(!e.length)return[t];let n=[],o=0;for(let s of e){let i=t.start.x+s*(t.end.x-t.start.x),l=t.start.y+s*(t.end.y-t.start.y),u=t.start.z+s*(t.end.z-t.start.z),d=o===0?{...t.start}:{x:t.start.x+o*(t.end.x-t.start.x),y:t.start.y+o*(t.end.y-t.start.y),z:t.start.z+o*(t.end.z-t.start.z)},f={...t,start:d,end:{x:i,y:l,z:u},length:t.length*(s-o)};f.drawWindow=void 0,f.isWindow=!1,n.push(f),o=s}let r={...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 r.drawWindow=void 0,r.isWindow=!1,n.push(r),n}function Ua(t,e,n=.15){let o=0,r=0;for(let i of e)i!==t&&(($e(t.start,i.start)<=n||$e(t.start,i.end)<=n)&&o++,($e(t.end,i.start)<=n||$e(t.end,i.end)<=n)&&r++);let s=0;return o>=1&&r>=1?s=5:(o>=1||r>=1)&&(s=2),{left:o,right:r,score:s}}function Ka(t,e){let n=[],{start:o,end:r}=t;for(let l of e){let{dist:u}=Ve(l.x,l.y,o.x,o.y,r.x,r.y);n.push(u)}let s=n.reduce((l,u)=>l+u,0)/n.length,i=n.reduce((l,u)=>l+(u-s)**2,0)/n.length;return i<.01?3:i<.05?2:i<.1?1:0}function Qa(t,e,n=.15){let o=t.end.x-t.start.x,r=t.end.y-t.start.y,s=Math.sqrt(o*o+r*r);if(s<1e-12)return 0;let i=-r/s,l=o/s,u=[[],[]];for(let c=0;c<2;c++){let a=c===0?t.start:t.end;for(let h of e){if(h===t)continue;let g=$e(a,h.start),p=$e(a,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+r*x)/(s*y)>=.342)continue;let z=(b.x-a.x)*i+(b.y-a.y)*l;u[c].push(z>0?1:-1)}}if(u[0].length===0||u[1].length===0)return 0;let d=[...u[0],...u[1]];return d.every(c=>c===d[0])?2:1}function Pr(t,e,n){let o=Ua(t,n),r=Ka(t,e),s=Qa(t,n);return{score:o.score*3+r*2+s*2,details:{conn:o.score,variance:r,sameSide:s}}}function Ja(t){let e=t.end.x-t.start.x,n=t.end.y-t.start.y,o=Math.atan2(n,e)*(180/Math.PI);return o<0&&(o+=180),o}function tl(t,e){let n=[];for(let o of t){let r=!1;for(let s of n){let i=Math.abs(o.angle-s[0].angle);if(Math.min(i,180-i)<=e){s.push(o),r=!0;break}}r||n.push([o])}return n}function el(t,e=.05){let n=[];for(let o of t){let r=!1;for(let s of n)if(Math.abs(o.offset-s[0].offset)<=e){s.push(o),r=!0;break}r||n.push([o])}return n}function nl(t,e,n,o,r){let s=[];for(let d of t){let f=d.seg,c=(f.start.x-e.start.x)*n+(f.start.y-e.start.y)*o,a=(f.end.x-e.start.x)*n+(f.end.y-e.start.y)*o;c<=a?s.push({l:c,r:a,idx:d.idx,startPt:f.start,endPt:f.end}):s.push({l:a,r:c,idx:d.idx,startPt:f.end,endPt:f.start})}s.sort((d,f)=>d.l-f.l);let i=[],l=.2,u=.5;for(let{l:d,r:f,idx:c,startPt:a,endPt:h}of s){if(i.length===0){i.push({l:d,r:f,srcIdxs:[c],startPt:a,endPt:h});continue}let g=i[i.length-1];if(d<=g.r+r){let p=Math.min(g.r,f)-Math.max(g.l,d),b=Math.hypot(g.endPt.x-a.x,g.endPt.y-a.y);p>=u||b<=l?(d<g.l&&(g.l=d,g.startPt=a),f>g.r&&(g.r=f,g.endPt=h),g.srcIdxs.includes(c)||g.srcIdxs.push(c)):i.push({l:d,r:f,srcIdxs:[c],startPt:a,endPt:h})}else i.push({l:d,r:f,srcIdxs:[c],startPt:a,endPt:h})}return i}function ol(t,e,n,o,r,s,i){let l=Math.hypot(n.x-e.x,n.y-e.y),u={...t};return u.start={...e},u.end={...n},u.length=l,u.direction={x:o,y:r,z:0},s!==void 0&&(u.rooftopPz=s),u.buildRosource=i,u.isRebuild=!1,u.doorAndBeamData||(u.doorAndBeamData=[]),u.insetionArr||(u.insetionArr=[]),u}function sl(t,e){let n=!0;for(;n;){n=!1;for(let o=0;o<t.length;o++)for(let r=o+1;r<t.length;r++){let s=t[o],i=t[r];if(s.rooftopPz!==void 0&&i.rooftopPz!==void 0&&Math.abs(s.rooftopPz-i.rooftopPz)>.05)continue;let l=Math.abs(s.end.x-i.start.x)<.001&&Math.abs(s.end.y-i.start.y)<.001,u=Math.abs(s.start.x-i.end.x)<.001&&Math.abs(s.start.y-i.end.y)<.001,d=Math.abs(s.end.x-i.end.x)<.001&&Math.abs(s.end.y-i.end.y)<.001,f=Math.abs(s.start.x-i.start.x)<.001&&Math.abs(s.start.y-i.start.y)<.001;if(!(l||u||d||f)||s.direction.x*i.direction.x+s.direction.y*i.direction.y<.98)continue;let a=s.start,h=s.end;l?h=i.end:u?a=i.start:d?h=i.start:f&&(a=i.end);let g=Math.hypot(h.x-a.x,h.y-a.y),p={...s};p.start=a,p.end=h,p.length=g,p.direction={x:(h.x-a.x)/g,y:(h.y-a.y)/g,z:0},s.rooftopPz!==void 0&&i.rooftopPz!==void 0?p.rooftopPz=Math.max(s.rooftopPz,i.rooftopPz):p.rooftopPz=s.rooftopPz!==void 0?s.rooftopPz:i.rooftopPz,p.buildRosource=s.buildRosource||i.buildRosource,p.isRebuild=!1,p.doorAndBeamData||(p.doorAndBeamData=[]),p.insetionArr||(p.insetionArr=[]),t[o]=p,e[o]=[...new Set([...e[o],...e[r]])],t.splice(r,1),e.splice(r,1),r--,n=!0}}return{segments:t,sourceMap:e}}function Ge(t,e=5,n=.05){if(t.length<=1)return{segments:t,sourceMap:t.map((u,d)=>[d])};let o=t.map((u,d)=>({seg:u,angle:Ja(u),idx:d}));o.sort((u,d)=>u.angle-d.angle);let r=tl(o,e),s=[],i=[],l=[];for(let u of r){let d=u[0].seg;for(let m of u)m.seg.length>d.length&&(d=m.seg);let f=d.end.x-d.start.x,c=d.end.y-d.start.y,a=Math.sqrt(f*f+c*c);if(a<1e-12)continue;let h=-c/a,g=f/a,p=u.map(m=>{let x=m.seg.start.x-d.start.x,y=m.seg.start.y-d.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=el(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}));l.push({values:[...V],segments:S})}let _=[...new Set(m.map(S=>String(S.seg.buildRosource)))],v=nl(m,x,M,P,n);for(let{l:S,r:R,srcIdxs:D,startPt:W,endPt:I}of v){if(R-S<.01)continue;let C=ol(x,W,I,M,P,T,x.buildRosource);s.push(C),i.push(D)}}}return{...sl(s,i),debugRPZGroups:l}}function rl(t){return{minLengthRatio:.95,maxDistance:.5,angleThreshold:45,projectionMargin:.1,printOnly:!0,minEmbedRatioThreshold:.3,noWallSurroundDistance:.3,minEmbedRatio:.05,...t}}function il(t,e,n){return[{x:e,y:n,z:0},{x:t[0].x,y:t[0].y,z:0},{x:t[1].x,y:t[1].y,z:0},{x:t[2].x,y:t[2].y,z:0},{x:t[3].x,y:t[3].y,z:0}]}function al(t,e,n,o,r,s,i,l,u){if(!["1527725434500","1527725386500","1527726772000","1527725058500"].some(c=>t.includes(c)))return;e.map(c=>{let{start:a,end:h}=c,g=Ve(n,o,a.x,a.y,h.x,h.y),p=r.map(z=>{let M=Ve(z.x,z.y,a.x,a.y,h.x,h.y);return`t=${M.t.toFixed(3)},d=${M.dist.toFixed(3)}`}),b=h.x-a.x,m=h.y-a.y,x=Math.sqrt(b*b+m*m)||1,y=Math.abs(i*(b/x)+l*(m/x)),w=Math.acos(Math.min(y,1))*(180/Math.PI);return{seg:c,lineDist:g.dist,t:g.t,pts:p,angle:w,length:c.length}}).sort((c,a)=>c.lineDist-a.lineDist)}function ll(t,e,n,o,r,s,i){let l=[{margin:s.projectionMargin,maxDist:s.maxDistance,label:"\u4E25\u683C"},{margin:.4,maxDist:.65,label:"\u5BBD\u677E"}],u=[];for(let d of l){if(u.length>0)break;for(let f of t){let c=!1,a=!1,h=!1,g=e*s.minLengthRatio;if(f.length<g){continue}c=!0;let{start:p,end:b}=f,m=!1,x=1/0;for(let v of r){let{dist:S,t:R}=Ve(v.x,v.y,p.x,p.y,b.x,b.y);R>=-d.margin&&R<=1+d.margin&&S<=d.maxDist&&(m=!0,x=Math.min(x,S))}if(!m){`${d.maxDist}${(-d.margin).toFixed(1)}${(1+d.margin).toFixed(1)}`;continue}a=!0;let y=Ve(r[0].x,r[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>s.angleThreshold){`${E.toFixed(1)}${s.angleThreshold}`;continue}h=!0;let T=[r[1],r[2],r[3],r[4]],V=zr(p.x,p.y,b.x,b.y,T),_=e>0?V/e:0;u.push({seg:f,minDist:x,embedRatio:_,ratio:f.length/e,score:0,details:{conn:0,variance:0,sameSide:0}})}}return u}function cl(t,e,n,o){if(t.length<=1)return t.length===1&&(t[0].score=-1),t;for(let r of t){let{score:s,details:i}=Pr(r.seg,e,n);r.score=s,r.details=i}return t.sort((r,s)=>s.embedRatio-r.embedRatio||s.score-r.score||r.minDist-s.minDist),t}function ul(t,e,n,o){let r=t.end.x-t.start.x,s=t.end.y-t.start.y,i=Math.sqrt(r*r+s*s),l=r/i,u=s/i,d=e.map(P=>{let E=P.x-t.start.x,T=P.y-t.start.y;return(E*l+T*u)/i}),f=Math.min(...d),c=Math.max(...d),a=(c-f)*i,h=(f+c)/2,g=t.start.x+h*r,p=t.start.y+h*s,b=n.box.min.z,m=n.box.max.z,x=Math.abs(m-b),y=Xe(o,t.start.x,t.start.y),w=Math.max(0,b-y),z=f<=0&&c>=1,M=t.start.z+h*(t.end.z-t.start.z);return{p:{x:g,y:p,z:M},width:a,full:z,height:x,groundClearance:w}}function No(t,e,n){let o=e.map(f=>n[f]),r=[],s=[],i=[],l=[],u,d;for(let f of o){if(f.originalPoints?.length)for(let c of f.originalPoints)r.push(c);if(f.doorAndBeamData?.length)for(let c of f.doorAndBeamData)s.push(c);if(f.insetionArr?.length)for(let c of f.insetionArr)i.push(c);if(f.drawWindow?.length)for(let c of f.drawWindow)l.push(c);f.boxData&&!u&&(u=f.boxData),f.rooftopPz!==void 0&&(d===void 0||f.rooftopPz>d)&&(d=f.rooftopPz)}r.length&&(t.originalPoints=r),s.length&&(t.doorAndBeamData=s),i.length&&(t.insetionArr=i),l.length&&(t.drawWindow=l),u&&(t.boxData=u),d!==void 0&&(t.rooftopPz=d)}function Pn(t,e,n=10,o=.2,r=.2){let s=[];if(!t.drawWindow)return s;let i=t.drawWindow.p,l=t.wallSegment,u=l.end.x-l.start.x,d=l.end.y-l.start.y,f=Math.sqrt(u*u+d*d)||1,c=u/f,a=d/f,h=i.x-l.start.x,g=i.y-l.start.y,p=(h*c+g*a)/f;for(let b of e){if(b===l)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(c*w+a*z),E=Math.acos(Math.min(M,1))*(180/Math.PI);if(Math.abs(E-90)>n)continue;let T=[b.start,b.end];for(let V of T){let _=V.x-l.start.x,v=V.y-l.start.y,S=(_*c+v*a)/f,R=l.start.x+S*f*c,D=l.start.y+S*f*a;if(Math.sqrt((V.x-R)**2+(V.y-D)**2)>r)continue;let I=Math.abs((S-p)*f);if(I<=o){s.push({seg:b,distAlongWall:I,angle:E,endPoint:V});break}}}return s}function Sn(t,e){let n=t.start,o=t.end,r=o.x-n.x,s=o.y-n.y,i=Math.sqrt(r*r+s*s)||1,l=((e.x-n.x)*r+(e.y-n.y)*s)/(i*i),u=Math.max(0,Math.min(1,l)),d={x:n.x+u*r,y:n.y+u*s,z:n.z+(o.z-n.z)*u||0};function f(y){if(!y||!y.length)return[[],[]];let w=[],z=[];for(let M of y){let P=((M.x-n.x)*r+(M.y-n.y)*s)/(i*i);P<=u+1e-8&&w.push(M),P>=u-1e-8&&z.push(M)}return(w.length===0||c(w[w.length-1],d)>1e-6)&&w.push({...d}),(z.length===0||c(z[0],d)>1e-6)&&z.unshift({...d}),[w,z]}function c(y,w){return Math.sqrt((y.x-w.x)**2+(y.y-w.y)**2)}let[a,h]=f(t.originalPoints),g=Math.max(u*i,1e-6),p=Math.max((1-u)*i,1e-6),b=t.direction||{x:r/i,y:s/i,z:(o.z-n.z)/i||0},m={...t,start:{...n},end:{...d},length:g,direction:{...b},originalPoints:a.length?a:void 0},x={...t,start:{...d},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)*r+(z.p.y-n.y)*s)/(i*i);M<=u+1e-8&&y.push(z),M>=u-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 _ of w)_.x<z&&(z=_.x),_.y<M&&(M=_.y),_.z!==void 0&&_.z<P&&(P=_.z),_.x>E&&(E=_.x),_.y>T&&(T=_.y),_.z!==void 0&&_.z>V&&(V=_.z);return{isBox3:!0,min:{x:z,y:M,z:P},max:{x:E,y:T,z:V}}};m.boxData=y(a),x.boxData=y(h)}return[m,x]}function Tn(t,e,n,o){let r=rl(n),s=[],{segments:i,sourceMap:l}=o??Ge(e),u=i;for(let d of t){let f=d.coordinatesByArea?.coordinates;if(!f||f.length<4)continue;let c=f.slice(0,4),a=c.reduce((V,_)=>V+_.x,0)/4,h=c.reduce((V,_)=>V+_.y,0)/4,{longSide:g,dirX:p,dirY:b}=je(c);if(g<.01)continue;let m=c.reduce((V,_)=>V+_.z,0)/4,x=Xe(e,a,h);if(m<x-.3)continue;let y=il(c,a,h);al(d.name,u,a,h,y,g,p,b,r);let w=ll(u,g,p,b,y,r,d.name);if(w.length>1&&r.minEmbedRatioThreshold>0){let V=Math.max(...w.map(_=>_.embedRatio));if(V>0){let _=w.length;w=w.filter(v=>v.embedRatio>=V*r.minEmbedRatioThreshold)}}if(w.length>0&&r.minEmbedRatio>0){let V=w.length;w=w.filter(_=>_.embedRatio>=r.minEmbedRatio)}w=cl(w,y,e,d.name);let z=null,M=1/0,P=0,E=0;if(w.length>0){let V=w[0];z=V.seg,M=V.minDist,P=V.ratio,E=V.embedRatio}if(z&&E<=0&&r.noWallSurroundDistance>0){let V=r.noWallSurroundDistance,_=c.map(C=>C.x),v=c.map(C=>C.y),S=Math.min(..._)-V,R=Math.max(..._)+V,D=Math.min(...v)-V,W=Math.max(...v)+V,I=!1;for(let C of u){let H=Math.min(C.start.x,C.end.x),A=Math.max(C.start.x,C.end.x),k=Math.min(C.start.y,C.end.y),O=Math.max(C.start.y,C.end.y);if(!(A<S||H>R)&&!(O<D||k>W)){I=!0;break}}I||(z=null)}let T;if(z&&(T=ul(z,c,d,i),!r.printOnly)){let V=z;V.drawWindow||(V.drawWindow=[]),V.drawWindow.push(T),V.isWindow=!0}if(z){let V={windowName:d.name,windowCategory:d.category,windowCenter:d.center,wallSegment:z,distance:M,wallLengthRatio:P,drawWindow:T};s.push(V)}}for(let d of s){let f=d.wallSegment,c=i.indexOf(f);if(c===-1)continue;let a=l[c];!a||a.length<=1||No(f,a,e)}return s}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 r=Array.isArray(e)?e.filter(b=>b&&b.category==="window"&&!b.isBayWindowObj):[],s,i;if(o.skipMerge)s=t,i=t.map((b,m)=>[m]);else{let b=Ge(t);s=b.segments,i=b.sourceMap}let l=Tn(r,t,o,{segments:s,sourceMap:i}),u=new Set;for(let b of l){let m=s.indexOf(b.wallSegment);m>=0&&u.add(m)}let d=[],f=new Set;for(let b of u){let m=i[b];if(m){No(s[b],m,t);for(let x of m)f.add(x)}d.push(s[b])}for(let b=0;b<t.length;b++)f.has(b)||d.push(t[b]);let c=new Set(l.map(b=>b.windowName));for(let b of e)b&&b.category==="window"&&!b.isBayWindowObj&&(c.has(b.name)?delete b.AbnormalWindow:b.AbnormalWindow=!0);let a=new Map;for(let b of e)b&&b.name&&a.set(b.name,b);let h=new Map;for(let b of l){let m=b.wallSegment;h.has(m)||h.set(m,[]),h.get(m).push(b)}let g=new Map,p=d;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),W=R/x;z.push({left:D-W,right:D+W,match:S})}if(z.length===0)continue;let M=Mr(b,p),P=1e-6,E=new Set,T=!1;for(let S of z){let R=!1,D=!1,W=null;for(let C of M)C<S.left-P&&((W===null||C>W)&&(W=C),R=!0);let I=null;for(let C of M)C>S.right+P&&((I===null||C<I)&&(I=C),D=!0);W!==null&&(E.add(W),T=!0),I!==null&&(E.add(I),T=!0)}if(!T)continue;let V=!1,_=null,v=null;for(let S of z){let R=S.match;if(!R.drawWindow||R.drawWindow.width<=1)continue;let D=a.get(R.windowName);if(!D||!D.positionArr||!D.positionArr.length)continue;let W=Pn(R,s);if(W.length<=1)continue;let I=D.positionArr[0],C=R.drawWindow.p,H=I.x-C.x,A=I.y-C.y,k=Math.sqrt(H*H+A*A);if(k<.001)continue;let O=H/k,N=A/k,L=W.filter(B=>{let $=(B.seg.start.x+B.seg.end.x)/2,G=(B.seg.start.y+B.seg.end.y)/2,Q=$-C.x,q=G-C.y;return Q*O+q*N>0});if(L.length){V=!0,_=L[0].endPoint,v=R;break}}if(V&&_&&v){let[S,R]=Sn(b,_);g.set(b,[S,R]);let D=((v.drawWindow.p.x-b.start.x)*y+(v.drawWindow.p.y-b.start.y)*w)/(x*x),W=((_.x-b.start.x)*y+(_.y-b.start.y)*w)/(x*x);D<=W?v.wallSegment=S:v.wallSegment=R}else{let S=Array.from(E).sort((D,W)=>D-W),R=Er(b,S);for(let D of z){let W=(D.left+D.right)/2,I=0;for(let C of R){let H=C.length/x;if(W>=I-P&&W<=I+H+P){let A=D.match.drawWindow;A&&(C.drawWindow||(C.drawWindow=[]),C.drawWindow.push(A),C.isWindow=!0),D.match.wallSegment=C;break}I+=H}}g.set(b,R)}}if(g.size>0){let b=[];for(let m of d)g.has(m)?b.push(...g.get(m)):b.push(m);for(let m of b)m.isWindow===void 0&&(m.isWindow=!!(m.drawWindow&&m.drawWindow.length>0));return{segments:b,matches:l}}for(let b of d)b.isWindow=!!(b.drawWindow&&b.drawWindow.length>0);return{segments:d,matches:l}}function Ze(t,e){let n=t.x-e.x,o=t.y-e.y;return Math.sqrt(n*n+o*o)}function no(t){let e=0,n=1/0,o=0,r=0;for(let s=0;s<4;s++){let i=t[s],l=t[(s+1)%4],u=l.x-i.x,d=l.y-i.y,f=Math.sqrt(u*u+d*d);f>e&&(e=f,o=u/f,r=d/f),f<n&&(n=f)}return{longSide:e,shortSide:n===1/0?e:n,dirX:o,dirY:r}}function Ye(t,e,n){let r=[];for(let s of t){let i=(s.start.x+s.end.x)/2,l=(s.start.y+s.end.y)/2,u=i-e,d=l-n;u*u+d*d<=9&&r.push(s.start.z,s.end.z)}if(r.length===0){let s=[];for(let i of t)s.push(i.start.z,i.end.z);return s.length?(s.sort((i,l)=>i-l),s[Math.floor(s.length/2)]):-1/0}return r.sort((s,i)=>s-i),r[Math.floor(r.length/2)]}function $t(t,e,n,o,r,s){let i=r-n,l=s-o,u=i*i+l*l;if(u<1e-12)return{dist:Math.sqrt((t-n)**2+(e-o)**2),t:0};let d=t-n,f=e-o,c=(d*i+f*l)/u,a=n+c*i,h=o+c*l;return{dist:Math.sqrt((t-a)**2+(e-h)**2),t:c}}function $o(t,e,n){let o=0;for(let r=0;r<4;r++){let s=n[r],i=n[(r+1)%4],l=(i.x-s.x)*(e-s.y)-(i.y-s.y)*(t-s.x);if(Math.abs(l)<1e-12)continue;let u=l>0?1:-1;if(o===0)o=u;else if(o!==u)return!1}return!0}function fl(t,e,n,o,r,s,i,l){let u=n-t,d=o-e,f=i-r,c=l-s,a=u*c-d*f;if(Math.abs(a)<1e-12)return null;let h=((r-t)*c-(s-e)*f)/a,g=((r-t)*d-(s-e)*u)/a;return h<-1e-12||h>1+1e-12||g<-1e-12||g>1+1e-12?null:Math.max(0,Math.min(1,h))}function Tr(t,e,n,o,r){let s=[];$o(t,e,r)&&s.push(0),$o(n,o,r)&&s.push(1);for(let u=0;u<4;u++){let d=r[u],f=r[(u+1)%4],c=fl(t,e,n,o,d.x,d.y,f.x,f.y);c!==null&&s.push(c)}if(s.length<2)return 0;s.sort((u,d)=>u-d);let i=Math.sqrt((n-t)**2+(o-e)**2),l=0;for(let u=0;u<s.length-1;u++){let d=s[u],f=s[u+1],c=(d+f)/2,a=t+c*(n-t),h=e+c*(o-e);$o(a,h,r)&&(l+=(f-d)*i)}return l}function Rr(t){if(!t||t.length<4)return[];let e=[...t].sort((i,l)=>i.z-l.z),n=e.slice(0,2),o=e.slice(2,4),r=[],s=new Set;for(let i of n){let l=-1,u=1/0;for(let d=0;d<o.length;d++){if(s.has(d))continue;let f=o[d].x-i.x,c=o[d].y-i.y,a=Math.sqrt(f*f+c*c);a<u&&(u=a,l=d)}if(l>=0){s.add(l);let d=o[l];r.push({bottom:i,top:d,midX:(i.x+d.x)/2,midY:(i.y+d.y)/2,height:Math.abs(d.z-i.z)})}}return r}function Sr(t,e,n){return $t(t.midX,t.midY,e.x,e.y,n.x,n.y)}function Dr(t,e,n,o=.08){if(!t||t.length<2)return null;let r=Sr(t[0],e,n),s=Sr(t[1],e,n);if(r.dist<=o&&s.dist<=o){let i=r.dist<=s.dist?0:1,l=1-i;return{hingeEdge:t[i],otherEdge:t[l],hingeDist:i===0?r.dist:s.dist,otherDist:l===0?r.dist:s.dist,isClosed:!0,hingeT:i===0?r.t:s.t}}if(r.dist<=o||s.dist<=o){let i=r.dist<=o?0:1,l=1-i;return{hingeEdge:t[i],otherEdge:t[l],hingeDist:i===0?r.dist:s.dist,otherDist:l===0?r.dist:s.dist,isClosed:!1,hingeT:i===0?r.t:s.t}}return null}function vr(t){if(!t||t.length<2)return 0;let e=t[0].midX-t[1].midX,n=t[0].midY-t[1].midY;return Math.sqrt(e*e+n*n)}function jo(t){if(!t||!t.start||!t.end)return null;let e=t.start,n=t.end,o=n.x-e.x,r=n.y-e.y,s=Math.sqrt(o*o+r*r)||1,i=0,l=0;return t.centerDir?(i=t.centerDir.x,l=t.centerDir.y):(i=-r/s,l=o/s),{p1:e,p2:n,dirX:o/s,dirY:r/s,length:s,midX:(e.x+n.x)/2,midY:(e.y+n.y)/2,normalX:i,normalY:l}}function Vr(t,e,n,o=.08){let r=jo(t);if(!r)return null;let s=$t(r.p1.x,r.p1.y,e.x,e.y,n.x,n.y),i=$t(r.p2.x,r.p2.y,e.x,e.y,n.x,n.y);if(s.dist<=o&&i.dist<=o){let l=s.dist<=i.dist;return{hingePoint:l?r.p1:r.p2,otherPoint:l?r.p2:r.p1,hingeDist:l?s.dist:i.dist,otherDist:l?i.dist:s.dist,isClosed:!0,hingeT:l?s.t:i.t}}if(s.dist<=o||i.dist<=o){let l=s.dist<=o;return{hingePoint:l?r.p1:r.p2,otherPoint:l?r.p2:r.p1,hingeDist:l?s.dist:i.dist,otherDist:l?i.dist:s.dist,isClosed:!1,hingeT:l?s.t:i.t}}return null}function oo(t,e=.1){let n=t.originalPoints;if(!n||n.length===0)return{densityProfile:[],binStartT:[],binEndT:[],avgDensity:0,maxDensity:0,minDensity:0,binSize:e};let o=t.end.x-t.start.x,r=t.end.y-t.start.y,s=t.length;if(s<=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*r)/(s*s);i.push(Math.max(0,Math.min(1,y)))}let l=Math.max(1,Math.ceil(s/e)),u=s/l,d=new Array(l).fill(0);for(let b of i){let m=Math.min(l-1,Math.floor(b*l));d[m]++}let f=d.map(b=>b/u),c=d.map((b,m)=>m/l),a=d.map((b,m)=>(m+1)/l),h=f.reduce((b,m)=>b+m,0)/l,g=Math.max(...f),p=Math.min(...f);return{densityProfile:f,binStartT:c,binEndT:a,avgDensity:h,maxDensity:g,minDensity:p,binSize:u}}function Ir(t){let{densityProfile:e,avgDensity:n}=t;if(e.length===0||n===0)return 0;let o=e.length,r=e.reduce((i,l)=>i+(l-n)**2,0)/o;return Math.sqrt(r)/n}function Cr(t){let e=[];for(let o of t)if(o.originalPoints&&o.originalPoints.length>=50&&o.length>=.5){let r=oo(o,.1);r.avgDensity>0&&e.push(r.avgDensity)}e.sort((o,r)=>o-r);let n=e.length>0?e[Math.floor(e.length/2)]:1;return{sortedDensities:e,medianDensity:n}}function Xo(t,e){let{sortedDensities:n}=e;if(n.length===0)return .5;if(t<=0)return 1;let o=0;for(let r of n)r<t&&o++;return 1-o/n.length}function Wr(t,e,n=.5,o=.5,r=3){let{densityProfile:s,avgDensity:i}=t;if(s.length===0||i===0)return[];let l=i*n,u=s.length,d=[],f=!1,c=0,a=0,h=0;for(let g=0;g<u;g++){let p=s[g]<l;if(p&&!f)f=!0,c=g,a=s[g],h=1;else if(p&&f)a+=s[g],h++;else if(!p&&f){f=!1;let b=g-1,m=c/u,x=(b+1)/u,y=(x-m)*e;y>=o&&y<=r&&d.push({startT:m,endT:x,startLen:m*e,endLen:x*e,avgDensity:a/h}),a=0,h=0}}if(f){let g=u-1,p=c/u,b=(g+1)/u,m=(b-p)*e;m>=o&&m<=r&&d.push({startT:p,endT:b,startLen:p*e,endLen:b*e,avgDensity:a/h})}return d}function dl(t,e,n){let o=t.originalPoints;if(!o||o.length<5)return{verticalGapRatio:1,isDoorSized:!0};let r=t.end.x-t.start.x,s=t.end.y-t.start.y,i=t.length*t.length;if(i<=0)return{verticalGapRatio:0,isDoorSized:!1};let l=[];for(let m of o){let x=m.x-t.start.x,y=m.y-t.start.y,w=(x*r+y*s)/i;w>=e&&w<=n&&m.z!==void 0&&isFinite(m.z)&&l.push(m.z)}if(l.length<5)return{verticalGapRatio:1,isDoorSized:!0};let u=1/0,d=-1/0;for(let m of o)m.z!==void 0&&isFinite(m.z)&&(m.z<u&&(u=m.z),m.z>d&&(d=m.z));let f=d-u;if(f<.5)return{verticalGapRatio:0,isDoorSized:!1};let c=15,a=new Array(c).fill(!1);for(let m of l){let x=Math.min(c-1,Math.max(0,Math.floor((m-u)/f*c)));a[x]=!0}let h=0,g=0;for(let m=0;m<c;m++)a[m]?(h=Math.max(h,g),g=0):g++;h=Math.max(h,g);let p=h/c,b=p>=.35;return{verticalGapRatio:p,isDoorSized:b}}function _r(t,e,n,o=.5,r=.5,s=3,i=.35){let l=Wr(e,n,o,r,s),u=[];for(let d of l){let{verticalGapRatio:f,isDoorSized:c}=dl(t,d.startT,d.endT);u.push({...d,verticalGapRatio:f,isRectangular:c})}return u}function Hr(t,e,n){if(!t||!t.start||!t.end)return null;let o=t.start,r=t.end,s=$t(o.x,o.y,e.x,e.y,n.x,n.y),i=$t(r.x,r.y,e.x,e.y,n.x,n.y),l=s.dist<=i.dist,u=l?o:r,d=l?s.dist:i.dist,f=$t(u.x,u.y,e.x,e.y,n.x,n.y);return{hingeT:Math.max(0,Math.min(1,f.t)),hingeDist:d}}function Ar(t,e,n,o=2e3){let{hingeT:r}=t,s=.25,i=0,l=null,u=0;for(let d of e){let f=(d.startT+d.endT)/2,c=Math.abs(f-r),a=Math.max(0,1-c/s),h=d.isRectangular?1:.3,g=Math.max(0,1-d.avgDensity/o),p=a*.5+h*.3+g*.2;p>i&&(i=p,l=d,u=a)}return{score:i>.5?i:-1,bestRegion:l,bestOverlap:u,bestOpeningStartT:l?.startT??0,bestOpeningEndT:l?.endT??0}}function hl(t,e,n=.15){let o=0,r=0;for(let i of e)i!==t&&((Ze(t.start,i.start)<=n||Ze(t.start,i.end)<=n)&&o++,(Ze(t.end,i.start)<=n||Ze(t.end,i.end)<=n)&&r++);let s=0;return o>=1&&r>=1?s=5:(o>=1||r>=1)&&(s=2),{left:o,right:r,score:s}}function ml(t,e){let n=[],{start:o,end:r}=t;for(let l of e){let{dist:u}=$t(l.x,l.y,o.x,o.y,r.x,r.y);n.push(u)}let s=n.reduce((l,u)=>l+u,0)/n.length,i=n.reduce((l,u)=>l+(u-s)**2,0)/n.length;return i<.01?3:i<.05?2:i<.1?1:0}function gl(t,e,n=.15){let o=t.end.x-t.start.x,r=t.end.y-t.start.y,s=Math.sqrt(o*o+r*r);if(s<1e-12)return 0;let i=-r/s,l=o/s,u=[[],[]];for(let c=0;c<2;c++){let a=c===0?t.start:t.end;for(let h of e){if(h===t)continue;let g=Ze(a,h.start),p=Ze(a,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+r*x)/(s*y)>=.342)continue;let z=(b.x-a.x)*i+(b.y-a.y)*l;u[c].push(z>0?1:-1)}}if(u[0].length===0||u[1].length===0)return 0;let d=[...u[0],...u[1]];return d.every(c=>c===d[0])?2:1}function Lr(t,e,n){let o=hl(t,n),r=ml(t,e),s=gl(t,n);return{score:o.score*3+r*2+s*2,details:{conn:o.score,variance:r,sameSide:s}}}function pl(t){let e=t.end.x-t.start.x,n=t.end.y-t.start.y,o=Math.atan2(n,e)*(180/Math.PI);return o<0&&(o+=180),o}function xl(t,e){let n=[];for(let o of t){let r=!1;for(let s of n){let i=Math.abs(o.angle-s[0].angle);if(Math.min(i,180-i)<=e){s.push(o),r=!0;break}}r||n.push([o])}return n}function yl(t,e=.05){let n=[];for(let o of t){let r=!1;for(let s of n)if(Math.abs(o.offset-s[0].offset)<=e){s.push(o),r=!0;break}r||n.push([o])}return n}function bl(t,e,n,o,r){let s=[];for(let d of t){let f=d.seg,c=(f.start.x-e.start.x)*n+(f.start.y-e.start.y)*o,a=(f.end.x-e.start.x)*n+(f.end.y-e.start.y)*o;c<=a?s.push({l:c,r:a,idx:d.idx,startPt:f.start,endPt:f.end}):s.push({l:a,r:c,idx:d.idx,startPt:f.end,endPt:f.start})}s.sort((d,f)=>d.l-f.l);let i=[],l=.01,u=.5;for(let{l:d,r:f,idx:c,startPt:a,endPt:h}of s){if(i.length===0){i.push({l:d,r:f,srcIdxs:[c],startPt:a,endPt:h});continue}let g=i[i.length-1];if(d<=g.r+r){let p=Math.min(g.r,f)-Math.max(g.l,d),b=Math.hypot(g.endPt.x-a.x,g.endPt.y-a.y);p>=u||b<=l?(d<g.l&&(g.l=d,g.startPt=a),f>g.r&&(g.r=f,g.endPt=h),g.srcIdxs.includes(c)||g.srcIdxs.push(c)):i.push({l:d,r:f,srcIdxs:[c],startPt:a,endPt:h})}else i.push({l:d,r:f,srcIdxs:[c],startPt:a,endPt:h})}return i}function wl(t,e,n,o,r,s,i){let l=Math.hypot(n.x-e.x,n.y-e.y),u={...t};return u.start={...e},u.end={...n},u.length=l,u.direction={x:o,y:r,z:0},s!==void 0&&(u.rooftopPz=s),u.buildRosource=i,u.isRebuild=!1,u.doorAndBeamData||(u.doorAndBeamData=[]),u.insetionArr||(u.insetionArr=[]),u}function zl(t,e){let n=!0;for(;n;){n=!1;for(let o=0;o<t.length;o++)for(let r=o+1;r<t.length;r++){let s=t[o],i=t[r];if(s.rooftopPz!==void 0&&i.rooftopPz!==void 0&&Math.abs(s.rooftopPz-i.rooftopPz)>.05)continue;let l=Math.abs(s.end.x-i.start.x)<.001&&Math.abs(s.end.y-i.start.y)<.001,u=Math.abs(s.start.x-i.end.x)<.001&&Math.abs(s.start.y-i.end.y)<.001,d=Math.abs(s.end.x-i.end.x)<.001&&Math.abs(s.end.y-i.end.y)<.001,f=Math.abs(s.start.x-i.start.x)<.001&&Math.abs(s.start.y-i.start.y)<.001;if(!(l||u||d||f)||s.direction.x*i.direction.x+s.direction.y*i.direction.y<.98)continue;let a=s.start,h=s.end;l?h=i.end:u?a=i.start:d?h=i.start:f&&(a=i.end);let g=Math.hypot(h.x-a.x,h.y-a.y),p={...s};p.start=a,p.end=h,p.length=g,p.direction={x:(h.x-a.x)/g,y:(h.y-a.y)/g,z:0},s.rooftopPz!==void 0&&i.rooftopPz!==void 0?p.rooftopPz=Math.max(s.rooftopPz,i.rooftopPz):p.rooftopPz=s.rooftopPz!==void 0?s.rooftopPz:i.rooftopPz,p.buildRosource=s.buildRosource||i.buildRosource,p.isRebuild=!1,p.doorAndBeamData||(p.doorAndBeamData=[]),p.insetionArr||(p.insetionArr=[]),t[o]=p,e[o]=[...new Set([...e[o],...e[r]])],t.splice(r,1),e.splice(r,1),r--,n=!0}}return{segments:t,sourceMap:e}}function Ue(t,e=5,n=.05){if(t.length<=1)return{segments:t,sourceMap:t.map((u,d)=>[d])};let o=t.map((u,d)=>({seg:u,angle:pl(u),idx:d}));o.sort((u,d)=>u.angle-d.angle);let r=xl(o,e),s=[],i=[],l=[];for(let u of r){let d=u[0].seg;for(let m of u)m.seg.length>d.length&&(d=m.seg);let f=d.end.x-d.start.x,c=d.end.y-d.start.y,a=Math.sqrt(f*f+c*c);if(a<1e-12)continue;let h=-c/a,g=f/a,p=u.map(m=>{let x=m.seg.start.x-d.start.x,y=m.seg.start.y-d.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=yl(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}));l.push({values:[...V],segments:S})}let _=[...new Set(m.map(S=>String(S.seg.buildRosource)))],v=bl(m,x,M,P,n);for(let{l:S,r:R,srcIdxs:D,startPt:W,endPt:I}of v){if(R-S<.01)continue;let C=wl(x,W,I,M,P,T,x.buildRosource);s.push(C),i.push(D)}}}return{...zl(s,i),debugRPZGroups:l}}function Ml(t){return{minLengthRatio:0,maxDistance:.5,angleThreshold:45,projectionMargin:.1,printOnly:!0,minEmbedRatioThreshold:.3,noWallSurroundDistance:.3,minEmbedRatio:.05,...t}}function El(t,e,n){return[{x:e,y:n,z:0},{x:t[0].x,y:t[0].y,z:0},{x:t[1].x,y:t[1].y,z:0},{x:t[2].x,y:t[2].y,z:0},{x:t[3].x,y:t[3].y,z:0}]}function Pl(t,e,n,o,r,s,i,l,u){if(!__DEBUG__||!["_008","_002","_014","_015","_020"].some(c=>t.includes(c)))return;e.map(c=>{let{start:a,end:h}=c,g=$t(n,o,a.x,a.y,h.x,h.y),p=r.map(z=>{let M=$t(z.x,z.y,a.x,a.y,h.x,h.y);return`t=${M.t.toFixed(3)},d=${M.dist.toFixed(3)}`}),b=h.x-a.x,m=h.y-a.y,x=Math.sqrt(b*b+m*m)||1,y=Math.abs(i*(b/x)+l*(m/x)),w=Math.acos(Math.min(y,1))*(180/Math.PI);return{seg:c,lineDist:g.dist,t:g.t,pts:p,angle:w,length:c.length}}).sort((c,a)=>c.lineDist-a.lineDist)}function Sl(t,e,n,o,r,s,i,l,u){let d=[{margin:s.projectionMargin,maxDist:s.maxDistance,label:"\u4E25\u683C"},{margin:.4,maxDist:.65,label:"\u5BBD\u677E"}],f=[],c=vr(l)||e;for(let a of d){if(f.length>0)break;for(let h of t){let{start:g,end:p}=h,b=!1,m=1/0;for(let E of r){let{dist:T,t:V}=$t(E.x,E.y,g.x,g.y,p.x,p.y);V>=-a.margin&&V<=1+a.margin&&T<=a.maxDist&&(b=!0,T<m&&(m=T))}if(!b)continue;let x=null;if(u&&(x=Vr(u,g,p,.3)),!x||!x.hingePoint){let E=Dr(l,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&&$t(r[0].x,r[0].y,g.x,g.y,p.x,p.y).dist>.3&&(x=null);let y=!1;if(!x||!x.hingePoint){let E=$t(r[0].x,r[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<-a.margin||x.hingeT>1+a.margin)){let E=$t(r[0].x,r[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=[r[1],r[2],r[3],r[4]],M=Tr(g.x,g.y,p.x,p.y,z),P=c>0?M/c:0;f.push({seg:h,minDist:m,embedRatio:P,ratio:h.length/c,score:0,details:{conn:0,variance:0,sameSide:0},hingeInfo:x,hingeScore:w})}}return f}function Tl(t,e,n,o){if(t.length<=1)return t.length===1&&(t[0].score=-1),t;for(let r of t){let{score:s,details:i}=Lr(r.seg,e,n);r.score=s,r.details=i}if(__DEBUG__&&o.includes("1527726772000"))for(let r of t){let s=r.seg,i=r.hingeInfo,l=r.hingeScore||0}return t.sort((r,s)=>{let i=r.hingeScore||0;return(s.hingeScore||0)-i||s.embedRatio-r.embedRatio||s.score-r.score||r.minDist-s.minDist}),t}function Rl(t,e,n,o){let r=t.end.x-t.start.x,s=t.end.y-t.start.y,i=Math.sqrt(r*r+s*s),l=r/i,u=s/i,d=e.map(P=>{let E=P.x-t.start.x,T=P.y-t.start.y;return(E*l+T*u)/i}),f=Math.min(...d),c=Math.max(...d),a=(c-f)*i,h=(f+c)/2,g=t.start.x+h*r,p=t.start.y+h*s,b=n.box.min.z,m=n.box.max.z,x=Math.abs(m-b),y=Ye(o,t.start.x,t.start.y),w=Math.max(0,b-y),z=f<=0&&c>=1,M=t.start.z+h*(t.end.z-t.start.z);return{p:{x:g,y:p,z:M},width:a,full:z,height:x,groundClearance:w,wallTMin:Math.max(0,Math.min(1,f)),wallTMax:Math.max(0,Math.min(1,c))}}function Go(t,e,n){let o=e.map(f=>n[f]),r=[],s=[],i=[],l=[],u,d;for(let f of o){if(f.originalPoints?.length)for(let c of f.originalPoints)r.push(c);if(f.doorAndBeamData?.length)for(let c of f.doorAndBeamData)s.push(c);if(f.insetionArr?.length)for(let c of f.insetionArr)i.push(c);if(f.DrawDoor?.length)for(let c of f.DrawDoor)l.push(c);f.boxData&&!u&&(u=f.boxData),f.rooftopPz!==void 0&&(d===void 0||f.rooftopPz>d)&&(d=f.rooftopPz)}r.length&&(t.originalPoints=r),s.length&&(t.doorAndBeamData=s),i.length&&(t.insetionArr=i),l.length&&(t.DrawDoor=l),u&&(t.boxData=u),d!==void 0&&(t.rooftopPz=d)}function un(t,e,n=10,o=.2,r=.2){let s=[];if(!t.DrawDoor)return s;let i=t.DrawDoor.p,l=t.wallSegment,u=l.end.x-l.start.x,d=l.end.y-l.start.y,f=Math.sqrt(u*u+d*d)||1,c=u/f,a=d/f,h=i.x-l.start.x,g=i.y-l.start.y,p=(h*c+g*a)/f;for(let b of e){if(b===l)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(c*w+a*z),E=Math.acos(Math.min(M,1))*(180/Math.PI);if(Math.abs(E-90)>n)continue;let T=[b.start,b.end];for(let V of T){let _=V.x-l.start.x,v=V.y-l.start.y,S=(_*c+v*a)/f,R=l.start.x+S*f*c,D=l.start.y+S*f*a;if(Math.sqrt((V.x-R)**2+(V.y-D)**2)>r)continue;let I=Math.abs((S-p)*f);if(I<=o){s.push({seg:b,distAlongWall:I,angle:E,endPoint:V});break}}}return s}function Rn(t,e){let n=t.start,o=t.end,r=o.x-n.x,s=o.y-n.y,i=Math.sqrt(r*r+s*s)||1,l=((e.x-n.x)*r+(e.y-n.y)*s)/(i*i),u=Math.max(0,Math.min(1,l)),d={x:n.x+u*r,y:n.y+u*s,z:n.z+(o.z-n.z)*u||0};function f(y){if(!y||!y.length)return[[],[]];let w=[],z=[];for(let M of y){let P=((M.x-n.x)*r+(M.y-n.y)*s)/(i*i);P<=u+1e-8&&w.push(M),P>=u-1e-8&&z.push(M)}return(w.length===0||c(w[w.length-1],d)>1e-6)&&w.push({...d}),(z.length===0||c(z[0],d)>1e-6)&&z.unshift({...d}),[w,z]}function c(y,w){return Math.sqrt((y.x-w.x)**2+(y.y-w.y)**2)}let[a,h]=f(t.originalPoints),g=Math.max(u*i,1e-6),p=Math.max((1-u)*i,1e-6),b=t.direction||{x:r/i,y:s/i,z:(o.z-n.z)/i||0},m={...t,start:{...n},end:{...d},length:g,direction:{...b},originalPoints:a.length?a:void 0},x={...t,start:{...d},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)*r+(z.p.y-n.y)*s)/(i*i);M<=u+1e-8&&y.push(z),M>=u-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 _ of w)_.x<z&&(z=_.x),_.y<M&&(M=_.y),_.z!==void 0&&_.z<P&&(P=_.z),_.x>E&&(E=_.x),_.y>T&&(T=_.y),_.z!==void 0&&_.z>V&&(V=_.z);return{isBox3:!0,min:{x:z,y:M,z:P},max:{x:E,y:T,z:V}}};m.boxData=y(a),x.boxData=y(h)}return[m,x]}function Dn(t,e,n,o){let r=Ml(n),s=[],{segments:i,sourceMap:l}=o??Ue(e),u=i,d=Cr(u);for(let f of t){let c=f.coordinatesByArea?.coordinates;if(!c||c.length<4)continue;let a=c.slice(0,4),h=jo(f.nline),g=no(a),p,b,m,x,y;if(h?(p=h.midX,b=h.midY,m=h.length,x=h.dirX,y=h.dirY):(p=a.reduce((L,B)=>L+B.x,0)/4,b=a.reduce((L,B)=>L+B.y,0)/4,m=g.longSide,x=g.dirX,y=g.dirY),m<.01)continue;let w=a.reduce((L,B)=>L+B.z,0)/4,z=Ye(e,p,b);if(w<z-.3)continue;let M=Rr(a),P=[...a].sort((L,B)=>L.z-B.z),E=P[0].x-P[1].x,T=P[0].y-P[1].y,V=Math.sqrt(E*E+T*T),_=El(a,p,b);Pl(f.name,u,p,b,_,m,x,y,r);let v=Sl(u,V,x,y,_,r,f.name,M,f.nline);if(v.length>0)for(let L=0;L<v.length;L++){let B=v[L],$=B.seg,G=!!B.hingeInfo?.hingePoint,Q=B.hingeInfo?.isClosed,q=B.hingeInfo?.hingeDist??-1,X=$t(_[0].x,_[0].y,$.start.x,$.start.y,$.end.x,$.end.y)}if(v=Tl(v,_,e,f.name),v.length===0){for(let B of u){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,ht=X/Y,St=Math.abs(it*x+ht*y),nt=Math.acos(Math.min(1,Math.abs(St)))*180/Math.PI,wt=$t(p,b,B.start.x,B.start.y,B.end.x,B.end.y)}let L=0;for(let B of u)$t(p,b,B.start.x,B.start.y,B.end.x,B.end.y).dist<2&&L++}let S=V;for(let L of v){let B=L.seg;if(B.originalPoints&&B.originalPoints.length>100&&B.length>.5)try{let $=oo(B,.1),G=_r(B,$,B.length,.5,.5,3,.35),Q,q=!1;if(f.nline){let ht=Hr(f.nline,B.start,B.end);if(ht)Q=ht.hingeT,q=ht.hingeDist>.05;else{let St=$t(p,b,B.start.x,B.start.y,B.end.x,B.end.y);Q=Math.max(0,Math.min(1,St.t))}}else{let ht=$t(p,b,B.start.x,B.start.y,B.end.x,B.end.y);Q=Math.max(0,Math.min(1,ht.t))}let X=Ir($),Y,it=X<=.3;it?Y={score:Xo($.avgDensity,d),bestRegion:null,bestOverlap:0,bestOpeningStartT:0,bestOpeningEndT:1}:(Y=Ar({hingeT:Q,doorWidth:S,isOpenDoor:q},G,B.length,d.medianDensity),Y.score<0&&(Y={score:Xo($.avgDensity,d),bestRegion:null,bestOverlap:0,bestOpeningStartT:0,bestOpeningEndT:1})),f.name.includes("door_002")&&(window.__doorLog=!0),L.densityScore=Y.score,L.densityOverlap=Y.bestOverlap,L.rectangularRegions=G,L.densityResult=$,L.densityOpeningStartT=Y.bestOpeningStartT,L.densityOpeningEndT=Y.bestOpeningEndT,L.densityCV=X,L.densityUsedGlobalRank=it}catch{L.densityScore=-1}else L.densityScore=-1}if(f.name.includes("door_002"))for(let L=0;L<v.length;L++){let $=v[L].seg,G=u.findIndex(q=>Math.abs(q.start.x-$.start.x)<.001&&Math.abs(q.start.y-$.start.y)<.001&&Math.abs(q.end.x-$.end.x)<.001&&Math.abs(q.end.y-$.end.y)<.001),Q=G>=0?l[G]||[]:[];for(let q of Q){let X=e[q]}}if(v.sort((L,B)=>{let $=L.densityScore>=0?L.densityScore:-1/0,G=B.densityScore>=0?B.densityScore:-1/0;if($!==G)return G-$;if(Math.abs($-G)<.3){let X=L.ratio||0,Y=B.ratio||0,it=Math.abs(X-1),ht=Math.abs(Y-1);if(it!==ht)return it-ht}let Q=L.hingeScore||0,q=B.hingeScore||0;return Q!==q?q-Q:L.minDist-B.minDist}),v.length>0)for(let L=0;L<v.length;L++){let B=v[L],$=B.seg,G=B.ratio||$.length/S,Q=Math.abs(G-1)}let R=null,D=1/0,W=0,I=0,C=null,H=-1,A=0,k=0,O=0;if(v.length>0){let L=v[0];R=L.seg,D=L.minDist,W=L.ratio,I=L.embedRatio,C=L.hingeInfo,H=L.densityScore??-1,A=L.densityOverlap??0,k=L.densityOpeningStartT??0,O=L.densityOpeningEndT??0}let N;if(R&&(N=Rl(R,a,f,i),N&&O>k&&(N.wallTMin=Math.max(0,Math.min(1,k)),N.wallTMax=Math.max(0,Math.min(1,O))),!r.printOnly)){let L=R;L.DrawDoor||(L.DrawDoor=[]),L.DrawDoor.push(N),L.isDoor=!0}if(R){let L=v.map(($,G)=>{let Q=$.seg;return{start:{x:Q.start.x,y:Q.start.y,z:Q.start.z},end:{x:Q.end.x,y:Q.end.y,z:Q.end.z},length:Q.length,densityScore:$.densityScore??-1,hingeScore:$.hingeScore??0,minDist:$.minDist,ratio:$.ratio,isWinner:G===0}}),B={doorName:f.name,doorCategory:f.category,doorCenter:f.center,wallSegment:R,distance:D,wallLengthRatio:W,DrawDoor:N,densityScore:H,densityOverlap:A,candidates:L,hingePoint:C?.hingePoint,otherPoint:C?.otherPoint,isClosed:C?.isClosed,doorWidth:N?.width,wallTMin:N?.wallTMin,wallTMax:N?.wallTMax};if(s.push(B),(f.name==="1527727501200_window_001"||f.name==="1527727427200_window_001")&&N){let $=R.end.x-R.start.x,G=R.end.y-R.start.y,Q=Math.sqrt($*$+G*G),q=$/Q,X=G/Q,Y=N.p.x-R.start.x,it=N.p.y-R.start.y,ht=(Y*q+it*X)/Q,St=0;for(let nt of i){if(nt===R)continue;let wt=nt.end.x-nt.start.x,zt=nt.end.y-nt.start.y,Dt=Math.sqrt(wt*wt+zt*zt)||1,Pt=wt/Dt,Mt=zt/Dt,It=Math.abs(q*Pt+X*Mt),ot=Math.acos(Math.min(It,1))*(180/Math.PI);if(Math.abs(ot-90)>10)continue;St++;let ft=[nt.start,nt.end],st="";for(let tt of ft){let ae=tt.x-R.start.x,bt=tt.y-R.start.y,Jt=(ae*q+bt*X)/Q,he=R.start.x+Jt*Q*q,Tt=R.start.y+Jt*Q*X,ee=Math.sqrt((tt.x-he)**2+(tt.y-Tt)**2),et=Math.abs((Jt-ht)*Q);st+=`\u7AEF(${tt.x.toFixed(2)},${tt.y.toFixed(2)})\u22A5=${ee.toFixed(3)}m \u6CBF\u5899=${et.toFixed(3)}m `}}}if(N&&N.width>1){let $=un(B,i);$.length>0&&$.forEach((G,Q)=>{})}}}for(let f of s){let c=f.wallSegment,a=i.indexOf(c);if(a===-1)continue;let h=l[a];!h||h.length<=1||Go(c,h,e)}return s}function so(t){return[t.wallTMin??0,t.wallTMax??1]}function Dl(t,e){let[n,o]=so(t),[r,s]=so(e),i=Math.max(0,Math.min(o,s)-Math.max(n,r)),l=Math.min(o-n,s-r);return l>0?i/l:0}function vl(t,e){if(!t.hingePoint||!e.hingePoint)return null;let n=t.hingePoint.x-e.hingePoint.x,o=t.hingePoint.y-e.hingePoint.y;return Math.sqrt(n*n+o*o)}function kr(t,e){let n=e.end.x-e.start.x,o=e.end.y-e.start.y,r=n*n+o*o;if(r<1e-10)return 0;let s=((t.x-e.start.x)*n+(t.y-e.start.y)*o)/r;return Math.max(0,Math.min(1,s))}function Br(t,e={}){let n=e.minTOverlapRatio??.5,o=e.maxHingeDist??.3,r=e.minHingeTOverlapRatio??.2;if(t.length<2)return{matches:t,removed:[]};let s=new Set,i=new Map;for(let f=0;f<t.length;f++){let a=t[f].wallSegment;i.has(a)||i.set(a,[]),i.get(a).push(f)}let l=0;for(let[f,c]of i){l++;let a=c.map(p=>t[p].doorName).join(", "),h=f.start,g=f.end}for(let[,f]of i){if(f.length<2)continue;let c=[...f].sort((a,h)=>{let g=t[a].densityScore??0;return(t[h].densityScore??0)-g});for(let a=0;a<c.length;a++){let h=c[a];if(s.has(h))continue;let g=t[h];for(let p=a+1;p<c.length;p++){let b=c[p];if(s.has(b))continue;let m=t[b],x=!1,y="",w=Dl(g,m),z=[g.hingePoint,g.otherPoint].filter(Boolean),M=[m.hingePoint,m.otherPoint].filter(Boolean),P=null;for(let W of z)for(let I of M){let C=Math.sqrt((W.x-I.x)**2+(W.y-I.y)**2);if(C>.25)continue;let H=kr(W,g.wallSegment),A=kr(I,m.wallSegment),k=Math.abs(H-A);(!P||C<P.dist)&&(P={dist:C,tDiff:k})}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]=so(g),[V,_]=so(m),v=vl(g,m);g.doorName.includes("door_002")||g.doorName.includes("door_004")||m.doorName.includes("door_002")||m.doorName.includes("door_004");let S=[g.hingePoint,g.otherPoint].filter(Boolean),R=[m.hingePoint,m.otherPoint].filter(Boolean),D=1/0;for(let W of S)for(let I of R){let C=Math.sqrt((W.x-I.x)**2+(W.y-I.y)**2);C<D&&(D=C)}x&&s.add(b)}}}let u=t.filter((f,c)=>!s.has(c)),d=t.filter((f,c)=>s.has(c)).map(f=>f.doorName);return{matches:u,removed:d}}function Zo(t,e,n){let o={printOnly:!1,skipMerge:!1,...n};for(let m of t)m.DrawDoor&&(m.DrawDoor=void 0),m.isDoor&&(m.isDoor=void 0),m.drawDoorData&&(m.drawDoorData=void 0);let r=Array.isArray(e)?e.filter(m=>m&&m.category==="door"&&!m.isFindBeam):[],s,i;if(o.skipMerge)s=t,i=t.map((m,x)=>[x]);else{let m=Ue(t);s=m.segments,i=m.sourceMap}for(let m=0;m<s.length;m++){let x=i[m];x&&!s[m].originalPoints&&Go(s[m],x,t)}let l=Dn(r,t,o,{segments:s,sourceMap:i}),d=Br(l,{minTOverlapRatio:.5}).matches,f=new Set(d.map(m=>m.doorName));for(let m of s){let x=m;if(x.DrawDoor&&x.DrawDoor.length>0){let y=l.filter(z=>z.wallSegment===m).length;d.filter(z=>z.wallSegment===m).length===0&&(x.DrawDoor=[],x.isDoor=!1)}}let c=new Map;for(let m=0;m<d.length;m++){let x=d[m],y=s.indexOf(x.wallSegment);y>=0&&c.set(y,m)}let a=[],h=new Set,g=new Map;for(let m of e)m&&m.name&&g.set(m.name,m);for(let[m,x]of c){let y=i[m];if(!y)continue;let w=s[m],z=w.DrawDoor,M=w.isDoor,P=w.end.x-w.start.x,E=w.end.y-w.start.y,T=P*P+E*E,V=0,_=1,v=d[x],R=(v?g.get(v.doorName):void 0)?.coordinatesByArea?.coordinates;if(R&&R.length>=4&&T>0){let C=R.slice(0,4).map(H=>{let A=H.x-w.start.x,k=H.y-w.start.y;return(A*P+k*E)/T});V=Math.max(0,Math.min(1,Math.min(...C))),_=Math.max(0,Math.min(1,Math.max(...C)))}let D,W;T>0&&_>V&&(D={x:w.start.x+V*P,y:w.start.y+V*E,z:w.start.z+V*(w.end.z-w.start.z)},W={x:w.start.x+_*P,y:w.start.y+_*E,z:w.start.z+_*(w.end.z-w.start.z)});let I=!1;for(let C of y){let H=t[C];if(!H)continue;let A=H.end.x-H.start.x,k=H.end.y-H.start.y,O=A*A+k*k,N=Math.sqrt(O);if(O<1e-10||!D||!W){h.add(C),a.push(H);continue}let L=((D.x-H.start.x)*A+(D.y-H.start.y)*k)/O,B=((W.x-H.start.x)*A+(W.y-H.start.y)*k)/O,$=Math.max(0,Math.min(1,Math.min(L,B))),G=Math.max(0,Math.min(1,Math.max(L,B)));if(G-$<.001)continue;h.add(C);let Q=nt=>({x:H.start.x+nt*A,y:H.start.y+nt*k,z:H.start.z+nt*(H.end.z-H.start.z)}),q=Q($),X=Q(G),Y=H.direction||{x:A/N,y:k/N,z:0},it,ht,St;if(H.originalPoints&&H.originalPoints.length>0){it=[],ht=[],St=[];for(let nt of H.originalPoints){let wt=((nt.x-H.start.x)*A+(nt.y-H.start.y)*k)/O;wt<$-1e-8?it.push(nt):wt>G+1e-8?St.push(nt):ht.push(nt)}it.length===0&&(it=void 0),ht.length===0&&(ht=void 0),St.length===0&&(St=void 0)}if($>.001){let nt={...H,start:{...H.start},end:{...q},length:$*N,direction:{...Y}};nt.DrawDoor=void 0,nt.isDoor=!1,nt.drawDoorData=void 0,nt.length<.01?(nt.isRebuild=!0,nt.originalPoints=[]):nt.originalPoints=it,a.push(nt)}{let nt={...H,start:{...q},end:{...X},length:(G-$)*N,direction:{...Y}};if(z&&(nt.DrawDoor=z),M&&(nt.isDoor=!0),nt.__matchIdx=x,nt.length<.01?(nt.isRebuild=!0,nt.originalPoints=[]):nt.originalPoints=ht,!I&&z&&z.length>0){I=!0;let wt=Math.sqrt(T),zt=wt>0?-E/wt:0,Dt=wt>0?P/wt:0,Pt={pointNum:2,start:D,end:W,n:{x:zt,y:Dt,z:0},height:z[0].height,groundClearance:z[0].groundClearance};nt.drawDoorData=Pt}a.push(nt)}if(G<.999){let nt={...H,start:{...X},end:{...H.end},length:(1-G)*N,direction:{...Y}};nt.DrawDoor=void 0,nt.isDoor=!1,nt.drawDoorData=void 0,nt.length<.01?(nt.isRebuild=!0,nt.originalPoints=[]):nt.originalPoints=St,a.push(nt)}}}for(let m=0;m<t.length;m++)h.has(m)||a.push(t[m]);let p=new Set(d.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 d){if(!m.DrawDoor||m.DrawDoor.width<=1)continue;let x=g.get(m.doorName);if(!x||!x.positionArr||!x.positionArr.length)continue;let y=un(m,s);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,_=y.filter(C=>{let H=(C.seg.start.x+C.seg.end.x)/2,A=(C.seg.start.y+C.seg.end.y)/2,k=H-z.x,O=A-z.y;return k*T+O*V>0});if(!_.length)continue;let v=_[0].endPoint,S=m.wallSegment;if(b.has(S))continue;let[R,D]=Rn(S,v);b.set(S,[R,D]);let W=((z.x-S.start.x)*(S.end.x-S.start.x)+(z.y-S.start.y)*(S.end.y-S.start.y))/(S.length*S.length),I=((v.x-S.start.x)*(S.end.x-S.start.x)+(v.y-S.start.y)*(S.end.y-S.start.y))/(S.length*S.length);W<=I?m.wallSegment=R:m.wallSegment=D}if(b.size>0){let m=[];for(let x of a)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:d}}for(let m of a)m.isDoor=!!(m.DrawDoor&&m.DrawDoor.length>0);return{segments:a,matches:d}}var Vl={findWalls:Tn,mergeSegments:Ge,computeFloorZ:Xe,analyzeQuadrangle:je,detectPerpWalls:Pn,splitSegment:Sn,process:qo},Il={findWalls:Dn,mergeSegments:Ue,computeFloorZ:Ye,analyzeQuadrangle:je,detectPerpWalls:un,splitSegment:Rn,process:Zo};function fn(t){return t==="window"?Vl:Il}function Cl(t,e,n,o,r){return fn(t).findWalls(e,n,o,r)}function Wl(t,e,n,o){return fn(t).process(e,n,o)}function _l(t,e){return fn(t).mergeSegments(e)}function Hl(t,e,n){return fn(t).detectPerpWalls(e,n)}function Al(t,e,n){return fn(t).splitSegment(e,n)}function Ke(t,e){let n=Math.atan2(e,t);return n<0&&(n+=Math.PI),n>=Math.PI&&(n-=Math.PI),n}function Ie(t,e,n){let o=Math.cos(n),r=Math.sin(n);return{x:t*o-e*r,z:t*r+e*o}}function ro(t,e,n,o,r,s){let i=r-n,l=s-o,u=i*i+l*l;if(u<1e-10){let g=t-n,p=e-o;return Math.sqrt(g*g+p*p)}let d=((t-n)*i+(e-o)*l)/u;d=Math.max(0,Math.min(1,d));let f=n+d*i,c=o+d*l,a=t-f,h=e-c;return Math.sqrt(a*a+h*h)}function Or(t){if(t.length<3)return 0;let e=0,n=t.length;for(let o=0;o<n;o++){let r=(o+1)%n;e+=t[o].x*t[r].z,e-=t[r].x*t[o].z}return Math.abs(e)/2}function Yo(t){let e=t.x2-t.x1,n=t.z2-t.z1;return Math.sqrt(e*e+n*n)}function io(t){if(!t.length)return{rotated:[],mainAngle:0};let e=180,n=new Array(e).fill(0),o=Math.PI/e;for(let f of t){let c=f.x2-f.x1,a=f.z2-f.z1,h=Math.sqrt(c*c+a*a);if(h<.01)continue;let g=Ke(c,a),p=Math.floor(g/o);p>=e&&(p=e-1),n[p]+=h}let r=new Array(e).fill(0),s=5;for(let f=0;f<e;f++){let c=0;for(let a=-s;a<=s;a++){let h=f+a;h<0&&(h+=e),h>=e&&(h-=e),c+=n[h]}r[f]=c}let i=0,l=0;for(let f=0;f<e;f++)r[f]>i&&(i=r[f],l=f);let u=(l+.5)*o;return{rotated:t.map(f=>{let c=Ie(f.x1,f.z1,-u),a=Ie(f.x2,f.z2,-u);return{...f,x1:c.x,z1:c.z,x2:a.x,z2:a.z}}),mainAngle:u}}var Uo=15*(Math.PI/180);function ao(t,e,n=.15,o=.5){let r=[];for(let f of t){let c=f.x2-f.x1,a=f.z2-f.z1,h=Math.sqrt(c*c+a*a);if(h<.01)continue;let g=Ke(c,a),p;if(e==="X"?p=g<Uo||g>Math.PI-Uo:p=Math.abs(g-Math.PI/2)<Uo,!p)continue;let b,m,x;e==="X"?(b=(f.z1+f.z2)/2,m=Math.min(f.x1,f.x2),x=Math.max(f.x1,f.x2)):(b=(f.x1+f.x2)/2,m=Math.min(f.z1,f.z2),x=Math.max(f.z1,f.z2)),r.push({line:f,offset:b,pStart:m,pEnd:x,length:h})}if(r.length===0)return{groups:[],lineToGroup:new Map};r.sort((f,c)=>f.offset-c.offset);let s=[],i=[r[0]],l=r[0].offset;for(let f=1;f<r.length;f++){let c=r[f];Math.abs(c.offset-l)<n?i.push(c):(s.push(i),i=[c],l=c.offset)}i.length>0&&s.push(i);let u=[],d=new Map;for(let f of s){f.sort((a,h)=>a.pStart-h.pStart);let c=[];for(let a of f){let h=!1;for(let g of c)if(a.pStart<=g.end+o){g.items.push(a),g.end=Math.max(g.end,a.pEnd),h=!0;break}h||c.push({items:[a],end:a.pEnd})}for(let a of c){let h=a.items.map(p=>p.line),g=u.length;u.push(h);for(let p of h)d.set(p.id,g)}}return{groups:u,lineToGroup:d}}function lo(t,e,n=.3){let o=new Map;for(let r of t){let s=null,i=1/0;for(let l of e){let u=ro(r.x,r.z,l.x1,l.z1,l.x2,l.z2);u<i&&(i=u,s=l.id)}s!==null&&i<=n&&o.set(r.id,s)}return o}var dn=.15;function Ll(t,e){return Math.round(t/dn)+"_"+Math.round(e/dn)}function Fr(t,e=5){if(t.length<3)return new Set;let n=new Map,o=0,r=0;function s(u,d){let f=Ll(u,d),c=n.get(f);if(c)return c;let a=Math.round(u/dn),h=Math.round(d/dn),g=null,p=dn*dn;for(let b=-1;b<=1;b++)for(let m=-1;m<=1;m++){let x=a+b+"_"+(h+m),y=n.get(x);if(!y)continue;let w=y.x-u,z=y.z-d,M=w*w+z*z;M<p&&(p=M,g=y)}return g?(n.set(f,g),g):(c={id:o++,x:u,z:d,edges:[]},n.set(f,c),c)}let i=[];for(let u of t){let d=s(u.x1,u.z1),f=s(u.x2,u.z2);if(d.id===f.id)continue;let c=Math.atan2(f.z-d.z,f.x-d.x),a=Math.atan2(d.z-f.z,d.x-f.x),h={id:r++,wallId:u.id,from:d,to:f,twin:null,angle:c,visited:!1},g={id:r++,wallId:u.id,from:f,to:d,twin:h,angle:a,visited:!1};h.twin=g,d.edges.push(h),f.edges.push(g),i.push(h,g)}if(i.length<6)return new Set;for(let u of n.values())u.edges.sort((d,f)=>d.angle-f.angle);let l=new Set;for(let u of i){if(u.visited)continue;let d=[],f=u,c=i.length+10;for(;!f.visited&&d.length<c;){f.visited=!0,d.push(f);let a=f.to,h=f.twin,g=a.edges.indexOf(h);if(g<0)break;let p=(g+1)%a.edges.length;f=a.edges[p]}if(d.length>=3){let a=d[0];if(d[d.length-1].to.id===a.from.id){let g=[],p=new Set;for(let m of d)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(Or(g)>=e)for(let m of p)l.add(m)}}}return l}var ag=12*(Math.PI/180);function Nr(t,e=2){let n=new Map;for(let o of t){let r=(o.x1+o.x2)/2,s=(o.z1+o.z2)/2,i=Math.floor(r/e),l=Math.floor(s/e),u=`${i},${l}`;n.has(u)||n.set(u,[]),n.get(u).push(o)}return n}var kl=0;function qr(){return++kl}function $r(t,e,n=.15,o=.5){if(!t.length)return[];let r=10*Math.PI/180,s=[];for(let f of t){let c=f.x2-f.x1,a=f.z2-f.z1,h=Math.sqrt(c*c+a*a);if(!(h<.01))if(e==="X"){if(Math.abs(a)>h*Math.sin(r))continue;let g=(f.z1+f.z2)/2,p=Math.min(f.x1,f.x2),b=Math.max(f.x1,f.x2);s.push({line:f,pStart:p,pEnd:b,offset:g,yMin:Math.min(f.y1,f.y2),yMax:Math.max(f.y1,f.y2)})}else{if(Math.abs(c)>h*Math.sin(r))continue;let g=(f.x1+f.x2)/2,p=Math.min(f.z1,f.z2),b=Math.max(f.z1,f.z2);s.push({line:f,pStart:p,pEnd:b,offset:g,yMin:Math.min(f.y1,f.y2),yMax:Math.max(f.y1,f.y2)})}}if(!s.length)return[];s.sort((f,c)=>f.offset-c.offset);let i=[],l=[s[0]],u=s[0].offset;for(let f=1;f<s.length;f++){let c=s[f];Math.abs(c.offset-u)<n?l.push(c):(i.push(l),l=[c],u=c.offset)}i.push(l);let d=[];for(let f of i){f.sort((a,h)=>a.pStart-h.pStart);let c=[];for(let a of f){if(c.length===0){c.push({pStart:a.pStart,pEnd:a.pEnd,offset:a.offset,count:1,yMin:a.yMin,yMax:a.yMax});continue}let h=c[c.length-1];a.pStart<=h.pEnd+o?(h.pEnd=Math.max(h.pEnd,a.pEnd),h.count+=1,h.yMin=Math.min(h.yMin,a.yMin),h.yMax=Math.max(h.yMax,a.yMax),h.offset=(h.offset*(h.count-1)+a.offset)/h.count):c.push({pStart:a.pStart,pEnd:a.pEnd,offset:a.offset,count:1,yMin:a.yMin,yMax:a.yMax})}for(let a of c){let h=a.pEnd-a.pStart;if(h<.01)continue;let g;e==="X"?g={id:qr(),x1:a.pStart,y1:a.yMin,z1:a.offset,x2:a.pEnd,y2:a.yMax,z2:a.offset,length:h,pointCount:a.count,isMain:!1}:g={id:qr(),x1:a.offset,y1:a.yMin,z1:a.pStart,x2:a.offset,y2:a.yMax,z2:a.pEnd,length:h,pointCount:a.count,isMain:!1},d.push(g)}}return d}function jr(t,e=.8,n=3){return t.filter(o=>o.length>=e&&o.pointCount>=n)}function Xr(t,e=1,n=3){return t.filter(o=>o.length>=e&&o.pointCount>=n)}function Bl(t,e,n={}){let{distTol:o=.15,gapTol:r=.5,minLen:s=.2,minGroupLen:i=1,minArea:l=3,maxWinDist:u=.3,minLongWall:d=2}=n,f=performance.now(),{rotated:c,mainAngle:a}=io(t),h=performance.now(),g=e.map(D=>{let W=Ie(D.x,D.z,-a);return{...D,x:W.x,z:W.z}}),{groups:p}=ao(c,"X",o,r),{groups:b}=ao(c,"Z",o,r),m=[...p,...b],x=performance.now(),y=new Map,w=[];for(let D=0;D<m.length;D++){let W=m[D];if(W.length===0){w.push(0);continue}let I=0;for(let C of W)I+=Yo(C),y.set(C.id,D);w.push(I)}let z=performance.now(),M=new Set;for(let D=0;D<m.length;D++)w[D]>=d&&M.add(D);if(M.size>0){let D=[...M];for(;D.length>0;){let W=D.shift(),I=m[W];for(let C=0;C<m.length;C++){if(M.has(C)||w[C]<i)continue;let H=m[C],A=!1;t:for(let k of I)for(let O of H)if(Math.hypot(k.x1-O.x1,k.z1-O.z1)<=co||Math.hypot(k.x1-O.x2,k.z1-O.z2)<=co||Math.hypot(k.x2-O.x1,k.z2-O.z1)<=co||Math.hypot(k.x2-O.x2,k.z2-O.z2)<=co){A=!0;break t}A&&(M.add(C),D.push(C))}}}let P=c.map((D,W)=>{let I=Yo(D),C=y.get(D.id),H=C!==void 0&&M.has(C),A=I>=d;return{id:W,x1:D.x1,y1:D.y1,z1:D.z1,x2:D.x2,y2:D.y2,z2:D.z2,length:I,pointCount:1,isMain:H||A}}),E=P.filter(D=>D.isMain),T=P.filter(D=>!D.isMain),V=performance.now(),_=lo(g,E,u),v=performance.now(),S=D=>D.map(W=>{let I=Ie(W.x1,W.z1,a),C=Ie(W.x2,W.z2,a);return{...W,x1:I.x,z1:I.z,x2:C.x,z2:C.z}}),R=performance.now();return console.log(`[\u4E3B\u4F53\u67B6\u6784] \u89D2\u5EA6\u5F52\u4E00\u5316: ${(h-f).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-f).toFixed(0)}ms`),{mainWalls:S(E),noiseWalls:S(T),windowToWall:_}}var co=.2;function Pe(t,e){let n=Math.atan2(e,t);return n<0&&(n+=Math.PI),n>=Math.PI&&(n-=Math.PI),n}function vn(t){for(;t>Math.PI;)t-=2*Math.PI;for(;t<-Math.PI;)t+=2*Math.PI;return t}function uo(t){return t*Math.PI/180}function Vn(t,e,n){let o=Math.cos(n),r=Math.sin(n);return{x:t*o-e*r,z:t*r+e*o}}function Se(t){let e=0;for(let n=1;n<t.length;n++){let o=t[n].x-t[n-1].x,r=t[n].z-t[n-1].z;e+=Math.sqrt(o*o+r*r)}return e}function Ko(t){if(t.length<3)return 0;let e=0,n=t.length;for(let o=0;o<n;o++){let r=(o+1)%n;e+=t[o].x*t[r].z,e-=t[r].x*t[o].z}return Math.abs(e)/2}function be(t,e,n,o){let r=n-t,s=o-e;return Math.sqrt(r*r+s*s)}function In(t,e,n,o,r,s){let i=r-n,l=s-o,u=i*i+l*l;if(u<1e-6)return be(t,e,n,o);let d=((t-n)*i+(e-o)*l)/u;return d=Math.max(0,Math.min(1,d)),be(t,e,n+d*i,o+d*l)}function Qo(t){if(t.length<4)return t;let e=t.map(n=>({x:n.x,z:n.z}));for(let n=0;n<3;n++){let o=[{...e[0]}];for(let r=1;r<e.length-1;r++)o.push({x:(e[r-1].x+e[r].x+e[r+1].x)/3,z:(e[r-1].z+e[r].z+e[r+1].z)/3});o.push({...e[e.length-1]}),e=o}return e}function Gr(t,e){let n=1/0;for(let o of t)for(let r=0;r<e.length-1;r++){let s=In(o.x,o.z,e[r].x,e[r].z,e[r+1].x,e[r+1].z);s<n&&(n=s)}return n}function fo(t,e){let n=new Map,o=1/0,r=-1/0,s=1/0,i=-1/0;for(let l of t){let u=Math.floor(l.x/e),d=Math.floor(l.z/e),f=u+","+d;n.set(f,(n.get(f)||0)+1),u<o&&(o=u),u>r&&(r=u),d<s&&(s=d),d>i&&(i=d)}return{cells:n,minX:o,maxX:r,minZ:s,maxZ:i}}function Zr(t,e){let n=new Set,o=1/0,r=-1/0,s=1/0,i=-1/0,l=(u,d)=>{let f=u+","+d;n.add(f),u<o&&(o=u),u>r&&(r=u),d<s&&(s=d),d>i&&(i=d)};for(let u of t){let d=u.x1,f=u.z1,c=u.x2,a=u.z2,h=Math.floor(d/e),g=Math.floor(f/e),p=Math.floor(c/e),b=Math.floor(a/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&&(l(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:r,minZ:s,maxZ:i}}function Wn(t,e=1){let n=new Set(t);for(let o=0;o<e;o++){let r=new Set(n);for(let i of n){let[l,u]=i.split(",").map(Number);for(let d=-1;d<=1;d++)for(let f=-1;f<=1;f++)d===0&&f===0||r.add(l+d+","+(u+f))}let s=new Set(r);for(let i of r){let[l,u]=i.split(",").map(Number),d=!0;for(let f=-1;f<=1;f++){for(let c=-1;c<=1;c++)if(!r.has(l+f+","+(u+c))){d=!1;break}if(!d)break}d||s.delete(i)}n.clear();for(let i of s)n.add(i)}return n}function Jo(t){let e=[],n=new Set;for(let o of t){if(n.has(o))continue;let r=new Set,s=[o];for(n.add(o);s.length>0;){let i=s.shift();r.add(i);let[l,u]=i.split(",").map(Number);for(let d=-1;d<=1;d++)for(let f=-1;f<=1;f++){if(d===0&&f===0)continue;let c=l+d+","+(u+f);t.has(c)&&!n.has(c)&&(n.add(c),s.push(c))}}r.size>=4&&e.push(r)}return e}function ts(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 r="",s=1/0,i=1/0;for(let g of n){let[p,b]=g.split(",").map(Number);(b<s||b===s&&p<i)&&(s=b,i=p,r=g)}if(!r)return[];let l=[[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1]],u=[],[d,f]=r.split(",").map(Number),c=0,a=new Set,h=n.size*8;for(let g=0;g<h;g++){let b=d+","+f+"|"+c;if(a.has(b))break;a.add(b),u.push({x:(d+.5)*e,z:(f+.5)*e});let m=(c+3)%8,x=!1;for(let y=0;y<8;y++){let w=(m+y)%8,z=d+l[w][0],M=f+l[w][1];if(n.has(z+","+M)){c=(w+4)%8,d=z,f=M,x=!0;break}}if(!x||d+","+f===r&&u.length>2)break}return u}function Cn(t,e){if(t.length<=2)return[...t];let n=0,o=0,r=t[0],s=t[t.length-1];for(let i=1;i<t.length-1;i++){let l=In(t[i].x,t[i].z,r.x,r.z,s.x,s.z);l>n&&(n=l,o=i)}if(n>e){let i=Cn(t.slice(0,o+1),e),l=Cn(t.slice(o),e);return[...i.slice(0,-1),...l]}return[r,s]}var es={cellSize:.1,densityThreshold:1,minComponentCells:20,simplifyEpsilon:.01,heightMin:.3,heightMax:2.8,closeIterations:5,sparseRadius:.3,sparseMinNeighbors:5,lineDensityMin:0,lineDensityMinLen:1,densityRatio:.12};function hn(t){let e=t.length;if(e<3)return{cx:0,cz:0,r:0,rmsResidual:0};let n=0,o=0,r=0,s=0,i=0,l=0,u=0,d=0,f=0;for(let m of t){let x=m.x,y=m.z;n+=x,o+=y,r+=x*x,s+=y*y,i+=x*y,l+=x*x*x,u+=y*y*y,d+=x*x*y,f+=x*y*y}let c=2*(e*(r+s)-n*n-o*o);if(Math.abs(c)<1e-10)return{cx:0,cz:0,r:0,rmsResidual:0};let a=(e*(l+f)-n*(r+s))/c,h=(e*(d+u)-o*(r+s))/c,g=Math.sqrt(Math.abs((r+s-2*a*n-2*h*o)/e+a*a+h*h)),p=0;for(let m of t){let y=Math.hypot(m.x-a,m.z-h)-g;p+=y*y}let b=Math.sqrt(p/e);return{cx:a,cz:h,r:g,rmsResidual:b}}function Ol(t){let e=t.length;if(e<4)return{eigenRatio:1,isLinear:!1,spread:0,mx:0,mz:0,v1x:1,v1z:0,v2x:0,v2z:1,s1:0,s2:0};let n=0,o=0;for(let w of t)n+=w.x,o+=w.z;n/=e,o/=e;let r=0,s=0,i=0;for(let w of t){let z=w.x-n,M=w.z-o;r+=z*z,s+=M*M,i+=z*M}r/=e,s/=e,i/=e;let l=r+s,u=Math.max(0,(r-s)*(r-s)+4*i*i),d=Math.sqrt(u),f=(l+d)/2,c=(l-d)/2,a=Math.sqrt(f),h=Math.sqrt(c),g=h,p=1,b=0,m=0,x=1;if(Math.abs(i)>1e-12||Math.abs(r-s)>1e-12){let w=i,z=f-r,M=Math.sqrt(w*w+z*z);M>1e-12&&(p=w/M,b=z/M);let P=i,E=c-r,T=Math.sqrt(P*P+E*E);T>1e-12&&(m=P/T,x=E/T)}let y=f>1e-10?c/f:0;return{eigenRatio:y,isLinear:y<.05,spread:g,mx:n,mz:o,v1x:p,v1z:b,v2x:m,v2z:x,s1:a,s2:h}}function Yr(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:r,spread:s,mx:i,mz:l,v1x:u,v1z:d,v2x:f,v2z:c,s1:a,s2:h}=Ol(t),g=0;for(let w=1;w<t.length;w++){let z=t[w].x-t[w-1].x,M=t[w].z-t[w-1].z;g+=Math.sqrt(z*z+M*M)}let p=Fl(t),b=hn(p);if(b.r>.1&&b.r<Math.max(g*5,2)&&b.rmsResidual<.07)return{type:"curved",eigenRatio:o,spread:s,cloudUsed:t.length,mx:i,mz:l,v1x:u,v1z:d,v2x:f,v2z:c,s1:a,s2:h};let x=g>.01?s/g:1;return{type:r&&(s<.05||x<.1)?"straight":"curved",eigenRatio:o,spread:s,cloudUsed:t.length,mx:i,mz:l,v1x:u,v1z:d,v2x:f,v2z:c,s1:a,s2:h}}function Fl(t){if(t.length<4)return[...t];let e=[{...t[0]}];for(let n=1;n<t.length-1;n++)e.push({x:(t[n-1].x+t[n].x+t[n+1].x)/3,z:(t[n-1].z+t[n].z+t[n+1].z)/3});return e.push({...t[t.length-1]}),e}function Nl(t,e,n=1.57){if(e<10)return[];let o=[];for(let 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 r=[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),r.push(r[p-1]+b)}let s=0;{let p=o[0]-o[e-1];p>Math.PI?p-=2*Math.PI:p<-Math.PI&&(p+=2*Math.PI),s=p}Math.abs(s)<.1;let i=[],l=5;for(let p=0;p<e;p++){let b=0;for(let m=-l;m<=l;m++)b+=r[(p+m+e)%e];i.push(b/(l*2+1))}let u=5,d=[];for(let p=0;p<e;p++){let b=i[(p+u)%e]-i[p];b>Math.PI?b-=2*Math.PI:b<-Math.PI&&(b+=2*Math.PI),d.push(b)}let f=10,c=.003,a=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=d[w],E=Math.abs(P),T=P>0?1:P<0?-1:0;if(E<c){w=(w+1)%e;continue}if(y===0){y=T,x=E,m=w,w=(w+1)%e;continue}if(T!==y){let V=E,_=T,v=(w+1)%e,S=1;for(let R=0;R<a&&S<a*2;R++){let D=d[v],W=Math.abs(D);if(W<c){v=(v+1)%e;continue}(D>0?1:-1)===_?V+=W:(V-=W,V<0&&(_=-_,V=-V)),v=(v+1)%e,S++}if(_===y&&V>h){w=(w+1)%e;continue}break}if(x+=E,m=w,w=(w+1)%e,w===p)break}if((m>b?m-b+1:e-b+m+1)>=f&&x>=n){let P=b,E=(b+u)%e,T=(m-u+e)%e,V=m,_=t[P],v=t[E],S=t[T],R=t[V],D=Math.atan2(v.z-_.z,v.x-_.x),I=Math.atan2(R.z-S.z,R.x-S.x)-D;I>Math.PI?I-=2*Math.PI:I<-Math.PI&&(I+=2*Math.PI);let C=Math.abs(I);if(!g.some(A=>{function k(L,B,$){return L<=B?$>=L&&$<=B:$>=L||$<=B}let O=0,N=0;for(let L=b;N++,k(A.start,A.end,L)&&O++,L!==m;L=(L+1)%e);return N>0&&O/N>.7})){let A=g.findIndex(k=>{function O(B,$,G){return B<=$?G>=B&&G<=$:G>=B||G<=$}let N=0,L=0;for(let B=k.start;L++,O(b,m,B)&&N++,B!==k.end;B=(B+1)%e);return L>0&&N/L>.7});A>=0?x>g[A].cumAngle&&(g[A]={start:b,end:m,cumAngle:x,actualAngle:C}):g.push({start:b,end:m,cumAngle:x,actualAngle:C})}}}return g}function ql(t,e){let s=new Array(e).fill(!1);for(let d=0;d<e;d++){let f=t[d],c=t[(d+15)%e],a=t[(d+30)%e],h=Math.atan2(c.z-f.z,c.x-f.x),g=Math.atan2(a.z-c.z,a.x-c.x),p=Math.abs(g-h);p>Math.PI&&(p=2*Math.PI-p),p>.07&&(s[(d+15)%e]=!0)}let i=new Set,l=[],u=-1;for(let d=0;d<e*2;d++){let f=d%e;if(s[f])u<0&&(u=f);else if(u>=0){let c=(f-1+e)%e,a=0;for(let h=u;a++,h!==c;h=(h+1)%e);if(a>=12){let h=`${u},${c}`;i.has(h)||(i.add(h),l.push({start:u,end:c}))}u=-1}}if(l.length>1){let d=l[0],f=l[l.length-1];f.end>e-3&&d.start<3&&(l[0]={start:f.start,end:d.end},l.pop())}return l}function $l(t,e){let n=[10,15,20,25,30,40],o=.15,r=.15,s=.5,i=3,l=6,u=new Array(e).fill(0);for(let c of n)if(!(c>=e))for(let a=0;a<e;a+=i){let h=a+c;if(h>=e)break;let g=[];for(let w=a;w<=h;w++)g.push(t[w]);if(g.length<c-1)continue;let{cx:p,cz:b,r:m,rmsResidual:x}=hn(g);if(m<.1||x>o||m<s)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<r))for(let w=a;w<=h;w++)u[w]++}let d=[],f=-1;for(let c=0;c<e*2;c++){let a=c%e;if(u[a]>=2)f<0&&(f=a);else if(f>=0){let h=(a-1+e)%e,g=0;for(let p=f;g++,p!==h;p=(p+1)%e);g>=l&&d.push({start:f,end:h}),f=-1}}if(d.length>1){let c=d[0],a=d[d.length-1];a.end>e-3&&c.start<3&&(d[0]={start:a.start,end:c.end},d.pop())}return d}function jl(t,e,n){function o(h,g){return h<=g?g-h+1:n-h+(g+1)}function r(h,g,p){return h<=g?p>=h&&p<=g:p>=h||p<=g}let s=o(t.start,t.end),i=o(e.start,e.end),l=s<=i?t.start:e.start,u=s<=i?t.end:e.end,d=s<=i?e.start:t.start,f=s<=i?e.end:t.end,c=0;for(let h=l;r(d,f,h)&&c++,h!==u;h=(h+1)%n);let a=s+i-c;return a>0?c/a:0}function Xl(t){if(t.length<2)return[];let e=[],n=.15,o=1.22,r=1.92;for(let l=0;l<t.length;l++){let u=t[l];for(let d=l+1;d<t.length;d++){let f=t[d],c=u.bx-u.ax,a=u.bz-u.az,h=f.bx-f.ax,g=f.bz-f.az,p=Math.sqrt(c*c+a*a),b=Math.sqrt(h*h+g*g);if(p<.01||b<.01)continue;let m=Math.abs(Math.atan2(c*g-a*h,c*h+a*g));if(m<o||m>r)continue;let x=[{x:u.ax,z:u.az},{x:u.bx,z:u.bz}],y=[{x:f.ax,z:f.az},{x:f.bx,z:f.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 s=[],i=new Array(e.length).fill(!1);for(let l=0;l<e.length;l++){if(i[l])continue;let u=e[l].x,d=e[l].z,f=1;i[l]=!0;for(let c=l+1;c<e.length;c++){if(i[c])continue;let a=e[c].x-u/f,h=e[c].z-d/f;Math.sqrt(a*a+h*h)<.3&&(u+=e[c].x,d+=e[c].z,f++,i[c]=!0)}s.push({x:u/f,z:d/f})}return s}function Ur(t,e){if(t.length<6)return[];let n={minCurveAngle:.05,minCurvePoints:5,smoothWindow:3,...e},o=t.length,r=[];for(let S=0;S<o;S++){let R=t[(S-1+o)%o],D=t[S],W=t[(S+1)%o],I=D.x-R.x,C=D.z-R.z,H=W.x-D.x,A=W.z-D.z,k=Math.sqrt(I*I+C*C),O=Math.sqrt(H*H+A*A);if(k<.001||O<.001){r.push(0);continue}r.push(Math.atan2((I*A-C*H)/(k*O),(I*H+C*A)/(k*O)))}let s=[],i=n.smoothWindow;for(let S=0;S<o;S++){let R=0;for(let D=-i;D<=i;D++)R+=r[(S+D+o)%o];s.push(R/(i*2+1))}let l=.008,u=[],d=-1,f=0,c=new Set;for(let S=0;S<o*2;S++){let R=S%o,D=s[R],W=D>=0?1:-1;if(Math.abs(D)>l&&(f===0||f===W))d<0&&(d=R,f=W);else if(d>=0){let I=(R-1+o)%o,C=0,H=0;for(let A=d;C+=Math.abs(s[A]),H++,A!==I;A=(A+1)%o);if(H>=n.minCurvePoints&&C>n.minCurveAngle){let A=`${d},${I}`;c.has(A)||(c.add(A),u.push({start:d,end:I,sign:f}))}d=-1,f=0}}if(u.length>1){let S=u[0],R=u[u.length-1];S.sign===R.sign&&R.end>o-3&&S.start<3&&(u[0]={start:R.start,end:S.end,sign:S.sign},u.pop())}{let S=s.filter(I=>Math.abs(I)>.001).map(I=>Math.abs(I)),R=S.length>0?Math.max(...S):0,D=S.length>0?S.reduce((I,C)=>I+C,0)/S.length:0,W=u.reduce((I,C)=>{let H=0;for(let A=C.start;H++,A!==C.end;A=(A+1)%o);return I+H},0)}let a=ql(t,o),h=$l(t,o),g=[...u,...a.map(S=>({start:S.start,end:S.end,sign:1})),...h.map(S=>({start:S.start,end:S.end,sign:1}))],p=u.length,m=g.map((S,R)=>{let D=[];for(let G=S.start;D.push({...t[G]}),G!==S.end;G=(G+1)%o);let W=0;for(let G=1;G<D.length;G++)s[(S.start+G-1)%o]*s[(S.start+G)%o]<-1e-8&&W++;let{cx:I,cz:C,r:H,rmsResidual:A}=hn(D),k=0,O=0;for(let G=1;G<D.length;G++){let Q=D[G-1].x-I,q=D[G-1].z-C,X=D[G].x-I,Y=D[G].z-C,it=Math.atan2(Q*Y-q*X,Q*X+q*Y);k+=Math.abs(it),O+=it}let N=Se(D),L=W===0?.12:.08;if(H>.1&&A>L||H>.1&&H>Math.max(N*15,8)||Math.abs(O)<.05)return null;let B=R<p?"turning":"sliding",$=B!=="turning"?Math.abs(O)>.35?"C_curve":"S_curve":W>0?"S_curve":"C_curve";return{seg:{points:D,type:$,radius:H,centerX:I,centerZ:C,arcAngle:k,arcLength:N},start:S.start,end:S.end,source:B}}).filter(S=>S!==null),x=new Set;function y(S,R){return S<=R?R-S+1:o-S+(R+1)}function w(S,R,D,W){for(let I=S;;I=(I+1)%o){let C;if(D<=W?C=I>=D&&I<=W:C=I>=D||I<=W,!C)return!1;if(I===R)break}return!0}for(let S=0;S<m.length;S++)if(!x.has(S))for(let R=S+1;R<m.length;R++){if(x.has(R))continue;if(jl({start:m[S].start,end:m[S].end},{start:m[R].start,end:m[R].end},o)>.6){let I=(m[S].seg.arcAngle>=m[R].seg.arcAngle?S:R)===S?R:S;if(m[S].seg.arcAngle>=m[R].seg.arcAngle)x.add(R);else{x.add(S);break}}else{let W=y(m[S].start,m[S].end),I=y(m[R].start,m[R].end),C=W<=I?S:R,H=W<=I?R:S;w(m[C].start,m[C].end,m[H].start,m[H].end)&&y(m[C].start,m[C].end)/y(m[H].start,m[H].end)<.7&&x.add(C)}}let z=m.filter((S,R)=>!x.has(R)),M=10,P=10,E=30,T=15,V=[],_=0;if(z.length>0){for(let D of z)D.start=(D.start-T+o)%o,D.end=(D.end+T)%o;let S=[...z].sort((D,W)=>D.start-W.start),R=S[0];for(let D=1;D<S.length;D++){let W=S[D],I=W.start-R.end;I<0&&(R.end>o*.5&&W.start<o*.5?I=W.start+o-R.end:I=0);let C=I===0,H=I<=E&&C;if(!H&&I<=E){let A=Math.sqrt((R.seg.centerX-W.seg.centerX)**2+(R.seg.centerZ-W.seg.centerZ)**2),k=Math.max(R.seg.radius,W.seg.radius),O=Math.min(R.seg.radius,W.seg.radius),N=O>0?k/O:99;H=A<P&&N<M}if(H){let A=Math.min(R.start,W.start),k=Math.max(R.end,W.end),O=[];for(let G=A;O.push({...t[G]}),G!==k;G=(G+1)%o);let{cx:N,cz:L,r:B}=hn(O),$=0;for(let G=1;G<O.length;G++){let Q=O[G-1].x-N,q=O[G-1].z-L,X=O[G].x-N,Y=O[G].z-L;$+=Math.abs(Math.atan2(Q*Y-q*X,Q*X+q*Y))}R={seg:{points:O,type:"C_curve",radius:B,centerX:N,centerZ:L,arcAngle:$,arcLength:Se(O)},start:R.start,end:W.end,source:R.source},_++}else V.push(R),R=W}V.push(R)}{if(V.length>1){let R=V.map((D,W)=>{if(W===0)return 0;let I=D.start-V[W-1].end;return I<0&&(I=D.start+o-V[W-1].end),I})}let S=[];for(let R=0;R<V.length;R++){if(S.length===0){S.push(V[R]);continue}let D=S[S.length-1],W=V[R].start-D.end;if(W<0&&(W=V[R].start+o-D.end),W<=30){let I=[...D.seg.points];for(let O=(D.end+1)%o;I.push({...t[O]}),O!==V[R].end;O=(O+1)%o);let{cx:C,cz:H,r:A}=hn(I),k=0;for(let O=1;O<I.length;O++){let N=I[O-1].x-C,L=I[O-1].z-H,B=I[O].x-C,$=I[O].z-H;k+=Math.abs(Math.atan2(N*$-L*B,N*B+L*$))}S[S.length-1]={seg:{points:I,type:"C_curve",radius:A,centerX:C,centerZ:H,arcAngle:k,arcLength:Se(I)},start:D.start,end:V[R].end,source:D.source}}else S.push(V[R])}V=S}return V.map((S,R)=>{let D=S.seg;return D.candidateId=R,D})}function Gl(t){let e=t.length;if(e<6)return null;let n=Nl(t,e,.35);if(n.length===0)return null;let o=n.filter(a=>a.actualAngle!=null&&a.actualAngle>.17);if(o.length===0)return null;o.sort((a,h)=>{let g=a.end>=a.start?a.end-a.start+1:e-a.start+a.end+1;return(h.end>=h.start?h.end-h.start+1:e-h.start+h.end+1)-g});let r=o[0],s=[];for(let a=r.start;s.push({...t[a]}),a!==r.end;a=(a+1)%e);if(s.length<10)return null;let{cx:i,cz:l,r:u,rmsResidual:d}=hn(s);if(u>.1&&d>.1)return null;let f=r.actualAngle,c=s.reduce((a,h,g)=>g===0?0:a+Math.hypot(h.x-s[g-1].x,h.z-s[g-1].z),0);return u>.3&&f>.17?{points:s,type:"C_curve",radius:u,centerX:i,centerZ:l,arcAngle:f,arcLength:c}:null}function ho(t,e,n){let o={...es,...n},r=Date.now(),s=t,i=Array.isArray(e)?e:[],l=[];if(i.length>10)try{for(let S of i){let R=S.x1,D=S.z1,W=S.x2,I=S.z2;if(R==null||D==null||W==null||I==null){let C=S.start?.x,H=S.start?.y,A=S.end?.x,k=S.end?.y;if(C==null||H==null||A==null||k==null)continue;l.push({ax:C,az:H,bx:A,bz:k})}else l.push({ax:R,az:D,bx:W,bz:I})}let v=.1*.1;if(l.length>5){let S=[],R=[],D=new Array(l.length).fill(0);for(let I of t){let C=1/0,H=-1;for(let A=0;A<l.length;A++){let k=l[A],O=k.bx-k.ax,N=k.bz-k.az,L=O*O+N*N,B;if(L<1e-8)B=(I.x-k.ax)**2+(I.y-k.az)**2;else{let $=((I.x-k.ax)*O+(I.y-k.az)*N)/L;$=Math.max(0,Math.min(1,$));let G=k.ax+$*O,Q=k.az+$*N;B=(I.x-G)**2+(I.y-Q)**2}if(B<C&&(C=B,H=A),C<=v)break}C<=v&&(R.push(I),S.push(H),D[H]++)}let W=R;if(o.lineDensityMin>0&&o.lineDensityMinLen>0){let I=new Set;for(let C=0;C<l.length;C++){let H=l[C],A=Math.hypot(H.bx-H.ax,H.bz-H.az);if(A>=o.lineDensityMinLen)continue;(A>.01?D[C]/A:0)<o.lineDensityMin&&I.add(C)}if(I.size>0){let C=[];for(let H=0;H<R.length;H++)I.has(S[H])||C.push(R[H]);W=C}}s=W}}catch(v){console.warn("[\u70B9\u4E91\u8F6E\u5ED3] \u7EBF\u6BB5\u8FC7\u6EE4\u5931\u8D25:",v)}let u=Xl(l),d=[];for(let v of s){let S=v.z;S<o.heightMin||S>o.heightMax||d.push({x:v.x,z:v.y})}if(d.length<50)return Qe(e,r);if(o.sparseRadius>0){let v=new Map,S=o.cellSize;for(let I of d){let C=`${Math.round(I.x/S)},${Math.round(I.z/S)}`;v.has(C)||v.set(C,[]),v.get(C).push(I)}let R=[],D=Math.ceil(o.sparseRadius/S);for(let I=-D;I<=D;I++)for(let C=-D;C<=D;C++)R.push(`${I},${C}`);let W=[];for(let I of d){let C=Math.round(I.x/S),H=Math.round(I.z/S),A=0;for(let k of R){let[O,N]=k.split(",").map(Number),L=v.get(`${C+O},${H+N}`);if(L&&(A+=L.length),A>=o.sparseMinNeighbors)break}A>=o.sparseMinNeighbors&&W.push(I)}d.length=0;for(let I=0;I<W.length;I++)d.push(W[I])}if(d.length<50)return Qe(e,r);let f=Date.now(),{cells:c}=fo(d,o.cellSize),a=new Set;if(o.densityRatio>0&&c.size>10){let v=Array.from(c.values()).sort((D,W)=>D-W),S=v[Math.floor(v.length/2)],R=Math.max(o.densityThreshold,Math.ceil(S*o.densityRatio));for(let[D,W]of c)W>=R&&a.add(D);if(a.size<o.minComponentCells){a.clear();for(let[D,W]of c)W>=o.densityThreshold&&a.add(D)}}else for(let[v,S]of c)S>=o.densityThreshold&&a.add(v);if(a.size<o.minComponentCells)return Qe(e,r);let h=a;o.closeIterations>0&&(h=Wn(a,o.closeIterations));let g=Date.now(),p=Jo(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=ts(v,o.cellSize);S.length>=4&&x.push(S)}let y=Date.now(),w=x.map(v=>{let S=Cn(v,o.simplifyEpsilon);if(S.length>=7)for(let R=0;R<2;R++){let D=S.length,W=S.map(I=>({x:I.x,z:I.z}));for(let I=0;I<D;I++){let C=S[(I-1+D)%D],H=S[I],A=S[(I+1)%D],k=H.x-C.x,O=H.z-C.z,N=A.x-H.x,L=A.z-H.z,B=Math.sqrt(k*k+O*O),$=Math.sqrt(N*N+L*L);if(B<.001||$<.001)continue;if(Math.abs(Math.atan2(k*L-O*N,k*N+O*L))>1.8){let Q=[-2,-1,0,1,2].map(Y=>S[(I+Y+D)%D]),q=Q.map(Y=>Y.x).sort((Y,it)=>Y-it),X=Q.map(Y=>Y.z).sort((Y,it)=>Y-it);W[I]={x:q[2],z:X[2]}}}S=W}if(S=Qo(S),u.length>0&&S.length>=5)for(let R of u){let D=1/0,W=-1;for(let I=0;I<S.length;I++){let C=S[I].x-R.x,H=S[I].z-R.z,A=C*C+H*H;A<D&&(D=A,W=I)}W>=0&&D<.3*.3&&(S[W]={x:R.x,z:R.z})}if(S.length>2){let R=S[0],D=S[S.length-1];(Math.abs(R.x-D.x)>.001||Math.abs(R.z-D.z)>.001)&&S.push({...R})}return S}),z=o.cellSize/2;function M(v){let S=0;for(let R=0;R<v.length;R++){let D=(R+1)%v.length;S+=v[R].x*v[D].z-v[D].x*v[R].z}return S/2}let P=w.map(v=>{if(v.length<3)return v;let S=M(v)>=0;return v.map((R,D)=>{let W=v[(D-1+v.length)%v.length],I=v[(D+1)%v.length],C=I.x-W.x,H=I.z-W.z;if(Math.sqrt(C*C+H*H)<.001)return{...R};let k=S?H:-H,O=S?-C:C,N=Math.sqrt(k*k+O*O);return N<.001?{...R}:{x:R.x+k/N*z,z:R.z+O/N*z}})}),E=Date.now(),T=[];for(let v=0;v<P.length;v++){let S=P[v];S.length<3||T.push({id:-v-1,points:S,length:Se(S),pointCount:S.length,type:"straight",isMain:!1})}let V=Date.now()-r,_=[];for(let v of w){let S=Ur(v);for(let D of S)_.push(D);let R=Gl(v);R&&_.push(R)}return{mainWalls:[],noiseWalls:[],contours:T,curvedSegments:_,filteredPoints:s,stats:{totalRawLines:e?.length??t.length,totalWalls:0,mainCount:0,noiseCount:T.length,elapsedMs:V}}}function Kr(t,e){let n=e?.cellSize??.05,o=e?.closeIterations??2,r=e?.minComponentCells??10,s=e?.simplifyEpsilon??.02,i=Date.now();if(t.length<3)return Qe(t,i);let l=t.map(T=>({x1:T.x1,z1:T.z1,x2:T.x2,z2:T.z2})),{active:u}=Zr(l,n);if(u.size<r)return Qe(t,i);let d=Date.now(),f=Wn(u,o),c=Date.now(),a=Jo(f).filter(T=>T.size>=r);if(a.length===0)return Qe(t,i);let h=a.reduce((T,V)=>T.size>=V.size?T:V),g=Date.now(),p=ts(h,n);if(p.length<4)return Qe(t,i);let b=Date.now(),m=Cn(p,s);if(m=Qo(m),m.length>2){let T=m[0],V=m[m.length-1];(Math.abs(T.x-V.x)>.001||Math.abs(T.z-V.z)>.001)&&m.push({...T})}let x=n/2;function y(T){let V=0;for(let _=0;_<T.length;_++){let v=(_+1)%T.length;V+=T[_].x*T[v].z-T[v].x*T[_].z}return V/2}let w=y(m)>=0,z=m.map((T,V)=>{let _=m[(V-1+m.length)%m.length],v=m[(V+1)%m.length],S=v.x-_.x,R=v.z-_.z;if(Math.sqrt(S*S+R*R)<.001)return{...T};let W=w?R:-R,I=w?-S:S,C=Math.sqrt(W*W+I*I);return C<.001?{...T}:{x:T.x+W/C*x,z:T.z+I/C*x}}),M=Date.now(),P=[];z.length>=3&&P.push({id:-1,points:z,length:Se(z),pointCount:z.length,type:"straight",isMain:!0});let E=Date.now()-i;return{mainWalls:[],noiseWalls:[],contours:P,stats:{totalRawLines:t.length,totalWalls:0,mainCount:0,noiseCount:P.length,elapsedMs:E}}}function Qe(t,e){return{mainWalls:[],noiseWalls:[],stats:{totalRawLines:t?.length??0,totalWalls:0,mainCount:0,noiseCount:0,elapsedMs:Date.now()-e}}}function mo(t,e,n){if(!t.length||n<=1)return t;let o=new Map;for(let l of t){let u=Math.floor(l.x/e),d=Math.floor(l.y/e),f=`${u},${d}`;o.has(f)||o.set(f,[]),o.get(f).push(l)}let r=new Map;for(let[l,u]of o){let[d,f]=l.split(","),c=parseInt(d),a=parseInt(f),h=0;for(let g=-2;g<=2;g++)for(let p=-2;p<=2;p++){let b=`${c+g},${a+p}`;h+=o.get(b)?.length??0}r.set(l,h)}let s=[],i=0;for(let l of t){let u=Math.floor(l.x/e),d=Math.floor(l.y/e),f=`${u},${d}`;(r.get(f)??0)>=n?s.push(l):i++}return s}function go(t,e,n){if(!t.length||n<=1||e<=0)return t;let o=new Map;for(let s of t){let i=Math.floor(s.x/e),l=Math.floor(s.y/e),u=Math.floor(s.z/e),d=`${i},${l},${u}`;o.has(d)||o.set(d,[]),o.get(d).push(s)}let r=[];for(let s of o.values())if(s.length>=n){let i=s.reduce((d,f)=>d+f.x,0)/s.length,l=s.reduce((d,f)=>d+f.y,0)/s.length,u=s.reduce((d,f)=>d+f.z,0)/s.length;r.push({x:i,y:l,z:u})}return r}function Qr(t,e,n){let o=go(t,e,n),r=t.length-o.length;return o}function Jr(t){let e=[];for(let d of t){let f=d.originalPoints??d.points??[];if(!Array.isArray(f)||f.length<2)continue;let c=Math.min(f.length,200);for(let a=1;a<c;a++){let h=Math.hypot(f[a].x-f[a-1].x,f[a].y-f[a-1].y,f[a].z-f[a-1].z);h>.001&&e.push(h)}}let n={voxelSize:.08,minPoints:3,minCentroids:3};if(e.length<10)return n;e.sort((d,f)=>d-f);let o=e[Math.floor(e.length/2)],r=Math.max(.03,Math.min(.25,o*3.5));r=Math.round(r*100)/100;let s=Math.pow(r/o,2),i=Math.max(2,Math.min(5,Math.round(s/4))),l=e.length/Math.max(1,t.length),u=Math.max(2,Math.min(4,Math.round(l/50)));return{voxelSize:r,minPoints:i,minCentroids:u}}function ti(t,e,n,o,r=3){if(!t.length||n<=0||o<=1)return{data:t,lines:e,removedCount:0};let s=[],i=[],l=0;for(let u=0;u<t.length;u++){let d=t[u],f=d.originalPoints??d.points??[];if(!Array.isArray(f)||f.length===0){s.push(d),i.push(e[u]);continue}let c=go(f,n,o);c.length>=r?(d.originalPoints&&(d.originalPoints=c),d.points&&(d.points=c),s.push(d),i.push(e[u])):l++}return{data:s,lines:i,removedCount:l}}function ei(t,e,n,o){let r=[],s=[],i=0;for(let l=0;l<t.length;l++){let u=t[l],d=u.originalPoints??u.points??[],c=(Array.isArray(d)?d.filter(b=>b&&b.x!==void 0&&b.y!==void 0):[]).length;if(c===0){r.push(u),s.push({...e[l],id:r.length-1});continue}let a=u.start??u,h=u.end??u,g=Math.hypot(h.x??0-a.x??0,h.y??0-a.y??0);if(g>=o||g<=.01){r.push(u),s.push({...e[l],id:r.length-1});continue}if(c/g<n){i++;continue}r.push(u),s.push({...e[l],id:r.length-1})}return{data:r,lines:s}}function Je(t,e,n,o,r,s){let i=r-n,l=s-o,u=i*i+l*l;if(u===0)return Math.hypot(t-n,e-o);let d=((t-n)*i+(e-o)*l)/u;return d=Math.max(0,Math.min(1,d)),Math.hypot(t-(n+d*i),e-(o+d*l))}function ns(t,e,n=.2){for(let o of e)if(Je(o.x,o.z,t.x1,t.z1,t.x2,t.z2)<=n)return!0;return!1}function ni(t,e,n=.2){let o=1/0,r={x:0,z:0};for(let i of e){let l=Je(i.x,i.z,t.x1,t.z1,t.x2,t.z2);l<o&&(o=l,r=i)}return o<=n}function oi(t,e,n,o=!0){function g(y,w,z,M){let P=z.points[0],E=z.points[z.points.length-1];return Math.hypot(y-P.x,w-P.z)<=M||Math.hypot(y-E.x,w-E.z)<=M}function p(y,w,z,M){for(let P=0;P<z.points.length-1;P++)if(Je(y,w,z.points[P].x,z.points[P].z,z.points[P+1].x,z.points[P+1].z)<=M)return!0;return!1}function b(y,w,z){let M=0,P=y[0],E=y[y.length-1];for(let T of w)if(g(P.x,P.z,T,z)||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,_=b(w,e,.8),v=y.arcAngle>1.745&&y.radius<5,S=y.radius>15&&P>.15&&w.length>=10,R=P>.12&&y.radius>1&&y.radius<4&&y.arcAngle>=.35&&w.length>=3;if(o&&console.log(` \u7279\u5F81: \u5F26\u957F/\u534A\u5F84=${P.toFixed(3)} \u5F13\u9AD8/\u5F26\u957F=${V.toFixed(4)} \u8FDE\u63A5=${_}/2${v?" \u5927\u5F27\u89D2\u8C41\u514D":""}${S?" \u5927\u534A\u5F84\u7ED3\u6784\u5F27":""}${R?" \u5408\u7406\u77ED\u5F27\u8C41\u514D":""}`),w.length>20&&y.arcAngle>5.2&&y.radius>.2){o&&console.log(` \u2192 \u8FD1\u95ED\u5408\u5706\u8C41\u514D(\u5F27\u89D2=${(y.arcAngle*180/Math.PI).toFixed(1)}\xB0, ${w.length}pts)`),x.push(y);continue}if(P<.15)if(_>=2&&y.arcAngle>=.35)o&&console.log(` \u2192 \u5F26\u957F/\u534A\u5F84=${P.toFixed(3)} < ${.15}\uFF0C\u4F46\u4E24\u7AEF\u8FDE\u63A5+\u5F27\u89D2>20\xB0\uFF0C\u8C41\u514D`);else{o&&console.log(` \u2192 \u5F26\u957F/\u534A\u5F84=${P.toFixed(3)} < ${.15}\uFF0C\u8F6E\u5ED3\u6296\u52A8\u5047\u5F27 \u8FC7\u6EE4`);continue}let D=_>=2?.025:.035;if(V<D&&!v&&!R&&!S){o&&console.log(` \u2192 \u5F13\u9AD8/\u5F26\u957F=${V.toFixed(4)} < ${D}(${_>=2?"\u5BBD\u677E":"\u6807\u51C6"})\uFF0C\u6781\u6241\u5F27(\u76F4\u7EBF\u6BB5\u566A\u58F0) \u8FC7\u6EE4`);continue}if(!v&&!R&&!S){if(y.arcAngle<.17){o&&console.log(` \u2192 \u5F27\u89D2<${(.17*180/Math.PI).toFixed(0)}\xB0 \u8FC7\u6EE4`);continue}if(y.arcAngle<.35&&_<2){o&&console.log(` \u2192 \u5F27\u89D2<${(.35*180/Math.PI).toFixed(0)}\xB0 \u4E14\u672A\u4E24\u7AEF\u8FDE\u63A5 \u8FC7\u6EE4`);continue}}if(P>2.01){o&&console.log(` \u2192 \u5F26\u957F/\u534A\u5F84=${P.toFixed(3)} > 2.01\uFF0C\u5F26\u957F\u8D85\u8FC7\u76F4\u5F84\uFF0C\u5F02\u5E38 \u8FC7\u6EE4`);continue}if(!v&&!S){let W=_>=2?2.5:1.5,I=Math.floor(w.length/2),C=w[I].x-w[0].x,H=w[I].z-w[0].z,A=w[w.length-1].x-w[I].x,k=w[w.length-1].z-w[I].z,O=Math.atan2(H,C),N=Math.atan2(k,A),L=Math.abs(N-O);if(L>Math.PI&&(L=2*Math.PI-L),L>60*Math.PI/180&&L>y.arcAngle*W){o&&console.log(` \u2192 V\u5F62\u62D0\u89D2\u8FC7\u6EE4 \u8F6C\u89D2=${(L*180/Math.PI).toFixed(1)}\xB0 > \u5F27\u89D2\xD7${W.toFixed(1)}=${(y.arcAngle*180/Math.PI*W).toFixed(1)}\xB0`);continue}}if(n&&n.length>5&&!(y.radius>15&&y.arcAngle>.26)){let W=w[0],I=w[w.length-1],C=.3,H=null,A=1/0,k=null,O=1/0;for(let N of n){let L=Je(W.x,W.z,N.x1,N.z1,N.x2,N.z2),B=Je(I.x,I.z,N.x1,N.z1,N.x2,N.z2);L<C&&L<A&&(H=N,A=L),B<C&&B<O&&(k=N,O=B)}if(!H||!k)console.log(` [\u7EBF\u6BB5\u8F6C\u89D2\u8C03\u8BD5 #${M}] \u672A\u627E\u5230\u5B8C\u6574\u7EBF\u6BB5: \u8D77\u7AEF=${!!H}(d=${A.toFixed(3)}) \u672B\u7AEF=${!!k}(d=${O.toFixed(3)})`);else if(H===k){console.log(" \u2192 \u7EBF\u6BB5\u8F6C\u89D2\u9A8C\u8BC1: \u5F27\u4E24\u7AEF\u5728\u540C\u4E00\u6761\u7EBF\u6BB5\u4E0A, \u76F4\u7EBF\u566A\u58F0\u5047\u5F27 \u8FC7\u6EE4");continue}else{let N=H.x2-H.x1,L=H.z2-H.z1,B=k.x2-k.x1,$=k.z2-k.z1,G=Math.sqrt(N*N+L*L),Q=Math.sqrt(B*B+$*$);if(G>.01&&Q>.01){let q=Math.abs(Math.atan2(N*$-L*B,N*B+L*$)),X=q*180/Math.PI;if(console.log(` [\u7EBF\u6BB5\u8F6C\u89D2\u8C03\u8BD5 #${M}] \u5F27\u4E24\u7AEF\u6BB5\u5939\u89D2=${X.toFixed(1)}\xB0 \u5F27\u89D2=${(y.arcAngle*180/Math.PI).toFixed(1)}\xB0`),q>.35&&q<3.05){let Y=q>2.09;if(!Y||y.arcAngle<.44){console.log(` \u2192 \u7EBF\u6BB5\u8F6C\u89D2\u9A8C\u8BC1: \u5F27\u4E24\u7AEF\u6BB5\u5939\u89D2=${X.toFixed(1)}\xB0\uFF0C${Y?"\u659C\u5899":"\u6298\u5899"}\u78E8\u5706\u5047\u5F27 \u8FC7\u6EE4`);continue}}}}}o&&console.log(" \u2192 \u2713 \u4FDD\u7559"),x.push(y)}return o&&console.log(`[\u56DE\u52A0\u5224\u65AD] ${t.length} \u2192 ${x.length} \u4E2A\u5F27\u6BB5`),x}function si(t,e){for(let n=0;n<t.length;n++){let o=t[n],r=[];for(let i of e)ns(i,o.points)&&r.push({id:i.id,len:Math.hypot(i.x2-i.x1,i.z2-i.z1)});r.sort((i,l)=>l.len-i.len);let s=r.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 ${r.length} \u6761: ${s}`)}}var ss={gridSize:2,connectDist:.8,angleTol:25,minLength:.8,minPointCount:3,hardCornerThreshold:30,minArea:5,minCurvePoints:6,curveStraightDist:.25,longWallMinLength:5};function ri(t){if(!t.length)return{rotated:[],mainAngle:0};let e=180,n=new Array(e).fill(0),o=Math.PI/e;for(let f of t){let c=f.x2-f.x1,a=f.z2-f.z1,h=Math.sqrt(c*c+a*a);if(h<.01)continue;let g=Pe(c,a),p=Math.floor(g/o);p>=e&&(p=e-1),n[p]+=h}let r=new Array(e).fill(0),s=5;for(let f=0;f<e;f++){let c=0;for(let a=-s;a<=s;a++){let h=f+a;h<0&&(h+=e),h>=e&&(h-=e),c+=n[h]}r[f]=c}let i=0,l=0;for(let f=0;f<e;f++)r[f]>i&&(i=r[f],l=f);let u=(l+.5)*o;return{rotated:t.map(f=>{let c=Vn(f.x1,f.z1,-u),a=Vn(f.x2,f.z2,-u);return{...f,x1:c.x,z1:c.z,x2:a.x,z2:a.z}}),mainAngle:u}}function ii(t,e){let n=new Map;for(let o of t){let r=(o.x1+o.x2)/2,s=(o.z1+o.z2)/2,i=Math.floor(r/e),l=Math.floor(s/e),u=`${i},${l}`;n.has(u)||n.set(u,[]),n.get(u).push(o)}return n}function ai(t,e,n){if(t.length===0)return[];let o=new Set,r=[];for(let s of t){if(o.has(s.id))continue;let i=[s],l=[],u=new Set([s.id]);o.add(s.id);let d=!0;for(;d;){d=!1;let a=i[i.length-1],h=a.x2,g=a.z2,p=Pe(a.x2-a.x1,a.z2-a.z1),b=null,m=e;for(let x of t){if(o.has(x.id))continue;let y=be(h,g,x.x1,x.z1),w=be(h,g,x.x2,x.z2),z=w<y,M=Math.min(y,w);if(M>m)continue;let P=z?Pe(x.x1-x.x2,x.z1-x.z2):Pe(x.x2-x.x1,x.z2-x.z1);Math.abs(vn(P-p))>n||(b=x,m=M)}if(b){o.add(b.id),u.add(b.id);let x=i[i.length-1],y=be(x.x2,x.z2,b.x1,b.z1),w=be(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}),d=!0}}for(d=!0;d;){d=!1;let a=l.length>0?l[l.length-1]:i[0],h=l.length>0?a.x2:a.x1,g=l.length>0?a.z2:a.z1,p=l.length>0?Pe(a.x2-a.x1,a.z2-a.z1):Pe(a.x2-a.x1,a.z2-a.z1),b=null,m=e;for(let x of t){if(o.has(x.id))continue;let y=be(h,g,x.x1,x.z1),w=be(h,g,x.x2,x.z2),z=w<y,M=Math.min(y,w);if(M>m)continue;let P=z?Pe(x.x1-x.x2,x.z1-x.z2):Pe(x.x2-x.x1,x.z2-x.z1);Math.abs(vn(P-p))>n||(b=x,m=M)}if(b){o.add(b.id),u.add(b.id);let x=be(h,g,b.x1,b.z1),y=be(h,g,b.x2,b.z2);x<=y?l.push({id:b.id,x1:b.x2,z1:b.z2,x2:b.x1,z2:b.z1}):l.push({...b}),d=!0}}let f=[];for(let a=l.length-1;a>=0;a--){let h=l[a];a===l.length-1&&f.push({x:h.x1,z:h.z1}),f.push({x:h.x2,z:h.z2})}for(let a=0;a<i.length;a++){let h=i[a];a===0&&f.length===0&&f.push({x:h.x1,z:h.z1}),f.push({x:h.x2,z:h.z2})}let c=[];for(let a of f){if(c.length>0){let h=c[c.length-1];if(Math.abs(a.x-h.x)<.001&&Math.abs(a.z-h.z)<.001)continue}c.push(a)}if(c.length>=2){let a=Se(c);r.push({points:c,length:a,pointCount:i.length+l.length,lineIds:[...u]})}}return r}function li(t){if(t.length<3)return[];let e=[];for(let n=1;n<t.length-1;n++){let o=t[n].x-t[n-1].x,r=t[n].z-t[n-1].z,s=t[n+1].x-t[n].x,i=t[n+1].z-t[n].z,l=Math.atan2(r,o),u=Math.atan2(i,s),d=vn(u-l);e.push(d)}return e}function ci(t,e=6){if(t.length<3)return"straight";let n=t[0],o=t[t.length-1],r=o.x-n.x,s=o.z-n.z;if(Math.sqrt(r*r+s*s)>.1){let f=0;for(let c of t){let a=In(c.x,c.z,n.x,n.z,o.x,o.z);a>f&&(f=a)}if(f<.05)return"straight"}let l=li(t);if(l.reduce((f,c)=>f+Math.abs(c),0)<.1||t.length<e)return"straight";let d=0;for(let f=0;f<l.length-1;f++)l[f]*l[f+1]<0&&d++;return d>0?"S_curve":"C_curve"}function ui(t,e){if(t.length<3)return[t];let n=uo(e),o=li(t),r=[],s=0;for(let i=0;i<o.length;i++)Math.abs(o[i])>n&&(r.push(t.slice(s,i+2)),s=i+1);return s<t.length-1&&r.push(t.slice(s)),r}function fi(t,e,n=6){let o=[],r=0;for(let s of t){let i=ui(s.points,e);for(let l of i){if(l.length<2)continue;let u=ci(l,n),d=Se(l),f=d/(s.length||1),c=Math.max(1,Math.round(s.pointCount*f));o.push({id:r++,points:l,length:d,pointCount:c,lineIds:s.lineIds,type:u,isMain:!1})}}return o}function di(t,e){if(t.length<3)return new Set;let n=.15;function o(d,f){return Math.round(d/n)+"_"+Math.round(f/n)}let r=new Map,s=0;function i(d,f){let c=o(d,f),a=r.get(c);if(a)return a;let h=Math.round(d/n),g=Math.round(f/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=r.get(y);if(!w)continue;let z=w.x-d,M=w.z-f,P=z*z+M*M;P<b&&(b=P,p=w)}return p?(r.set(c,p),p):(a={id:s++,x:d,z:f,edges:[]},r.set(c,a),a)}for(let d of t){if(d.points.length<2)continue;let f=d.points[0],c=d.points[d.points.length-1],a=i(f.x,f.z),h=i(c.x,c.z);if(a.id===h.id)continue;let g={to:h,wallId:d.id,visited:!1,twin:null},p={to:a,wallId:d.id,visited:!1,twin:g};g.twin=p,a.edges.push(g),h.edges.push(p)}for(let d of r.values())d.edges.sort((f,c)=>{let a=Math.atan2(f.to.z-d.z,f.to.x-d.x),h=Math.atan2(c.to.z-d.z,c.to.x-d.x);return a-h});let l=new Set,u=new Set;for(let d of r.values())for(let f of d.edges)u.add(f);for(let d of u){if(d.visited)continue;let f=[],c=d,a=u.size+10;for(;!c.visited&&f.length<a;){c.visited=!0,f.push(c);let h=c.to,g=c.twin,p=h.edges.indexOf(g);if(p<0)break;let b=(p+1)%h.edges.length;c=h.edges[b]}if(f.length>=3){let h=f[0];if(f[f.length-1].to.id===h.from?.id){let p=[],b=new Set,m=null;for(let x of r.values())if(x.edges.includes(f[0])){m=x;break}if(!m)continue;p.push({x:m.x,z:m.z});for(let x of f)b.add(x.wallId),p.push({x:x.to.x,z:x.to.z});if(f[f.length-1].to.id===m.id&&Ko(p)>=e)for(let y of b)l.add(y)}}}return l}function mn(t,e){let n={...ss,...e},o=Date.now(),{rotated:r,mainAngle:s}=ri(t),i=Date.now(),l=ii(r,n.gridSize),u=Date.now(),d=uo(n.angleTol),f=[];for(let v of l.values()){let S=v.map(D=>({id:D.id,x1:D.x1,z1:D.z1,x2:D.x2,z2:D.z2})),R=ai(S,n.connectDist,d);f.push(...R)}let c=Date.now(),a=new Set,h=f.filter(v=>{let S=v.length>=n.minLength||v.pointCount>=n.minPointCount;return S&&a.add(v),S}),g=f.filter(v=>!a.has(v)),p=Date.now(),b=fi(h,n.hardCornerThreshold,n.minCurvePoints),m=Date.now(),x=di(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],W=v[v.length-1],I=S[0],C=S[S.length-1];return Math.hypot(D.x-I.x,D.z-I.z)<R||Math.hypot(D.x-C.x,D.z-C.z)<R||Math.hypot(W.x-I.x,W.z-I.z)<R||Math.hypot(W.x-C.x,W.z-C.z)<R}let z=[],M=[];for(let v of b){if(v.type==="straight"&&v.points.length>=2){let S=!1;for(let R of b){if(R.id===v.id||R.type==="straight"||w(v.points,R.points))continue;if(Gr(v.points,R.points)<n.curveStraightDist){S=!0;break}}if(S){z.push({...v,id:-z.length-1});continue}}M.push(v)}let P=Date.now(),E=M,T=[];for(let v=0;v<g.length;v++){let S=g[v];T.push({id:-v-1,points:S.points,length:S.length,pointCount:S.pointCount,lineIds:S.lineIds,type:"straight",isMain:!1})}for(let v of z)T.push(v);let V=v=>v.map(S=>({...S,points:S.points.map(R=>Vn(R.x,R.z,s))})),_=Date.now()-o;return{mainWalls:V(E),noiseWalls:V(T),stats:{totalRawLines:t.length,totalWalls:b.length,mainCount:E.length,noiseCount:T.length,elapsedMs:_}}}function rs(t,e,n){let o={...es,...n},r=Date.now(),s=[];for(let h of t){let g=h.z;g<o.heightMin||g>o.heightMax||s.push({x:h.x,z:h.y})}if(s.length<100)return mn(e);let{cells:i}=fo(s,o.cellSize),l=new Set;for(let[h,g]of i)g>=o.densityThreshold&&l.add(h);let u=Wn(l,o.morphIterations),d=[],f={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){d.push(h);continue}let y=0,w=9;for(let z=0;z<w;z++){let M=z/(w-1),P=g+(b-g)*M,E=p+(m-p)*M,T=Math.floor(P/o.cellSize),V=Math.floor(E/o.cellSize);u.has(T+","+V)&&y++}y>=Math.ceil(w*.5)?d.push(h):f.lowDensity++,f.total++}if(d.length<5)return mn(e);let c=mn(d),a=Date.now()-r;return c}function os(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 is(t,e,n){let o={outlierEnabled:!0,outlierCellSize:.1,outlierMinNeighbors:3,densityFilterEnabled:!1,...n},r=Date.now(),s=mn(t),i=s.mainWalls,l=s.noiseWalls,u=new Set(i.map(M=>M.id)),d=[];for(let M=0;M<e.length;M++){if(!u.has(M))continue;let P=e[M];if(!(!P||!Array.isArray(P)))for(let E of P)E&&E.x!==void 0&&E.y!==void 0&&E.z!==void 0&&d.push({x:E.x,y:E.y,z:E.z})}let f=d.length,c=d;o.outlierEnabled&&c.length>0&&(c=mo(c,o.outlierCellSize,o.outlierMinNeighbors));let a=[],h=[];if(c.length>=100){let M=o.pcConfig??{},P=ho(c,t,{cellSize:.05,densityThreshold:1,minComponentCells:8,simplifyEpsilon:.008,heightMin:.3,heightMax:2.8,closeIterations:8,densityRatio:.12,...M});a=P.contours??[],h=P.curvedSegments??[]}let g=[];if(h.length>0)for(let M=0;M<h.length;M++){let E=h[M].points;if(E.length<2)continue;let T=1/0,V=-1/0,_=1/0,v=-1/0;for(let D of E)D.x<T&&(T=D.x),D.x>V&&(V=D.x),D.z<_&&(_=D.z),D.z>v&&(v=D.z);let S=[];for(let D of t)ni(D,E,.2)&&S.push(D.id);let R=E.map(D=>({x:D.x,y:D.z,z:0}));g.push({id:M,originalPoints:R,rawLineIds:S})}let p;if(o.densityFilterEnabled&&c.length>0&&i.length>0){let M=new Set(s.mainWalls.map(T=>T.id)),P=t.filter(T=>M.has(T.id));p=rs(c,P).mainWalls}let b=new Set;for(let M of s.mainWalls)if(M.lineIds)for(let P of M.lineIds)b.add(P);let m=new Set;for(let M of s.noiseWalls)if(M.lineIds)for(let P of M.lineIds)m.add(P);let x=t.filter(M=>b.has(M.id)).map(os),y=t.filter(M=>m.has(M.id)).map(os),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(os)}let z=Date.now()-r;return{mainWalls:x,noiseWalls:y,contours:a,curvedSegments:h,lineCurves:g.length>0?g:void 0,filteredPoints:c,secondMainWalls:w,stats:{totalRawLines:t.length,firstMainCount:x.length,firstNoiseCount:y.length,contourCount:a.length,curvedCount:h.length,secondMainCount:p?.length,mainWallPointCount:f,filteredPointCount:c.length,elapsedMs:z}}}function hi(t,e){let n=Array.isArray(t)?t:t?.data??[],o=[],r=[];for(let l=0;l<n.length;l++){let u=n[l],d=u.start??u,f=u.end??u;o.push({id:l,x1:d.x??0,y1:d.z??0,z1:d.y??0,x2:f.x??0,y2:f.z??0,z2:f.y??0});let c=u.originalPoints??u.points??[],a=Array.isArray(c)?c.filter(h=>h&&h.x!==void 0):[];r.push(a)}let s=is(o,r,e),i=Array.isArray(t)?{data:t}:{...t};return i.lineCurves=s.lineCurves??[],i.lineCurveNum=s.curvedSegments?.length??0,i}export{ss as CONFIG,no as analyzeDoorQuad,je as analyzeQuad,go as applyVoxelFilter,lo as attachWindows,Ke as calcAngle,qi as checkBeamIsReasonable,Yr as classifyWallByPointCloudPCA,mn as classifyWallShapes,Ya as computeContour,Ye as computeDoorLocalFloorZ,Xe as computeLocalFloorZ,Jr as computeVoxelParams,ei as densityPreFilter,un as detectDoorPerpendicularWalls,Hl as detectPerpWalls,Pn as detectPerpendicularWalls,Aa as drawStaircase,oi as filterFalseArcCurves,jr as filterWalls,Xr as filterWallsHard,Dn as findDoorWalls,Fr as findMainByLoops,Tn as findWindowWalls,Ni as getBeamLine,Zi as getColLine,Pi as getLineCheckResults,fn as getMatcherAPI,ka as getMergeFloorMeaning,La as getMergeMeaning,Ei as getOneLineCheckResults,Ti as getOneLineClusterResults,Ba as getStaircase,ns as isRawLineNearArc,si as logArcRawSegments,Cl as matchWalls,$r as mergeCollinear,Ge as mergeCollinearSegments,Ue as mergeDoorCollinearSegments,_l as mergeWallSegments,io as normalizeAngles,$t as pointToDoorSegmentDist,ro as pointToSegDist,Je as pointToSegDist2D,Ve as pointToSegmentDist,qo as processData,Zo as processDoorData,rs as processFilteredByPointCloud,ho as processFromPointCloud,Kr as processFromSegments,Bl as processPipeline,hi as processSegments,Wl as processWallData,mo as removeOutlierPoints,Ie as rotateXZ,is as runMainWallPipeline,Nr as spatialGrid,Rn as splitDoorWallSegment,Al as splitWallSeg,Sn as splitWallSegment,_i as updateStEdPoint,Qr as voxelFilter,ti as voxelFilterLines};
|
|
1
|
+
var mi=Object.create;var as=Object.defineProperty;var gi=Object.getOwnPropertyDescriptor;var pi=Object.getOwnPropertyNames;var xi=Object.getPrototypeOf,yi=Object.prototype.hasOwnProperty;var Be=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var bi=(t,e,n,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of pi(e))!yi.call(t,r)&&r!==n&&as(t,r,{get:()=>e[r],enumerable:!(o=gi(e,r))||o.enumerable});return t};var wi=(t,e,n)=>(n=t!=null?mi(xi(t)):{},bi(e||!t||!t.__esModule?as(n,"default",{value:t,enumerable:!0}):n,t));var Hs=Be((Ro,Do)=>{(function(t,e){typeof Ro=="object"&&typeof Do<"u"?Do.exports=e():typeof define=="function"&&define.amd?define(e):(t=t||self,t.RBush=e())})(Ro,function(){"use strict";function t(y,w,z,M,P){e(y,w,z||0,M||y.length-1,P||o)}function e(y,w,z,M,P){for(;M>z;){if(M-z>600){var E=M-z+1,T=w-z+1,V=Math.log(E),_=.5*Math.exp(2*V/3),v=.5*Math.sqrt(V*_*(E-_)/E)*(T-E/2<0?-1:1),S=Math.max(z,Math.floor(w-T*_/E+v)),R=Math.min(M,Math.floor(w+(E-T)*_/E+v));e(y,w,S,R,P)}var D=y[w],W=z,I=M;for(n(y,z,w),P(y[M],D)>0&&n(y,z,M);W<I;){for(n(y,W,I),W++,I--;P(y[W],D)<0;)W++;for(;P(y[I],D)>0;)I--}P(y[z],D)===0?n(y,z,I):(I++,n(y,I,M)),I<=w&&(z=I+1),w<=I&&(M=I-1)}}function n(y,w,z){var M=y[w];y[w]=y[z],y[z]=M}function o(y,w){return y<w?-1:y>w?1:0}var r=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()};r.prototype.all=function(){return this._all(this.data,[])},r.prototype.search=function(w){var z=this.data,M=[];if(!b(w,z))return M;for(var P=this.toBBox,E=[];z;){for(var T=0;T<z.children.length;T++){var V=z.children[T],_=z.leaf?P(V):V;b(w,_)&&(z.leaf?M.push(V):p(w,_)?this._all(V,M):E.push(V))}z=E.pop()}return M},r.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},r.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},r.prototype.insert=function(w){return w&&this._insert(w,this.data.height-1),this},r.prototype.clear=function(){return this.data=m([]),this},r.prototype.remove=function(w,z){if(!w)return this;for(var M=this.data,P=this.toBBox(w),E=[],T=[],V,_,v;M||E.length;){if(M||(M=E.pop(),_=E[E.length-1],V=T.pop(),v=!0),M.leaf){var S=s(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,_=M,M=M.children[0]):_?(V++,M=_.children[V],v=!1):M=null}return this},r.prototype.toBBox=function(w){return w},r.prototype.compareMinX=function(w,z){return w.minX-z.minX},r.prototype.compareMinY=function(w,z){return w.minY-z.minY},r.prototype.toJSON=function(){return this.data},r.prototype.fromJSON=function(w){return this.data=w,this},r.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},r.prototype._build=function(w,z,M,P){var E=M-z+1,T=this._maxEntries,V;if(E<=T)return V=m(w.slice(z,M+1)),i(V,this.toBBox),V;P||(P=Math.ceil(Math.log(E)/Math.log(T)),T=Math.ceil(E/Math.pow(T,P-1))),V=m([]),V.leaf=!1,V.height=P;var _=Math.ceil(E/T),v=_*Math.ceil(Math.sqrt(T));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,_,this.compareMinY);for(var D=S;D<=R;D+=_){var W=Math.min(D+_-1,R);V.children.push(this._build(w,D,W,P-1))}}return i(V,this.toBBox),V},r.prototype._chooseSubtree=function(w,z,M,P){for(;P.push(z),!(z.leaf||P.length-1===M);){for(var E=1/0,T=1/0,V=void 0,_=0;_<z.children.length;_++){var v=z.children[_],S=c(v),R=h(w,v)-S;R<T?(T=R,E=S<E?S:E,V=v):R===T&&S<E&&(E=S,V=v)}z=V||z.children[0]}return z},r.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),u(T,P);z>=0&&E[z].children.length>this._maxEntries;)this._split(E,z),z--;this._adjustParentBBoxes(P,E,z)},r.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)},r.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)},r.prototype._chooseSplitIndex=function(w,z,M){for(var P,E=1/0,T=1/0,V=z;V<=M-z;V++){var _=l(w,0,V,this.toBBox),v=l(w,V,M,this.toBBox),S=g(_,v),R=c(_)+c(v);S<E?(E=S,P=V,T=R<T?R:T):S===E&&R<T&&(T=R,P=V)}return P||M-z},r.prototype._chooseSplitAxis=function(w,z,M){var P=w.leaf?this.compareMinX:d,E=w.leaf?this.compareMinY:f,T=this._allDistMargin(w,z,M,P),V=this._allDistMargin(w,z,M,E);T<V&&w.children.sort(P)},r.prototype._allDistMargin=function(w,z,M,P){w.children.sort(P);for(var E=this.toBBox,T=l(w,0,z,E),V=l(w,M-z,M,E),_=a(T)+a(V),v=z;v<M-z;v++){var S=w.children[v];u(T,w.leaf?E(S):S),_+=a(T)}for(var R=M-z-1;R>=z;R--){var D=w.children[R];u(V,w.leaf?E(D):D),_+=a(V)}return _},r.prototype._adjustParentBBoxes=function(w,z,M){for(var P=M;P>=0;P--)u(z[P],w)},r.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 s(y,w,z){if(!z)return w.indexOf(y);for(var M=0;M<w.length;M++)if(z(y,w[M]))return M;return-1}function i(y,w){l(y,0,y.children.length,w,y)}function l(y,w,z,M,P){P||(P=m(null)),P.minX=1/0,P.minY=1/0,P.maxX=-1/0,P.maxY=-1/0;for(var E=w;E<z;E++){var T=y.children[E];u(P,y.leaf?M(T):T)}return P}function u(y,w){return y.minX=Math.min(y.minX,w.minX),y.minY=Math.min(y.minY,w.minY),y.maxX=Math.max(y.maxX,w.maxX),y.maxY=Math.max(y.maxY,w.maxY),y}function d(y,w){return y.minX-w.minX}function f(y,w){return y.minY-w.minY}function c(y){return(y.maxX-y.minX)*(y.maxY-y.minY)}function a(y){return y.maxX-y.minX+(y.maxY-y.minY)}function h(y,w){return(Math.max(w.maxX,y.maxX)-Math.min(w.minX,y.minX))*(Math.max(w.maxY,y.maxY)-Math.min(w.minY,y.minY))}function g(y,w){var z=Math.max(y.minX,w.minX),M=Math.max(y.minY,w.minY),P=Math.min(y.maxX,w.maxX),E=Math.min(y.maxY,w.maxY);return Math.max(0,P-z)*Math.max(0,E-M)}function 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 r})});var As=Be((vo,Vo)=>{(function(t,e){typeof vo=="object"&&typeof Vo<"u"?Vo.exports=e():typeof define=="function"&&define.amd?define(e):(t=t||self,t.TinyQueue=e())})(vo,function(){"use strict";var t=function(o,r){if(o===void 0&&(o=[]),r===void 0&&(r=e),this.data=o,this.length=this.data.length,this.compare=r,this.length>0)for(var s=(this.length>>1)-1;s>=0;s--)this._down(s)};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],r=this.data.pop();return this.length--,this.length>0&&(this.data[0]=r,this._down(0)),o}},t.prototype.peek=function(){return this.data[0]},t.prototype._up=function(o){for(var r=this,s=r.data,i=r.compare,l=s[o];o>0;){var u=o-1>>1,d=s[u];if(i(l,d)>=0)break;s[o]=d,o=u}s[o]=l},t.prototype._down=function(o){for(var r=this,s=r.data,i=r.compare,l=this.length>>1,u=s[o];o<l;){var d=(o<<1)+1,f=s[d],c=d+1;if(c<this.length&&i(s[c],f)<0&&(d=c,f=s[c]),i(f,u)>=0)break;s[o]=f,o=d}s[o]=u};function e(n,o){return n<o?-1:n>o?1:0}return t})});var ks=Be((Qd,Ls)=>{Ls.exports=function(e,n,o,r){var s=e[0],i=e[1],l=!1;o===void 0&&(o=0),r===void 0&&(r=n.length);for(var u=(r-o)/2,d=0,f=u-1;d<u;f=d++){var c=n[o+d*2+0],a=n[o+d*2+1],h=n[o+f*2+0],g=n[o+f*2+1],p=a>i!=g>i&&s<(h-c)*(i-a)/(g-a)+c;p&&(l=!l)}return l}});var Os=Be((Jd,Bs)=>{Bs.exports=function(e,n,o,r){var s=e[0],i=e[1],l=!1;o===void 0&&(o=0),r===void 0&&(r=n.length);for(var u=r-o,d=0,f=u-1;d<u;f=d++){var c=n[d+o][0],a=n[d+o][1],h=n[f+o][0],g=n[f+o][1],p=a>i!=g>i&&s<(h-c)*(i-a)/(g-a)+c;p&&(l=!l)}return l}});var qs=Be((th,Zn)=>{var Fs=ks(),Ns=Os();Zn.exports=function(e,n,o,r){return n.length>0&&Array.isArray(n[0])?Ns(e,n,o,r):Fs(e,n,o,r)};Zn.exports.nested=Ns;Zn.exports.flat=Fs});var js=Be((Yn,$s)=>{(function(t,e){typeof Yn=="object"&&typeof $s<"u"?e(Yn):typeof define=="function"&&define.amd?define(["exports"],e):e((t=t||self).predicates={})})(Yn,function(t){"use strict";let n=33306690738754706e-32;function o(h,g,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 r(h){return new Float64Array(h)}let s=33306690738754716e-32,i=22204460492503146e-32,l=11093356479670487e-47,u=r(4),d=r(8),f=r(12),c=r(16),a=r(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)>=s*M?z:-(function(P,E,T,V,_,v,S){let R,D,W,I,C,H,A,k,O,N,L,B,$,G,Q,q,X,Y,it=P-_,ht=T-_,St=E-v,nt=V-v;C=(Q=(k=it-(A=(H=134217729*it)-(H-it)))*(N=nt-(O=(H=134217729*nt)-(H-nt)))-((G=it*nt)-A*O-k*O-A*N))-(L=Q-(X=(k=St-(A=(H=134217729*St)-(H-St)))*(N=ht-(O=(H=134217729*ht)-(H-ht)))-((q=St*ht)-A*O-k*O-A*N))),u[0]=Q-(L+C)+(C-X),C=($=G-((B=G+L)-(C=B-G))+(L-C))-(L=$-q),u[1]=$-(L+C)+(C-q),C=(Y=B+L)-B,u[2]=B-(Y-C)+(L-C),u[3]=Y;let wt=(function(It,ot){let ft=ot[0];for(let st=1;st<It;st++)ft+=ot[st];return ft})(4,u),zt=i*S;if(wt>=zt||-wt>=zt||(R=P-(it+(C=P-it))+(C-_),W=T-(ht+(C=T-ht))+(C-_),D=E-(St+(C=E-St))+(C-v),I=V-(nt+(C=V-nt))+(C-v),R===0&&D===0&&W===0&&I===0)||(zt=l*S+n*Math.abs(wt),(wt+=it*I+nt*R-(St*W+ht*D))>=zt||-wt>=zt))return wt;C=(Q=(k=R-(A=(H=134217729*R)-(H-R)))*(N=nt-(O=(H=134217729*nt)-(H-nt)))-((G=R*nt)-A*O-k*O-A*N))-(L=Q-(X=(k=D-(A=(H=134217729*D)-(H-D)))*(N=ht-(O=(H=134217729*ht)-(H-ht)))-((q=D*ht)-A*O-k*O-A*N))),a[0]=Q-(L+C)+(C-X),C=($=G-((B=G+L)-(C=B-G))+(L-C))-(L=$-q),a[1]=$-(L+C)+(C-q),C=(Y=B+L)-B,a[2]=B-(Y-C)+(L-C),a[3]=Y;let Dt=o(4,u,4,a,d);C=(Q=(k=it-(A=(H=134217729*it)-(H-it)))*(N=I-(O=(H=134217729*I)-(H-I)))-((G=it*I)-A*O-k*O-A*N))-(L=Q-(X=(k=St-(A=(H=134217729*St)-(H-St)))*(N=W-(O=(H=134217729*W)-(H-W)))-((q=St*W)-A*O-k*O-A*N))),a[0]=Q-(L+C)+(C-X),C=($=G-((B=G+L)-(C=B-G))+(L-C))-(L=$-q),a[1]=$-(L+C)+(C-q),C=(Y=B+L)-B,a[2]=B-(Y-C)+(L-C),a[3]=Y;let Pt=o(Dt,d,4,a,f);C=(Q=(k=R-(A=(H=134217729*R)-(H-R)))*(N=I-(O=(H=134217729*I)-(H-I)))-((G=R*I)-A*O-k*O-A*N))-(L=Q-(X=(k=D-(A=(H=134217729*D)-(H-D)))*(N=W-(O=(H=134217729*W)-(H-W)))-((q=D*W)-A*O-k*O-A*N))),a[0]=Q-(L+C)+(C-X),C=($=G-((B=G+L)-(C=B-G))+(L-C))-(L=$-q),a[1]=$-(L+C)+(C-q),C=(Y=B+L)-B,a[2]=B-(Y-C)+(L-C),a[3]=Y;let Mt=o(Pt,f,4,a,c);return c[Mt-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 Ks=Be((eh,_o)=>{"use strict";var Xs=Hs(),Kn=As(),pa=qs(),xa=js().orient2d;Kn.default&&(Kn=Kn.default);_o.exports=Us;_o.exports.default=Us;function Us(t,e,n){e=Math.max(0,e===void 0?2:e),n=n||0;var o=Ma(t),r=new Xs(16);r.toBBox=function(x){return{minX:x[0],minY:x[1],maxX:x[0],maxY:x[1]}},r.compareMinX=function(x,y){return x[0]-y[0]},r.compareMinY=function(x,y){return x[1]-y[1]},r.load(t);for(var s=[],i=0,l;i<o.length;i++){var u=o[i];r.remove(u),l=Ys(u,l),s.push(l)}var d=new Xs(16);for(i=0;i<s.length;i++)d.insert(Io(s[i]));for(var f=e*e,c=n*n;s.length;){var a=s.shift(),h=a.p,g=a.next.p,p=Co(h,g);if(!(p<c)){var b=p/f;u=ya(r,a.prev.p,h,g,a.next.next.p,b,d),u&&Math.min(Co(u,h),Co(u,g))<=b&&(s.push(a),s.push(Ys(u,a)),r.remove(u),d.remove(a),d.insert(Io(a)),d.insert(Io(a.next)))}}a=l;var m=[];do m.push(a.p),a=a.next;while(a!==l);return m.push(a.p),m}function ya(t,e,n,o,r,s,i){for(var l=new Kn([],ba),u=t.data;u;){for(var d=0;d<u.children.length;d++){var f=u.children[d],c=u.leaf?Wo(f,n,o):wa(n,o,f);c>s||l.push({node:f,dist:c})}for(;l.length&&!l.peek().node.children;){var a=l.pop(),h=a.node,g=Wo(h,e,n),p=Wo(h,o,r);if(a.dist<g&&a.dist<p&&Zs(n,h,i)&&Zs(o,h,i))return h}u=l.pop(),u&&(u=u.node)}return null}function ba(t,e){return t.dist-e.dist}function wa(t,e,n){if(Gs(t,n)||Gs(e,n))return 0;var o=Un(t[0],t[1],e[0],e[1],n.minX,n.minY,n.maxX,n.minY);if(o===0)return 0;var r=Un(t[0],t[1],e[0],e[1],n.minX,n.minY,n.minX,n.maxY);if(r===0)return 0;var s=Un(t[0],t[1],e[0],e[1],n.maxX,n.minY,n.maxX,n.maxY);if(s===0)return 0;var i=Un(t[0],t[1],e[0],e[1],n.minX,n.maxY,n.maxX,n.maxY);return i===0?0:Math.min(o,r,s,i)}function Gs(t,e){return t[0]>=e.minX&&t[0]<=e.maxX&&t[1]>=e.minY&&t[1]<=e.maxY}function Zs(t,e,n){for(var o=Math.min(t[0],e[0]),r=Math.min(t[1],e[1]),s=Math.max(t[0],e[0]),i=Math.max(t[1],e[1]),l=n.search({minX:o,minY:r,maxX:s,maxY:i}),u=0;u<l.length;u++)if(za(l[u].p,l[u].next.p,t,e))return!1;return!0}function cn(t,e,n){return xa(t[0],t[1],e[0],e[1],n[0],n[1])}function za(t,e,n,o){return t!==o&&e!==n&&cn(t,e,n)>0!=cn(t,e,o)>0&&cn(n,o,t)>0!=cn(n,o,e)>0}function Io(t){var e=t.p,n=t.next.p;return t.minX=Math.min(e[0],n[0]),t.minY=Math.min(e[1],n[1]),t.maxX=Math.max(e[0],n[0]),t.maxY=Math.max(e[1],n[1]),t}function Ma(t){for(var e=t[0],n=t[0],o=t[0],r=t[0],s=0;s<t.length;s++){var i=t[s];i[0]<e[0]&&(e=i),i[0]>o[0]&&(o=i),i[1]<n[1]&&(n=i),i[1]>r[1]&&(r=i)}var l=[e,n,o,r],u=l.slice();for(s=0;s<t.length;s++)pa(t[s],l)||u.push(t[s]);return Pa(u)}function Ys(t,e){var n={p:t,prev:null,next:null,minX:0,minY:0,maxX:0,maxY:0};return e?(n.next=e.next,n.prev=e,e.next.prev=n,e.next=n):(n.prev=n,n.next=n),n}function Co(t,e){var n=t[0]-e[0],o=t[1]-e[1];return n*n+o*o}function Wo(t,e,n){var o=e[0],r=e[1],s=n[0]-o,i=n[1]-r;if(s!==0||i!==0){var l=((t[0]-o)*s+(t[1]-r)*i)/(s*s+i*i);l>1?(o=n[0],r=n[1]):l>0&&(o+=s*l,r+=i*l)}return s=t[0]-o,i=t[1]-r,s*s+i*i}function Un(t,e,n,o,r,s,i,l){var u=n-t,d=o-e,f=i-r,c=l-s,a=t-r,h=e-s,g=u*u+d*d,p=u*f+d*c,b=f*f+c*c,m=u*a+d*h,x=f*a+c*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,_=(1-w)*e+w*o,v=(1-M)*r+M*i,S=(1-M)*s+M*l,R=v-V,D=S-_;return R*R+D*D}function Ea(t,e){return t[0]===e[0]?t[1]-e[1]:t[0]-e[0]}function Pa(t){t.sort(Ea);for(var e=[],n=0;n<t.length;n++){for(;e.length>=2&&cn(e[e.length-2],e[e.length-1],t[n])<=0;)e.pop();e.push(t[n])}for(var o=[],r=t.length-1;r>=0;r--){for(;o.length>=2&&cn(o[o.length-2],o[o.length-1],t[r])<=0;)o.pop();o.push(t[r])}return o.pop(),e.pop(),e.concat(o)}});import*as Fe from"three";import*as Oe from"three";var Ht=class t{constructor(e=0,n=0,o=0){this.x=e,this.y=n,this.z=o}set(e,n,o){return this.x=e,this.y=n,this.z=o,this}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this}clone(){return new t(this.x,this.y,this.z)}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this}subVectors(e,n){return this.x=e.x-n.x,this.y=e.y-n.y,this.z=e.z-n.z,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z}crossVectors(e,n){let o=e.x,r=e.y,s=e.z,i=n.x,l=n.y,u=n.z;return this.x=r*u-s*l,this.y=s*i-o*u,this.z=o*l-r*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,r=this.z-e.z;return n*n+o*o+r*r}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,r=this.y,s=this.z,i=e.x,l=e.y,u=e.z,d=Math.cos(n),f=Math.sin(n),c=i*o+l*r+u*s;return this.x=i*c*(1-d)+o*d+(-u*r+l*s)*f,this.y=l*c*(1-d)+r*d+(u*o-i*s)*f,this.z=u*c*(1-d)+s*d+(-l*o+i*r)*f,this}},Hn=class{constructor(e=new Ht(1,0,0),n=0){this.normal=e,this.constant=n}set(e,n){return this.normal.copy(e),this.constant=n,this}setFromNormalAndCoplanarPoint(e,n){return this.normal.copy(e),this.constant=-n.dot(this.normal),this}setFromCoplanarPoints(e,n,o){let r=new Ht().subVectors(n,e),s=new Ht().subVectors(o,e),i=new Ht().crossVectors(r,s).normalize();return this.normal.copy(i),this.constant=-e.dot(this.normal),this}distanceToPoint(e){return this.normal.dot(e)+this.constant}projectPoint(e,n=new Ht){let o=this.distanceToPoint(e);return n.copy(e),n.x-=this.normal.x*o,n.y-=this.normal.y*o,n.z-=this.normal.z*o,n}},_n=()=>typeof performance<"u"&&performance.now?performance.now():Date.now(),yo=class{constructor(){this.results=null,this.clusterResults=null}initLimits1(e,n){let o,r;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?r=30:n<2?r=40:n<2.5?r=45:n<3?r=60:n<3.6?r=70:r=80,{horizontalSubdivisions:o,verticalSubdivisions:r}}initLimits2(e,n){let s=Math.round(Math.max(5,Math.min(350,e/.08))),i=Math.round(Math.max(30,Math.min(80,n/.06)));return{horizontalSubdivisions:s,verticalSubdivisions:i}}initLimits3(e,n){let o;e<2?o=.06:e<10?o=.1:o=.15;let r=Math.round(Math.max(5,Math.min(350,e/o))),s=Math.round(Math.max(30,Math.min(80,n/.06)));return{horizontalSubdivisions:r,verticalSubdivisions:s}}initLimits4(e,n){let o=Math.round(Math.max(5,Math.min(350,20*Math.sqrt(e)))),r=Math.round(Math.max(30,Math.min(80,20*Math.sqrt(n))));return{horizontalSubdivisions:o,verticalSubdivisions:r}}createSubdividedWallPlane(e,n,o,r=null){let s=[];if(!e||!e.start||!e.end||isNaN(e.rooftopPz))return s;let i=new Ht(e.start.x,e.start.y,e.start.z),l=new Ht(e.end.x,e.end.y,e.end.z),u=new Ht(e.end.x,e.end.y,e.rooftopPz),d=new Ht(e.start.x,e.start.y,e.rooftopPz),f=[i,l,u,d];for(let P=0;P<f.length;P++)if(!this.isValidVector3(f[P]))return console.error(`\u5899\u4F53\u57FA\u7840\u70B9${P}\u65E0\u6548:`,f[P]),s;let c=i.distanceTo(l),a=Math.abs(e.rooftopPz-e.start.z);if(c===0||a===0)return s;let h=c/o,g=a/n,p=new Ht().subVectors(l,i).normalize(),b=i.x,m=i.y,x=i.z,y=p.x,w=p.y,z=p.z,M=(P,E)=>new Ht(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 _=V*h,v=(V+1)*h;s.push({points:[M(_,E),M(v,E),M(v,T),M(_,T)],userData:{type:"wallSegment",row:P,col:V,width:h,height:g}})}}return s}analyzePointDistribution(e,n,o=.01,r={}){let s=r.projectPlane||null;this.results={totalSegments:0,segmentsWithPoints:0,segmentsWithoutPoints:0,missingSegments:[],existSegments:[],pointsInSegments:new Map,segmentsByPoint:new Map,segmentDetails:new Map,tolerance:o,analysisTime:null};let i=_n(),l=[],u=new Map,d=1/0,f=-1/0,c=1/0,a=-1/0;for(let _=0;_<e.length;_++){let v=e[_];if(v.userData&&v.userData.type==="wallSegment"){let S=this.getWorldVerticesNew(v.points);if(S.length<4)continue;let R=new Ht().add(S[0]).add(S[1]).add(S[2]).add(S[3]).multiplyScalar(.25);v.userData.center=R,v.vertices=S;let D=v.userData.row,W=v.userData.col,I=`row${D}_col${W}`;l.push(v),u.set(I,v),D<d&&(d=D),D>f&&(f=D),W<c&&(c=W),W>a&&(a=W)}}if(this.results.totalSegments=l.length,l.length===0)return this.results.analysisTime=_n()-i,this.printAnalysisResults(),this.results;let h=`row${d}_col${c}`,g=u.get(h)||l[0];if(!g||!g.vertices||g.vertices.length<4)return this.results.analysisTime=_n()-i,this.printAnalysisResults(),this.results;let p=g.vertices[0],b=g.vertices[1],m=g.vertices[3],x=new Ht().subVectors(b,p).normalize(),y=new Ht().subVectors(m,p).normalize(),w=g.userData.width,z=g.userData.height,M=f-d+1,P=a-c+1,E=new Hn;E.setFromCoplanarPoints(p,b,m);let T=new Ht,V=new Ht;for(let _=0;_<n.length;_+=3){let v=new Ht(n[_],n[_+1],n[_+2]),S=s?s.projectPoint(v,V):v;if(Math.abs(E.distanceToPoint(S))>o)continue;T.subVectors(S,p);let D=T.dot(x),W=T.dot(y),I=Math.ceil((D-o)/w-1),C=Math.floor((D+o)/w),H=Math.ceil((W-o)/z-1),A=Math.floor((W+o)/z);if(C<0||I>P-1||A<0||H>M-1)continue;let k=Math.max(0,I),O=Math.min(P-1,C),N=Math.max(0,H),L=Math.min(M-1,A);for(let B=N;B<=L;B++){let $=d+B;for(let G=k;G<=O;G++){let Q=c+G,q=`row${$}_col${Q}`;u.has(q)&&(this.results.pointsInSegments.has(q)||this.results.pointsInSegments.set(q,[_]))}}}for(let _ of l){let v=`row${_.userData.row}_col${_.userData.col}`,S=this.results.pointsInSegments.has(v)?this.results.pointsInSegments.get(v).length:0,R=S>=1,D={row:_.userData.row,col:_.userData.col,width:_.userData.width,height:_.userData.height,segmentKey:v,vertices:_.vertices,center:_.userData.center,mesh:_,pointCount:S,hasPointsButNotEnough:S>0&&S<1};R?(this.results.segmentsWithPoints++,this.results.existSegments.push(D)):(this.results.segmentsWithoutPoints++,this.results.missingSegments.push(D))}return this.results.analysisTime=_n()-i,this.printAnalysisResults(),this.results}isPointInWallSegmentOptimized(e,n,o,r,s,i,l,u,d,f,c){if(Math.abs(o.distanceToPoint(e))>c)return!1;let h=new Ht().subVectors(e,n),g=Math.abs(h.dot(s)),p=Math.abs(h.dot(i));if(g>d&&p>f)return!1;let b=new Ht().subVectors(e,r),m=b.dot(s),x=b.dot(i),y=m>=-c&&m<=l+c,w=x>=-c&&x<=u+c;return y&&w}getWorldVerticesNew(e){return e}highlightEmptySegments(e,n=null,o=null,r=1){if(!this.results)return console.warn("\u8BF7\u5148\u8FD0\u884C\u5206\u6790\u51FD\u6570"),null;let s=new Map,i=new Map;for(let d of this.results.missingSegments)s.set(d.segmentKey,d),i.has(d.row)||i.set(d.row,new Map),i.get(d.row).set(d.col,{segmentKey:d.segmentKey,isEmpty:!0,visited:!1});for(let d of e)if(d.userData&&d.userData.type==="wallSegment"){let f=`row${d.userData.row}_col${d.userData.col}`,c=s.has(f);i.has(d.userData.row)||i.set(d.userData.row,new Map),i.get(d.userData.row).has(d.userData.col)||i.get(d.userData.row).set(d.userData.col,{segmentKey:f,isEmpty:c,visited:!1})}let l=[],u=[[0,1],[1,0],[0,-1],[-1,0]];for(let[d,f]of s){let c=i.get(f.row)?.get(f.col);if(c&&!c.visited){let a=[],h=[[f.row,f.col]],g=0;for(c.visited=!0;g<h.length;){let p=h[g++],b=p[0],m=p[1],x=`row${b}_col${m}`;s.has(x)&&a.push(s.get(x));for(let y of u){let w=b+y[0],z=m+y[1];if(i.has(w)&&i.get(w).has(z)){let M=i.get(w).get(z);!M.visited&&M.isEmpty&&(M.visited=!0,h.push([w,z]))}}}a.length>=r&&l.push(a)}}return this.clusterResults={clusters:l.sort((d,f)=>f.length-d.length),totalClusters:l.length},this.clusterResults}getClusterInfo(){if(!this.clusterResults)return null;let e=this.clusterResults.clusters.map(n=>n.length);return{totalClusters:this.clusterResults.totalClusters,clusterSizes:this.clusterResults.clusters.map((n,o)=>({clusterIndex:o,size:n.length,segments:n.map(r=>r.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)}},ls=(t,e)=>{let n={},o=[],r=[];if(!t||t.length===0)return n.originalVertices=o,n.allCenterPoints=r,n;if(e=="xyz")for(let s of t){r.push({x:s.center.x,y:s.center.y,z:s.center.z});let i=[];for(let l=0;l<s.vertices.length;l++)i.push({x:s.vertices[l].x,y:s.vertices[l].y,z:s.vertices[l].z});o.push(i)}else if(e=="three")for(let s of t){r.push(new Oe.Vector3(s.center.x,s.center.y,s.center.z));let i=[];for(let l=0;l<s.vertices.length;l++)i.push(new Oe.Vector3(s.vertices[l].x,s.vertices[l].y,s.vertices[l].z));o.push(i)}else if(e=="array")for(let s of t){r.push(s.center.x),r.push(s.center.y),r.push(s.center.z);let i=[];for(let l=0;l<s.vertices.length;l++)i.push(s.vertices[l].x,s.vertices[l].y,s.vertices[l].z);o.push(i)}return n.originalVertices=o,n.allCenterPoints=r,n},zi=(t,e)=>{let n=new Ht().copy(t.start).add(t.end).multiplyScalar(.5),o=new Ht().subVectors(new Ht(n.x,n.y,n.z+1),n).normalize(),r=new Ht(t.direction.x,t.direction.y,0);r.applyAxisAngle(o,Math.PI/2);let s=new Ht().copy(n).add(r.clone().multiplyScalar(t.length)),i=new Ht().copy(n).sub(r.clone().multiplyScalar(t.length));if(n.z=t.start.z,s.z=t.start.z,i.z=t.start.z,e=="three")return{start:new Oe.Vector3(s.x,s.y,s.z),end:new Oe.Vector3(i.x,i.y,i.z),center:new Oe.Vector3(n.x,n.y,n.z),direction:new Oe.Vector3(r.x,r.y,r.z)};if(e=="xyz")return{start:{x:s.x,y:s.y,z:s.z},end:{x:i.x,y:i.y,z:i.z},center:{x:n.x,y:n.y,z:n.z},direction:{x:r.x,y:r.y,z:r.z}};if(e=="array")return{start:[s.x,s.y,s.z],end:[i.x,i.y,i.z],center:[n.x,n.y,n.z],direction:[r.x,r.y,r.z]}},cs=async(t,e=!0,n="three")=>{for(let o=0;o<t.length;o++){let r=t[o];await bo(r,e,n)}},bo=(t,e=!0,n="three")=>{if((t.isBayWindow||t.isWindow||t.isBalconyRailing)&&e)return;let o=new Hn().setFromCoplanarPoints(new Ht(t.start.x,t.start.y,t.start.z),new Ht(t.end.x,t.end.y,t.end.z),new Ht(t.start.x,t.start.y,t.rooftopPz)),r=new Ht(t.start.x,t.start.y,t.start.z).distanceTo(new Ht(t.end.x,t.end.y,t.end.z)),s=Math.abs(t.rooftopPz-t.start.z),i=new yo,{horizontalSubdivisions:l,verticalSubdivisions:u}=i.initLimits4(r,s),d=i.createSubdividedWallPlane(t,u,l,null);i.analyzePointDistribution(d,t.originalPoints,.01,{projectPlane:o});let f=i.highlightEmptySegments(d,null,null),c=[];if(f&&f.clusters)for(let g of f.clusters){let p=ls(g,n);p&&c.push(p)}let h=zi(t,n).direction;if(t.checkResults=c,t.verticalDirection=h,t.saveExistSegments){let g=[],p=ls(i.results.existSegments,n);p&&g.push(p),t.existSegments=g}};var Rt=class t{constructor(e=0,n=0,o=0){this.x=e,this.y=n,this.z=o}set(e,n,o){return this.x=e,this.y=n,this.z=o,this}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this}clone(){return new t(this.x,this.y,this.z)}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this}subVectors(e,n){return this.x=e.x-n.x,this.y=e.y-n.y,this.z=e.z-n.z,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z}crossVectors(e,n){let o=e.x,r=e.y,s=e.z,i=n.x,l=n.y,u=n.z;return this.x=r*u-s*l,this.y=s*i-o*u,this.z=o*l-r*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,r=this.z-e.z;return n*n+o*o+r*r}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,r=this.y,s=this.z,i=e.x,l=e.y,u=e.z,d=Math.cos(n),f=Math.sin(n),c=i*o+l*r+u*s;return this.x=i*c*(1-d)+o*d+(-u*r+l*s)*f,this.y=l*c*(1-d)+r*d+(u*o-i*s)*f,this.z=u*c*(1-d)+s*d+(-l*o+i*r)*f,this}},yn=class{constructor(e=new Rt(1,0,0),n=0){this.normal=e,this.constant=n}set(e,n){return this.normal.copy(e),this.constant=n,this}setFromNormalAndCoplanarPoint(e,n){return this.normal.copy(e),this.constant=-n.dot(this.normal),this}setFromCoplanarPoints(e,n,o){let r=new Rt().subVectors(n,e),s=new Rt().subVectors(o,e),i=new Rt().crossVectors(r,s).normalize();return this.normal.copy(i),this.constant=-e.dot(this.normal),this}distanceToPoint(e){return this.normal.dot(e)+this.constant}projectPoint(e,n=new Rt){let o=this.distanceToPoint(e);return n.copy(e),n.x-=this.normal.x*o,n.y-=this.normal.y*o,n.z-=this.normal.z*o,n}},An=()=>typeof performance<"u"&&performance.now?performance.now():Date.now(),Ln=class{constructor(){this.results=null,this.clusterResults=null}initLimits1(e,n){let o,r;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?r=30:n<2?r=40:n<2.5?r=45:n<3?r=60:n<3.6?r=70:r=80,{horizontalSubdivisions:o,verticalSubdivisions:r}}initLimits2(e,n){let s=Math.round(Math.max(5,Math.min(350,e/.08))),i=Math.round(Math.max(30,Math.min(80,n/.06)));return{horizontalSubdivisions:s,verticalSubdivisions:i}}initLimits3(e,n){let o;e<2?o=.06:e<10?o=.1:o=.15;let r=Math.round(Math.max(5,Math.min(350,e/o))),s=Math.round(Math.max(30,Math.min(80,n/.06)));return{horizontalSubdivisions:r,verticalSubdivisions:s}}initLimits4(e,n){let o=Math.round(Math.max(5,Math.min(350,20*Math.sqrt(e)))),r=Math.round(Math.max(30,Math.min(80,20*Math.sqrt(n))));return{horizontalSubdivisions:o,verticalSubdivisions:r}}createSubdividedWallPlane(e,n,o,r=null){let s=[];if(!e||!e.start||!e.end||isNaN(e.rooftopPz))return s;let i=new Rt(e.start.x,e.start.y,e.start.z),l=new Rt(e.end.x,e.end.y,e.end.z),u=new Rt(e.end.x,e.end.y,e.rooftopPz),d=new Rt(e.start.x,e.start.y,e.rooftopPz),f=[i,l,u,d];for(let P=0;P<f.length;P++)if(!this.isValidVector3(f[P]))return console.error(`\u5899\u4F53\u57FA\u7840\u70B9${P}\u65E0\u6548:`,f[P]),s;let c=i.distanceTo(l),a=Math.abs(e.rooftopPz-e.start.z);if(c===0||a===0)return s;let h=c/o,g=a/n,p=new Rt().subVectors(l,i).normalize(),b=i.x,m=i.y,x=i.z,y=p.x,w=p.y,z=p.z,M=(P,E)=>new Rt(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 _=V*h,v=(V+1)*h;s.push({points:[M(_,E),M(v,E),M(v,T),M(_,T)],userData:{type:"wallSegment",row:P,col:V,width:h,height:g}})}}return s}analyzePointDistribution(e,n,o=.01,r={}){let s=r.projectPlane||null;this.results={totalSegments:0,segmentsWithPoints:0,segmentsWithoutPoints:0,missingSegments:[],existSegments:[],pointsInSegments:new Map,segmentsByPoint:new Map,segmentDetails:new Map,tolerance:o,analysisTime:null};let i=An(),l=[],u=new Map,d=1/0,f=-1/0,c=1/0,a=-1/0;for(let _=0;_<e.length;_++){let v=e[_];if(v.userData&&v.userData.type==="wallSegment"){let S=this.getWorldVerticesNew(v.points);if(S.length<4)continue;let R=new Rt().add(S[0]).add(S[1]).add(S[2]).add(S[3]).multiplyScalar(.25);v.userData.center=R,v.vertices=S;let D=v.userData.row,W=v.userData.col,I=`row${D}_col${W}`;l.push(v),u.set(I,v),D<d&&(d=D),D>f&&(f=D),W<c&&(c=W),W>a&&(a=W)}}if(this.results.totalSegments=l.length,l.length===0)return this.results.analysisTime=An()-i,this.printAnalysisResults(),this.results;let h=`row${d}_col${c}`,g=u.get(h)||l[0];if(!g||!g.vertices||g.vertices.length<4)return this.results.analysisTime=An()-i,this.printAnalysisResults(),this.results;let p=g.vertices[0],b=g.vertices[1],m=g.vertices[3],x=new Rt().subVectors(b,p).normalize(),y=new Rt().subVectors(m,p).normalize(),w=g.userData.width,z=g.userData.height,M=f-d+1,P=a-c+1,E=new yn;E.setFromCoplanarPoints(p,b,m);let T=new Rt,V=new Rt;for(let _=0;_<n.length;_++){let v=n[_],S=s?s.projectPoint(v,V):v;if(Math.abs(E.distanceToPoint(S))>o)continue;T.subVectors(S,p);let D=T.dot(x),W=T.dot(y),I=Math.ceil((D-o)/w-1),C=Math.floor((D+o)/w),H=Math.ceil((W-o)/z-1),A=Math.floor((W+o)/z);if(C<0||I>P-1||A<0||H>M-1)continue;let k=Math.max(0,I),O=Math.min(P-1,C),N=Math.max(0,H),L=Math.min(M-1,A);for(let B=N;B<=L;B++){let $=d+B;for(let G=k;G<=O;G++){let Q=c+G,q=`row${$}_col${Q}`;u.has(q)&&(this.results.pointsInSegments.has(q)||this.results.pointsInSegments.set(q,[_]))}}}for(let _ of l){let v=`row${_.userData.row}_col${_.userData.col}`,S=this.results.pointsInSegments.has(v)?this.results.pointsInSegments.get(v).length:0,R=S>=1,D={row:_.userData.row,col:_.userData.col,width:_.userData.width,height:_.userData.height,segmentKey:v,vertices:_.vertices,center:_.userData.center,mesh:_,pointCount:S,hasPointsButNotEnough:S>0&&S<1};R?(this.results.segmentsWithPoints++,this.results.existSegments.push(D)):(this.results.segmentsWithoutPoints++,this.results.missingSegments.push(D))}return this.results.analysisTime=An()-i,this.printAnalysisResults(),this.results}isPointInWallSegmentOptimized(e,n,o,r,s,i,l,u,d,f,c){if(Math.abs(o.distanceToPoint(e))>c)return!1;let h=new Rt().subVectors(e,n),g=Math.abs(h.dot(s)),p=Math.abs(h.dot(i));if(g>d&&p>f)return!1;let b=new Rt().subVectors(e,r),m=b.dot(s),x=b.dot(i),y=m>=-c&&m<=l+c,w=x>=-c&&x<=u+c;return y&&w}getWorldVerticesNew(e){return e}highlightEmptySegments(e,n=null,o=null,r=1){if(!this.results)return console.warn("\u8BF7\u5148\u8FD0\u884C\u5206\u6790\u51FD\u6570"),null;let s=new Map,i=new Map;for(let d of this.results.missingSegments)s.set(d.segmentKey,d),i.has(d.row)||i.set(d.row,new Map),i.get(d.row).set(d.col,{segmentKey:d.segmentKey,isEmpty:!0,visited:!1});for(let d of e)if(d.userData&&d.userData.type==="wallSegment"){let f=`row${d.userData.row}_col${d.userData.col}`,c=s.has(f);i.has(d.userData.row)||i.set(d.userData.row,new Map),i.get(d.userData.row).has(d.userData.col)||i.get(d.userData.row).set(d.userData.col,{segmentKey:f,isEmpty:c,visited:!1})}let l=[],u=[[0,1],[1,0],[0,-1],[-1,0]];for(let[d,f]of s){let c=i.get(f.row)?.get(f.col);if(c&&!c.visited){let a=[],h=[[f.row,f.col]],g=0;for(c.visited=!0;g<h.length;){let p=h[g++],b=p[0],m=p[1],x=`row${b}_col${m}`;s.has(x)&&a.push(s.get(x));for(let y of u){let w=b+y[0],z=m+y[1];if(i.has(w)&&i.get(w).has(z)){let M=i.get(w).get(z);!M.visited&&M.isEmpty&&(M.visited=!0,h.push([w,z]))}}}a.length>=r&&l.push(a)}}return this.clusterResults={clusters:l.sort((d,f)=>f.length-d.length),totalClusters:l.length},this.clusterResults}getClusterInfo(){if(!this.clusterResults)return null;let e=this.clusterResults.clusters.map(n=>n.length);return{totalClusters:this.clusterResults.totalClusters,clusterSizes:this.clusterResults.clusters.map((n,o)=>({clusterIndex:o,size:n.length,segments:n.map(r=>r.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)}},us=(t,e)=>{let n={},o=[],r=[];if(!t||t.length===0)return n.originalVertices=o,n.allCenterPoints=r,n;if(e=="xyz")for(let s of t){r.push({x:s.center.x,y:s.center.y,z:s.center.z});let i=[];for(let l=0;l<s.vertices.length;l++)i.push({x:s.vertices[l].x,y:s.vertices[l].y,z:s.vertices[l].z});o.push(i)}else if(e=="three")for(let s of t){r.push(new Fe.Vector3(s.center.x,s.center.y,s.center.z));let i=[];for(let l=0;l<s.vertices.length;l++)i.push(new Fe.Vector3(s.vertices[l].x,s.vertices[l].y,s.vertices[l].z));o.push(i)}else if(e=="array")for(let s of t){r.push(s.center.x),r.push(s.center.y),r.push(s.center.z);let i=[];for(let l=0;l<s.vertices.length;l++)i.push(s.vertices[l].x,s.vertices[l].y,s.vertices[l].z);o.push(i)}return n.originalVertices=o,n.allCenterPoints=r,n},Mi=(t,e)=>{let n=new Rt().copy(t.start).add(t.end).multiplyScalar(.5),o=new Rt().subVectors(new Rt(n.x,n.y,n.z+1),n).normalize(),r=new Rt(t.direction.x,t.direction.y,0);r.applyAxisAngle(o,Math.PI/2);let s=new Rt().copy(n).add(r.clone().multiplyScalar(t.length)),i=new Rt().copy(n).sub(r.clone().multiplyScalar(t.length));if(n.z=t.start.z,s.z=t.start.z,i.z=t.start.z,e=="three")return{start:new Fe.Vector3(s.x,s.y,s.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(r.x,r.y,r.z)};if(e=="xyz")return{start:{x:s.x,y:s.y,z:s.z},end:{x:i.x,y:i.y,z:i.z},center:{x:n.x,y:n.y,z:n.z},direction:{x:r.x,y:r.y,z:r.z}};if(e=="array")return{start:[s.x,s.y,s.z],end:[i.x,i.y,i.z],center:[n.x,n.y,n.z],direction:[r.x,r.y,r.z]}},Ei=(t,e=!0,n="three",o="xyz")=>{o=="xyz"?fs(t,e,n):o=="array"&&bo(t,e,n)},Pi=(t,e=!0,n="three",o="xyz")=>{o=="xyz"?Si(t,e,n):o=="array"&&cs(t,e,n)},Si=(t,e=!0,n="three")=>{for(let o=0;o<t.length;o++){let r=t[o];fs(r,e,n)}},fs=(t,e=!0,n="three")=>{if((t.isBayWindow||t.isWindow||t.isBalconyRailing)&&e)return;let o=new yn().setFromCoplanarPoints(new Rt(t.start.x,t.start.y,t.start.z),new Rt(t.end.x,t.end.y,t.end.z),new Rt(t.start.x,t.start.y,t.rooftopPz)),r=new Rt(t.start.x,t.start.y,t.start.z).distanceTo(new Rt(t.end.x,t.end.y,t.end.z)),s=Math.abs(t.rooftopPz-t.start.z),i=new Ln,{horizontalSubdivisions:l,verticalSubdivisions:u}=i.initLimits4(r,s),d=i.createSubdividedWallPlane(t,u,l,null);i.analyzePointDistribution(d,t.originalPoints,.01,{projectPlane:o});let f=i.highlightEmptySegments(d,null,null),c=[];if(f&&f.clusters)for(let g of f.clusters){let p=us(g,n);p&&c.push(p)}let h=Mi(t,n).direction;if(t.checkResults=c,t.verticalDirection=h,t.saveExistSegments){let g=[],p=us(i.results.existSegments,n);p&&g.push(p),t.existSegments=g}},Ti=t=>{if((t.isBayWindow||t.isWindow||t.isBalconyRailing)&&limit)return;let e=new yn().setFromCoplanarPoints(new Rt(t.start.x,t.start.y,t.start.z),new Rt(t.end.x,t.end.y,t.end.z),new Rt(t.start.x,t.start.y,t.rooftopPz)),n=new Rt(t.start.x,t.start.y,t.start.z).distanceTo(new Rt(t.end.x,t.end.y,t.end.z)),o=Math.abs(t.rooftopPz-t.start.z),r=new Ln,{horizontalSubdivisions:s,verticalSubdivisions:i}=r.initLimits4(n,o),l=r.createSubdividedWallPlane(t,i,s,null);return r.analyzePointDistribution(l,t.originalPoints,.01,{projectPlane:e}),r.highlightEmptySegments(l,null,null)};import*as F from"three";import"three/examples/jsm/utils/BufferGeometryUtils.js";import*as U from"three";import{CSS2DObject as Ec}from"three/examples/jsm/renderers/CSS2DRenderer.js";import"three/examples/jsm/utils/BufferGeometryUtils.js";import we from"path";import{fileURLToPath as vi}from"url";import kn from"path";import{fileURLToPath as Ri}from"url";import{Vector3 as ec}from"three";var Di=Ri(import.meta.url),wo=kn.dirname(Di),nc=kn.resolve(wo,"./data/lines.meta.json"),oc=kn.resolve(wo,"./data/lines.bin"),sc=kn.resolve(wo,"./data/checks.bin");var Vi=vi(import.meta.url),De=we.dirname(Vi),uc=we.resolve(De,"./data/lines.tmp.bin"),fc=we.resolve(De,"./data/checks.tmp.bin"),dc=we.resolve(De,"./data/lines.new_points.tmp.bin"),hc=we.resolve(De,"./data/lines.new_points.bin"),mc=we.resolve(De,"./data/lines.meta.json"),gc=we.resolve(De,"./data/lines.bin"),pc=we.resolve(De,"./data/checks.bin"),xc=we.resolve(De,"./data/lines.exist_segments.bin"),yc=we.resolve(De,"./data/lines.exist_segments.tmp.bin");import{Vector3 as Ii}from"three";var Bn=class{points=[];_tempArr=[0,0,0];constructor(e){}initPoints(e){this.points=e}getPointByIndex(e,n){let o=e*3;return n.x=this.points[o],n.y=this.points[o+1],n.z=this.points[o+2],n}getPointArrByIndex(e){let n=e*3;return[this.points[n],this.points[n+1],this.points[n+2]]}getPoint2ArrByIndex(e){let n=e*3;return[this.points[n],this.points[n+1]]}getIndexsByIndex(e,n){n.length=0,n.push(e*3),n.push(e*3+1),n.push(e*3+2)}pointsToVector3Arr(e){let n=[];for(let o=0;o<e.length/3;o++)n.push(new Ii(e[o*3],e[o*3+1],e[o*3+2]));return n}vector3ArrToPoints(e){let n=[];for(let o=0;o<e.length;o++)n.push(e[o].x,e[o].y,e[o].z);return n}vector3ArrToFloat32Array(e){return new Float32Array(e.flatMap(o=>[o.x,o.y,o.z]))}clsoe(){this.points=[]}};var hs=(t,e,n)=>{let o=new U.LineBasicMaterial({color:"#0011ff"}),r=[];r.push(t),r.push(e);let s=new U.BufferGeometry;s.setFromPoints(r),s.rotateX(-Math.PI/2),n.add(new U.Line(s,o))},ze=(t,e,n,o,r=1e-8)=>{let s=e.x-t.x,i=e.y-t.y,l=o.x-n.x,u=o.y-n.y,d=s*u-i*l;if(Math.abs(d)<r)return null;let f=((n.x-t.x)*u-(n.y-t.y)*l)/d,c=((n.x-t.x)*i-(n.y-t.y)*s)/d;return f<-r||f>1+r||c<-r||c>1+r?null:{point:new U.Vector3(t.x+f*s,t.y+f*i,t.z)}},ms=(t,e,n={})=>{let{fontSize:o=36,fontFamily:r="sans-serif",backgroundColor:s="rgba(0,0,0,0)",textColor:i="#ffffff",padding:l=10,maxWidth:u=256}=n,f=document.createElement("canvas").getContext("2d");f.font=`bold ${o}px ${r}`;let a=f.measureText(t).width,h=Math.min(a+l*2,u),g=o+l*2,p=document.createElement("canvas");p.width=h,p.height=g;let b=p.getContext("2d");b.fillStyle=s,b.fillRect(0,0,h,g),b.fillStyle=i,b.font=`bold ${o}px ${r}`,b.textAlign="center",b.textBaseline="middle",a>u-l*2?Ci(b,t,h/2,g/2,u,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 Ci(t,e,n,o,r,s){let i=e.split(""),l="",u=s*1.2,d=o;for(let f=0;f<i.length;f++){let c=l+i[f];t.measureText(c).width>r&&f>0?(t.fillText(l,n,d),l=i[f],d+=u):l=c}t.fillText(l,n,d)}var Kt=(t,e,n=.01)=>{let o=Math.sqrt(t.x*t.x+t.y*t.y+t.z*t.z),r=Math.sqrt(e.x*e.x+e.y*e.y+e.z*e.z);if(o<1e-10||r<1e-10)return{parallel:!1,sameDirection:null,angle:NaN};let s={x:t.x/o,y:t.y/o,z:t.z/o},i={x:e.x/r,y:e.y/r,z:e.z/r},l=s.x*i.x+s.y*i.y+s.z*i.z;l=Math.max(-1,Math.min(1,l));let u=Math.acos(Math.abs(l)),d=u<=n;return{parallel:d,sameDirection:d?l>0:null,angle:u}};var gs=(t,e,n,o)=>{if(e<1e-4||n<1e-4)return{};let r=t,s=[];if(o&&o.length&&(s=o.map(M=>M.clone())),!r||r.length<4)return{};let i=new U.Vector3().subVectors(r[1],r[0]).normalize(),l=new U.Vector3().subVectors(r[3],r[0]).normalize(),u=i.clone().cross(l).normalize(),d=1/0,f=-1/0,c=1/0,a=-1/0;for(let M of r){let P=M.dot(i),E=M.dot(l);P<d&&(d=P),P>f&&(f=P),E<c&&(c=E),E>a&&(a=E)}let h=r[0].dot(u),g=i.clone().multiplyScalar(d).add(l.clone().multiplyScalar(c)).add(u.clone().multiplyScalar(h)),p=i.clone().multiplyScalar(f).add(l.clone().multiplyScalar(c)).add(u.clone().multiplyScalar(h)),b=i.clone().multiplyScalar(f).add(l.clone().multiplyScalar(a)).add(u.clone().multiplyScalar(h)),m=i.clone().multiplyScalar(d).add(l.clone().multiplyScalar(a)).add(u.clone().multiplyScalar(h)),x=[g,p,b,m],y=Kt(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]),_=x[0].distanceTo(x[3]),v=V/e,S=_/n,R=.001;for(let D=0;D<v;D++){let W=x[0],I=0;for(let C=0;C<S;C++){let H=W.clone().addScaledVector(M,e),A=H.clone().addScaledVector(E,n),k=W.clone().addScaledVector(E,n),O=new U.Vector3().add(W).add(H).add(A).add(k).multiplyScalar(.25);for(let N=0;N<s.length;N++)if(s[N].distanceTo(O)<R){I++;break}W=k}if(I>=S/2)break;w+=I,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 W=x[1],I=0;for(let C=0;C<S;C++){let H=W.clone().addScaledVector(P,e),A=H.clone().addScaledVector(E,n),k=W.clone().addScaledVector(E,n),O=new U.Vector3().add(W).add(H).add(A).add(k).multiplyScalar(.25);for(let N=0;N<s.length;N++)if(s[N].distanceTo(O)<R){I++;break}W=k}if(I>=S/2)break;w+=I,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 W=x[3],I=0;for(let C=0;C<v;C++){let H=W.clone().addScaledVector(M,e),A=H.clone().addScaledVector(T,n),k=W.clone().addScaledVector(T,n),O=new U.Vector3().add(W).add(H).add(A).add(k).multiplyScalar(.25);for(let N=0;N<s.length;N++)if(s[N].distanceTo(O)<R){I++;break}W=H}if(I>=v/2)break;w+=I,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}},Gt=(t,e,n,o,r=U.MathUtils.degToRad(8))=>{let s=new U.Vector3,i=new U.Vector3;s.subVectors(new U.Vector3(e.x,e.y,0),new U.Vector3(t.x,t.y,0)).normalize(),i.subVectors(new U.Vector3(o.x,o.y,0),new U.Vector3(n.x,n.y,0)).normalize();let l=s.dot(i),u=Math.acos(Math.min(Math.abs(l),1)),d=1-Math.min(u/r,1),f=l>0?"same":"opposite";return{parallelism:d,angle:u,angleDeg:U.MathUtils.radToDeg(u),isParallel:u<r,direction:f,vectors:{v1:s,v2:i}}},ie=(t,e,n,o)=>{let r=new U.Vector3().subVectors(e,t),s=new U.Vector3().subVectors(o,n),i=r.length(),l=s.length();if(i===0||l===0)return{rate:NaN,angle:NaN,isPerpendicular:!1,isParallel:!1};r.normalize(),s.normalize();let u=Math.abs(r.dot(s)),d=Math.min(1,Math.max(0,u)),f=Math.acos(d),c=U.MathUtils.radToDeg(f),a=1-d,h=1e-6;return{rate:a,percent:`${(a*100).toFixed(2)}%`,angle:c,isPerpendicular:Math.abs(c-90)<.01,isParallel:c<.01}},qt=(t,e,n=!1)=>new U.Vector3((t.x+e.x)/2,(t.y+e.y)/2,n?0:(t.z+e.z)/2),ye=(t,e,n,o,r={})=>{let{parallelAngleMax:s=U.MathUtils.degToRad(10),collinearAngleMax:i=U.MathUtils.degToRad(7),distanceThreshold:l=2,overlapThreshold:u=.01}=r,d=new U.Vector3().subVectors(e,t),f=new U.Vector3().subVectors(o,n),c=d.clone().normalize(),a=f.clone().normalize(),h=U.MathUtils.clamp(c.dot(a),-1,1),g=Math.acos(Math.abs(h)),p=U.MathUtils.radToDeg(g);if(g>s)return{type:"not_parallel",angleDeg:p,avgPerpendicularDistance:null,maxPerpendicularDistance:null,gap:null,overlap:null,closestDistance:null};h<0&&a.negate();let b=new U.Vector3().addVectors(c,a).normalize(),m=new U.Vector3().addVectors(t,e).multiplyScalar(.5),x=ds(n,m,c),y=ds(o,m,c),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),_=Math.max(M,P),v=Math.min(E,T),S=Math.max(E,T),R=_-V,D=S-v,W=Math.min(R,D),I=Math.min(_,S)-Math.max(V,v),C=I<0?-I:0,H=I>0?I:0,A=W>0?H/W:0,k=Wi(t,e,n,o),O=g<=i&&w<l,N;return O?N=A>.5?"collinear_overlap":"collinear_gap":g<=s&&(N="parallel_offset"),{type:N,angleDeg:p,avgPerpendicularDistance:w,maxPerpendicularDistance:z,gap:C,overlap:H,closestDistance:k}};function ds(t,e,n){let o=new U.Vector3().subVectors(t,e),r=o.dot(n),s=n.clone().multiplyScalar(r);return new U.Vector3().subVectors(o,s).length()}function Wi(t,e,n,o){let r=new U.Vector3().subVectors(e,t),s=new U.Vector3().subVectors(o,n),i=new U.Vector3().subVectors(n,t),l=r.dot(r),u=r.dot(s),d=s.dot(s),f=r.dot(i),c=s.dot(i),a=l*d-u*u,h,g;a<1e-10?(h=0,g=d!==0?c/d:0):(h=(u*c-d*f)/a,g=(l*c-u*f)/a),h=U.MathUtils.clamp(h,0,1),g=d!==0?U.MathUtils.clamp((u*h+c)/d,0,1):0,h=l!==0?U.MathUtils.clamp((u*g-f)/l,0,1):0;let p=t.clone().add(r.clone().multiplyScalar(h)),b=n.clone().add(s.clone().multiplyScalar(g));return p.distanceTo(b)}var On=t=>{let e=999999,n=-999999;for(let o=0;o<t.length;o++)t[o].z>n&&(n=t[o].z),t[o].z<e&&(e=t[o].z);return{minZ:e,maxZ:n}},bn=(t,e,n)=>{let o=new U.Plane,r=new U.Vector3(t.x,t.y,t.z),s=new U.Vector3(e.x,e.y,e.z),i=new U.Vector3(e.x,e.y,e.z+5);o.setFromCoplanarPoints(r,s,i);let l=[],u=[];n.forEach(b=>{let m=new U.Vector3;o.projectPoint(b,m),u.push(m.clone()),m.z=r.z,l.push(m)});let d=new U.Vector3,f=new U.Vector3;o.projectPoint(r,d),o.projectPoint(s,f);let c=new U.Line3(d,f),a=[],h=[],g=[],p=new U.Vector3;return l.forEach((b,m)=>{c.closestPointToPoint(b,!0,p).distanceTo(b)<.001?(a.push(n[m]),h.push(u[m])):g.push(b)}),{newOriginalPoints:a,newProjectPoints:g,newOnLinePoints:h}},ps=(t,e,n)=>{function o(r,s,i,l,u,d,f,c,a){let h=new U.Line3(r,s),g=new Map,p=new U.Vector3,b=r.clone(),m=s.clone(),x=0;for(;;){let y=new Map,w=0;for(let z=0;z<a.checkResults.length;z++)if(!(a.checkResults[z].allCenterPoints.length/c*100<1))for(let P=0;P<a.checkResults[z].allCenterPoints.length;P++){if(g.has(z)&&g.get(z).removePtsIndex.includes(P))continue;let E=a.checkResults[z].allCenterPoints[P];E=new U.Vector3(E.x,E.y,E.z);let T=h.closestPointToPoint(E,!0,p),V=E.distanceTo(T);Math.abs(V-u)<.01&&(w++,y.has(z)?y.get(z).removePtsIndex.push(P):y.set(z,{index:z,removePtsIndex:[P]}))}if(x==f){r=b,s=m;break}if(w<d/20*19||w==0){y.clear(),f-x<5&&(r=b,s=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(),r=r.addScaledVector(i,l),s=s.addScaledVector(i,l),h.set(r,s)}}if(g.size>0&&x!=f)for(let[y,w]of g){let z=[],M=[];for(let P=0;P<a.checkResults[y].allCenterPoints.length;P++)w.removePtsIndex.includes(P)||(z.push(a.checkResults[y].allCenterPoints[P]),M.push(a.checkResults[y].originalVertices[P]));a.checkResults[y].allCenterPoints=z,a.checkResults[y].originalVertices=M}}for(let r=0;r<t.length;r++){let s=t[r];if(s.length<.5)continue;let i=-1,l=-1,u=e.readLineById(s.id);u.checkResults=e.getLineCheckReultsById(s.id),u.originalPoints=e.getOriginalPointsById(s.id),s.originalPoints=u.originalPoints,s.checkResults=u.checkResults,s.checkResults.allCenterPoints=[],u=null;for(let D=0;D<s.checkResults.length;D++)for(let W=0;W<s.checkResults[D].originalVertices.length;W++){let I=Fn(s.checkResults[D].originalVertices[W]);s.checkResults.allCenterPoints.push(I)}if(!s.checkResults||s.checkResults.length<=0)continue;if(s.checkResults[0].originalVertices&&s.checkResults[0].originalVertices.length>0){let D=s.checkResults[0].originalVertices[0],[W,I,C,H]=D;W=new U.Vector3(W.x,W.y,W.z),I=new U.Vector3(I.x,I.y,I.z),C=new U.Vector3(C.x,C.y,C.z),H=new U.Vector3(H.x,H.y,H.z),i=W.distanceTo(I),l=W.distanceTo(H);let A=new U.Vector3().subVectors(W,I).normalize(),k=Kt(A,new U.Vector3(0,0,1));k&&k.parallel&&([l,i]=[i,l])}if(i<0||l<0)continue;let d=new U.Vector3(s.start.x,s.start.y,s.start.z),f=new U.Vector3(s.end.x,s.end.y,s.end.z),c=d.distanceTo(f),a=s.rooftopPz-s.start.z,h=Math.ceil(c/i),g=Math.ceil(a/l),p=d.clone(),b=f.clone(),m=b.clone().add(new U.Vector3(0,0,a)),x=p.clone().add(new U.Vector3(0,0,a)),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=l/2,T=c*a,V=i*l,_=T/V;o(p,x,y,i,P,g,h,_,s),o(b,m,w,i,P,g,h,_,s),s.start=p,s.end=b;let{newOriginalPoints:v}=bn(p,b,s.originalPoints);s.originalPoints=v,n.stageReplaceCheckResults(s.id,s.checkResults);let R=new Bn().vector3ArrToFloat32Array(s.originalPoints);n.stageReplacePoints(s.id,R),s.checkResults=null,s.originalPoints=null}n.commit()},jt=(t,e)=>new U.Vector3(t.x,t.y,0).distanceTo(new U.Vector3(e.x,e.y,0)),zo=(t,e,n=1e-6)=>{let o=new U.Vector3;return t.closestPointToPoint(e,!0,o),o.distanceTo(e)<n},nn=t=>{let e=0,n=[];for(let o=0;o<t.length;o++)for(let r=o+1;r<t.length;r++){let s=t[o].distanceTo(t[r]);s>e&&(e=s,n=[t[o],t[r]])}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 xs=()=>{let t=Math.floor(Math.random()*75+180).toString(16).padStart(2,"0"),e=Math.floor(Math.random()*75+180).toString(16).padStart(2,"0"),n=Math.floor(Math.random()*75+180).toString(16).padStart(2,"0");return`#${t}${e}${n}`};var Mo=(t,e=.001)=>{let n=new Map,o=[];for(let r of t){let s=Math.round(r.x/e),i=Math.round(r.y/e),l=Math.round(r.z/e),u=`${s},${i},${l}`;n.has(u)||(n.set(u,!0),o.push(r))}return o},ys=t=>{let e=t.center,n=t.halfSize,r=t.rotation.elements,s=new U.Vector3(r[0],r[1],r[2]).multiplyScalar(n.x),i=new U.Vector3(r[3],r[4],r[5]).multiplyScalar(n.y),l=new U.Vector3(r[6],r[7],r[8]).multiplyScalar(n.z);function u(f,c,a){return e.clone().addScaledVector(s,f).addScaledVector(i,c).addScaledVector(l,a)}return[u(-1,-1,-1),u(1,-1,-1),u(1,1,-1),u(-1,1,-1),u(-1,-1,1),u(1,-1,1),u(1,1,1),u(-1,1,1)]},Eo=(t,e)=>{let n=t[0],o=t[1],r=t[2],s=t[3],i=new U.Vector3().subVectors(o,n),l=new U.Vector3().subVectors(s,n),u=i.length(),d=l.length();i.normalize(),l.normalize();let f=new U.Vector3(0,0,1),a=new U.Vector3().add(n).add(o).add(r).add(s).multiplyScalar(.25).clone().addScaledVector(f,e/2),h=new U.BoxGeometry(u,d,e),g=new U.Matrix4;return g.makeBasis(i,l,f),g.setPosition(a),h.applyMatrix4(g),h.computeVertexNormals(),h},Fn=t=>{if(!t||t.length===0)return null;let e=new U.Vector3(0,0,0);for(let n of t)Array.isArray(n)?(e.x+=n[0],e.y+=n[1],e.z+=n[2]):(e.x+=n.x,e.y+=n.y,e.z+=n.z);return e.divideScalar(t.length),e};import*as Xt from"three";var _i=(t,e)=>{console.log("lines",t);for(let n=0;n<t.length;n++){let o=t[n],r=[];o.originalPoints.forEach(y=>{let w=new Xt.Vector3(y.x,y.y,0),z=!1;for(let M=0;M<r.length;M++)if(ct(w,r[M],.01)){z=!0;break}z||r.push(w)});let s=Math.round(Math.max(5,Math.min(350,20*Math.sqrt(o.length)))),i=1,l=new Xt.Vector3(o.start.x,o.start.y,o.start.z),u=new Xt.Vector3(o.end.x,o.end.y,o.end.z),d=new Xt.Vector3().subVectors(u,l).normalize(),f=d.clone().cross(new Xt.Vector3(0,0,1)).normalize(),c=f.clone().negate(),a=[],h=[],g=o.length/s;console.log(g);for(let y=0;y<s;y++){let w=[];w.push(l.clone().addScaledVector(f,i)),w.push(w[0].clone().addScaledVector(d,g)),w.push(w[1].clone().addScaledVector(c,i*2)),w.push(l.clone().addScaledVector(c,g));let z=[];for(let M=0;M<r.length;M++)a.includes(M)||Ai(r[M],w)&&(a.push(M),z.push(r[M]));z.length>0&&h.push(Li(z)),l=l.addScaledVector(d,g)}let p=new Float32Array(r.length*3);r.forEach((y,w)=>{p[w*3]=y.x,p[w*3+1]=y.y,p[w*3+2]=y.z});let b=new Xt.BufferGeometry;b.setAttribute("position",new Xt.BufferAttribute(p,3)),b.rotateX(-Math.PI/2),e.add(new Xt.Points(b,new Xt.PointsMaterial({color:xs(),size:.02})));let[m,x]=Fi(h,{plane:"xy",trimRatio:0});hs(m,x,e)}};function bs(t,e="xy"){if(e==="xy")return{x:t.x,y:t.y};if(e==="xz")return{x:t.x,y:t.z};if(e==="yz")return{x:t.y,y:t.z};throw new Error(`Unsupported plane: ${e}`)}function Hi(t,e,n){let o=e.x-t.x,r=e.y-t.y,s=n.x-t.x,i=n.y-t.y;return o*i-r*s}function Ai(t,e,n="xy"){if(!e||e.length!==4)throw new Error("rectPoints must contain 4 points");let o=bs(t,n),r=e.map(l=>bs(l,n)),s=!1,i=!1;for(let l=0;l<4;l++){let u=r[l],d=r[(l+1)%4],f=Hi(u,d,o);if(f>1e-9&&(s=!0),f<-1e-9&&(i=!0),s&&i)return!1}return!0}function Li(t){if(!t||t.length===0)return null;let e=new Xt.Vector3(0,0,0);for(let n of t)Array.isArray(n)?(e.x+=n[0],e.y+=n[1],e.z+=n[2]):(e.x+=n.x,e.y+=n.y,e.z+=n.z);return e.divideScalar(t.length),e}function ki(t){return t instanceof Xt.Vector3?t.clone():Array.isArray(t)?new Xt.Vector3(t[0],t[1],t[2]):new Xt.Vector3(t.x,t.y,t.z)}function Bi(t,e="xy"){let n=ki(t);if(e==="xy")return{x:n.x,y:n.y,up:n.z};if(e==="xz")return{x:n.x,y:n.z,up:n.y};if(e==="yz")return{x:n.y,y:n.z,up:n.x};throw new Error(`Unsupported plane: ${e}`)}function ws(t,e,n,o="xy"){if(o==="xy")return new Xt.Vector3(t,e,n);if(o==="xz")return new Xt.Vector3(t,n,e);if(o==="yz")return new Xt.Vector3(n,t,e);throw new Error(`Unsupported plane: ${o}`)}function Oi(t,e,n){if(Math.abs(e)<1e-12)return t>=n?{x:1,y:0}:{x:0,y:1};let r=t+n,s=t*n-e*e,i=Math.sqrt(Math.max(0,r*r*.25-s)),l=r*.5+i,u=e,d=l-t,f=Math.hypot(u,d);return f<1e-12?{x:1,y:0}:{x:u/f,y:d/f}}function Fi(t,e={}){let{plane:n="xy",trimRatio:o=0}=e;if(!t||t.length<2)return null;let r=t.map(I=>Bi(I,n)),s=0,i=0,l=0;for(let I of r)s+=I.x,i+=I.y,l+=I.up;s/=r.length,i/=r.length,l/=r.length;let u=0,d=0,f=0;for(let I of r){let C=I.x-s,H=I.y-i;u+=C*C,d+=C*H,f+=H*H}u/=r.length,d/=r.length,f/=r.length;let c=Oi(u,d,f),a={x:-c.y,y:c.x},h=[];for(let I of r){let C=I.x-s,H=I.y-i,A=C*c.x+H*c.y,k=C*a.x+H*a.y;h.push({s:A,t:k,up:I.up})}h.sort((I,C)=>I.s-C.s);let g=h.length,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 I=h.map(H=>H.t).sort((H,A)=>H-A),C=Math.floor(I.length/2);return I.length%2===0?(I[C-1]+I[C])*.5:I[C]})(),w=(()=>{let I=h.map(H=>H.up).sort((H,A)=>H-A),C=Math.floor(I.length/2);return I.length%2===0?(I[C-1]+I[C])*.5:I[C]})(),z=m.s,M=x.s,P=y,E=y,T=w,V=w,_=s+c.x*z+a.x*P,v=i+c.y*z+a.y*P,S=s+c.x*M+a.x*E,R=i+c.y*M+a.y*E,D=ws(_,v,T,n),W=ws(S,R,V,n);return[D,W]}var Ni=async(t,e,n,o,r)=>{if(ps(t,o,r),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(W=>{D.push(new F.Vector3(W.x,W.y,W.z))}),M.push(D)});let P=M.length,E=Array.from({length:P},(R,D)=>D);for(let R=0;R<P;R++)for(let D=R+1;D<P;D++){let W=M[R],I=M[D];if(W.some(H=>I.some(A=>H.equals(A)))){let H=T(R),A=T(D);H!==A&&(E[H]=A)}}let V=new Map,_=-1,v=-1;for(let R=0;R<P;R++){let D=T(R);V.has(D)||V.set(D,{points:[],area:0,index:-1,gridWidth:-1,gridHeight:-1,centerPts:[],facePoints:[],boxArea:-1,totalInPlaneNum:-1});let W=V.get(D),[I,C,H,A]=M[R],k=new F.Vector3().add(I).add(C).add(H).add(A).multiplyScalar(.25);if(W.points.push(...M[R]),W.area+=I.distanceTo(C)*I.distanceTo(A),W.index=w,W.centerPts.push(k),_==-1||v==-1){let O=new F.Vector3().subVectors(I,C).normalize();v=I.distanceTo(A),_=I.distanceTo(C);let N=Kt(O,new F.Vector3(0,0,1));N&&N.parallel&&([v,_]=[_,v])}W.gridWidth=_,W.gridHeight=v}let S=V.values();for(let R of V.values()){let{facePoints:D,boxArea:W,totalInPlaneNum:I}=gs(R.points,R.gridWidth,R.gridHeight,R.centerPts);R.centerPts=null,R.facePoints=D,R.boxArea=W,R.totalInPlaneNum=I}x.push(...S)}m.checkResults=null,m.mergeCheckRegion=x}}let s=[];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=qt(y[0],y[3],!0),P=qt(y[1],y[2],!0);s.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<s.length;m++){let x=s[m];for(let y=0;y<t.length;y++){if(t[y].length<.5)continue;let w=[],z=qt(t[y].start,t[y].end,!0);w.push(z),w.push(qt(z,t[y].start,!0)),w.push(qt(z,t[y].end,!0));let M=!1,P=x.boxPoints.length;for(let E=0;E<w.length;E++){let T=w[E].x,V=w[E].y;for(let _=0,v=P-1;_<P;v=_++){let S=x.boxPoints[_].x,R=x.boxPoints[_].y,D=x.boxPoints[v].x,W=x.boxPoints[v].y;R>V!=W>V&&T<(D-S)*(V-R)/(W-R)+S&&(M=!M)}if(M)break}if(M){let E=new F.Vector3(t[y].start.x,t[y].start.y,0),T=new F.Vector3(t[y].end.x,t[y].end.y,0),V=x.doorStartPt.distanceTo(x.doorEndPt),_=E.distanceTo(T),v=Gt(x.doorStartPt,x.doorEndPt,E,T);if(Math.abs(_-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(_-V)>1.3&&v&&v.angleDeg<15){let S=ye(x.doorStartPt,x.doorEndPt,E,T,{parallelAngleMax:F.MathUtils.degToRad(15)}),R=x.doorStartPt.distanceTo(E),D=x.doorStartPt.distanceTo(T),W=x.doorEndPt.distanceTo(E),I=x.doorEndPt.distanceTo(T),C=R<.2||D<.2||W<.2||I<.2;if(S&&S.type=="collinear_overlap"&&S.maxPerpendicularDistance<.1&&!C){x.inWall=!0;break}else{let H=new F.Line3(E,T),A=H.closestPointToPoint(x.doorStartPt,!0,new F.Vector3),k=H.closestPointToPoint(x.doorEndPt,!0,new F.Vector3),O=A.distanceTo(x.doorStartPt),N=k.distanceTo(x.doorEndPt);if(O<.1||N<.1){x.inWall=!0;break}}}}else continue}}let i=0,l=[],u=[],d=[],f=[],c=.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 W=S[0].distanceTo(S[1]),I=S[0].distanceTo(S[3]),C=v.gridHeight*(I/v.gridHeight/3*2)+v.gridHeight/2,H=new F.Vector3(S[0].x,S[0].y,S[0].z+C),A=new F.Vector3(S[1].x,S[1].y,S[1].z+C),k=new F.Line3(H,A),O=[],N=new F.Vector3;v.points.forEach(q=>{k.closestPointToPoint(q,!0,N).distanceTo(q)<v.gridHeight+.01&&O.push(q)});let L=[],B=[];for(;;){let q=[];for(let X=0;X<O.length;X++)B.includes(X)||q.length==0&&(q.push(O[X]),B.push(X));for(let X=0;X<O.length;X++)if(!B.includes(X)){for(let Y=0;Y<q.length;Y++)if(O[X].distanceTo(q[Y])<v.gridWidth+.01){q.push(O[X]),B.push(X),X=-1;break}}if(q.length==0)break;L.push(q)}let $=[];for(let q=0;q<L.length;q++){let X={lineSt:new F.Vector3,lineEd:new F.Vector3,facePoints:[]},Y=nn(L[q]);Array.isArray(Y)&&Y.length==2&&(X.lineSt=Y[0],X.lineEd=Y[1],X.facePoints.push(new F.Vector3(Y[0].x,Y[0].y,S[0].z)),X.facePoints.push(new F.Vector3(Y[1].x,Y[1].y,S[0].z)),X.facePoints.push(new F.Vector3(Y[1].x,Y[1].y,S[2].z)),X.facePoints.push(new F.Vector3(Y[0].x,Y[0].y,S[2].z)),$.push(X))}V+=v.area;let G=0;if(D!=0&&(G=v.gridHeight*v.gridWidth*D),(v.area-G)/R*100>70&&$.length==1||$.length>1)for(let q=0;q<$.length;q++){let X=$[q],Y=X.facePoints[0].distanceTo(X.facePoints[1]),it=X.facePoints[0].distanceTo(X.facePoints[3]),ht=Y/x.length*100,St=x.rooftopPz-X.facePoints[2].z;if(it<1.5||z<X.facePoints[2].z||St>T/3*2)continue;let nt=!1,wt=!1,zt=!1,Dt=new F.Vector3(0,0,0),Pt=new F.Vector3(0,0,0),Mt=!1,It=[],ot=X.facePoints[2].clone(),ft=X.facePoints[3].clone(),st=X.facePoints[0].clone(),tt=X.facePoints[1].clone(),ae=!1,bt=-1;if(Math.abs(X.facePoints[0].z-x.start.z)<.25){let Jt=!1;for(let rt=0;rt<e.length;rt++){let Ct=rt+1;if(Ct>=e.length)continue;let Ft=new F.Vector3(e[rt].x,e[rt].y,e[rt].z),at=new F.Vector3(e[Ct].x,e[Ct].y,e[Ct].z);if(ze(new F.Vector3(Ft.x,Ft.y,0),new F.Vector3(at.x,at.y,0),new F.Vector3(X.facePoints[0].x,X.facePoints[0].y,0),new F.Vector3(X.facePoints[1].x,X.facePoints[1].y,0),.1)!=null){Jt=!0;break}}let{newOriginalPoints:he}=bn(st,tt,x.originalPoints),Tt=[],ee=[];if(he.forEach(rt=>{rt.z>=ot.z?Tt.push(rt):rt.z<=st.z&&ee.push(rt)}),Tt.length<20)continue;let et=x.rooftopPz-ot.z,me=ot.clone();me.z+=et;let Ae=ot.distanceTo(ft),Le=new F.Vector3().subVectors(ft,ot).normalize(),gn=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(Ae)))),ke=Ae/gn,ge=[],tn=[];for(let rt=0;rt<gn;rt++)ge.push(new F.Vector3(ot.x,ot.y,ot.z+et/5).addScaledVector(Le,ke*rt)),ge.push(new F.Vector3(me.x,me.y,me.z-et/5).addScaledVector(Le,ke*rt));let en=ge.length;for(let rt=0;rt<Tt.length;rt++)for(let Ct=0;Ct<ge.length;Ct++)if(new F.Vector3(Tt[rt].x,Tt[rt].y,Tt[rt].z).distanceTo(ge[Ct])<.05){tn.push(ge[Ct]),ge.splice(Ct,1);break}if(tn.length/en<.5)continue;if(Y>.17&&x.length>.5){let rt=jt(P,st),Ct=jt(P,tt),Ft=jt(E,st),at=jt(E,tt),j=.15,Et=10;if(rt<j||Ct<j)if(Tt.length>10){let yt=new F.Vector3(x.start.x,x.start.y,0),ut=new F.Vector3(x.end.x,x.end.y,0),gt=new F.Vector3().subVectors(yt,ut).normalize(),kt=new F.Vector3,pt=1/0,Ot=-1,xt=!1,dt=!1;for(let J=0;J<t.length;J++){if(J==m)continue;let mt=new F.Vector3(t[J].start.x,t[J].start.y,0),lt=new F.Vector3(t[J].end.x,t[J].end.y,0),vt=ze(yt,ut,mt,lt,.1),Wt=ie(yt,ut,mt,lt);if(vt!=null){if(Wt&&Wt.angle>85){let _t=vt.point.distanceTo(yt),At=vt.point.distanceTo(ut);if(_t<.3){dt=!0,pt=1/0,Ot=-1;break}}continue}if(Wt&&Wt.angle>85){let At=new F.Line3(mt,lt).closestPointToPoint(yt,!0,kt),Bt=Gt(yt,ut,At,yt);if(!Bt||Bt.direction!="same")continue;let se=yt.clone().addScaledVector(gt,Et),Ut=ut.clone().addScaledVector(gt.clone().negate(),Et),re=new F.Vector3().subVectors(lt,mt).normalize(),te=mt.clone().addScaledVector(re.clone().negate(),.03),Te=lt.clone().addScaledVector(re,.03),le=ze(se,Ut,te,Te);if(le==null)continue;let ne=yt.distanceTo(le.point);ne<pt&&(pt=ne,Ot=J)}else if(Wt&&Wt.angle<5){let _t=new F.Vector3(st.x,st.y,0),At=new F.Vector3(tt.x,tt.y,0),Bt=jt(_t,mt),se=jt(_t,lt),Ut=jt(At,mt),re=jt(At,lt),te=Gt(yt,ut,mt,_t),Te=!1,le=o.readLineById(t[J].id);if(le.checkResults=o.getLineCheckReultsById(t[J].id),t[J].checkResults=le.checkResults,le=null,t[J].checkResults){for(let ne=0;ne<t[J].checkResults.length;ne++){let xn=[];for(let xe=0;xe<t[J].checkResults[ne].originalVertices.length;xe++){let Re=Fn(t[J].checkResults[ne].originalVertices[xe]);Re.z=0,xn.push(Re)}let pe=nn(xn);if(pe.length==2){let xe=jt(_t,pe[0]),Re=jt(_t,pe[1]),po=jt(At,pe[0]),xo=jt(At,pe[1]);if(xe<.2||Re<.2||po<.2||xo<.2){Te=!0;break}}}t[J].checkResults=null}if(te&&te.direction=="same"&&!Te&&(Bt<.1||se<.1||Ut<.1||re<.1)){xt=!0,pt=1/0,Ot=-1;break}}}if(pt!=1/0&&pt<2&&(x.length-Y>.2||x.length-Y<.02)&&pt<Y*2)t[Ot].length>.25&&Y+pt>.5&&(ae=!0,rt<j?(ft=ft.addScaledVector(gt,pt),st=st.addScaledVector(gt,pt)):(ot=ot.addScaledVector(gt,pt),tt=tt.addScaledVector(gt,pt)));else{if(!xt&&!dt&&x.length-Y>.1)continue;if(!xt&&!dt&&x.length-Y<.1&&x.length<1.8)continue}}else continue;if(Ft<j||at<j)if(Tt.length>10){let yt=new F.Vector3(x.start.x,x.start.y,0),ut=new F.Vector3(x.end.x,x.end.y,0),gt=new F.Vector3().subVectors(ut,yt).normalize(),kt=new F.Vector3,pt=1/0,Ot=-1,xt=!1,dt=!1;for(let J=0;J<t.length;J++){if(J==m)continue;let mt=new F.Vector3(t[J].start.x,t[J].start.y,0),lt=new F.Vector3(t[J].end.x,t[J].end.y,0),vt=ze(yt,ut,mt,lt,.03),Wt=ie(yt,ut,mt,lt);if(vt!=null){if(Wt&&Wt.angle>85){let _t=vt.point.distanceTo(yt);if(vt.point.distanceTo(ut)<.3){dt=!0,pt=1/0,Ot=-1;break}}continue}if(Wt&&Wt.angle>85){let At=new F.Line3(mt,lt).closestPointToPoint(ut,!0,kt),Bt=Gt(ut,yt,At,ut);if(!Bt||Bt.direction!="same")continue;let se=yt.clone().addScaledVector(gt.clone().negate(),Et),Ut=ut.clone().addScaledVector(gt,Et),re=new F.Vector3().subVectors(lt,mt).normalize(),te=mt.clone().addScaledVector(re.clone().negate(),.03),Te=lt.clone().addScaledVector(re,.03),le=ze(se,Ut,te,Te);if(le==null)continue;let ne=ut.distanceTo(le.point);ne<pt&&(pt=ne,Ot=J)}else if(Wt&&Wt.angle<5){let _t=new F.Vector3(st.x,st.y,0),At=new F.Vector3(tt.x,tt.y,0),Bt=jt(_t,mt),se=jt(_t,lt),Ut=jt(At,mt),re=jt(At,lt),te=Gt(ut,yt,mt,_t),Te=!1,le=o.readLineById(t[J].id);if(le.checkResults=o.getLineCheckReultsById(t[J].id),t[J].checkResults=le.checkResults,le=null,t[J].checkResults){for(let ne=0;ne<t[J].checkResults.length;ne++){let xn=[];for(let xe=0;xe<t[J].checkResults[ne].originalVertices.length;xe++){let Re=Fn(t[J].checkResults[ne].originalVertices[xe]);Re.z=0,xn.push(Re)}let pe=nn(xn);if(pe.length==2){let xe=jt(_t,pe[0]),Re=jt(_t,pe[1]),po=jt(At,pe[0]),xo=jt(At,pe[1]);if(xe<.2||Re<.2||po<.2||xo<.2){Te=!0;break}}}t[J].checkResults=null}if(te&&te.direction=="same"&&!Te&&(Bt<.1||se<.1||Ut<.1||re<.1)){xt=!0,pt=1/0,Ot=-1;break}}}if(pt!=1/0&&pt<2&&(x.length-Y>.2||x.length-Y<.02)&&pt<Y*2)t[Ot].length>.25&&Y+pt>.5&&(ae=!0,Ft<j?(ft=ft.addScaledVector(gt,pt),st=st.addScaledVector(gt,pt)):(ot=ot.addScaledVector(gt,pt),tt=tt.addScaledVector(gt,pt)));else{if(!xt&&!dt&&x.length-Y>.1)continue;if(!xt&&!dt&&x.length-Y<.1&&x.length<1.8)continue}}else continue;Y=ft.distanceTo(ot)}if(ht<85&&Y>.3||Y>.7&&it>T-T/2){if(!x.isLine2){if(Y<3.5)for(let rt=0;rt<s.length;rt++){let Ct=new F.Vector3(s[rt].doorStartPt.x,s[rt].doorStartPt.y,0),Ft=new F.Vector3(s[rt].doorEndPt.x,s[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),Et=X.facePoints[2].z<s[rt].maxZ||Math.abs(X.facePoints[2].z-s[rt].maxZ)<.3,yt=Math.abs(X.facePoints[2].z-s[rt].maxZ)>.2;if(Et){let ut=ye(Ct.clone(),Ft.clone(),at.clone(),j.clone(),{distanceThreshold:2});if(ut&&ut.type=="collinear_gap"){let gt=qt(Ct,Ft),kt=new F.Line3(new F.Vector3(x.start.x,x.start.y,0),new F.Vector3(x.end.x,x.end.y,0)),pt=new F.Vector3,Ot=kt.closestPointToPoint(gt,!0,pt);if(gt.distanceTo(Ot)<.15){let dt=at.distanceTo(Ct),J=j.distanceTo(Ct);if(dt>.25&&J>.25){let vt=at.distanceTo(Ft),Wt=j.distanceTo(Ft);if(vt>.2&&Wt>.2)continue}wt=!0,Mt=!0,It.push(s[rt].index),s[rt].isFind=!0,bt=rt,zt=n[s[rt].index].isFindBeam,n[s[rt].index].isFindBeam=!0;let mt=new F.Vector3().subVectors(at,j).normalize(),lt=Ct.distanceTo(Ft)-ut.overlap;J<dt&&mt.negate(),dt>J?(ot=X.facePoints[2].clone().addScaledVector(mt,lt),ft=X.facePoints[3].clone(),st=ft.clone(),tt=ot.clone(),st.z=tt.z=X.facePoints[0].z):(ot=X.facePoints[2].clone(),ft=X.facePoints[3].clone().addScaledVector(mt,lt),st=ft.clone(),tt=ot.clone(),st.z=tt.z=X.facePoints[0].z)}}else if(ut&&ut.type=="collinear_overlap"&&ut.maxPerpendicularDistance<.35){let gt=at.distanceTo(j),kt=Ft.distanceTo(Ct);if(Math.abs(gt-ut.overlap)<.25||Math.abs(kt-ut.overlap)<.25){if(kt>gt&&Math.abs(kt-ut.overlap)>1){let pt=at.distanceTo(Ct),Ot=at.distanceTo(Ft),xt=j.distanceTo(Ct),dt=j.distanceTo(Ft),J=pt<Ot?pt:Ot,mt=xt<dt?xt:dt,lt=new F.Vector3().subVectors(at,j).normalize(),vt=kt-ut.overlap;J<mt?(lt.negate(),ot=X.facePoints[2].clone().addScaledVector(lt,vt),ft=X.facePoints[3].clone(),st=ft.clone(),tt=ot.clone(),st.z=tt.z=X.facePoints[0].z):(ot=X.facePoints[2].clone(),ft=X.facePoints[3].clone().addScaledVector(lt,vt),st=ft.clone(),tt=ot.clone(),st.z=tt.z=X.facePoints[0].z)}Y>1.5&&(wt=!0,Mt=!0,It.push(s[rt].index),s[rt].isFind=!0,zt=n[s[rt].index].isFindBeam,n[s[rt].index].isFindBeam=!0,bt=rt)}}}}if(!Mt&&Y<1.5)for(let rt=0;rt<s.length;rt++){if(s[rt].inWall)continue;let Ct=new F.Vector3(s[rt].doorStartPt.x,s[rt].doorStartPt.y,0),Ft=new F.Vector3(s[rt].doorEndPt.x,s[rt].doorEndPt.y,0),at=new F.Vector3(ft.x,ft.y,0),j=new F.Vector3(ot.x,ot.y,0),Et=new F.Vector3().subVectors(Ct,Ft).normalize(),yt=new F.Vector3().subVectors(at,j).normalize(),ut=.25,gt=Ct.clone().addScaledVector(Et,ut),kt=Ft.clone().addScaledVector(Et.clone().negate(),ut),pt=at.clone().addScaledVector(yt,ut),Ot=j.clone().addScaledVector(yt.clone().negate(),ut);if(Gt(gt,kt,pt,Ot).isParallel)continue;let dt=ze(gt,kt,pt,Ot),J=!0,mt=Ct.distanceTo(at),lt=Ct.distanceTo(j),vt=Ft.distanceTo(at),Wt=Ft.distanceTo(j);if((mt<c||lt<c||vt<c||Wt<c||dt)&&J){let At=new F.Line3(at,j);if(mt<c||vt<c)if(Dt=at.clone(),mt<c){let Bt=At.closestPointToPoint(Ft,!1,new F.Vector3);Pt=new F.Vector3().subVectors(Ft,Bt).normalize()}else{let Bt=At.closestPointToPoint(Ct,!1,new F.Vector3);Pt=new F.Vector3().subVectors(Ct,Bt).normalize()}else if(lt<c||Wt<c)if(Dt=j.clone(),lt<c){let Bt=At.closestPointToPoint(Ft,!1,new F.Vector3);Pt=new F.Vector3().subVectors(Ft,Bt).normalize()}else{let Bt=At.closestPointToPoint(Ct,!1,new F.Vector3);Pt=new F.Vector3().subVectors(Ct,Bt).normalize()}else if(dt){let Bt=dt.point.distanceTo(at),se=dt.point.distanceTo(j),Ut=dt.point.distanceTo(gt),re=dt.point.distanceTo(kt);if(Bt<se?Dt=at.clone():Dt=j.clone(),Ut<re){let te=At.closestPointToPoint(kt,!1,new F.Vector3);Pt=new F.Vector3().subVectors(kt,te).normalize()}else{let te=At.closestPointToPoint(gt,!1,new F.Vector3);Pt=new F.Vector3().subVectors(gt,te).normalize()}}zt=n[s[rt].index].isFindBeam,n[s[rt].index].isFindBeam=!0,wt=!0,s[rt].isFind=!0,bt=rt}}}(wt||Jt||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),Et=1/0,yt=1/0,ut=st.clone(),gt=tt.clone(),kt=[],pt=[],Ot=new F.Line3(ot,ft),xt=new F.Vector3,dt=999999;if(x.originalPoints.forEach(J=>{if(J.z-st.z<it/2+.1&&J.z-st.z>it/2-.1&&kt.push(J),J.z>ot.z){let mt=Ot.closestPointToPoint(J,!0,xt),lt=new F.Vector3().subVectors(mt,ot),vt=new F.Vector3().subVectors(mt,ft),Wt=Kt(at,vt),_t=Kt(j,lt);Wt&&Wt.parallel&&!Wt.sameDirection&&_t&&_t.parallel&&!_t.sameDirection&&pt.push(J)}}),kt.length>0){let{newProjectPoints:J}=bn(st,tt,kt);for(let mt of J)mt.z=st.z;J.forEach(mt=>{let lt=new F.Vector3(mt.x,mt.y,st.z),vt=new F.Vector3().subVectors(lt,tt),Wt=new F.Vector3().subVectors(lt,st),_t=Kt(at,Wt),At=Kt(j,vt);if(_t&&_t.parallel&&_t.sameDirection){let Bt=lt.distanceTo(st);Bt<Et&&(Et=Bt,ut=lt)}else if(At&&At.parallel&&At.sameDirection){let Bt=lt.distanceTo(tt);Bt<yt&&(yt=Bt,gt=lt)}})}if(ut.equals(st)||(st=ut,ft=new F.Vector3(st.x,st.y,ft.z)),gt.equals(tt)||(tt=gt,ot=new F.Vector3(tt.x,tt.y,ot.z)),pt.length>10){let{newOnLinePoints:J}=bn(ft,ot,pt);for(let mt=0;mt<J.length;mt++){let vt=Ot.closestPointToPoint(J[mt],!0,xt).distanceTo(J[mt]);vt>.02&&dt>vt&&(dt=vt)}ot.z+=dt,ft.z+=dt,it+=dt}}let Jt=!1;for(let at=0;at<d.length;at++){let j=ye(d[at].start,d[at].end,st,tt);j&&j.type=="collinear_overlap"&&j.maxPerpendicularDistance<.07&&(Jt=!0)}if(Jt){bt!=-1&&(zt||(n[s[bt].index].isFindBeam=!1,s[bt].isFind=!1));continue}let he=tt.distanceTo(st);if(he<.4&&!wt||he<.3&&wt)continue;u.includes(m)||u.push(m);let Tt="",ee=wt?"singleDoor":"";ee=Mt?"pullOutDoor":ee;let et={id:i,beamStart:ot,beamEnd:ft,beamHeight:x.rooftopPz-ot.z,doorStart:st,doorEnd:tt,doorHeight:it,nearId:-1,type:Tt,isExtend:ae,isDoor:wt,isPullOutDoor:Mt,pcbDoorIndexs:It,beamNearWallVec:new F.Vector3(0,0,0),doorType:ee,doorOpenEndPoint:Dt,doorOpenVector:Pt,lineIsOnlyBeam:!1};if(et.beamHeight<.1)continue;let me=1/0,Ae=!1,Le=new F.Vector3,gn=new F.Vector3,ke=-1,ge=-1,tn=-1,en=!1,pn=!1;if(!Ae){let at=new F.Line3(st.clone(),tt.clone()),j=-1;for(let Et=0;Et<t.length;Et++){if(t[Et].length<.5||Et==m)continue;let yt=new F.Vector3(t[Et].start.x,t[Et].start.y,t[Et].start.z),ut=new F.Vector3(t[Et].end.x,t[Et].end.y,t[Et].end.z),gt=ye(yt,ut,st,tt),kt=Gt(yt,ut,st,tt);if(gt&>.maxPerpendicularDistance<.5){if(kt&&kt.isParallel){let lt=new F.Line3(yt,ut),vt=new F.Vector3(st.x,st.y,yt.z),Wt=lt.closestPointToPoint(vt,!0,new F.Vector3),_t=ie(Wt,vt,st,tt);_t&&_t.angle>85&&(et.beamNearWallVec=new F.Vector3().subVectors(Wt,vt).normalize(),et.beamStart.z>t[Et].rooftopPz-.03&&Y>1?pn=!0:pn=!1)}let pt=[],Ot=o.readLineById(t[Et].id);Ot.originalPoints=o.getOriginalPointsById(t[Et].id),t[Et].originalPoints=Ot.originalPoints,Ot=null,t[Et].originalPoints.forEach(lt=>{lt.z>st.z+.2&<.z<st.z+it/2&&pt.push(new F.Vector3(lt.x,lt.y,st.z))}),t[Et].originalPoints=null;let xt=new F.Vector3,dt=[],J=[];for(let lt=0;lt<pt.length;lt++){let vt=at.closestPointToPoint(pt[lt],!0,xt);vt.distanceTo(pt[lt])<.15&&(dt.push(pt[lt]),J.push(vt.clone()))}for(let lt=0;lt<J.length;lt++)zo(at,J[lt])&&dt.push(J[lt]);if(dt=J,dt=Mo(dt),dt.length<150)continue;let mt=nn(dt);if(mt.length==2){let lt=mt[0].distanceTo(mt[1]);if(Math.abs(lt-at.distance())<.3){j=gt.maxPerpendicularDistance;let vt=new F.Line3(yt,ut),Wt=new F.Vector3(st.x,st.y,yt.z),_t=vt.closestPointToPoint(Wt,!0,new F.Vector3);if(et.beamNearWallVec=new F.Vector3().subVectors(_t,Wt).normalize(),et.beamStart.z>t[Et].rooftopPz-.03&&Y>.8)pn=!0,en=!0;else if(Jt=!0,bt!=-1&&(zt||(n[s[bt].index].isFindBeam=!1,s[bt].isFind=!1)),ge!=-1&&tn!=-1){let At=t[ge].doorAndBeamData[tn];At.nearId=-1}break}}if(Jt)break}else gt&>.type=="collinear_overlap"&>.maxPerpendicularDistance>.3&>.maxPerpendicularDistance<.7&&(en=!0)}if(Jt){if(Y<1.5||j<.08)continue;en=!0}}let rt=!1;if(ke!=-1)for(let at=0;at<f.length&&!(f[at].length==1&&(f[at][0].id==i?(f[at].push({id:ke,beamStart:Le,beamEnd:gn}),rt=!0):f[at][0].id==ke&&(f[at].push({id:i,beamStart:ot,beamEnd:ft}),rt=!0),rt));at++);rt||f.push([{id:i,beamStart:ot,beamEnd:ft}]);let Ct=et.doorStart.distanceTo(et.doorEnd),Ft=On(x.originalPoints);if(et.lineIsOnlyBeam=Ft.minZ>x.start.z&&Ft.minZ-x.start.z>1,wt?Tt="door":Ct>1.5||ae?Tt="beam":Tt=en&&Ct>.8?"beam":"hole",Tt!="beam"&&t[m].isLine2)continue;et.type=Tt,et.wallBelowBeam=pn;for(let at=0;at<l.length;at++){let j=t[l[at].linesIndex].doorAndBeamData[l[at].doorIndex];if(j.nearId!=-1||et.type=="beam"&&j.type!="beam"||et.type!="beam"&&j.type=="beam")continue;let Et=Gt(ot.clone(),ft.clone(),j.beamStart.clone(),j.beamEnd.clone());if(Et&&Et.isParallel){let yt=ot.distanceTo(ft),ut=j.beamStart.distanceTo(j.beamEnd),gt=new F.Line3(ot.clone(),ft.clone());gt.start.z=0,gt.end.z=0;let kt=qt(j.beamStart,j.beamEnd,!0);ut>yt&&(gt.start=new F.Vector3(j.beamStart.x,j.beamStart.y,0),gt.end=new F.Vector3(j.beamEnd.x,j.beamEnd.y,0),kt=qt(ot,ft,!0));let pt=new F.Vector3,Ot=gt.closestPointToPoint(kt,!0,pt),xt=Ot.distanceTo(kt),dt=new F.Vector3().subVectors(kt,Ot).normalize(),J=dt.clone().negate(),mt=kt.clone().addScaledVector(J,xt+.1),lt=ze(gt.start,gt.end,kt,mt),vt=!wt&&!j.isDoor&&(yt>ut*2||ut>yt*2);if(xt<.4&<!=null&&!vt){let Wt=!1;for(let Ut=0;Ut<x.doorAndBeamData.length;Ut++)if(x.doorAndBeamData[Ut].id==j.id){Wt=!0;break}if(Wt)continue;j.nearId=i,et.nearId=j.id;let _t=.8;(j.isDoor||et.isDoor)&&(j.isDoor=!0,et.isDoor=!0),j.doorType!=""?et.doorType=j.doorType:et.doorType!=""&&(j.doorType=et.doorType),j.isPullOutDoor?et.isPullOutDoor=!0:et.isPullOutDoor&&(j.isPullOutDoor=!0);let At=It.some(Ut=>j.pcbDoorIndexs.includes(Ut)),Bt=!1,se=!1;if(et.type=="beam"&&j.type=="beam"){let Ut=o.readLineById(t[l[at].linesIndex].id);Ut.originalPoints=o.getOriginalPointsById(t[l[at].linesIndex].id),t[l[at].linesIndex].originalPoints=Ut.originalPoints,Ut=null;let re=On(t[l[at].linesIndex].originalPoints),te=On(x.originalPoints);t[l[at].linesIndex].originalPoints=null,re.minZ>t[l[at].linesIndex].start.z&&re.minZ-t[l[at].linesIndex].start.z>1&&te.minZ>x.start.z&&te.minZ-x.start.z>1&&(Bt=yt>ut,se=yt<ut,ut>yt&&(et.isExtend=!0),yt>ut&&(t[l[at].linesIndex].isExtend=!0))}yt<ut&&!se||Bt?(Bt&&(J=J.negate(),dt=dt.negate()),yt>_t&&!j.isPullOutDoor?(j.beamStart=ot.clone().addScaledVector(J,xt),j.beamEnd=ft.clone().addScaledVector(J,xt),j.doorStart=st.clone().addScaledVector(J,xt),j.doorEnd=tt.clone().addScaledVector(J,xt),j.doorHeight=et.doorHeight,j.beamStart.z=j.beamEnd.z=j.doorStart.z+j.doorHeight,j.doorOpenEndPoint=et.doorOpenEndPoint.clone(),j.doorOpenVector=et.doorOpenVector.clone()):!Mt||Mt&&j.isPullOutDoor&&At?(et.beamStart=j.beamStart.clone().addScaledVector(dt,xt),et.beamEnd=j.beamEnd.clone().addScaledVector(dt,xt),et.doorStart=j.doorStart.clone().addScaledVector(dt,xt),et.doorEnd=j.doorEnd.clone().addScaledVector(dt,xt),et.doorHeight=j.doorHeight,et.beamStart.z=et.beamEnd.z=et.doorStart.z+et.doorHeight,et.doorOpenEndPoint=j.doorOpenEndPoint.clone(),et.doorOpenVector=j.doorOpenVector.clone()):(j.beamStart=ot.clone().addScaledVector(J,xt),j.beamEnd=ft.clone().addScaledVector(J,xt),j.doorStart=st.clone().addScaledVector(J,xt),j.doorEnd=tt.clone().addScaledVector(J,xt),j.doorHeight=et.doorHeight,j.beamStart.z=j.beamEnd.z=j.doorStart.z+j.doorHeight,j.doorOpenEndPoint=et.doorOpenEndPoint.clone(),j.doorOpenVector=et.doorOpenVector.clone())):(yt>ut&&!Bt||se)&&(se&&(J=J.negate(),dt=dt.negate()),ut>_t&&!Mt?(et.beamStart=j.beamStart.clone().addScaledVector(J,xt),et.beamEnd=j.beamEnd.clone().addScaledVector(J,xt),et.doorStart=j.doorStart.clone().addScaledVector(J,xt),et.doorEnd=j.doorEnd.clone().addScaledVector(J,xt),et.doorHeight=j.doorHeight,et.beamStart.z=et.beamEnd.z=et.doorStart.z+et.doorHeight,et.doorOpenEndPoint=j.doorOpenEndPoint.clone(),et.doorOpenVector=j.doorOpenVector.clone()):!j.isPullOutDoor||Mt&&j.isPullOutDoor&&At?(j.beamStart=ot.clone().addScaledVector(dt,xt),j.beamEnd=ft.clone().addScaledVector(dt,xt),j.doorStart=st.clone().addScaledVector(dt,xt),j.doorEnd=tt.clone().addScaledVector(dt,xt),j.doorHeight=et.doorHeight,j.beamStart.z=j.beamEnd.z=j.doorStart.z+j.doorHeight,j.doorOpenEndPoint=et.doorOpenEndPoint.clone(),j.doorOpenVector=et.doorOpenVector.clone()):(et.beamStart=j.beamStart.clone().addScaledVector(J,xt),et.beamEnd=j.beamEnd.clone().addScaledVector(J,xt),et.doorStart=j.doorStart.clone().addScaledVector(J,xt),et.doorEnd=j.doorEnd.clone().addScaledVector(J,xt),et.doorHeight=j.doorHeight,et.beamStart.z=et.beamEnd.z=et.doorStart.z+et.doorHeight,et.doorOpenEndPoint=j.doorOpenEndPoint.clone(),et.doorOpenVector=j.doorOpenVector.clone())),ke=et.nearId,Le=j.beamStart.clone(),gn=j.beamEnd.clone(),Ae=!0,ge=l[at].linesIndex,tn=l[at].doorIndex;break}}}if(et.nearId!=-1&&Tt=="hole"){let at=!1;for(let j=0;j<t.length;j++)if(t[j].doorAndBeamData){for(let Et=0;Et<t[j].doorAndBeamData.length;Et++)if(t[j].doorAndBeamData[Et].nearId==i&&t[j].doorAndBeamData[Et].type=="beam"){t[j].doorAndBeamData[Et].type=Tt,at=!0;break}if(at)break}}if(x.doorAndBeamIdToCheckResults.push([v.index,i]),x.doorAndBeamData.push(et),l.push({linesIndex:m,doorIndex:x.doorAndBeamData.length-1}),d.push({start:st,end:tt}),i++,Mt&&Y<2)break}}}let _=x.length*(x.rooftopPz-x.start.z);x.completePointAreaPercentage=V/_*100,x.checkResults=null,x.originalPoints=null,x.mergeCheckRegion=null}if(u.length>1)for(let m=0;m<u.length;m++){let x=[];for(let y=0;y<t[u[m]].doorAndBeamData.length;y++){let w=!1;if(t[u[m]].doorAndBeamData[y].type==="beam"&&(t[u[m]].doorAndBeamData[y].beamNearWallVec.x==0&&t[u[m]].doorAndBeamData[y].beamNearWallVec.y==0&&t[u[m]].doorAndBeamData[y].beamNearWallVec.z==0&&t[u[m]].doorAndBeamData[y].nearId==-1||!t[u[m]].doorAndBeamData[y].wallBelowBeam&&t[u[m]].doorAndBeamData[y].nearId==-1)&&(t[u[m]].doorAndBeamData[y].lineIsOnlyBeam?w=!0:t[u[m]].doorAndBeamData[y].type="hole"),!w){let z=t[u[m]].doorAndBeamData[y].doorStart.clone(),M=t[u[m]].doorAndBeamData[y].doorEnd.clone();z.z=M.z=0;let P=z.distanceTo(M);for(let E=0;E<u.length;E++)if(m!=E)for(let T=0;T<t[u[E]].doorAndBeamData.length;T++){let V=t[u[E]].doorAndBeamData[T].doorStart.clone(),_=t[u[E]].doorAndBeamData[T].doorEnd.clone();V.z=_.z=0;let v=V.distanceTo(_),S=ye(z,M,V,_);if(S.type=="collinear_overlap"&&S.maxPerpendicularDistance<.2){let R=new F.Line3(V,_),D=qt(z,M),W=R.closestPointToPoint(D,!0,new F.Vector3),I=D.distanceTo(W);if(Math.abs(P-S.overlap)<.1&&I<.04){t[u[E]].doorAndBeamData[T].nearId==t[u[m]].doorAndBeamData[y].id&&(t[u[E]].doorAndBeamData[T].nearId=-1),w=!0;break}}}}if(w){for(let z=0;z<t[u[m]].doorAndBeamIdToCheckResults.length;z++)if(t[u[m]].doorAndBeamIdToCheckResults[1]==t[u[m]].doorAndBeamData[y].id){t[u[m]].doorAndBeamIdToCheckResults.splice(z,1);break}}w||x.push(t[u[m]].doorAndBeamData[y])}x.length!=t[u[m]].doorAndBeamData.length&&(t[u[m]].doorAndBeamData=x)}let a=.65,h=2,g=[],p=[];for(let m=0;m<s.length;m++){if(s[m].isFind||s[m].inWall)continue;let x=new F.Vector3(s[m].doorStartPt.x,s[m].doorStartPt.y,0),y=new F.Vector3(s[m].doorEndPt.x,s[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),_=y.clone().addScaledVector(w.clone().negate(),T),v=M.clone().addScaledVector(E,T),S=P.clone().addScaledVector(E.clone().negate(),T),R=ze(V,_,v,S),D=Gt(V,_,v,S),W=x.distanceTo(M)>y.distanceTo(M)?y:x,I=W.distanceTo(M),C=W.distanceTo(P);if((I<c||C<c)&&D&&!D.isParallel){let A=x.distanceTo(M),k=x.distanceTo(P),O=A<k?M:P,N=!1;for(let L=0;L<t.length;L++){if(L==z||g.includes(L)||t[L].length<.7)continue;let B=new F.Vector3(t[L].start.x,t[L].start.y,0),$=new F.Vector3(t[L].end.x,t[L].end.y,0),G=new F.Vector3().subVectors(B,$).normalize(),Q=G.clone().negate(),q=B.clone().addScaledVector(G,5),X=$.clone().addScaledVector(Q,5),Y=ie(M,P,B,$),it=ye(M,P,B,$),ht=ze(M,P,q,X),St=!0;if(ht!=null&&(St=ht.point.distanceTo(M)<c||ht.point.distanceTo(P)<c),(Y&&Y.angle>85||it&&it.type=="collinear_gap")&&St){let nt=new F.Line3(M,P),wt=new F.Vector3,zt=nt.closestPointToPoint(B,!0,wt),Dt=nt.closestPointToPoint($,!0,wt),Pt=zt.distanceTo(B),Mt=Dt.distanceTo($),It,ot;if(Pt>Mt&&Mt>a)It=$,ot=Dt;else if(Pt<Mt&&Pt>a)It=B,ot=zt;else continue;if(Pt=O.distanceTo(B),Mt=O.distanceTo($),Pt>h&&Mt>h)continue;let ft=Gt(It,ot,B,$),st=Gt(It,ot,V,_);if(st&&st.isParallel||!ft||!ft.isParallel)continue;let tt=ye(x,y,It,ot);if(tt&&tt.type=="collinear_overlap"&&tt.maxPerpendicularDistance<.2)continue;It.z=ot.z=t[L].start.z;let ae=!1;for(let Tt=0;Tt<p.length;Tt++){let ee=ye(p[Tt].start,p[Tt].end,It,ot);if(ee&&ee.type=="collinear_overlap"&&ee.maxPerpendicularDistance<.2){ae=!0;break}}if(ae)continue;for(let Tt=0;Tt<t.length;Tt++){if(t[Tt].length<.5)continue;let ee=new F.Vector3(t[Tt].start.x,t[Tt].start.y,t[Tt].start.z),et=new F.Vector3(t[Tt].end.x,t[Tt].end.y,t[Tt].end.z),me=ye(ee,et,It,ot);if(me&&me.type=="collinear_overlap"&&me.maxPerpendicularDistance<.1){ae=!0;break}}if(ae)continue;p.push({start:It,end:ot}),g.push(L);let bt=t[L].rooftopPz-t[L].start.z,Jt=t[z].rooftopPz-t[z].start.z,he=bt<Jt?bt:Jt;t[L].doorAndBeamData||(t[L].doorAndBeamData=[]),t[L].doorAndBeamData.push({id:i,beamStart:It,beamEnd:ot,beamHeight:he,doorStart:It,doorEnd:ot,doorHeight:he,nearId:-1,type:"onlyDoor",isDoor:!0,beamNearWallVec:new F.Vector3(0,0,0)}),n[s[m].index].isFindBeam=!0,n[s[m].index].isFindOnlyDoor=!0,f.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:f}},qi=async(t,e)=>{for(let n=0;n<t.length;n++){let o=t[n],r=new F.Vector3(o.start.x,o.start.y,o.start.z),s=new F.Vector3(o.end.x,o.end.y,o.end.z),i=new F.Line3(r.clone(),s.clone()),l=-1;for(let u=0;u<o.doorAndBeamData.length;u++){let d=o.doorAndBeamData[u],f=d.doorHeight;d.isRebuild=!1;let c=!1,a=!1;if(!(d.nearId!=-1||d.type!="beam")){for(let h=0;h<t.length;h++){if(t[h].length<.5||h==n)continue;let g=new F.Vector3(t[h].start.x,t[h].start.y,t[h].start.z),p=new F.Vector3(t[h].end.x,t[h].end.y,t[h].end.z),b=ye(g,p,r,s),m=Gt(g,p,r,s);if(b&&b.maxPerpendicularDistance<.5){if(m&&m.isParallel){let E=new F.Line3(g,p),T=new F.Vector3(r.x,r.y,g.z),V=E.closestPointToPoint(T,!0,new F.Vector3),_=ie(V,T,r,s);_&&_.angle>85&&(d.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>r.z+.2&&E.z<r.z+f/2&&x.push(new F.Vector3(E.x,E.y,r.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++)zo(i,M[E])&&z.push(M[E]);if(z=M,z=Mo(z),z.length<150)continue;let P=nn(z);if(P.length==2){let E=P[0].distanceTo(P[1]);if(Math.abs(E-i.distance())<.3){l=b.maxPerpendicularDistance;let T=new F.Line3(g,p),V=new F.Vector3(r.x,r.y,g.z),_=T.closestPointToPoint(V,!0,new F.Vector3);d.beamNearWallVec=new F.Vector3().subVectors(_,V).normalize(),d.beamStart.z>t[h].rooftopPz-.03&&length>1?a=!0:c=!0;break}}if(c)break}else b&&b.type=="collinear_overlap"&&b.maxPerpendicularDistance>.3&&b.maxPerpendicularDistance<.7&&(a=!0)}if(c){if(length<1.8||l<.2)continue;a=!0}a||(d.isRebuild=!0)}}}};import*as Lt from"three";import"three/examples/jsm/utils/BufferGeometryUtils.js";var zs=(t,e={})=>{let n=e.eps??1e-6,o=e.project??(m=>({x:m.x,y:m.z})),r=e.skipSplit??!1,s=e.insideAreaSign??"positive",i=r?t.map((m,x)=>({start:Nn(m.start),end:Nn(m.end),uuid:m.uuid,sourceIndex:x,sourceSegment:m})):$i(t,o,n),l=[],u=new Map;function d(m){let x=Math.round(m.x/n),y=Math.round(m.y/n);return`${x},${y}`}function f(m){let x=d(m);if(u.has(x))return u.get(x);let y=l.length;return l.push({id:y,x:m.x,y:m.y}),u.set(x,y),y}let c=[],a=new Map;for(let m of i){let x=o(m.start),y=o(m.end);if(Ms(x,y)<n*n)continue;let w=f(x),z=f(y);if(w===z)continue;let M=w<z?`${w}_${z}`:`${z}_${w}`;if(a.has(M))continue;let P=c.length;c.push({id:P,a:w,b:z,uuid:m.uuid,sourceIndex:m.sourceIndex,sourceSegment:m.sourceSegment||m}),a.set(M,P)}let h=[],g=Array.from({length:l.length},()=>[]);function p(m,x,y,w,z){let M=l[m],P=l[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 c){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=>l[v]),E=Xi(P),T=!1;if(s==="positive"?T=E>n:T=E<-n,!T)continue;let V=x.map(v=>h[v].uuid),_=x.map(v=>h[v].sourceIndex);b.push({uuids:V,area:Math.abs(E),lineIndexes:_})}return b};function $i(t,e,n=1e-6){let o=[];for(let r=0;r<t.length;r++){let s=t[r],i=e(s.start),l=e(s.end),u=[{t:0,point:Nn(s.start)},{t:1,point:Nn(s.end)}];for(let f=0;f<t.length;f++){if(r===f)continue;let c=t[f],a=e(c.start),h=e(c.end),g=ji(i,l,a,h,n);g&&g.t>n&&g.t<1-n&&u.push({t:g.t,point:Gi(s.start,s.end,g.t)})}u.sort((f,c)=>f.t-c.t);let d=[];for(let f of u)(d.length===0||Math.abs(f.t-d[d.length-1].t)>n)&&d.push(f);for(let f=0;f<d.length-1;f++){let c=d[f].point,a=d[f+1].point,h=e(c),g=e(a);Ms(h,g)<n*n||o.push({start:c,end:a,uuid:s.uuid,sourceIndex:r,sourceSegment:s})}}return o}function ji(t,e,n,o,r=1e-6){let s={x:e.x-t.x,y:e.y-t.y},i={x:o.x-n.x,y:o.y-n.y},l={x:n.x-t.x,y:n.y-t.y},u=Po(s,i);if(Math.abs(u)<r)return null;let d=Po(l,i)/u,f=Po(l,s)/u;return d>=-r&&d<=1+r&&f>=-r&&f<=1+r?{t:d,u:f,point:{x:t.x+d*s.x,y:t.y+d*s.y}}:null}function Po(t,e){return t.x*e.y-t.y*e.x}function Ms(t,e){let n=t.x-e.x,o=t.y-e.y;return n*n+o*o}function Xi(t){let e=0;for(let n=0;n<t.length;n++){let o=t[n],r=t[(n+1)%t.length];e+=o.x*r.y-r.x*o.y}return e/2}function Gi(t,e,n){return t&&typeof t.clone=="function"&&typeof t.lerp=="function"?t.clone().lerp(e,n):{x:t.x+(e.x-t.x)*n,y:t.y+(e.y-t.y)*n,z:t.z!==void 0&&e.z!==void 0?t.z+(e.z-t.z)*n:void 0}}function Nn(t){return t&&typeof t.clone=="function"?t.clone():{x:t.x,y:t.y,z:t.z}}var Zi=(t,e)=>{if(!t||t.length<=0)return;let n={rectangles:[],threeEdgeRect:[]},o=new Set,r=.1,s=1.2,i=.15,l=2,u=80,d=95;if(!t[0].uuid){let a=1e4;for(let h=0;h<t.length;h++)t[h].uuid=a++}let f=[];for(let a=0;a<t.length;a++)f.push({start:t[a].start,end:t[a].end,uuid:t[a].uuid});let c=zs(f,{eps:1e-5,returnDetail:!0,project:a=>({x:a.x,y:a.y})});for(let a=0;a<c.length;a++){if(c[a].uuids.length<4||c[a].area<i||c[a].area>l)continue;let h=!1;for(let g=0;g<c[a].lineIndexes.length;g++){let p=t[c[a].lineIndexes[g]].length;if(p<r||p>s)break;let b=new Lt.Vector3(t[c[a].lineIndexes[g]].start.x,t[c[a].lineIndexes[g]].start.y,t[c[a].lineIndexes[g]].start.z),m=new Lt.Vector3(t[c[a].lineIndexes[g]].end.x,t[c[a].lineIndexes[g]].end.y,t[c[a].lineIndexes[g]].end.z),x=!1,y=new Lt.Vector3(0,0,0);for(let w=g+1;w<c[a].lineIndexes.length;w++){let z=t[c[a].lineIndexes[w]].length;if(z<r||z>s)break;let M=new Lt.Vector3(t[c[a].lineIndexes[w]].start.x,t[c[a].lineIndexes[w]].start.y,t[c[a].lineIndexes[w]].start.z),P=new Lt.Vector3(t[c[a].lineIndexes[w]].end.x,t[c[a].lineIndexes[w]].end.y,t[c[a].lineIndexes[w]].end.z),E=Gt(b,m,M,P);if(E&&E.isParallel){if(p+z>s){x=!0;break}p+=z;let V=ct(b,M),_=ct(b,P),v=ct(m,M),S=ct(m,P);V?(b=m.clone(),m=P.clone()):_?(b=m.clone(),m=M.clone()):v?m=P.clone():S&&(m=M.clone());continue}let T=ie(b,m,M,P);if(!T||T.angle<u||T.angle>d){x=!0;break}for(let V=w+1;V<c[a].lineIndexes.length;V++){let _=t[c[a].lineIndexes[V]].length;if(_<r||_>s)break;let v=new Lt.Vector3(t[c[a].lineIndexes[V]].start.x,t[c[a].lineIndexes[V]].start.y,t[c[a].lineIndexes[V]].start.z),S=new Lt.Vector3(t[c[a].lineIndexes[V]].end.x,t[c[a].lineIndexes[V]].end.y,t[c[a].lineIndexes[V]].end.z),R=Gt(M,P,v,S);if(R&&R.isParallel){if(z+_>s){x=!0;break}z+=_;let W=ct(M,v),I=ct(M,S),C=ct(P,v),H=ct(P,S);W?(M=P.clone(),P=S.clone()):I?(M=P.clone(),P=v.clone()):C?P=S.clone():H&&(P=v.clone());continue}let D=ie(M,P,v,S);if(!D||D.angle<u||D.angle>d){x=!0;break}for(let W=V+1;W<c[a].lineIndexes.length;W++){let I=t[c[a].lineIndexes[W]].length;if(I<r||I>s)break;let C=new Lt.Vector3(t[c[a].lineIndexes[W]].start.x,t[c[a].lineIndexes[W]].start.y,t[c[a].lineIndexes[W]].start.z),H=new Lt.Vector3(t[c[a].lineIndexes[W]].end.x,t[c[a].lineIndexes[W]].end.y,t[c[a].lineIndexes[W]].end.z),A=Gt(v,S,C,H);if(A&&A.isParallel){if(_+I>s){x=!0;break}_+=I;let $=ct(v,C),G=ct(v,H),Q=ct(S,C),q=ct(S,H);$?(v=S.clone(),S=H.clone()):G?(v=S.clone(),S=C.clone()):Q?S=H.clone():q&&(S=C.clone());continue}let k=ie(v,S,C,H);if(!k||k.angle<u||k.angle>d){x=!0;break}let O=ct(C,b),N=ct(C,m),L=ct(H,b),B=ct(H,m);if(O||N||L||B)h=!0;else for(let $=W+1;$<c[a].lineIndexes.length;$++){let G=t[c[a].lineIndexes[$]].length;if(G<r||G>s)break;let Q=new Lt.Vector3(t[c[a].lineIndexes[$]].start.x,t[c[a].lineIndexes[$]].start.y,t[c[a].lineIndexes[$]].start.z),q=new Lt.Vector3(t[c[a].lineIndexes[$]].end.x,t[c[a].lineIndexes[$]].end.y,t[c[a].lineIndexes[$]].end.z),X=Gt(C,H,Q,q);if(X&&X.isParallel){if(I+G>s){x=!0;break}I+=G;let Y=ct(C,Q),it=ct(C,q),ht=ct(H,Q),St=ct(H,q);if(Y)C=H.clone(),H=q.clone();else if(it)C=H.clone(),H=Q.clone();else if(ht)H=q.clone();else if(St)H=Q.clone();else continue;if(O=ct(C,b),N=ct(C,m),L=ct(H,b),B=ct(H,m),O||N||L||B){h=!0;break}}}break}if(x)break}if(x)break}if(x)break}h&&n.rectangles.push(c[a].uuids)}for(let a=0;a<t.length;a++){let h=t[a].length;if(o.has(t[a].uuid)||h<r||h>s)continue;let g={uuids:[],missingEdge:{start:new Lt.Vector3,end:new Lt.Vector3}},p=new Lt.Vector3(t[a].start.x,t[a].start.y,t[a].start.z),b=new Lt.Vector3(t[a].end.x,t[a].end.y,t[a].end.z),m=!0,x=!0;for(let z=0;z<t.length;z++){if(z==a)continue;let M=new Lt.Vector3(t[z].start.x,t[z].start.y,t[z].start.z),P=new Lt.Vector3(t[z].end.x,t[z].end.y,t[z].end.z),E=ct(M,p),T=ct(P,p),V=ct(M,b),_=ct(P,b);if(E||T?m=!1:(V||_)&&(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==a||o.has(z)||M<r||M>s)continue;let P=new Lt.Vector3(t[z].start.x,t[z].start.y,t[z].start.z),E=new Lt.Vector3(t[z].end.x,t[z].end.y,t[z].end.z),T=ie(p,b,P,E);if(!T||T.angle<85)continue;let V=ct(P,b),_=ct(E,b);if(!V&&!_)continue;let v=new Lt.Vector3,S=new Lt.Vector3;V?(v=P.clone(),S=E.clone()):(v=E.clone(),S=P.clone());for(let R=0;R<t.length;R++){let D=t[R].length;if(R==a||R==z||o.has(R)||D<r||D>s)continue;let W=new Lt.Vector3(t[R].start.x,t[R].start.y,t[R].start.z),I=new Lt.Vector3(t[R].end.x,t[R].end.y,t[R].end.z),C=ie(P,E,W,I);if(!C||C.angle<85)continue;let H=ct(W,S),A=ct(I,S);if(!H&&!A)continue;let k=new Lt.Vector3,O=new Lt.Vector3;H?(k=W.clone(),O=I.clone()):(k=I.clone(),O=W.clone());let N=new Lt.Vector3().subVectors(O,k).normalize(),L=Kt(w,N,.1);if(!L||!L.parallel||!L.sameDirection)continue;let B=!0,$=!0;for(let Q=0;Q<t.length;Q++){if(Q==R)continue;let q=new Lt.Vector3(t[Q].start.x,t[Q].start.y,t[Q].start.z),X=new Lt.Vector3(t[Q].end.x,t[Q].end.y,t[Q].end.z),Y=ct(q,W),it=ct(X,W),ht=ct(q,I),St=ct(X,I);if(Y||it?B=!1:(ht||St)&&($=!1),!B&&!$)break}if(!B&&!$)continue;let G=h*M;if(!(G<i||G>l)){g.uuids=[t[a].uuid,t[z].uuid,t[R].uuid],g.missingEdge.start=O,g.missingEdge.end=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 Vt=11102230246251565e-32,Zt=134217729,wn=(3+8*Vt)*Vt;function Ne(t,e,n,o,r){let s,i,l,u,d=e[0],f=o[0],c=0,a=0;f>d==f>-d?(s=d,d=e[++c]):(s=f,f=o[++a]);let h=0;if(c<t&&a<n)for(f>d==f>-d?(i=d+s,l=s-(i-d),d=e[++c]):(i=f+s,l=s-(i-f),f=o[++a]),s=i,l!==0&&(r[h++]=l);c<t&&a<n;)f>d==f>-d?(i=s+d,u=i-s,l=s-(i-u)+(d-u),d=e[++c]):(i=s+f,u=i-s,l=s-(i-u)+(f-u),f=o[++a]),s=i,l!==0&&(r[h++]=l);for(;c<t;)i=s+d,u=i-s,l=s-(i-u)+(d-u),d=e[++c],s=i,l!==0&&(r[h++]=l);for(;a<n;)i=s+f,u=i-s,l=s-(i-u)+(f-u),f=o[++a],s=i,l!==0&&(r[h++]=l);return(s!==0||h===0)&&(r[h++]=s),h}function zn(t,e){let n=e[0];for(let o=1;o<t;o++)n+=e[o];return n}function K(t){return new Float64Array(t)}var Yi=(3+16*Vt)*Vt,Ui=(2+12*Vt)*Vt,Ki=(9+64*Vt)*Vt*Vt,on=K(4),Es=K(8),Ps=K(12),Ss=K(16),oe=K(4);function Qi(t,e,n,o,r,s,i){let l,u,d,f,c,a,h,g,p,b,m,x,y,w,z,M,P,E,T=t-r,V=n-r,_=e-s,v=o-s;w=T*v,a=Zt*T,h=a-(a-T),g=T-h,a=Zt*v,p=a-(a-v),b=v-p,z=g*b-(w-h*p-g*p-h*b),M=_*V,a=Zt*_,h=a-(a-_),g=_-h,a=Zt*V,p=a-(a-V),b=V-p,P=g*b-(M-h*p-g*p-h*b),m=z-P,c=z-m,on[0]=z-(m+c)+(c-P),x=w+m,c=x-w,y=w-(x-c)+(m-c),m=y-M,c=y-m,on[1]=y-(m+c)+(c-M),E=x+m,c=E-x,on[2]=x-(E-c)+(m-c),on[3]=E;let S=zn(4,on),R=Ui*i;if(S>=R||-S>=R||(c=t-T,l=t-(T+c)+(c-r),c=n-V,d=n-(V+c)+(c-r),c=e-_,u=e-(_+c)+(c-s),c=o-v,f=o-(v+c)+(c-s),l===0&&u===0&&d===0&&f===0)||(R=Ki*i+wn*Math.abs(S),S+=T*f+v*l-(_*d+V*u),S>=R||-S>=R))return S;w=l*v,a=Zt*l,h=a-(a-l),g=l-h,a=Zt*v,p=a-(a-v),b=v-p,z=g*b-(w-h*p-g*p-h*b),M=u*V,a=Zt*u,h=a-(a-u),g=u-h,a=Zt*V,p=a-(a-V),b=V-p,P=g*b-(M-h*p-g*p-h*b),m=z-P,c=z-m,oe[0]=z-(m+c)+(c-P),x=w+m,c=x-w,y=w-(x-c)+(m-c),m=y-M,c=y-m,oe[1]=y-(m+c)+(c-M),E=x+m,c=E-x,oe[2]=x-(E-c)+(m-c),oe[3]=E;let D=Ne(4,on,4,oe,Es);w=T*f,a=Zt*T,h=a-(a-T),g=T-h,a=Zt*f,p=a-(a-f),b=f-p,z=g*b-(w-h*p-g*p-h*b),M=_*d,a=Zt*_,h=a-(a-_),g=_-h,a=Zt*d,p=a-(a-d),b=d-p,P=g*b-(M-h*p-g*p-h*b),m=z-P,c=z-m,oe[0]=z-(m+c)+(c-P),x=w+m,c=x-w,y=w-(x-c)+(m-c),m=y-M,c=y-m,oe[1]=y-(m+c)+(c-M),E=x+m,c=E-x,oe[2]=x-(E-c)+(m-c),oe[3]=E;let W=Ne(D,Es,4,oe,Ps);w=l*f,a=Zt*l,h=a-(a-l),g=l-h,a=Zt*f,p=a-(a-f),b=f-p,z=g*b-(w-h*p-g*p-h*b),M=u*d,a=Zt*u,h=a-(a-u),g=u-h,a=Zt*d,p=a-(a-d),b=d-p,P=g*b-(M-h*p-g*p-h*b),m=z-P,c=z-m,oe[0]=z-(m+c)+(c-P),x=w+m,c=x-w,y=w-(x-c)+(m-c),m=y-M,c=y-m,oe[1]=y-(m+c)+(c-M),E=x+m,c=E-x,oe[2]=x-(E-c)+(m-c),oe[3]=E;let I=Ne(W,Ps,4,oe,Ss);return Ss[I-1]}function sn(t,e,n,o,r,s){let i=(e-s)*(n-r),l=(t-r)*(o-s),u=i-l,d=Math.abs(i+l);return Math.abs(u)>=Yi*d?u:-Qi(t,e,n,o,r,s,d)}var bu=(7+56*Vt)*Vt,wu=(3+28*Vt)*Vt,zu=(26+288*Vt)*Vt*Vt,Mu=K(4),Eu=K(4),Pu=K(4),Su=K(4),Tu=K(4),Ru=K(4),Du=K(4),vu=K(4),Vu=K(4),Iu=K(8),Cu=K(8),Wu=K(8),_u=K(4),Hu=K(8),Au=K(8),Lu=K(16),ku=K(12),Bu=K(192),Ou=K(192);var qu=(10+96*Vt)*Vt,$u=(4+48*Vt)*Vt,ju=(44+576*Vt)*Vt*Vt,Xu=K(4),Gu=K(4),Zu=K(4),Yu=K(4),Uu=K(4),Ku=K(4),Qu=K(4),Ju=K(4),tf=K(8),ef=K(8),nf=K(8),of=K(8),sf=K(8),rf=K(8),af=K(8),lf=K(8),cf=K(8),uf=K(4),ff=K(4),df=K(4),hf=K(8),mf=K(16),gf=K(16),pf=K(16),xf=K(32),yf=K(32),bf=K(48),wf=K(64),zf=K(1152),Mf=K(1152);var Tf=(16+224*Vt)*Vt,Rf=(5+72*Vt)*Vt,Df=(71+1408*Vt)*Vt*Vt,vf=K(4),Vf=K(4),If=K(4),Cf=K(4),Wf=K(4),_f=K(4),Hf=K(4),Af=K(4),Lf=K(4),kf=K(4),Bf=K(24),Of=K(24),Ff=K(24),Nf=K(24),qf=K(24),$f=K(24),jf=K(24),Xf=K(24),Gf=K(24),Zf=K(24),Yf=K(1152),Uf=K(1152),Kf=K(1152),Qf=K(1152),Jf=K(1152),td=K(2304),ed=K(2304),nd=K(3456),od=K(5760),sd=K(8),rd=K(8),id=K(8),ad=K(16),ld=K(24),cd=K(48),ud=K(48),fd=K(96),dd=K(192),hd=K(384),md=K(384),gd=K(384),pd=K(768);var xd=K(96),yd=K(96),bd=K(96),wd=K(1152);var Rs=Math.pow(2,-52),qn=new Uint32Array(512),an=class t{static from(e,n=sa,o=ra){let r=e.length,s=new Float64Array(r*2);for(let i=0;i<r;i++){let l=e[i];s[2*i]=n(l),s[2*i+1]=o(l)}return new t(s)}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:r,_hullHash:s}=this,i=e.length>>1,l=1/0,u=1/0,d=-1/0,f=-1/0;for(let T=0;T<i;T++){let V=e[2*T],_=e[2*T+1];V<l&&(l=V),_<u&&(u=_),V>d&&(d=V),_>f&&(f=_),this._ids[T]=T}let c=(l+d)/2,a=(u+f)/2,h=0,g=0,p=0;for(let T=0,V=1/0;T<i;T++){let _=So(c,a,e[2*T],e[2*T+1]);_<V&&(h=T,V=_)}let b=e[2*h],m=e[2*h+1];for(let T=0,V=1/0;T<i;T++){if(T===h)continue;let _=So(b,m,e[2*T],e[2*T+1]);_<V&&_>0&&(g=T,V=_)}let 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=na(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 _=0;_<i;_++)this._dists[_]=e[2*_]-e[0]||e[2*_+1]-e[1];rn(this._ids,this._dists,0,i-1);let T=new Uint32Array(i),V=0;for(let _=0,v=-1/0;_<i;_++){let S=this._ids[_],R=this._dists[S];R>v&&(T[V++]=S,v=R)}this.hull=T.subarray(0,V),this.triangles=new Uint32Array(0),this.halfedges=new Int32Array(0);return}if(sn(b,m,x,y,z,M)<0){let T=g,V=x,_=y;g=p,x=z,y=M,p=T,z=V,M=_}let P=oa(b,m,x,y,z,M);this._cx=P.x,this._cy=P.y;for(let T=0;T<i;T++)this._dists[T]=So(e[2*T],e[2*T+1],P.x,P.y);rn(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,r[h]=0,r[g]=1,r[p]=2,s.fill(-1),s[this._hashKey(b,m)]=h,s[this._hashKey(x,y)]=g,s[this._hashKey(z,M)]=p,this.trianglesLen=0,this._addTriangle(h,g,p,-1,-1,-1);for(let T=0,V=0,_=0;T<this._ids.length;T++){let v=this._ids[T],S=e[2*v],R=e[2*v+1];if(T>0&&Math.abs(S-V)<=Rs&&Math.abs(R-_)<=Rs||(V=S,_=R,v===h||v===g||v===p))continue;let D=0;for(let A=0,k=this._hashKey(S,R);A<this._hashSize&&(D=s[(k+A)%this._hashSize],!(D!==-1&&D!==o[D]));A++);D=n[D];let W=D,I;for(;I=o[W],sn(S,R,e[2*W],e[2*W+1],e[2*I],e[2*I+1])>=0;)if(W=I,W===D){W=-1;break}if(W===-1)continue;let C=this._addTriangle(W,v,o[W],-1,-1,r[W]);r[v]=this._legalize(C+2),r[W]=C,E++;let H=o[W];for(;I=o[H],sn(S,R,e[2*H],e[2*H+1],e[2*I],e[2*I+1])<0;)C=this._addTriangle(H,v,I,r[v],-1,r[H]),r[v]=this._legalize(C+2),o[H]=H,E--,H=I;if(W===D)for(;I=n[W],sn(S,R,e[2*I],e[2*I+1],e[2*W],e[2*W+1])<0;)C=this._addTriangle(I,v,W,-1,r[W],r[I]),this._legalize(C+2),r[I]=C,o[W]=W,E--,W=I;this._hullStart=n[v]=W,o[W]=n[H]=v,o[v]=H,s[this._hashKey(S,R)]=v,s[this._hashKey(e[2*W],e[2*W+1])]=W}this.hull=new Uint32Array(E);for(let T=0,V=this._hullStart;T<E;T++)this.hull[T]=V,V=o[V];this.triangles=this._triangles.subarray(0,this.trianglesLen),this.halfedges=this._halfedges.subarray(0,this.trianglesLen)}_hashKey(e,n){return Math.floor(ta(e-this._cx,n-this._cy)*this._hashSize)%this._hashSize}_legalize(e){let{_triangles:n,_halfedges:o,coords:r}=this,s=0,i=0;for(;;){let l=o[e],u=e-e%3;if(i=u+(e+2)%3,l===-1){if(s===0)break;e=qn[--s];continue}let d=l-l%3,f=u+(e+1)%3,c=d+(l+2)%3,a=n[i],h=n[e],g=n[f],p=n[c];if(ea(r[2*a],r[2*a+1],r[2*h],r[2*h+1],r[2*g],r[2*g+1],r[2*p],r[2*p+1])){n[e]=p,n[l]=a;let m=o[c];if(m===-1){let y=this._hullStart;do{if(this._hullTri[y]===c){this._hullTri[y]=e;break}y=this._hullPrev[y]}while(y!==this._hullStart)}this._link(e,m),this._link(l,o[i]),this._link(i,c);let x=d+(l+1)%3;s<qn.length&&(qn[s++]=x)}else{if(s===0)break;e=qn[--s]}}return i}_link(e,n){this._halfedges[e]=n,n!==-1&&(this._halfedges[n]=e)}_addTriangle(e,n,o,r,s,i){let l=this.trianglesLen;return this._triangles[l]=e,this._triangles[l+1]=n,this._triangles[l+2]=o,this._link(l,r),this._link(l+1,s),this._link(l+2,i),this.trianglesLen+=3,l}};function ta(t,e){let n=t/(Math.abs(t)+Math.abs(e));return(e>0?3-n:1+n)/4}function So(t,e,n,o){let r=t-n,s=e-o;return r*r+s*s}function ea(t,e,n,o,r,s,i,l){let u=t-i,d=e-l,f=n-i,c=o-l,a=r-i,h=s-l,g=u*u+d*d,p=f*f+c*c,b=a*a+h*h;return u*(c*b-p*h)-d*(f*b-p*a)+g*(f*h-c*a)<0}function na(t,e,n,o,r,s){let i=n-t,l=o-e,u=r-t,d=s-e,f=i*i+l*l,c=u*u+d*d,a=.5/(i*d-l*u),h=(d*f-l*c)*a,g=(i*c-u*f)*a;return h*h+g*g}function oa(t,e,n,o,r,s){let i=n-t,l=o-e,u=r-t,d=s-e,f=i*i+l*l,c=u*u+d*d,a=.5/(i*d-l*u),h=t+(d*f-l*c)*a,g=e+(i*c-u*f)*a;return{x:h,y:g}}function rn(t,e,n,o){if(o-n<=20)for(let r=n+1;r<=o;r++){let s=t[r],i=e[s],l=r-1;for(;l>=n&&e[t[l]]>i;)t[l+1]=t[l--];t[l+1]=s}else{let r=n+o>>1,s=n+1,i=o;Mn(t,r,s),e[t[n]]>e[t[o]]&&Mn(t,n,o),e[t[s]]>e[t[o]]&&Mn(t,s,o),e[t[n]]>e[t[s]]&&Mn(t,n,s);let l=t[s],u=e[l];for(;;){do s++;while(e[t[s]]<u);do i--;while(e[t[i]]>u);if(i<s)break;Mn(t,s,i)}t[n+1]=t[i],t[i]=l,o-s+1>=i-n?(rn(t,e,s,o),rn(t,e,n,i-1)):(rn(t,e,n,i-1),rn(t,e,s,o))}}function Mn(t,e,n){let o=t[e];t[e]=t[n],t[n]=o}function sa(t){return t[0]}function ra(t){return t[1]}var ue=class{constructor(){this._x0=this._y0=this._x1=this._y1=null,this._=""}moveTo(e,n){this._+=`M${this._x0=this._x1=+e},${this._y0=this._y1=+n}`}closePath(){this._x1!==null&&(this._x1=this._x0,this._y1=this._y0,this._+="Z")}lineTo(e,n){this._+=`L${this._x1=+e},${this._y1=+n}`}arc(e,n,o){e=+e,n=+n,o=+o;let r=e+o,s=n;if(o<0)throw new Error("negative radius");this._x1===null?this._+=`M${r},${s}`:(Math.abs(this._x1-r)>1e-6||Math.abs(this._y1-s)>1e-6)&&(this._+="L"+r+","+s),o&&(this._+=`A${o},${o},0,1,1,${e-o},${n}A${o},${o},0,1,1,${this._x1=r},${this._y1=s}`)}rect(e,n,o,r){this._+=`M${this._x0=this._x1=+e},${this._y0=this._y1=+n}h${+o}v${+r}h${-o}Z`}value(){return this._||null}};var Ce=class{constructor(){this._=[]}moveTo(e,n){this._.push([e,n])}closePath(){this._.push(this._[0].slice())}lineTo(e,n){this._.push([e,n])}value(){return this._.length?this._:null}};var En=class{constructor(e,[n,o,r,s]=[0,0,960,500]){if(!((r=+r)>=(n=+n))||!((s=+s)>=(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=r,this.xmin=n,this.ymax=s,this.ymin=o,this._init()}update(){return this.delaunay.update(),this._init(),this}_init(){let{delaunay:{points:e,hull:n,triangles:o},vectors:r}=this,s,i,l=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],_=e[M],v=e[M+1],S=T-P,R=V-E,D=_-P,W=v-E,I=(S*W-R*D)*2;if(Math.abs(I)<1e-9){if(s===void 0){s=i=0;for(let H of n)s+=e[H*2],i+=e[H*2+1];s/=n.length,i/=n.length}let C=1e9*Math.sign((s-P)*W-(i-E)*D);x=(P+_)/2-C*W,y=(E+v)/2+C*D}else{let C=1/I,H=S*S+R*R,A=D*D+W*W;x=P+(W*H-R*A)*C,y=E+(S*A-D*H)*C}l[b]=x,l[b+1]=y}let u=n[n.length-1],d,f=u*4,c,a=e[2*u],h,g=e[2*u+1];r.fill(0);for(let p=0;p<n.length;++p)u=n[p],d=f,c=a,h=g,f=u*4,a=e[2*u],g=e[2*u+1],r[d+2]=r[f]=h-g,r[d+3]=r[f+1]=a-c}render(e){let n=e==null?e=new ue:void 0,{delaunay:{halfedges:o,inedges:r,hull:s},circumcenters:i,vectors:l}=this;if(s.length<=1)return null;for(let f=0,c=o.length;f<c;++f){let a=o[f];if(a<f)continue;let h=Math.floor(f/3)*2,g=Math.floor(a/3)*2,p=i[h],b=i[h+1],m=i[g],x=i[g+1];this._renderSegment(p,b,m,x,e)}let u,d=s[s.length-1];for(let f=0;f<s.length;++f){u=d,d=s[f];let c=Math.floor(r[d]/3)*2,a=i[c],h=i[c+1],g=u*4,p=this._project(a,h,l[g+2],l[g+3]);p&&this._renderSegment(a,h,p[0],p[1],e)}return n&&n.value()}renderBounds(e){let n=e==null?e=new ue:void 0;return e.rect(this.xmin,this.ymin,this.xmax-this.xmin,this.ymax-this.ymin),n&&n.value()}renderCell(e,n){let o=n==null?n=new ue:void 0,r=this._clip(e);if(r===null||!r.length)return;n.moveTo(r[0],r[1]);let s=r.length;for(;r[0]===r[s-2]&&r[1]===r[s-1]&&s>1;)s-=2;for(let i=2;i<s;i+=2)(r[i]!==r[i-2]||r[i+1]!==r[i-1])&&n.lineTo(r[i],r[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 r=this.cellPolygon(n);r&&(r.index=n,yield r)}}cellPolygon(e){let n=new Ce;return this.renderCell(e,n),n.value()}_renderSegment(e,n,o,r,s){let i,l=this._regioncode(e,n),u=this._regioncode(o,r);l===0&&u===0?(s.moveTo(e,n),s.lineTo(o,r)):(i=this._clipSegment(e,n,o,r,l,u))&&(s.moveTo(i[0],i[1]),s.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 r=this._clip(o);if(r){t:for(let s=0,i=n.length;s<i;s+=2)for(let l=0,u=r.length;l<u;l+=2)if(n[s]===r[l]&&n[s+1]===r[l+1]&&n[(s+2)%i]===r[(l+u-2)%u]&&n[(s+3)%i]===r[(l+u-1)%u]){yield o;break t}}}}_cell(e){let{circumcenters:n,delaunay:{inedges:o,halfedges:r,triangles:s}}=this,i=o[e];if(i===-1)return null;let l=[],u=i;do{let d=Math.floor(u/3);if(l.push(n[d*2],n[d*2+1]),u=u%3===2?u-2:u+1,s[u]!==e)break;u=r[u]}while(u!==i&&u!==-1);return l}_clip(e){if(e===0&&this.delaunay.hull.length===1)return[this.xmax,this.ymin,this.xmax,this.ymax,this.xmin,this.ymax,this.xmin,this.ymin];let n=this._cell(e);if(n===null)return null;let{vectors:o}=this,r=e*4;return this._simplify(o[r]||o[r+1]?this._clipInfinite(e,n,o[r],o[r+1],o[r+2],o[r+3]):this._clipFinite(e,n))}_clipFinite(e,n){let o=n.length,r=null,s,i,l=n[o-2],u=n[o-1],d,f=this._regioncode(l,u),c,a=0;for(let h=0;h<o;h+=2)if(s=l,i=u,l=n[h],u=n[h+1],d=f,f=this._regioncode(l,u),d===0&&f===0)c=a,a=0,r?r.push(l,u):r=[l,u];else{let g,p,b,m,x;if(d===0){if((g=this._clipSegment(s,i,l,u,d,f))===null)continue;[p,b,m,x]=g}else{if((g=this._clipSegment(l,u,s,i,f,d))===null)continue;[m,x,p,b]=g,c=a,a=this._edgecode(p,b),c&&a&&this._edge(e,c,a,r,r.length),r?r.push(p,b):r=[p,b]}c=a,a=this._edgecode(m,x),c&&a&&this._edge(e,c,a,r,r.length),r?r.push(m,x):r=[m,x]}if(r)c=a,a=this._edgecode(r[0],r[1]),c&&a&&this._edge(e,c,a,r,r.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 r}_clipSegment(e,n,o,r,s,i){let l=s<i;for(l&&([e,n,o,r,s,i]=[o,r,e,n,i,s]);;){if(s===0&&i===0)return l?[o,r,e,n]:[e,n,o,r];if(s&i)return null;let u,d,f=s||i;f&8?(u=e+(o-e)*(this.ymax-n)/(r-n),d=this.ymax):f&4?(u=e+(o-e)*(this.ymin-n)/(r-n),d=this.ymin):f&2?(d=n+(r-n)*(this.xmax-e)/(o-e),u=this.xmax):(d=n+(r-n)*(this.xmin-e)/(o-e),u=this.xmin),s?(e=u,n=d,s=this._regioncode(e,n)):(o=u,r=d,i=this._regioncode(o,r))}}_clipInfinite(e,n,o,r,s,i){let l=Array.from(n),u;if((u=this._project(l[0],l[1],o,r))&&l.unshift(u[0],u[1]),(u=this._project(l[l.length-2],l[l.length-1],s,i))&&l.push(u[0],u[1]),l=this._clipFinite(e,l))for(let d=0,f=l.length,c,a=this._edgecode(l[f-2],l[f-1]);d<f;d+=2)c=a,a=this._edgecode(l[d],l[d+1]),c&&a&&(d=this._edge(e,c,a,l,d),f=l.length);else this.contains(e,(this.xmin+this.xmax)/2,(this.ymin+this.ymax)/2)&&(l=[this.xmin,this.ymin,this.xmax,this.ymin,this.xmax,this.ymax,this.xmin,this.ymax]);return l}_edge(e,n,o,r,s){for(;n!==o;){let i,l;switch(n){case 5:n=4;continue;case 4:n=6,i=this.xmax,l=this.ymin;break;case 6:n=2;continue;case 2:n=10,i=this.xmax,l=this.ymax;break;case 10:n=8;continue;case 8:n=9,i=this.xmin,l=this.ymax;break;case 9:n=1;continue;case 1:n=5,i=this.xmin,l=this.ymin;break}(r[s]!==i||r[s+1]!==l)&&this.contains(e,i,l)&&(r.splice(s,0,i,l),s+=2)}return s}_project(e,n,o,r){let s=1/0,i,l,u;if(r<0){if(n<=this.ymin)return null;(i=(this.ymin-n)/r)<s&&(u=this.ymin,l=e+(s=i)*o)}else if(r>0){if(n>=this.ymax)return null;(i=(this.ymax-n)/r)<s&&(u=this.ymax,l=e+(s=i)*o)}if(o>0){if(e>=this.xmax)return null;(i=(this.xmax-e)/o)<s&&(l=this.xmax,u=n+(s=i)*r)}else if(o<0){if(e<=this.xmin)return null;(i=(this.xmin-e)/o)<s&&(l=this.xmin,u=n+(s=i)*r)}return[l,u]}_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,r=(n+4)%e.length;(e[n]===e[o]&&e[o]===e[r]||e[n+1]===e[o+1]&&e[o+1]===e[r+1])&&(e.splice(o,2),n-=2)}e.length||(e=null)}return e}};var ia=2*Math.PI,ln=Math.pow;function aa(t){return t[0]}function la(t){return t[1]}function ca(t){let{triangles:e,coords:n}=t;for(let o=0;o<e.length;o+=3){let r=2*e[o],s=2*e[o+1],i=2*e[o+2];if((n[i]-n[r])*(n[s+1]-n[r+1])-(n[s]-n[r])*(n[i+1]-n[r+1])>1e-10)return!1}return!0}function ua(t,e,n){return[t+Math.sin(t+e)*n,e+Math.cos(t-e)*n]}var We=class t{static from(e,n=aa,o=la,r){return new t("length"in e?fa(e,n,o,r):Float64Array.from(da(e,n,o,r)))}constructor(e){this._delaunator=new an(e),this.inedges=new Int32Array(e.length/2),this._hullIndex=new Int32Array(e.length/2),this.points=this._delaunator.coords,this._init()}update(){return this._delaunator.update(),this._init(),this}_init(){let e=this._delaunator,n=this.points;if(e.hull&&e.hull.length>2&&ca(e)){this.collinear=Int32Array.from({length:n.length/2},(a,h)=>h).sort((a,h)=>n[2*a]-n[2*h]||n[2*a+1]-n[2*h+1]);let u=this.collinear[0],d=this.collinear[this.collinear.length-1],f=[n[2*u],n[2*u+1],n[2*d],n[2*d+1]],c=1e-8*Math.hypot(f[3]-f[1],f[2]-f[0]);for(let a=0,h=n.length/2;a<h;++a){let g=ua(n[2*a],n[2*a+1],c);n[2*a]=g[0],n[2*a+1]=g[1]}this._delaunator=new an(n)}else delete this.collinear;let o=this.halfedges=this._delaunator.halfedges,r=this.hull=this._delaunator.hull,s=this.triangles=this._delaunator.triangles,i=this.inedges.fill(-1),l=this._hullIndex.fill(-1);for(let u=0,d=o.length;u<d;++u){let f=s[u%3===2?u-2:u+1];(o[u]===-1||i[f]===-1)&&(i[f]=u)}for(let u=0,d=r.length;u<d;++u)l[r[u]]=u;r.length<=2&&r.length>0&&(this.triangles=new Int32Array(3).fill(-1),this.halfedges=new Int32Array(3).fill(-1),this.triangles[0]=r[0],i[r[0]]=1,r.length===2&&(i[r[1]]=0,this.triangles[1]=r[1],this.triangles[2]=r[1]))}voronoi(e){return new En(this,e)}*neighbors(e){let{inedges:n,hull:o,_hullIndex:r,halfedges:s,triangles:i,collinear:l}=this;if(l){let c=l.indexOf(e);c>0&&(yield l[c-1]),c<l.length-1&&(yield l[c+1]);return}let u=n[e];if(u===-1)return;let d=u,f=-1;do{if(yield f=i[d],d=d%3===2?d-2:d+1,i[d]!==e)return;if(d=s[d],d===-1){let c=o[(r[e]+1)%o.length];c!==f&&(yield c);return}}while(d!==u)}find(e,n,o=0){if(e=+e,e!==e||(n=+n,n!==n))return-1;let r=o,s;for(;(s=this._step(o,e,n))>=0&&s!==o&&s!==r;)o=s;return s}_step(e,n,o){let{inedges:r,hull:s,_hullIndex:i,halfedges:l,triangles:u,points:d}=this;if(r[e]===-1||!d.length)return(e+1)%(d.length>>1);let f=e,c=ln(n-d[e*2],2)+ln(o-d[e*2+1],2),a=r[e],h=a;do{let g=u[h],p=ln(n-d[g*2],2)+ln(o-d[g*2+1],2);if(p<c&&(c=p,f=g),h=h%3===2?h-2:h+1,u[h]!==e)break;if(h=l[h],h===-1){if(h=s[(i[e]+1)%s.length],h!==g&&ln(n-d[h*2],2)+ln(o-d[h*2+1],2)<c)return h;break}}while(h!==a);return f}render(e){let n=e==null?e=new ue:void 0,{points:o,halfedges:r,triangles:s}=this;for(let i=0,l=r.length;i<l;++i){let u=r[i];if(u<i)continue;let d=s[i]*2,f=s[u]*2;e.moveTo(o[d],o[d+1]),e.lineTo(o[f],o[f+1])}return this.renderHull(e),n&&n.value()}renderPoints(e,n){n===void 0&&(!e||typeof e.moveTo!="function")&&(n=e,e=null),n=n==null?2:+n;let o=e==null?e=new ue:void 0,{points:r}=this;for(let s=0,i=r.length;s<i;s+=2){let l=r[s],u=r[s+1];e.moveTo(l+n,u),e.arc(l,u,n,0,ia)}return o&&o.value()}renderHull(e){let n=e==null?e=new ue:void 0,{hull:o,points:r}=this,s=o[0]*2,i=o.length;e.moveTo(r[s],r[s+1]);for(let l=1;l<i;++l){let u=2*o[l];e.lineTo(r[u],r[u+1])}return e.closePath(),n&&n.value()}hullPolygon(){let e=new Ce;return this.renderHull(e),e.value()}renderTriangle(e,n){let o=n==null?n=new ue:void 0,{points:r,triangles:s}=this,i=s[e*=3]*2,l=s[e+1]*2,u=s[e+2]*2;return n.moveTo(r[i],r[i+1]),n.lineTo(r[l],r[l+1]),n.lineTo(r[u],r[u+1]),n.closePath(),o&&o.value()}*trianglePolygons(){let{triangles:e}=this;for(let n=0,o=e.length/3;n<o;++n)yield this.trianglePolygon(n)}trianglePolygon(e){let n=new Ce;return this.renderTriangle(e,n),n.value()}};function fa(t,e,n,o){let r=t.length,s=new Float64Array(r*2);for(let i=0;i<r;++i){let l=t[i];s[i*2]=e.call(o,l,i,t),s[i*2+1]=n.call(o,l,i,t)}return s}function*da(t,e,n,o){let r=0;for(let s of t)yield e.call(o,s,r,t),yield n.call(o,s,r,t),++r}function To(t,e,n,o){let r,s;n<o?(r=n,s=o):(r=o,s=n);let i=r*e+s;t.set(i,(t.get(i)||0)+1)}function Ds(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 r=new Float64Array(o*2);for(let p=0,b=0;p<o;p++){let m=n[p];r[b++]=m[0],r[b++]=m[1]}let s=new We(r),{triangles:i}=s;if(!i.length)return[];let l=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=r[y],P=r[y+1],E=r[w],T=r[w+1],V=r[z],_=r[z+1],v=M-E,S=P-T,R=M-V,D=P-_,W=E-V,I=T-_,C=W*W+I*I,H=R*R+D*D,A=v*v+S*S,k=(E-M)*(_-P)-(V-M)*(T-P);if(k===0)continue;let O=k*k,L=M===0||E===0||V===0?O:4*O;C*H*A<=L&&(To(l,o,b,m),To(l,o,m,x),To(l,o,x,b))}if(!l.size)return[];let u=new Map,d=0,f=-1;for(let[p,b]of l){if(b!==1)continue;let m=Math.floor(p/o),x=p-m*o;f===-1&&(f=m),Ds(u,m,x),Ds(u,x,m),d++}if(d===0)return[];let c=[],a=new Uint8Array(o),h=f,g=-1;do{c.push(n[h]),a[h]=1;let p=u.get(h)||[],b=-1;for(let m=0;m<p.length;m++){let x=p[m];if(x!==g&&!a[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!==f&&c.length<=d+1);return c.length>0&&c.push(c[0]),c}import*as Nt from"three";import{OBB as Ia}from"three/examples/jsm/math/OBB.js";var Yt=63710088e-1,Vs={centimeters:Yt*100,centimetres:Yt*100,degrees:360/(2*Math.PI),feet:Yt*3.28084,inches:Yt*39.37,kilometers:Yt/1e3,kilometres:Yt/1e3,meters:Yt,metres:Yt,miles:Yt/1609.344,millimeters:Yt*1e3,millimetres:Yt*1e3,nauticalmiles:Yt/1852,radians:1,yards:Yt*1.0936};function Is(t,e,n={}){let o={type:"Feature"};return(n.id===0||n.id)&&(o.id=n.id),n.bbox&&(o.bbox=n.bbox),o.properties=e||{},o.geometry=t,o}function $n(t,e,n={}){if(!t)throw new Error("coordinates is required");if(!Array.isArray(t))throw new Error("coordinates must be an Array");if(t.length<2)throw new Error("coordinates must be at least 2 numbers long");if(!vs(t[0])||!vs(t[1]))throw new Error("coordinates must contain numbers");return Is({type:"Point",coordinates:t},e,n)}function jn(t,e,n={}){for(let r of t){if(r.length<4)throw new Error("Each LinearRing of a Polygon must have 4 or more Positions.");if(r[r.length-1].length!==r[0].length)throw new Error("First and last Position are not equivalent.");for(let s=0;s<r[r.length-1].length;s++)if(r[r.length-1][s]!==r[0][s])throw new Error("First and last Position are not equivalent.")}return Is({type:"Polygon",coordinates:t},e,n)}function ha(t,e="kilometers"){let n=Vs[e];if(!n)throw new Error(e+" units is invalid");return t*n}function ma(t,e="kilometers"){let n=Vs[e];if(!n)throw new Error(e+" units is invalid");return t/n}function Xn(t){return t%(2*Math.PI)*180/Math.PI}function fe(t){return t%360*Math.PI/180}function Gn(t,e="kilometers",n="kilometers"){if(!(t>=0))throw new Error("length must be a positive number");return ha(ma(t,e),n)}function vs(t){return!isNaN(t)&&t!==null&&!Array.isArray(t)}function Cs(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Me(t,e,n){if(t!==null)for(var o,r,s,i,l,u,d,f=0,c=0,a,h=t.type,g=h==="FeatureCollection",p=h==="Feature",b=g?t.features.length:1,m=0;m<b;m++){d=g?t.features[m].geometry:p?t.geometry:t,a=d?d.type==="GeometryCollection":!1,l=a?d.geometries.length:1;for(var x=0;x<l;x++){var y=0,w=0;if(i=a?d.geometries[x]:d,i!==null){u=i.coordinates;var z=i.type;switch(f=n&&(z==="Polygon"||z==="MultiPolygon")?1:0,z){case null:break;case"Point":if(e(u,c,m,y,w)===!1)return!1;c++,y++;break;case"LineString":case"MultiPoint":for(o=0;o<u.length;o++){if(e(u[o],c,m,y,w)===!1)return!1;c++,z==="MultiPoint"&&y++}z==="LineString"&&y++;break;case"Polygon":case"MultiLineString":for(o=0;o<u.length;o++){for(r=0;r<u[o].length-f;r++){if(e(u[o][r],c,m,y,w)===!1)return!1;c++}z==="MultiLineString"&&y++,z==="Polygon"&&w++}z==="Polygon"&&y++;break;case"MultiPolygon":for(o=0;o<u.length;o++){for(w=0,r=0;r<u[o].length;r++){for(s=0;s<u[o][r].length-f;s++){if(e(u[o][r][s],c,m,y,w)===!1)return!1;c++}w++}y++}break;case"GeometryCollection":for(o=0;o<i.geometries.length;o++)if(Me(i.geometries[o],e,n)===!1)return!1;break;default:throw new Error("Unknown Geometry Type")}}}}}function Ws(t){var e=[];return Me(t,function(n){e.push(n)}),e}function ga(t,e){var n,o,r,s,i,l,u,d,f,c,a=0,h=t.type==="FeatureCollection",g=t.type==="Feature",p=h?t.features.length:1;for(n=0;n<p;n++){for(l=h?t.features[n].geometry:g?t.geometry:t,d=h?t.features[n].properties:g?t.properties:{},f=h?t.features[n].bbox:g?t.bbox:void 0,c=h?t.features[n].id:g?t.id:void 0,u=l?l.type==="GeometryCollection":!1,i=u?l.geometries.length:1,r=0;r<i;r++){if(s=u?l.geometries[r]:l,s===null){if(e(null,a,d,f,c)===!1)return!1;continue}switch(s.type){case"Point":case"LineString":case"MultiPoint":case"Polygon":case"MultiLineString":case"MultiPolygon":{if(e(s,a,d,f,c)===!1)return!1;break}case"GeometryCollection":{for(o=0;o<s.geometries.length;o++)if(e(s.geometries[o],a,d,f,c)===!1)return!1;break}default:throw new Error("Unknown Geometry Type")}}a++}}function _s(t,e,n){var o=n;return ga(t,function(r,s,i,l,u){s===0&&n===void 0?o=r:o=e(o,r,s,i,l,u)}),o}var Qs=wi(Ks(),1);function Js(t,e={}){e.concavity=e.concavity||1/0;let n=[];if(Me(t,r=>{n.push([r[0],r[1]])}),!n.length)return null;let o=(0,Qs.default)(n,e.concavity);return o.length>3?jn([o]):null}function Qn(t,e={}){let n=0,o=0,r=0;return Me(t,function(s){n+=s[0],o+=s[1],r++},!0),$n([n/r,o/r],e.properties)}function ce(t){if(!t)throw new Error("coord is required");if(!Array.isArray(t)){if(t.type==="Feature"&&t.geometry!==null&&t.geometry.type==="Point")return[...t.geometry.coordinates];if(t.type==="Point")return[...t.coordinates]}if(Array.isArray(t)&&t.length>=2&&!Array.isArray(t[0])&&!Array.isArray(t[1]))return[...t];throw new Error("coord must be GeoJSON Point or an Array of numbers")}function tr(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 nr(t,e,n={}){let o;return n.final?o=er(ce(e),ce(t)):o=er(ce(t),ce(e)),o>180?-(360-o):o}function er(t,e){let n=fe(t[1]),o=fe(e[1]),r=fe(e[0]-t[0]);r>Math.PI&&(r-=2*Math.PI),r<-Math.PI&&(r+=2*Math.PI);let s=Math.log(Math.tan(o/2+Math.PI/4)/Math.tan(n/2+Math.PI/4)),i=Math.atan2(r,s);return(Xn(i)+360)%360}function or(t,e,n={}){let o=ce(t),r=ce(e);r[0]+=r[0]-o[0]>180?-360:o[0]-r[0]>180?360:0;let s=Sa(o,r);return Gn(s,"meters",n.units)}function Sa(t,e,n){n=n===void 0?Yt:Number(n);let o=n,r=t[1]*Math.PI/180,s=e[1]*Math.PI/180,i=s-r,l=Math.abs(e[0]-t[0])*Math.PI/180;l>Math.PI&&(l-=2*Math.PI);let u=Math.log(Math.tan(s/2+Math.PI/4)/Math.tan(r/2+Math.PI/4)),d=Math.abs(u)>1e-11?i/u:Math.cos(r);return Math.sqrt(i*i+d*d*l*l)*o}function sr(t,e,n,o={}){let r=e<0,s=Gn(Math.abs(e),o.units,"meters");r&&(s=-Math.abs(s));let i=ce(t),l=Ta(i,s,n);return l[0]+=l[0]-i[0]>180?-360:i[0]-l[0]>180?360:0,$n(l,o.properties)}function Ta(t,e,n,o){o=o===void 0?Yt:Number(o);let r=e/o,s=t[0]*Math.PI/180,i=fe(t[1]),l=fe(n),u=r*Math.cos(l),d=i+u;Math.abs(d)>Math.PI/2&&(d=d>0?Math.PI-d:-Math.PI-d);let f=Math.log(Math.tan(d/2+Math.PI/4)/Math.tan(i/2+Math.PI/4)),c=Math.abs(f)>1e-11?u/f:Math.cos(i),a=r*Math.sin(l)/c;return[((s+a)*180/Math.PI+540)%360-180,d*180/Math.PI]}function rr(t){if(!t)throw new Error("geojson is required");switch(t.type){case"Feature":return ir(t);case"FeatureCollection":return Ra(t);case"Point":case"LineString":case"Polygon":case"MultiPoint":case"MultiLineString":case"MultiPolygon":case"GeometryCollection":return Ho(t);default:throw new Error("unknown GeoJSON type")}}function ir(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=ar(t.properties),t.geometry==null?e.geometry=null:e.geometry=Ho(t.geometry),e}function ar(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(r=>r):e[n]=ar(o):e[n]=o}),e}function Ra(t){let e={type:"FeatureCollection"};return Object.keys(t).forEach(n=>{switch(n){case"type":case"features":return;default:e[n]=t[n]}}),e.features=t.features.map(n=>ir(n)),e}function Ho(t){let e={type:t.type};return t.bbox&&(e.bbox=t.bbox),t.type==="GeometryCollection"?(e.geometries=t.geometries.map(n=>Ho(n)),e):(e.coordinates=lr(t.coordinates),e)}function lr(t){let e=t;return typeof e[0]!="object"?e.slice():e.map(n=>lr(n))}function Ao(t,e,n){if(n=n||{},!Cs(n))throw new Error("options is invalid");let o=n.pivot,r=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 s=o??Qn(t);return(r===!1||r===void 0)&&(t=rr(t)),Me(t,function(i){let u=nr(s,i)+e,d=or(s,i),f=tr(sr(s,d,u));i[0]=f[0],i[1]=f[1]}),t}function Lo(t,e,n={}){if(n.final===!0)return Da(t,e);let o=ce(t),r=ce(e),s=fe(o[0]),i=fe(r[0]),l=fe(o[1]),u=fe(r[1]),d=Math.sin(i-s)*Math.cos(u),f=Math.cos(l)*Math.sin(u)-Math.sin(l)*Math.cos(u)*Math.cos(i-s);return Xn(Math.atan2(d,f))}function Da(t,e){let n=Lo(e,t);return n=(n+180)%360,n}function cr(t,e={}){if(t.bbox!=null&&e.recompute!==!0)return t.bbox;let n=[1/0,1/0,-1/0,-1/0];return Me(t,o=>{n[0]>o[0]&&(n[0]=o[0]),n[1]>o[1]&&(n[1]=o[1]),n[2]<o[0]&&(n[2]=o[0]),n[3]<o[1]&&(n[3]=o[1])}),n}function ur(t,e={}){let n=Number(t[0]),o=Number(t[1]),r=Number(t[2]),s=Number(t[3]);if(t.length===6)throw new Error("@turf/bbox-polygon does not support BBox with 6 positions");let i=[n,o];return jn([[i,[r,o],[r,s],[n,s],i]],e.properties,{bbox:t,id:e.id})}function fr(t){return ur(cr(t))}function mr(t){return _s(t,(e,n)=>e+va(n),0)}function va(t){let e=0,n;switch(t.type){case"Polygon":return dr(t.coordinates);case"MultiPolygon":for(n=0;n<t.coordinates.length;n++)e+=dr(t.coordinates[n]);return e;case"Point":case"MultiPoint":case"LineString":case"MultiLineString":return 0}return 0}function dr(t){let e=0;if(t&&t.length>0){e+=Math.abs(hr(t[0]));for(let n=1;n<t.length;n++)e-=Math.abs(hr(t[n]))}return e}var Va=Yt*Yt/2,ko=Math.PI/180;function hr(t){let e=t.length-1;if(e<=2)return 0;let n=0,o=0;for(;o<e;){let r=t[o],s=t[o+1===e?0:o+1],i=t[o+2>=e?(o+2)%e:o+2],l=r[0]*ko,u=s[1]*ko,d=i[0]*ko;n+=(d-l)*Math.sin(u),o++}return n*Va}function gr(t){let e=Js(t);if(!e)throw new Error("Can't calculate smallestSurroundingRectangleByArea for given geometry");let n=Qn(e),o=Ws(e),r=Number.MAX_SAFE_INTEGER,s=null;for(let i=0;i<o.length-1;i++){let l=Lo(o[i],o[i+1]),u=Ao(e,-1*l,{pivot:n}),d=fr(u),f=mr(d);f<r&&(r=f,s=Ao(d,l,{pivot:n}))}return s}function pr(t,e){let n=e[0]-t[0],o=e[1]-t[1];return Math.sqrt(n*n+o*o)}function Ca(t){let e=1/0,n=-1/0,o=1/0,r=-1/0;for(let[s,i]of t)s<e&&(e=s),s>n&&(n=s),i<o&&(o=i),i>r&&(r=i);return[(n+e)*.5,(r+o)*.5]}var to=class t extends Ia{getBoxMesh(){_e.identity(),_e.setFromMatrix3(this.rotation),_e.decompose(Jn,qe,new Nt.Vector3);let e=this.halfSize.clone().multiplyScalar(2),n=new Nt.Mesh(new Nt.BoxGeometry(e.x,e.y,e.z));return n.position.copy(this.center),n.rotation.setFromQuaternion(qe),n}getBoxEdge(e=16776960){let n=this.getBoxMesh();_a.setFromObject(n);let o=new Nt.EdgesGeometry(n.geometry.clone().applyMatrix4(n.matrixWorld));return new Nt.LineSegments(o,new Nt.LineBasicMaterial({color:e,toneMapped:!1}))}toJson(){return _e.identity(),_e.setFromMatrix3(this.rotation),_e.decompose(Jn,qe,new Nt.Vector3),{size:this.halfSize.toArray(),center:this.center.toArray(),quaternion:qe.toArray()}}static from(e,n,o,r=new t){if(o instanceof Nt.Euler)qe.setFromEuler(o);else if(o instanceof Nt.Quaternion)qe.copy(o);else throw new Error("\u4F20\u5165\u7684\u65CB\u8F6C\u4E0D\u662F\u6B27\u62C9\u89D2\u6216\u8005\u56DB\u5143\u6570");return _e.compose(n,qe,Wa),r.center.copy(n),r.halfSize.copy(e.multiplyScalar(.5)),r.rotation.setFromMatrix4(_e),r}static fromByPath2D(e,n,o,r=new t){let s=gr({type:"Polygon",coordinates:[e.map(h=>[h.x,h.y])]});if(!s)throw new Error("2d obb \u83B7\u53D6\u5931\u8D25");let i=s.geometry.coordinates[0],l=pr(i[0],i[1]),u=pr(i[1],i[2]),d=Math.atan2(i[1][1]-i[0][1],i[1][0]-i[0][0]);Jn.set(l,u,o),xr.set(0,0,d);let[f,c]=Ca(i);return n.x=f,n.y=c,this.from(Jn,n,xr,r)}},_e=new Nt.Matrix4,qe=new Nt.Quaternion,xr=new Nt.Euler,Wa=new Nt.Vector3(1,1,1),Jn=new Nt.Vector3,_a=new Nt.Box3;import"three";function Ha(t,e,n=.005,o=.2){if(!t.length||!e.length)return 0;let r=Math.max(n,.03),s=n*n,i=new Map,l=(c,a,h)=>`${Math.floor(c/r)},${Math.floor(a/r)},${Math.floor(h/r)}`;for(let c of e){let a=l(c.x,c.y,c.z);i.has(a)||i.set(a,[]),i.get(a).push(c)}let u=0,d=Math.ceil(n/r)+1,f=[];for(let c=-d;c<=d;c++)for(let a=-d;a<=d;a++)for(let h=-d;h<=d;h++)c*c+a*a+h*h<=d*d&&f.push([c,a,h]);for(let c of t){let a=Math.floor(c.x/r),h=Math.floor(c.y/r),g=Math.floor(c.z/r),p=!1;for(let[b,m,x]of f){let y=`${a+b},${h+m},${g+x}`;if(i.has(y)){for(let w of i.get(y))if(c.distanceToSquared(w)<s){p=!0;break}if(p)break}}if(p&&(u++,u/t.length>o))return u/t.length}return u/t.length}function He(t,e,n=.5){let o=0,r=0;for(let s of t)if(e.containsPoint(s)&&(o++,r=o/t.length,r>n))break;return r}function Bo(t,e,n,o){if(t.intersectsOBB(e))return!0;{let s=Qt(t,o),i=Qt(e,n);if(s||i)return!0}return!1}function Oo(t,e){let n=new Z.Vector3,o=new Z.Vector3;t.getSize(n),e.getSize(o);let r=n.x*n.y*n.z,s=o.x*o.y*o.z;return r>s?1:r<s?-1:0}function Qt(t,e){let n=!0;for(let o=0;o<e.length;o++)if(!t.containsPoint(e[o])){n=!1;break}return n}function de(t){if(t.length===0)return{x:0,y:0,z:0,h:0};let e=0,n=0,o=-1/0,r=1/0;for(let s of t)e+=s.x,n+=s.y,o=Math.max(o,s.z),r=Math.min(r,s.z);return{x:e/t.length,y:n/t.length,z:0,maxz:o,minz:r,h:o-r}}function Ee(t,e,n,o){let r=[];for(let i=0;i<t.length;i++)r.push(new Z.Vector3(t[i][0],t[i][1],0));if(r.length==0)return null;let s=to.fromByPath2D(r,e,n);return s.center.z=o,s}var Aa=(t,e)=>{let n=new Z.Group,o=new Z.MeshStandardMaterial({color:16737792,side:Z.DoubleSide});for(let r=0;r<t.length;r++){let s=[];for(let p=0;p<t[r].path.length;p++)s.push(new Z.Vector3(t[r].path[p][0],t[r].path[p][1],0));if(s.length==0)continue;n.add(t[r].obb.getBoxEdge());let i=new Z.BufferGeometry;i.setFromPoints(s);let l="green",u=new Z.LineBasicMaterial({color:l,depthTest:!1,depthWrite:!1}),d=new Z.Line(i,u);d.position.z=t[r].maxz,n.add(d);let f=t[r].obb.center.clone(),c=ms(t[r].type,f),a=t[r].stairBottomPt1.clone(),h=t[r].stairBottomPt2.clone();for(let p=0;p<t[r].stairStepNum;p++){let b=[a,h];b.push(h.clone().addScaledVector(t[r].vecStepWidth,t[r].stairStepWidth)),b.push(a.clone().addScaledVector(t[r].vecStepWidth,t[r].stairStepWidth));let m=Eo(b,t[r].stairStepHeight),x=new Z.Mesh(m,o);n.add(x),a=a.addScaledVector(t[r].vecStepWidth,t[r].stairStepWidth),a=a.addScaledVector(new Z.Vector3(0,0,1),t[r].stairStepHeight),h=h.addScaledVector(t[r].vecStepWidth,t[r].stairStepWidth),h=h.addScaledVector(new Z.Vector3(0,0,1),t[r].stairStepHeight)}if(t[r].rectPt1.x!=0&&t[r].rectPt1.y!=0){let p=[t[r].stairBottomPt1,t[r].stairBottomPt2,t[r].rectPt2,t[r].rectPt1],b=Eo(p,t[r].stairStepHeight),m=new Z.Mesh(b,o);n.add(m)}let g=new Z.MeshBasicMaterial({color:16776960});for(let p=0;p<t[r].stairBottom1BalconyRailing.length;p++){let b=new Z.CylinderGeometry(.03,.03,t[r].balconyRailingHeight,32),m=new Z.Mesh(b,g);m.position.set(t[r].stairBottom1BalconyRailing[p].x,t[r].stairBottom1BalconyRailing[p].z+t[r].balconyRailingHeight/2,-t[r].stairBottom1BalconyRailing[p].y),e.add(m)}for(let p=0;p<t[r].stairBottom2BalconyRailing.length;p++){let b=new Z.CylinderGeometry(.03,.03,t[r].balconyRailingHeight,32),m=new Z.Mesh(b,g);m.position.set(t[r].stairBottom2BalconyRailing[p].x,t[r].stairBottom2BalconyRailing[p].z+t[r].balconyRailingHeight/2,-t[r].stairBottom2BalconyRailing[p].y),e.add(m)}}return n},La=(t,e)=>{if(t.length==0)return[];e||(e=t[0].averagePz);let n=[],o=new Map;for(let s=0;s<t.length;s++){let i=t[s].points.map(m=>[m.x,m.y]),l=t[s].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 u=l.split("_").slice(1,3).join("_").split(".")[0].split("_")[0],d=l.indexOf("_")+1,f=l.lastIndexOf("_"),c=l.substring(d,f);if(c.includes("top")&&(d=c.indexOf("top")+4,c=c.substring(d,f)),c.includes("left")&&(d=c.indexOf("left")+5,c=c.substring(d,f)),c.includes("right")&&(d=c.indexOf("right")+6,c=c.substring(d,f)),c.includes("front")&&(d=c.indexOf("front")+6,c=c.substring(d,f)),c==="wall"||c==="stair guardrail")continue;let a=[];for(let m=0;m<t[s].points.length;m++)a.push(new Z.Vector3(t[s].points[m].x,t[s].points[m].y,t[s].points[m].z));let h=-99999;if(c==="floor"){let m=new Map;for(let y=0;y<t[s].points.length;y++){let w=t[s].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[s].points[y]),m.set(w,z)}else m.set(w,{num:1,points:[t[s].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]),a=[],a=x[1].points.map(y=>new Z.Vector3(y.x,y.y,y.z)),h=x[0]}let g=de(a),p={points:a,path:ve(i),h:g.h,minz:g.minz,maxz:g.maxz,center:{x:g.x,y:g.y,z:g.z},obj_id:t[s].obj_id,type:c,averagePz:e,obb:null,isDel:!1,obj_id:l,positionArr:[t[s].position]};if(p.obb=Ee(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==c){b=m;break}if(b!=-1?n[b].array.push(p):n.push({type:c,array:[p]}),c=="floor"&&h!=-99999)if(o.has(h)){let m=o.get(h);m.num+=p.points.length,m.datas.push(p),o.set(h,m)}else o.set(h,{num:p.points.length,datas:[p]})}if(o.size>0){let s=[];for(let[i,l]of o.entries()){let{num:u,datas:d}=l;u>3e3&&s.push(...d)}for(let i=0;i<n.length;i++)if(n[i].type=="floor"){n[i].array=s;break}}for(let s=0;s<n.length;s++){let i=n[s].array,l=new Set,u=[];for(let f=0;f<i.length;f++){if(i[f].obb==null||l.has(f))continue;let c={...i[f],obb:i[f].obb.clone()};for(let a=f+1;a<i.length;a++){if(i[a].obb==null||l.has(a))continue;let h=c.obb.intersectsOBB(i[a].obb,.01);if(h||(h=$a(c.obb,i[a].obb)),h){l.add(a);for(let b=0;b<i[a].points.length;b++)(i[a].points[b].z>e&&i[a].points[b].z-e>.1||c.type=="floor"||c.type=="Staircase")&&c.points.push(i[a].points[b]);let g=c.points.map(b=>[b.x,b.y]);c.path=ve(g);let p=de(c.points);c.h=p.h,c.minz=p.minz,c.maxz=p.maxz,c.center={x:p.x,y:p.y,z:p.z},c.obb=Ee(c.path,c.center,c.h,(c.maxz+c.minz)/2),c.positionArr.push(...i[a].positionArr),a=f}}c.path.length>i[f].path.length&&(l.add(f),u.push(c))}let d=[];for(let f=0;f<i.length;f++)l.has(f)||d.push(i[f]);d.push(...u),n[s].array=d}for(let s=0;s<n.length;s++){let i=n[s].type;if(i==="people"||i==="floor")continue;let l=n[s].array;for(let u=0;u<l.length;u++){let d=l[u].obb,f=l[u].minz,c=l[u].maxz,a=l[u].averagePz;if(i==="window"||i==="door"||i==="tv"||i==="chair"||i==="cabinet"||i==="table"){let h=new Z.Vector3;d.getSize(h);let g=[h.x,h.y,h.z],p=0;for(let b of g)if(b<.2&&(p++,p===2)){l[u].isDel=!0;break}}if(!l[u].isDel)for(let h=s+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(d.intersectsOBB(m)){let w=He(p[b].points,d),z=He(l[u].points,m),M=Oo(d,m);if(z>=.5&&M==-1&&i!=="Staircase"&&g!=="Staircase"){l[u].isDel=!0;break}if(i!=="wall"&&i!=="floor"&&i!=="roof"){if(i==="window"){if(g==="balcony railing"&&Qt(d,p[b].points)){p[b].isDel=!0;continue}if(g==="balcony railing"&&Qt(m,l[u].points)){l[u].isDel=!0;break}if(g==="balcony railing"&&Bo(d,m,l[u].points,p[b].points)&&(Math.abs(f-x)<.1||Math.abs(x-a)>.3)){p[b].isDel=!0;continue}if(g==="door"&&Qt(d,p[b].points)){p[b].isDel=!0;continue}if(g==="door"&&Qt(m,l[u].points)){p[b].isDel=!0;continue}if(g==="window sill")continue}else if(i==="balcony railing"){if(g==="window"&&Qt(d,p[b].points)){p[b].isDel=!0;continue}if(g==="window"&&Qt(m,l[u].points)){l[u].isDel=!0;break}if(g==="window"&&Bo(d,m,l[u].points,p[b].points)&&(Math.abs(f-x)<.1||Math.abs(f-a)>.3)){l[u].isDel=!0;break}if(g==="Staircase"&&Qt(d,p[b].points)){l[u].isStaircaseBalconyRailing=!0;break}if(g==="Staircase"&&Qt(m,l[u].points)){l[u].isStaircaseBalconyRailing=!0;break}if(g==="Staircase"&&d.intersectsOBB(m)){l[u].isStaircaseBalconyRailing=!0;break}}else if(i==="door"){if(g==="window"&&Qt(d,p[b].points)){l[u].isDel=!0;break}if(g==="window"&&Qt(m,l[u].points)){l[u].isDel=!0;break}if(g==="window sill"&&Qt(d,p[b].points)){l[u].isDel=!0;break}if(g==="window sill"&&Qt(m,l[u].points)){l[u].isDel=!0;break}}else if(i==="window sill"){if(g==="window")continue;if(g==="floor"&&Qt(d,p[b].points)){p[b].isDel=!0;continue}if(g==="door"&&Qt(d,p[b].points)){p[b].isDel=!0;continue}if(g==="door"&&Qt(m,l[u].points)){p[b].isDel=!0;continue}}else if(i==="Staircase"){if(g==="balcony railing"&&Qt(d,p[b].points)){p[b].isStaircaseBalconyRailing=!0;continue}if(g==="balcony railing"&&Qt(m,l[u].points)){p[b].isStaircaseBalconyRailing=!0;continue}if(g==="balcony railing"&&d.intersectsOBB(m)){p[b].isStaircaseBalconyRailing=!0;continue}}let P=!1,E=[],T=[],V=l[u].points,_=p[b].points;if(V.length>_.length?(P=!0,E=V,T=_):(E=_,T=V),Ha(T,E,.03,.5)>.5)if(P)p[b].isDel=!0;else{l[u].isDel=!0;break}else if(Bo(d,m,l[u].points,p[b].points)){let S=Oo(d,m);if(S===1||S===0){if(g==="switch"||g==="Staircase")continue;V.length>_.length?He(T,d)>=.5&&(p[b].isDel=!0):He(E,d)>=.5&&(p[b].isDel=!0)}else{if(i==="switch"||i==="Staircase")continue;if(V.length>_.length){if(He(E,m)>=.5){l[u].isDel=!0;break}}else if(He(T,m)>=.5){l[u].isDel=!0;break}}}}}}if(l[u].isDel)break}}}for(let s=0;s<n.length;s++){let i=n[s].type,l=n[s].array;for(let u=0;u<l.length;u++){let d=l[u].maxz,f=l[u].minz,c=i==="switch"?.1:.3;if(Math.abs(d-e)<c&&i!="floor"){l[u].isDel=!0;continue}if(i==="window"||i==="door"||i==="tv"){let a=Math.abs(d-e),h=Math.abs(f-e);(i==="tv"&&h<1.6||i!=="window"&&a<1.6)&&(l[u].isDel=!0),i==="window"&&a<1&&(l[u].isDel=!0),i==="door"&&h>1&&(l[u].isDel=!0)}if(i==="chair"){let a=new Z.Vector3;l[u].obb.getSize(a),(a.x<.1||a.y<.1||a.z<.2)&&(l[u].isDel=!0)}if(i==="balcony railing"&&(Math.abs(d-f)<.4&&(l[u].isDel=!0),(f<e&&Math.abs(f-e)>1||f>e&&Math.abs(f-e)>1)&&(l[u].isDel=!0),d<e&&(l[u].isDel=!0)),i==="people"&&(Math.abs(d-f)<1&&(l[u].isDel=!0),f>e&&f-e>.3&&(l[u].isDel=!0),d<e&&(l[u].isDel=!0)),i==="floor"){let a=new Z.Vector3;l[u].obb.getSize(a),(a.x<.1||a.y<.1)&&(l[u].isDel=!0)}i==="stair guardrail"&&l[u].points.length<100&&(l[u].isDel=!0)}}for(let s=0;s<n.length;s++)n[s].array=n[s].array.filter(i=>!i.isDel);let r=[];for(let s=0;s<n.length;s++){let i=n[s].array;for(let l=0;l<i.length;l++)r.push({obbBox:i[l].obb,box:new Z.Box3().setFromPoints(i[l].points),category:i[l].type,center:{x:i[l].center.x,y:i[l].center.y,z:(i[l].minz+i[l].maxz)/2},name:i[l].obj_id,obj_id:i[l].obj_id,pcdPoints:i[l].points,positionArr:i[l].positionArr})}return r},ka=t=>{if(t.length==0)return[];let e=[],n=new Map;for(let r=0;r<t.length;r++){let s=t[r].points.map(b=>[b.x,b.y]),i=t[r].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],u=i.indexOf("_")+1,d=i.lastIndexOf("_"),f=i.substring(u,d);if(f!=="floor")continue;let c=[];for(let b=0;b<t[r].points.length;b++)c.push(new Z.Vector3(t[r].points[b].x,t[r].points[b].y,t[r].points[b].z));let a=-99999;if(f==="floor"){let b=new Map;for(let x=0;x<t[r].points.length;x++){let y=t[r].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[r].points[x]),b.set(y,w)}else b.set(y,{num:1,points:[t[r].points[x]]})}let m=[...b.entries()].reduce((x,y)=>y[1].num>x[1].num?y:x);s=[],s=m[1].points.map(x=>[x.x,x.y]),c=[],c=m[1].points.map(x=>new Z.Vector3(x.x,x.y,x.z)),a=m[0]}let h=de(c),g={points:c,path:ve(s),h:h.h,minz:h.minz,maxz:h.maxz,center:{x:h.x,y:h.y,z:h.z},obj_id:t[r].obj_id,type:f,obb:null,isDel:!1,obj_id:i,positionArr:[t[r].position]};if(g.obb=Ee(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==f){p=b;break}if(p!=-1?e[p].array.push(g):e.push({type:f,array:[g]}),f=="floor"&&a!=-99999)if(n.has(a)){let b=n.get(a);b.num+=g.points.length,b.datas.push(g),n.set(a,b)}else n.set(a,{num:g.points.length,datas:[g]})}for(let r=0;r<e.length;r++){let s=e[r].array,i=[],l=[];for(let d=0;d<s.length;d++){if(s[d].obb==null||i.includes(d))continue;let f={...s[d],obb:s[d].obb.clone()};for(let c=d+1;c<s.length;c++){if(s[c].obb==null||i.includes(c))continue;if(f.obb.intersectsOBB(s[c].obb)){i.push(c);for(let p=0;p<s[c].points.length;p++)f.points.push(s[c].points[p]);let h=f.points.map(p=>[p.x,p.y]);f.path=ve(h);let g=de(f.points);f.h=g.h,f.minz=g.minz,f.maxz=g.maxz,f.center={x:g.x,y:g.y,z:g.z},f.obb=Ee(f.path,f.center,f.h,(f.maxz+f.minz)/2),f.positionArr.push(...s[c].positionArr),c=d}}f.path.length>s[d].path.length&&(i.push(d),l.push(f))}let u=[];for(let d=0;d<s.length;d++)i.includes(d)||u.push(s[d]);u.push(...l),e[r].array=u}for(let r=0;r<e.length;r++){let s=e[r].type,i=e[r].array;for(let l=0;l<i.length;l++)s==="floor"&&i[l].points.length<500&&(i[l].isDel=!0)}for(let r=0;r<e.length;r++)e[r].array=e[r].array.filter(s=>!s.isDel);let o=[];for(let r=0;r<e.length;r++){let s=e[r].array;for(let i=0;i<s.length;i++)o.push({obbBox:s[i].obb,box:new Z.Box3().setFromPoints(s[i].points),category:s[i].type,center:{x:s[i].center.x,y:s[i].center.y,z:(s[i].minz+s[i].maxz)/2},name:s[i].obj_id,obj_id:s[i].obj_id,pcdPoints:s[i].points,positionArr:s[i].positionArr})}return o},Ba=(t,e)=>{if(!t||!t.splitFloorProjectsResults||!t.trajectoryResults)return[];let n=t.splitFloorProjectsResults,o=t.trajectoryResults,r=new Map;for(let a=0;a<o.length;a++){let h=o[a].floor;r.has(h)?r.get(h).push(o[a]):r.set(h,[o[a]])}let s=new Map,i=[];for(let a=0;a<n.length;a++){let h=[],g=n[a];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=de(M),E={points:M,path:ve(b),h:P.h,minz:P.minz,maxz:P.maxz,center:{x:P.x,y:P.y,z:P.z},obj_id:g[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=Ee(E.path,E.center,E.h,(E.maxz+E.minz)/2),E.obb!=null&&(z=="Staircase"?h.push(E):z=="balcony railing"&&i.push(E))}s.set(a+1,h)}let l=[];for(let[a,h]of s){let g={floor:a,findTrajectoryResults:[],otherTrajectoryResults:[],lastTrajectoryResults:[]},p=r.get(a);if(!p){g.otherTrajectoryResults=h,l.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,l.push(g)}function u(a,h){let g=a,p=[],b=[];for(let x=0;x<a.length;x++){if(a[x].obb==null||p.includes(x))continue;let y={...a[x],obb:a[x].obb.clone()};for(let w=x+1;w<a.length;w++){if(a[w].obb==null||p.includes(w))continue;if(y.obb.intersectsOBB(a[w].obb)||h){p.push(w);for(let E=0;E<a[w].points.length;E++)y.points.push(a[w].points[E]);let M=y.points.map(E=>[E.x,E.y]);y.path=ve(M);let P=de(y.points);y.h=P.h,y.minz=P.minz,y.maxz=P.maxz,y.center={x:P.x,y:P.y,z:P.z},y.obb=Ee(y.path,y.center,y.h,(y.maxz+y.minz)/2),y.positionArr.push(...a[w].positionArr),w=x}}y.path.length>a[x].path.length&&(p.push(x),b.push(y))}let m=[];for(let x=0;x<a.length;x++)p.includes(x)||m.push(a[x]);return m.push(...b),a=m,a}for(let a=0;a<l.length;a++){for(let h=0;h<l[a].findTrajectoryResults.length;h++)l[a].findTrajectoryResults[h]=u(l[a].findTrajectoryResults[h],!0);l[a].otherTrajectoryResults=u(l[a].otherTrajectoryResults,!1)}for(let a=0;a<l.length;a++){for(let h=0;h<l[a].findTrajectoryResults.length;h++){for(let g=0;g<l[a].findTrajectoryResults[h].length;g++){let p=yr(l[a].findTrajectoryResults[h][g].points,{binCount:100,minBinPoints:5,sideK:2.2,zK:2.2,minSideRange:.2,minZRange:.2,lowerZScale:.4,upperZScale:1.8}),b=br(p.keep,{radius:.1,minClusterSize:50,lowPercent:.45});if(b.keep.length==0){l[a].findTrajectoryResults[h][g].isDel=!0;continue}l[a].findTrajectoryResults[h][g].points=b.keep;let m=l[a].findTrajectoryResults[h][g].points.map(y=>[y.x,y.y]);l[a].findTrajectoryResults[h][g].path=ve(m);let x=de(l[a].findTrajectoryResults[h][g].points);l[a].findTrajectoryResults[h][g].h=x.h,l[a].findTrajectoryResults[h][g].minz=x.minz,l[a].findTrajectoryResults[h][g].maxz=x.maxz,l[a].findTrajectoryResults[h][g].center={x:x.x,y:x.y,z:x.z},l[a].findTrajectoryResults[h][g].obb=Ee(l[a].findTrajectoryResults[h][g].path,l[a].findTrajectoryResults[h][g].center,l[a].findTrajectoryResults[h][g].h,(l[a].findTrajectoryResults[h][g].maxz+l[a].findTrajectoryResults[h][g].minz)/2)}l[a].findTrajectoryResults[h]=l[a].findTrajectoryResults[h].filter(g=>!g.isDel)}for(let h=0;h<l[a].otherTrajectoryResults.length;h++){let g=yr(l[a].otherTrajectoryResults[h].points,{binCount:100,minBinPoints:5,sideK:2.2,zK:2.2,minSideRange:.2,minZRange:.2,lowerZScale:.4,upperZScale:1.8}),p=br(g.keep,{radius:.1,minClusterSize:50,lowPercent:.45});if(p.keep.length==0){l[a].otherTrajectoryResults[h].isDel=!0;continue}l[a].otherTrajectoryResults[h].points=p.keep;let b=l[a].otherTrajectoryResults[h].points.map(x=>[x.x,x.y]);l[a].otherTrajectoryResults[h].path=ve(b);let m=de(l[a].otherTrajectoryResults[h].points);l[a].otherTrajectoryResults[h].h=m.h,l[a].otherTrajectoryResults[h].minz=m.minz,l[a].otherTrajectoryResults[h].maxz=m.maxz,l[a].otherTrajectoryResults[h].center={x:m.x,y:m.y,z:m.z},l[a].otherTrajectoryResults[h].obb=Ee(l[a].otherTrajectoryResults[h].path,l[a].otherTrajectoryResults[h].center,l[a].otherTrajectoryResults[h].h,(l[a].otherTrajectoryResults[h].maxz+l[a].otherTrajectoryResults[h].minz)/2)}l[a].otherTrajectoryResults.filter(h=>!h.isDel)}function d(a){for(let h=0;h<a.length;h++){let g=a[h].obb;for(let p=h+1;p<a.length;p++){let b=a[p].obb;if(!a[p].isDel){if(g.intersectsOBB(b)){let m=He(a[p].points,g),x=He(a[h].points,b),y=Oo(g,b);if(m>=.5&&(y==1||y==0)&&(a[p].isDel=!0),x>=.5&&y==-1){a[h].isDel=!0;break}}if(a[h].isDel)break}}}return a=a.filter(h=>!h.isDel),a}for(let a=0;a<l.length;a++){let h=[];for(let g=0;g<l[a].findTrajectoryResults.length;g++)h.push(...l[a].findTrajectoryResults[g]);h.push(...l[a].otherTrajectoryResults),l[a].lastTrajectoryResults=d(h)}function f(a){let h=[];if(a.length>0){let g=.3,p=.5,b=.5,m=.2;for(let x=0;x<a.length;x++){let y=a[x].obb.halfSize.clone().multiplyScalar(2),w=a[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=ys(a[x].obb);if(E.length!=8)continue;let T=new Z.Line3(E[0],E[1]),V=new Z.Line3(E[1],E[2]),_=new Z.Line3(E[2],E[3]),v=new Z.Line3(E[3],E[0]),S=new Z.Line3(E[4],E[5]),R=new Z.Line3(E[5],E[6]),D=new Z.Line3(E[6],E[7]),W=new Z.Line3(E[7],E[4]),I=[],C=[],H=[],A=[],k=[],O=[],N=[],L=[];for(let bt=0;bt<w.length;bt++){let Jt=T.closestPointToPoint(w[bt],!0,new Z.Vector3),he=V.closestPointToPoint(w[bt],!0,new Z.Vector3),Tt=_.closestPointToPoint(w[bt],!0,new Z.Vector3),ee=v.closestPointToPoint(w[bt],!0,new Z.Vector3),et=S.closestPointToPoint(w[bt],!0,new Z.Vector3),me=R.closestPointToPoint(w[bt],!0,new Z.Vector3),Ae=D.closestPointToPoint(w[bt],!0,new Z.Vector3),Le=W.closestPointToPoint(w[bt],!0,new Z.Vector3);Jt.distanceTo(w[bt])<m&&I.push(w[bt]),he.distanceTo(w[bt])<m&&C.push(w[bt]),Tt.distanceTo(w[bt])<m&&H.push(w[bt]),ee.distanceTo(w[bt])<m&&A.push(w[bt]),et.distanceTo(w[bt])<m&&k.push(w[bt]),me.distanceTo(w[bt])<m&&O.push(w[bt]),Ae.distanceTo(w[bt])<m&&N.push(w[bt]),Le.distanceTo(w[bt])<m&&L.push(w[bt])}let B=E[0].distanceTo(E[1]),$=E[1].distanceTo(E[2]),G=E[2].distanceTo(E[3]),Q=E[3].distanceTo(E[0]),q=new Z.Vector3,X=new Z.Vector3,Y=new Z.Vector3,it=new Z.Vector3;Math.abs(B-z)<.01?I.length>H.length?(q=E[0].clone(),X=E[1].clone(),Y=new Z.Vector3().subVectors(X,q).normalize(),it=new Z.Vector3().subVectors(E[2],E[1]).normalize()):(q=E[2].clone(),X=E[3].clone(),Y=new Z.Vector3().subVectors(X,q).normalize(),it=new Z.Vector3().subVectors(E[0],E[3]).normalize()):C.length>A.length?(q=E[1].clone(),X=E[2].clone(),Y=new Z.Vector3().subVectors(X,q).normalize(),it=new Z.Vector3().subVectors(E[3],E[2]).normalize()):(q=E[3].clone(),X=E[0].clone(),Y=new Z.Vector3().subVectors(X,q).normalize(),it=new Z.Vector3().subVectors(E[1],E[0]).normalize());let ht=E[4].distanceTo(E[5]),St=E[5].distanceTo(E[6]),nt=E[6].distanceTo(E[7]),wt=E[7].distanceTo(E[4]),zt=new Z.Vector3,Dt=new Z.Vector3,Pt=new Z.Vector3(q.x,q.y,E[4].z),Mt=new Z.Vector3(X.x,X.y,E[4].z);(ct(E[4],Pt)||ct(E[4],Mt))&&(ct(E[5],Pt)||ct(E[5],Mt))?(zt=E[6].clone(),Dt=E[7].clone()):(ct(E[5],Pt)||ct(E[5],Mt))&&(ct(E[6],Pt)||ct(E[6],Mt))?(zt=E[7].clone(),Dt=E[4].clone()):(ct(E[6],Pt)||ct(E[6],Mt))&&(ct(E[7],Pt)||ct(E[7],Mt))?(zt=E[4].clone(),Dt=E[5].clone()):(ct(E[7],Pt)||ct(E[7],Mt))&&(ct(E[4],Pt)||ct(E[4],Mt))&&(zt=E[5].clone(),Dt=E[6].clone());let It=q.distanceTo(X),ot=zt.distanceTo(Dt),ft=new Z.Vector3().subVectors(new Z.Vector3(q.x,q.y,zt.z),q).normalize();if(Math.abs(It-ot)>.01||Math.abs(It-z)>.01){console.log("\u4E0A\u4E0B\u957F\u5EA6\u4E0D\u4E00\u81F4,\u6216\u4E0E\u5BBD\u4E0D\u4E00\u81F4",It,ot,z);continue}let st=Math.sqrt(It*It+ot*ot),tt=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(st)))),ae={stairStepHeight:P/tt,stairStepWidth:M/tt,staitWidth:z,stairLength:M,stairHeigth:P,stairStepNum:tt,stairBottomPt1:q,stairBottomPt2:X,stairTopPt1:zt,stairTopPt2:Dt,vecStepLength:Y,vecStepWidth:it,vecStepHeight:ft,path:a[x].path,obb:a[x].obb,maxz:a[x].maxz,points:a[x].points,rectPt1:new Z.Vector3(0,0,0),rectPt2:new Z.Vector3(0,0,0)};h.push(ae)}}return h}let c=[];for(let a=0;a<l.length;a++)c.push(...f(l[a].lastTrajectoryResults));for(let a=0;a<c.length;a++){let h=c[a].stairTopPt1.clone(),g=c[a].stairTopPt2.clone(),p=c[a].stairBottomPt1.clone(),b=c[a].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=qt(h,g,!0),M=qt(p,b,!0),P=qt(z,M),E=new Z.Vector3().subVectors(z,P).normalize(),T=new Z.Vector3().subVectors(M,P).normalize(),V=z.distanceTo(M),_=!1,v=!1;for(let S=0;S<c.length;S++){if(a==S)continue;let R=c[S].stairTopPt1.clone(),D=c[S].stairTopPt2.clone(),W=c[S].stairBottomPt1.clone(),I=c[S].stairBottomPt2.clone(),C=new Z.Vector3().subVectors(R,D).normalize(),H=new Z.Vector3().subVectors(W,I).normalize(),A=R.clone(),k=D.clone(),O=W.clone(),N=I.clone();A.z=k.z=O.z=N.z=0;let L=qt(R,D,!0),B=qt(W,I,!0),$=L.distanceTo(B),G=Gt(z,M,L,B),Q=!1;if(G&&G.isParallel&&R.z<=p.z&&p.z-R.z<.3){Q=!0,v=!0;let q=A.addScaledVector(C.clone().negate(),100),X=k.addScaledVector(C,100),Y=O.addScaledVector(H.clone().negate(),100),it=N.addScaledVector(H,100),ht=new Z.Line3(q,X),St=new Z.Line3(Y,it),nt=ht.closestPointToPoint(P,!0,new Z.Vector3),wt=St.closestPointToPoint(P,!0,new Z.Vector3),zt=new Z.Vector3().subVectors(nt,P),Dt=new Z.Vector3().subVectors(wt,P),Pt=zt.length(),Mt=Dt.length();Dt=Dt.normalize(),zt=zt.normalize();let It=Kt(E,zt,.1),ot=Kt(T,zt,.1),ft=Kt(T,Dt,.1),st=Kt(E,Dt,.1);if(It&&It.sameDirection&&Pt>V/2){let tt=Pt-V/2;c[a].stairBottomPt1=c[a].stairBottomPt1.addScaledVector(T,tt),c[a].stairBottomPt2=c[a].stairBottomPt2.addScaledVector(T,tt)}else if(ot&&ot.sameDirection&&Pt>V/2){let tt=Pt-V/2;c[a].stairBottomPt1=c[a].stairBottomPt1.addScaledVector(T,tt),c[a].stairBottomPt2=c[a].stairBottomPt2.addScaledVector(T,tt)}if(ft&&ft.sameDirection&&Mt>V/2){let tt=Mt-V/2;c[a].stairTopPt1=c[a].stairTopPt1.addScaledVector(E,tt),c[a].stairTopPt2=c[a].stairTopPt2.addScaledVector(E,tt)}else if(st&&st.sameDirection&&Mt>V/2){let tt=Mt-V/2;c[a].stairTopPt1=c[a].stairTopPt1.addScaledVector(E,tt),c[a].stairTopPt2=c[a].stairTopPt2.addScaledVector(E,tt)}}else if(G&&G.isParallel&&h.z<W.z&&W.z-h.z<.2){Q=!0,_=!0;let q=A.addScaledVector(C.clone().negate(),100),X=k.addScaledVector(C,100),Y=O.addScaledVector(H.clone().negate(),100),it=N.addScaledVector(H,100),ht=new Z.Line3(q,X),St=new Z.Line3(Y,it),nt=ht.closestPointToPoint(P,!1,new Z.Vector3),wt=St.closestPointToPoint(P,!1,new Z.Vector3),zt=new Z.Vector3().subVectors(nt,P),Dt=new Z.Vector3().subVectors(wt,P),Pt=zt.length(),Mt=Dt.length();Dt=Dt.normalize(),zt=zt.normalize();let It=Kt(E,zt,.1),ot=Kt(T,zt,.1),ft=Kt(T,Dt,.1),st=Kt(E,Dt,.1);if(It&&It.sameDirection&&Pt>V/2){let tt=Pt-V/2;c[a].stairBottomPt1=c[a].stairBottomPt1.addScaledVector(T,tt),c[a].stairBottomPt2=c[a].stairBottomPt2.addScaledVector(T,tt)}else if(ot&&ot.sameDirection&&Pt>V/2){let tt=Pt-V/2;c[a].stairBottomPt1=c[a].stairBottomPt1.addScaledVector(T,tt),c[a].stairBottomPt2=c[a].stairBottomPt2.addScaledVector(T,tt)}if(ft&&ft.sameDirection&&Mt>V/2){let tt=Mt-V/2;c[a].stairTopPt1=c[a].stairTopPt1.addScaledVector(E,tt),c[a].stairTopPt2=c[a].stairTopPt2.addScaledVector(E,tt)}else if(st&&st.sameDirection&&Mt>V/2){let tt=Mt-V/2;c[a].stairTopPt1=c[a].stairTopPt1.addScaledVector(E,tt),c[a].stairTopPt2=c[a].stairTopPt2.addScaledVector(E,tt)}c[a].stairTopPt1.z=c[a].stairTopPt2.z=W.z}if(Q&&(h=c[a].stairTopPt1.clone(),g=c[a].stairTopPt2.clone(),p=c[a].stairBottomPt1.clone(),b=c[a].stairBottomPt2.clone(),m=h.clone(),x=g.clone(),y=p.clone(),w=b.clone(),m.z=x.z=y.z=w.z=0,z=qt(h,g,!0),M=qt(p,b,!0),P=qt(z,M),E=new Z.Vector3().subVectors(z,P).normalize(),T=new Z.Vector3().subVectors(M,P).normalize(),V=z.distanceTo(M)),v&&_)break}if(v||_){let S=c[a].stairTopPt1.clone(),R=c[a].stairTopPt2.clone(),D=c[a].stairBottomPt1.clone(),W=c[a].stairBottomPt2.clone(),I=qt(S,R,!0),C=qt(D,W,!0),H=I.distanceTo(C),A=c[a].stairTopPt1.distanceTo(c[a].stairTopPt2),k=c[a].stairBottomPt1.distanceTo(c[a].stairBottomPt2),O=Math.sqrt(A*A+k*k),N=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(O))));c[a].stairStepNum=N,c[a].stairHeigth=c[a].stairTopPt1.z-c[a].stairBottomPt1.z,c[a].stairStepHeight=c[a].stairHeigth/c[a].stairStepNum,c[a].stairStepWidth=H/c[a].stairStepNum}}for(let a=0;a<c.length;a++){let h=c[a].stairTopPt1,g=c[a].stairTopPt2,p=c[a].stairBottomPt1.clone(),b=c[a].stairBottomPt2.clone(),m=new Z.Vector3(h.x,h.y,p.z),x=c[a].vecStepWidth;for(let y=0;y<c.length;y++){if(a==y)continue;let w=c[y].stairTopPt1,z=c[y].stairTopPt2,M=c[y].stairBottomPt1.clone(),P=c[y].stairBottomPt2.clone(),E=new Z.Vector3(w.x,w.y,M.z),T=c[y].vecStepWidth;if(Math.abs(h.z-M.z)<.3&&M.z>p.z&&c[a].obb.intersectsOBB(c[y].obb)){let V=ie(m,p,E,M);if(V&&V.angle>75){let _=M.distanceTo(h),v=M.distanceTo(g),S=P.distanceTo(h),R=P.distanceTo(g),D=h.clone(),W=D.clone().addScaledVector(x,c[y].staitWidth),I=new Z.Vector3().subVectors(g,h).normalize(),C=h.distanceTo(g),H=D.clone().addScaledVector(I,C),A=W.clone().addScaledVector(I,C),k=D.clone().addScaledVector(I,c[y].stairLength),O=W.clone().addScaledVector(I,c[y].stairLength),N=_;(N>v||N>R)&&(N=v,D=g.clone(),W=D.clone().addScaledVector(x,c[y].staitWidth),I=new Z.Vector3().subVectors(h,g).normalize(),C=h.distanceTo(g),H=D.clone().addScaledVector(I,C),A=W.clone().addScaledVector(I,C),k=D.clone().addScaledVector(I,c[y].stairLength),O=W.clone().addScaledVector(I,c[y].stairLength));let L=new Z.Vector3().subVectors(k,H).normalize(),B=k.distanceTo(H);k.z=O.z=c[y].maxz,c[y].stairBottomPt1=H,c[y].stairBottomPt2=A,c[y].stairTopPt1=k,c[y].stairTopPt2=O,c[y].rectPt1=D,c[y].rectPt2=W;let $=H.distanceTo(A),G=k.distanceTo(O),Q=Math.sqrt(B*B+c[y].stairHeigth*c[y].stairHeigth),q=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(Q))));c[y].stairStepNum=q,c[y].stairHeigth=k.z-H.z,c[y].stairStepHeight=c[y].stairHeigth/c[y].stairStepNum,c[y].stairStepWidth=B/c[y].stairStepNum,c[y].vecStepLength=I.clone().negate(),c[y].vecStepWidth=L;break}}}}return Oa(c,i,e),c},Oa=(t,e,n)=>{if(!t||t.length<=0||!e||e.length<=0)return;let o=1.5,r=0;for(let s=0;s<t.length;s++){t[s].stairBottom1BalconyRailing=[],t[s].stairBottom2BalconyRailing=[],t[s].balconyRailingHeight=0;let i=t[s].stairBottomPt1.clone(),l=t[s].stairBottomPt2.clone(),u=t[s].stairBottomPt1.clone(),d=t[s].stairBottomPt2.clone(),f=new Z.Vector3().subVectors(l,i).normalize();i=i.addScaledVector(f,.05),l=l.addScaledVector(f.clone().negate(),.05);let c=[],a=[];for(let h=0;h<t[s].stairStepNum;h++){let g=[i,u];g.push(g[1].clone().addScaledVector(t[s].vecStepWidth,t[s].stairStepWidth)),g.push(g[0].clone().addScaledVector(t[s].vecStepWidth,t[s].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=de(g),m=Ee(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(r==0&&(r=de(x).maxz),y){let z=qt(g[1],g[2]);z.z+=t[s].stairStepHeight,c.push(z)}g=[],g=[l,d],g.push(g[1].clone().addScaledVector(t[s].vecStepWidth,t[s].stairStepWidth)),g.push(g[0].clone().addScaledVector(t[s].vecStepWidth,t[s].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=de(g),m=Ee(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(r==0&&(r=de(x).maxz),y){let z=qt(g[1],g[2]);z.z+=t[s].stairStepHeight,a.push(z)}i=i.addScaledVector(t[s].vecStepWidth,t[s].stairStepWidth),i=i.addScaledVector(t[s].vecStepHeight,t[s].stairStepHeight),l=l.addScaledVector(t[s].vecStepWidth,t[s].stairStepWidth),l=l.addScaledVector(t[s].vecStepHeight,t[s].stairStepHeight),u=u.addScaledVector(t[s].vecStepWidth,t[s].stairStepWidth),u=u.addScaledVector(t[s].vecStepHeight,t[s].stairStepHeight),d=d.addScaledVector(t[s].vecStepWidth,t[s].stairStepWidth),d=d.addScaledVector(t[s].vecStepHeight,t[s].stairStepHeight)}c.length>t[s].stairStepNum-3&&(t[s].stairBottom1BalconyRailing=c),a.length>t[s].stairStepNum-3&&(t[s].stairBottom2BalconyRailing=a),t[s].balconyRailingHeight=r}};function yr(t,e={}){let{binCount:n=80,minBinPoints:o=5,sideK:r=3,zK:s=3,minSideRange:i=.2,minZRange:l=.2,maxSearchBins:u=3,lowerZScale:d=1,upperZScale:f=1}=e;if(!t||t.length===0)return[];let c=t.map((H,A)=>({index:A,x:H.x,y:H.y,z:H.z,raw:H})),a=0,h=0;for(let H of c)a+=H.x,h+=H.y;a/=c.length,h/=c.length;let g=0,p=0,b=0;for(let H of c){let A=H.x-a,k=H.y-h;g+=A*A,p+=A*k,b+=k*k}g/=c.length,p/=c.length,b/=c.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,_=c.map(H=>{let A=H.x-a,k=H.y-h,O=A*w+k*z,N=A*P+k*E;return T=Math.min(T,O),V=Math.max(V,O),{...H,t:O,side:N}}),S=(V-T||1)/n,R=new Map;for(let H of _){let A=Math.floor((H.t-T)/S);A<0&&(A=0),A>=n&&(A=n-1),R.has(A)||R.set(A,[]),R.get(A).push(H)}let D=new Map;for(let[H,A]of R){if(A.length<o)continue;let k=A.map(q=>q.side).sort((q,X)=>q-X),O=A.map(q=>q.z).sort((q,X)=>q-X),N=eo(k),L=eo(O),B=eo(k.map(q=>Math.abs(q-N)).sort((q,X)=>q-X)),$=eo(O.map(q=>Math.abs(q-L)).sort((q,X)=>q-X)),G=Math.max(i,B*1.4826*r),Q=Math.max(l,$*1.4826*s);D.set(H,{sideMedian:N,zMedian:L,sideRange:G,zRange:Q})}function W(H){if(D.has(H))return D.get(H);for(let A=1;A<=u;A++){if(D.has(H-A))return D.get(H-A);if(D.has(H+A))return D.get(H+A)}return null}let I=[],C=[];for(let H of _){let A=Math.floor((H.t-T)/S);A<0&&(A=0),A>=n&&(A=n-1);let k=W(A);if(!k){C.push(H.raw);continue}let O=Math.abs(H.side-k.sideMedian)<=k.sideRange,N=k.zMedian-k.zRange*d,L=k.zMedian+k.zRange*f,B=H.z>=N&&H.z<=L;O&&B?I.push(H.raw):C.push(H.raw)}return{keep:I,removed:C,debug:{meanX:a,meanY:h,dirX:w,dirY:z,sideX:P,sideY:E,minT:T,maxT:V,binSize:S,stats:D}}}function eo(t){if(t.length===0)return 0;let e=Math.floor(t.length/2);return t.length%2===0?(t[e-1]+t[e])/2:t[e]}function Fa(t,e){let n=new Map;for(let o=0;o<t.length;o++){let r=t[o],s=Math.floor(r.x/e),i=Math.floor(r.y/e),l=Math.floor(r.z/e),u=`${s},${i},${l}`;n.has(u)||n.set(u,[]),n.get(u).push(o)}return n}function Na(t,e,n,o,r){let s=t[n],i=Math.floor(s.x/o),l=Math.floor(s.y/o),u=Math.floor(s.z/o),d=[];for(let f=-1;f<=1;f++)for(let c=-1;c<=1;c++)for(let a=-1;a<=1;a++){let h=`${i+f},${l+c},${u+a}`,g=e.get(h);if(g)for(let p of g){if(p===n)continue;let b=t[p],m=s.x-b.x,x=s.y-b.y,y=s.z-b.z;m*m+x*x+y*y<=r&&d.push(p)}}return d}function br(t,e={}){let{radius:n=.35,minClusterSize:o=20,lowPercent:r=.35}=e,s=qa(t,{radius:n}),i=t.map(f=>f.z).sort((f,c)=>f-c),l=i[Math.floor(i.length*r)],u=[],d=[];for(let f of s.clusters){let c=f.map(g=>s.points[g]),a=c.reduce((g,p)=>g+p.z,0)/c.length;c.length<o&&a<=l?d.push(...c.map(g=>g.raw)):u.push(...c.map(g=>g.raw))}return{keep:u,removed:d}}function qa(t,e={}){let{radius:n=.35}=e,o=t.map((u,d)=>({index:d,x:u.x,y:u.y,z:u.z,raw:u})),r=Fa(o,n),s=n*n,i=new Array(o.length).fill(!1),l=[];for(let u=0;u<o.length;u++){if(i[u])continue;let d=[],f=[u];for(i[u]=!0;f.length>0;){let c=f.shift();d.push(c);let a=Na(o,r,c,n,s);for(let h of a)i[h]||(i[h]=!0,f.push(h))}l.push(d)}return{points:o,clusters:l}}function $a(t,e,n=1e-6){let o=ja(e);for(let r of o)if(!Xa(t,r,n))return!1;return!0}function ja(t){let e=t.center,n=t.halfSize,o=t.rotation.elements,r=new Z.Vector3(o[0],o[1],o[2]).multiplyScalar(n.x),s=new Z.Vector3(o[3],o[4],o[5]).multiplyScalar(n.y),i=new Z.Vector3(o[6],o[7],o[8]).multiplyScalar(n.z),l=[];for(let u of[-1,1])for(let d of[-1,1])for(let f of[-1,1]){let c=e.clone().addScaledVector(r,u).addScaledVector(s,d).addScaledVector(i,f);l.push(c)}return l}function Xa(t,e,n=1e-6){let o=new Z.Vector3().subVectors(e,t.center),r=t.rotation.elements,s=t.halfSize,i=new Z.Vector3(r[0],r[1],r[2]),l=new Z.Vector3(r[3],r[4],r[5]),u=new Z.Vector3(r[6],r[7],r[8]),d=o.dot(i),f=o.dot(l),c=o.dot(u);return Math.abs(d)<=s.x+n&&Math.abs(f)<=s.y+n&&Math.abs(c)<=s.z+n}function Ga(t,e,n,o){return 1+(t[e][0]===0||t[n][0]===0||t[o][0]===0?1:0)}function Za(t,e,n,o,r,s){let i=Math.hypot(n-r,o-s),l=Math.hypot(t-r,e-s),u=Math.hypot(t-n,e-o),d=Math.abs((n-t)*(s-e)-(r-t)*(o-e))/2;return d===0?1/0:i*l*u/(4*d)}function Ya(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:r}=o;if(!r.length)return[];let s=new Map,i=(g,p)=>g<p?`${g}_${p}`:`${p}_${g}`;for(let g=0;g<r.length;g+=3){let p=r[g],b=r[g+1],m=r[g+2],[x,y]=n[p],[w,z]=n[b],[M,P]=n[m],E=Za(x,y,w,z,M,P),T=Ga(n,p,b,m);if(E<=1/T)for(let[V,_]of[[p,b],[b,m],[m,p]]){let v=i(V,_);s.set(v,(s.get(v)||0)+1)}}let l=[];for(let[g,p]of s)p===1&&l.push(g.split("_").map(Number));if(!l.length)return[];let u=new Map;for(let[g,p]of l)(u.get(g)||u.set(g,[]).get(g)).push(p),(u.get(p)||u.set(p,[]).get(p)).push(g);let d=l[0][0],f=[],c=new Set,a=d,h=-1;do{f.push(n[a]),c.add(a);let g=u.get(a)||[],p=g.find(b=>b!==h&&!c.has(b));if(p===void 0&&(p=g.find(b=>b!==h)),p===void 0)break;h=a,a=p}while(a!==d&&f.length<=l.length+1);return f.length>0&&f.push(f[0]),f}function $e(t,e){let n=t.x-e.x,o=t.y-e.y;return Math.sqrt(n*n+o*o)}function je(t){let e=0,n=0,o=0;for(let r=0;r<4;r++){let s=t[r],i=t[(r+1)%4],l=i.x-s.x,u=i.y-s.y,d=Math.sqrt(l*l+u*u);d>e&&(e=d,n=l/d,o=u/d)}return{longSide:e,dirX:n,dirY:o}}function Xe(t,e,n){let r=[];for(let s of t){let i=(s.start.x+s.end.x)/2,l=(s.start.y+s.end.y)/2,u=i-e,d=l-n;u*u+d*d<=9&&r.push(s.start.z,s.end.z)}if(r.length===0){let s=[];for(let i of t)s.push(i.start.z,i.end.z);return s.length?(s.sort((i,l)=>i-l),s[Math.floor(s.length/2)]):-1/0}return r.sort((s,i)=>s-i),r[Math.floor(r.length/2)]}function Ve(t,e,n,o,r,s){let i=r-n,l=s-o,u=i*i+l*l;if(u<1e-12)return{dist:Math.sqrt((t-n)**2+(e-o)**2),t:0};let d=t-n,f=e-o,c=(d*i+f*l)/u,a=n+c*i,h=o+c*l;return{dist:Math.sqrt((t-a)**2+(e-h)**2),t:c}}function Fo(t,e,n){let o=0;for(let r=0;r<4;r++){let s=n[r],i=n[(r+1)%4],l=(i.x-s.x)*(e-s.y)-(i.y-s.y)*(t-s.x);if(Math.abs(l)<1e-12)continue;let u=l>0?1:-1;if(o===0)o=u;else if(o!==u)return!1}return!0}function wr(t,e,n,o,r,s,i,l){let u=n-t,d=o-e,f=i-r,c=l-s,a=u*c-d*f;if(Math.abs(a)<1e-12)return null;let h=((r-t)*c-(s-e)*f)/a,g=((r-t)*d-(s-e)*u)/a;return h<-1e-12||h>1+1e-12||g<-1e-12||g>1+1e-12?null:Math.max(0,Math.min(1,h))}function zr(t,e,n,o,r){let s=[];Fo(t,e,r)&&s.push(0),Fo(n,o,r)&&s.push(1);for(let u=0;u<4;u++){let d=r[u],f=r[(u+1)%4],c=wr(t,e,n,o,d.x,d.y,f.x,f.y);c!==null&&s.push(c)}if(s.length<2)return 0;s.sort((u,d)=>u-d);let i=Math.sqrt((n-t)**2+(o-e)**2),l=0;for(let u=0;u<s.length-1;u++){let d=s[u],f=s[u+1],c=(d+f)/2,a=t+c*(n-t),h=e+c*(o-e);Fo(a,h,r)&&(l+=(f-d)*i)}return l}function Mr(t,e,n=1e-6){let o=[],r=t.start.x,s=t.start.y,i=t.end.x,l=t.end.y;for(let f of e){if(f===t)continue;let c=wr(r,s,i,l,f.start.x,f.start.y,f.end.x,f.end.y);c!==null&&c>n&&c<1-n&&o.push(c)}o.sort((f,c)=>f-c);let u=[],d=-1/0;for(let f of o)f-d>n&&(u.push(f),d=f);return u}function Er(t,e){if(!e.length)return[t];let n=[],o=0;for(let s of e){let i=t.start.x+s*(t.end.x-t.start.x),l=t.start.y+s*(t.end.y-t.start.y),u=t.start.z+s*(t.end.z-t.start.z),d=o===0?{...t.start}:{x:t.start.x+o*(t.end.x-t.start.x),y:t.start.y+o*(t.end.y-t.start.y),z:t.start.z+o*(t.end.z-t.start.z)},f={...t,start:d,end:{x:i,y:l,z:u},length:t.length*(s-o)};f.drawWindow=void 0,f.isWindow=!1,n.push(f),o=s}let r={...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 r.drawWindow=void 0,r.isWindow=!1,n.push(r),n}function Ua(t,e,n=.15){let o=0,r=0;for(let i of e)i!==t&&(($e(t.start,i.start)<=n||$e(t.start,i.end)<=n)&&o++,($e(t.end,i.start)<=n||$e(t.end,i.end)<=n)&&r++);let s=0;return o>=1&&r>=1?s=5:(o>=1||r>=1)&&(s=2),{left:o,right:r,score:s}}function Ka(t,e){let n=[],{start:o,end:r}=t;for(let l of e){let{dist:u}=Ve(l.x,l.y,o.x,o.y,r.x,r.y);n.push(u)}let s=n.reduce((l,u)=>l+u,0)/n.length,i=n.reduce((l,u)=>l+(u-s)**2,0)/n.length;return i<.01?3:i<.05?2:i<.1?1:0}function Qa(t,e,n=.15){let o=t.end.x-t.start.x,r=t.end.y-t.start.y,s=Math.sqrt(o*o+r*r);if(s<1e-12)return 0;let i=-r/s,l=o/s,u=[[],[]];for(let c=0;c<2;c++){let a=c===0?t.start:t.end;for(let h of e){if(h===t)continue;let g=$e(a,h.start),p=$e(a,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+r*x)/(s*y)>=.342)continue;let z=(b.x-a.x)*i+(b.y-a.y)*l;u[c].push(z>0?1:-1)}}if(u[0].length===0||u[1].length===0)return 0;let d=[...u[0],...u[1]];return d.every(c=>c===d[0])?2:1}function Pr(t,e,n){let o=Ua(t,n),r=Ka(t,e),s=Qa(t,n);return{score:o.score*3+r*2+s*2,details:{conn:o.score,variance:r,sameSide:s}}}function Ja(t){let e=t.end.x-t.start.x,n=t.end.y-t.start.y,o=Math.atan2(n,e)*(180/Math.PI);return o<0&&(o+=180),o}function tl(t,e){let n=[];for(let o of t){let r=!1;for(let s of n){let i=Math.abs(o.angle-s[0].angle);if(Math.min(i,180-i)<=e){s.push(o),r=!0;break}}r||n.push([o])}return n}function el(t,e=.05){let n=[];for(let o of t){let r=!1;for(let s of n)if(Math.abs(o.offset-s[0].offset)<=e){s.push(o),r=!0;break}r||n.push([o])}return n}function nl(t,e,n,o,r){let s=[];for(let d of t){let f=d.seg,c=(f.start.x-e.start.x)*n+(f.start.y-e.start.y)*o,a=(f.end.x-e.start.x)*n+(f.end.y-e.start.y)*o;c<=a?s.push({l:c,r:a,idx:d.idx,startPt:f.start,endPt:f.end}):s.push({l:a,r:c,idx:d.idx,startPt:f.end,endPt:f.start})}s.sort((d,f)=>d.l-f.l);let i=[],l=.2,u=.5;for(let{l:d,r:f,idx:c,startPt:a,endPt:h}of s){if(i.length===0){i.push({l:d,r:f,srcIdxs:[c],startPt:a,endPt:h});continue}let g=i[i.length-1];if(d<=g.r+r){let p=Math.min(g.r,f)-Math.max(g.l,d),b=Math.hypot(g.endPt.x-a.x,g.endPt.y-a.y);p>=u||b<=l?(d<g.l&&(g.l=d,g.startPt=a),f>g.r&&(g.r=f,g.endPt=h),g.srcIdxs.includes(c)||g.srcIdxs.push(c)):i.push({l:d,r:f,srcIdxs:[c],startPt:a,endPt:h})}else i.push({l:d,r:f,srcIdxs:[c],startPt:a,endPt:h})}return i}function ol(t,e,n,o,r,s,i){let l=Math.hypot(n.x-e.x,n.y-e.y),u={...t};return u.start={...e},u.end={...n},u.length=l,u.direction={x:o,y:r,z:0},s!==void 0&&(u.rooftopPz=s),u.buildRosource=i,u.isRebuild=!1,u.doorAndBeamData||(u.doorAndBeamData=[]),u.insetionArr||(u.insetionArr=[]),u}function sl(t,e){let n=!0;for(;n;){n=!1;for(let o=0;o<t.length;o++)for(let r=o+1;r<t.length;r++){let s=t[o],i=t[r];if(s.rooftopPz!==void 0&&i.rooftopPz!==void 0&&Math.abs(s.rooftopPz-i.rooftopPz)>.05)continue;let l=Math.abs(s.end.x-i.start.x)<.001&&Math.abs(s.end.y-i.start.y)<.001,u=Math.abs(s.start.x-i.end.x)<.001&&Math.abs(s.start.y-i.end.y)<.001,d=Math.abs(s.end.x-i.end.x)<.001&&Math.abs(s.end.y-i.end.y)<.001,f=Math.abs(s.start.x-i.start.x)<.001&&Math.abs(s.start.y-i.start.y)<.001;if(!(l||u||d||f)||s.direction.x*i.direction.x+s.direction.y*i.direction.y<.98)continue;let a=s.start,h=s.end;l?h=i.end:u?a=i.start:d?h=i.start:f&&(a=i.end);let g=Math.hypot(h.x-a.x,h.y-a.y),p={...s};p.start=a,p.end=h,p.length=g,p.direction={x:(h.x-a.x)/g,y:(h.y-a.y)/g,z:0},s.rooftopPz!==void 0&&i.rooftopPz!==void 0?p.rooftopPz=Math.max(s.rooftopPz,i.rooftopPz):p.rooftopPz=s.rooftopPz!==void 0?s.rooftopPz:i.rooftopPz,p.buildRosource=s.buildRosource||i.buildRosource,p.isRebuild=!1,p.doorAndBeamData||(p.doorAndBeamData=[]),p.insetionArr||(p.insetionArr=[]),t[o]=p,e[o]=[...new Set([...e[o],...e[r]])],t.splice(r,1),e.splice(r,1),r--,n=!0}}return{segments:t,sourceMap:e}}function Ge(t,e=5,n=.05){if(t.length<=1)return{segments:t,sourceMap:t.map((u,d)=>[d])};let o=t.map((u,d)=>({seg:u,angle:Ja(u),idx:d}));o.sort((u,d)=>u.angle-d.angle);let r=tl(o,e),s=[],i=[],l=[];for(let u of r){let d=u[0].seg;for(let m of u)m.seg.length>d.length&&(d=m.seg);let f=d.end.x-d.start.x,c=d.end.y-d.start.y,a=Math.sqrt(f*f+c*c);if(a<1e-12)continue;let h=-c/a,g=f/a,p=u.map(m=>{let x=m.seg.start.x-d.start.x,y=m.seg.start.y-d.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=el(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}));l.push({values:[...V],segments:S})}let _=[...new Set(m.map(S=>String(S.seg.buildRosource)))],v=nl(m,x,M,P,n);for(let{l:S,r:R,srcIdxs:D,startPt:W,endPt:I}of v){if(R-S<.01)continue;let C=ol(x,W,I,M,P,T,x.buildRosource);s.push(C),i.push(D)}}}return{...sl(s,i),debugRPZGroups:l}}function rl(t){return{minLengthRatio:.95,maxDistance:.5,angleThreshold:45,projectionMargin:.1,printOnly:!0,minEmbedRatioThreshold:.3,noWallSurroundDistance:.3,minEmbedRatio:.05,...t}}function il(t,e,n){return[{x:e,y:n,z:0},{x:t[0].x,y:t[0].y,z:0},{x:t[1].x,y:t[1].y,z:0},{x:t[2].x,y:t[2].y,z:0},{x:t[3].x,y:t[3].y,z:0}]}function al(t,e,n,o,r,s,i,l,u){if(!["1527725434500","1527725386500","1527726772000","1527725058500"].some(c=>t.includes(c)))return;e.map(c=>{let{start:a,end:h}=c,g=Ve(n,o,a.x,a.y,h.x,h.y),p=r.map(z=>{let M=Ve(z.x,z.y,a.x,a.y,h.x,h.y);return`t=${M.t.toFixed(3)},d=${M.dist.toFixed(3)}`}),b=h.x-a.x,m=h.y-a.y,x=Math.sqrt(b*b+m*m)||1,y=Math.abs(i*(b/x)+l*(m/x)),w=Math.acos(Math.min(y,1))*(180/Math.PI);return{seg:c,lineDist:g.dist,t:g.t,pts:p,angle:w,length:c.length}}).sort((c,a)=>c.lineDist-a.lineDist)}function ll(t,e,n,o,r,s,i){let l=[{margin:s.projectionMargin,maxDist:s.maxDistance,label:"\u4E25\u683C"},{margin:.4,maxDist:.65,label:"\u5BBD\u677E"}],u=[];for(let d of l){if(u.length>0)break;for(let f of t){let c=!1,a=!1,h=!1,g=e*s.minLengthRatio;if(f.length<g){continue}c=!0;let{start:p,end:b}=f,m=!1,x=1/0;for(let v of r){let{dist:S,t:R}=Ve(v.x,v.y,p.x,p.y,b.x,b.y);R>=-d.margin&&R<=1+d.margin&&S<=d.maxDist&&(m=!0,x=Math.min(x,S))}if(!m){`${d.maxDist}${(-d.margin).toFixed(1)}${(1+d.margin).toFixed(1)}`;continue}a=!0;let y=Ve(r[0].x,r[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>s.angleThreshold){`${E.toFixed(1)}${s.angleThreshold}`;continue}h=!0;let T=[r[1],r[2],r[3],r[4]],V=zr(p.x,p.y,b.x,b.y,T),_=e>0?V/e:0;u.push({seg:f,minDist:x,embedRatio:_,ratio:f.length/e,score:0,details:{conn:0,variance:0,sameSide:0}})}}return u}function cl(t,e,n,o){if(t.length<=1)return t.length===1&&(t[0].score=-1),t;for(let r of t){let{score:s,details:i}=Pr(r.seg,e,n);r.score=s,r.details=i}return t.sort((r,s)=>s.embedRatio-r.embedRatio||s.score-r.score||r.minDist-s.minDist),t}function ul(t,e,n,o){let r=t.end.x-t.start.x,s=t.end.y-t.start.y,i=Math.sqrt(r*r+s*s),l=r/i,u=s/i,d=e.map(P=>{let E=P.x-t.start.x,T=P.y-t.start.y;return(E*l+T*u)/i}),f=Math.min(...d),c=Math.max(...d),a=(c-f)*i,h=(f+c)/2,g=t.start.x+h*r,p=t.start.y+h*s,b=n.box.min.z,m=n.box.max.z,x=Math.abs(m-b),y=Xe(o,t.start.x,t.start.y),w=Math.max(0,b-y),z=f<=0&&c>=1,M=t.start.z+h*(t.end.z-t.start.z);return{p:{x:g,y:p,z:M},width:a,full:z,height:x,groundClearance:w}}function No(t,e,n){let o=e.map(f=>n[f]),r=[],s=[],i=[],l=[],u,d;for(let f of o){if(f.originalPoints?.length)for(let c of f.originalPoints)r.push(c);if(f.doorAndBeamData?.length)for(let c of f.doorAndBeamData)s.push(c);if(f.insetionArr?.length)for(let c of f.insetionArr)i.push(c);if(f.drawWindow?.length)for(let c of f.drawWindow)l.push(c);f.boxData&&!u&&(u=f.boxData),f.rooftopPz!==void 0&&(d===void 0||f.rooftopPz>d)&&(d=f.rooftopPz)}r.length&&(t.originalPoints=r),s.length&&(t.doorAndBeamData=s),i.length&&(t.insetionArr=i),l.length&&(t.drawWindow=l),u&&(t.boxData=u),d!==void 0&&(t.rooftopPz=d)}function Pn(t,e,n=10,o=.2,r=.2){let s=[];if(!t.drawWindow)return s;let i=t.drawWindow.p,l=t.wallSegment,u=l.end.x-l.start.x,d=l.end.y-l.start.y,f=Math.sqrt(u*u+d*d)||1,c=u/f,a=d/f,h=i.x-l.start.x,g=i.y-l.start.y,p=(h*c+g*a)/f;for(let b of e){if(b===l)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(c*w+a*z),E=Math.acos(Math.min(M,1))*(180/Math.PI);if(Math.abs(E-90)>n)continue;let T=[b.start,b.end];for(let V of T){let _=V.x-l.start.x,v=V.y-l.start.y,S=(_*c+v*a)/f,R=l.start.x+S*f*c,D=l.start.y+S*f*a;if(Math.sqrt((V.x-R)**2+(V.y-D)**2)>r)continue;let I=Math.abs((S-p)*f);if(I<=o){s.push({seg:b,distAlongWall:I,angle:E,endPoint:V});break}}}return s}function Sn(t,e){let n=t.start,o=t.end,r=o.x-n.x,s=o.y-n.y,i=Math.sqrt(r*r+s*s)||1,l=((e.x-n.x)*r+(e.y-n.y)*s)/(i*i),u=Math.max(0,Math.min(1,l)),d={x:n.x+u*r,y:n.y+u*s,z:n.z+(o.z-n.z)*u||0};function f(y){if(!y||!y.length)return[[],[]];let w=[],z=[];for(let M of y){let P=((M.x-n.x)*r+(M.y-n.y)*s)/(i*i);P<=u+1e-8&&w.push(M),P>=u-1e-8&&z.push(M)}return(w.length===0||c(w[w.length-1],d)>1e-6)&&w.push({...d}),(z.length===0||c(z[0],d)>1e-6)&&z.unshift({...d}),[w,z]}function c(y,w){return Math.sqrt((y.x-w.x)**2+(y.y-w.y)**2)}let[a,h]=f(t.originalPoints),g=Math.max(u*i,1e-6),p=Math.max((1-u)*i,1e-6),b=t.direction||{x:r/i,y:s/i,z:(o.z-n.z)/i||0},m={...t,start:{...n},end:{...d},length:g,direction:{...b},originalPoints:a.length?a:void 0},x={...t,start:{...d},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)*r+(z.p.y-n.y)*s)/(i*i);M<=u+1e-8&&y.push(z),M>=u-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 _ of w)_.x<z&&(z=_.x),_.y<M&&(M=_.y),_.z!==void 0&&_.z<P&&(P=_.z),_.x>E&&(E=_.x),_.y>T&&(T=_.y),_.z!==void 0&&_.z>V&&(V=_.z);return{isBox3:!0,min:{x:z,y:M,z:P},max:{x:E,y:T,z:V}}};m.boxData=y(a),x.boxData=y(h)}return[m,x]}function Tn(t,e,n,o){let r=rl(n),s=[],{segments:i,sourceMap:l}=o??Ge(e),u=i;for(let d of t){let f=d.coordinatesByArea?.coordinates;if(!f||f.length<4)continue;let c=f.slice(0,4),a=c.reduce((V,_)=>V+_.x,0)/4,h=c.reduce((V,_)=>V+_.y,0)/4,{longSide:g,dirX:p,dirY:b}=je(c);if(g<.01)continue;let m=c.reduce((V,_)=>V+_.z,0)/4,x=Xe(e,a,h);if(m<x-.3)continue;let y=il(c,a,h);al(d.name,u,a,h,y,g,p,b,r);let w=ll(u,g,p,b,y,r,d.name);if(w.length>1&&r.minEmbedRatioThreshold>0){let V=Math.max(...w.map(_=>_.embedRatio));if(V>0){let _=w.length;w=w.filter(v=>v.embedRatio>=V*r.minEmbedRatioThreshold)}}if(w.length>0&&r.minEmbedRatio>0){let V=w.length;w=w.filter(_=>_.embedRatio>=r.minEmbedRatio)}w=cl(w,y,e,d.name);let z=null,M=1/0,P=0,E=0;if(w.length>0){let V=w[0];z=V.seg,M=V.minDist,P=V.ratio,E=V.embedRatio}if(z&&E<=0&&r.noWallSurroundDistance>0){let V=r.noWallSurroundDistance,_=c.map(C=>C.x),v=c.map(C=>C.y),S=Math.min(..._)-V,R=Math.max(..._)+V,D=Math.min(...v)-V,W=Math.max(...v)+V,I=!1;for(let C of u){let H=Math.min(C.start.x,C.end.x),A=Math.max(C.start.x,C.end.x),k=Math.min(C.start.y,C.end.y),O=Math.max(C.start.y,C.end.y);if(!(A<S||H>R)&&!(O<D||k>W)){I=!0;break}}I||(z=null)}let T;if(z&&(T=ul(z,c,d,i),!r.printOnly)){let V=z;V.drawWindow||(V.drawWindow=[]),V.drawWindow.push(T),V.isWindow=!0}if(z){let V={windowName:d.name,windowCategory:d.category,windowCenter:d.center,wallSegment:z,distance:M,wallLengthRatio:P,drawWindow:T};s.push(V)}}for(let d of s){let f=d.wallSegment,c=i.indexOf(f);if(c===-1)continue;let a=l[c];!a||a.length<=1||No(f,a,e)}return s}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 r=Array.isArray(e)?e.filter(b=>b&&b.category==="window"&&!b.isBayWindowObj):[],s,i;if(o.skipMerge)s=t,i=t.map((b,m)=>[m]);else{let b=Ge(t);s=b.segments,i=b.sourceMap}let l=Tn(r,t,o,{segments:s,sourceMap:i}),u=new Set;for(let b of l){let m=s.indexOf(b.wallSegment);m>=0&&u.add(m)}let d=[],f=new Set;for(let b of u){let m=i[b];if(m){No(s[b],m,t);for(let x of m)f.add(x)}d.push(s[b])}for(let b=0;b<t.length;b++)f.has(b)||d.push(t[b]);let c=new Set(l.map(b=>b.windowName));for(let b of e)b&&b.category==="window"&&!b.isBayWindowObj&&(c.has(b.name)?delete b.AbnormalWindow:b.AbnormalWindow=!0);let a=new Map;for(let b of e)b&&b.name&&a.set(b.name,b);let h=new Map;for(let b of l){let m=b.wallSegment;h.has(m)||h.set(m,[]),h.get(m).push(b)}let g=new Map,p=d;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),W=R/x;z.push({left:D-W,right:D+W,match:S})}if(z.length===0)continue;let M=Mr(b,p),P=1e-6,E=new Set,T=!1;for(let S of z){let R=!1,D=!1,W=null;for(let C of M)C<S.left-P&&((W===null||C>W)&&(W=C),R=!0);let I=null;for(let C of M)C>S.right+P&&((I===null||C<I)&&(I=C),D=!0);W!==null&&(E.add(W),T=!0),I!==null&&(E.add(I),T=!0)}if(!T)continue;let V=!1,_=null,v=null;for(let S of z){let R=S.match;if(!R.drawWindow||R.drawWindow.width<=1)continue;let D=a.get(R.windowName);if(!D||!D.positionArr||!D.positionArr.length)continue;let W=Pn(R,s);if(W.length<=1)continue;let I=D.positionArr[0],C=R.drawWindow.p,H=I.x-C.x,A=I.y-C.y,k=Math.sqrt(H*H+A*A);if(k<.001)continue;let O=H/k,N=A/k,L=W.filter(B=>{let $=(B.seg.start.x+B.seg.end.x)/2,G=(B.seg.start.y+B.seg.end.y)/2,Q=$-C.x,q=G-C.y;return Q*O+q*N>0});if(L.length){V=!0,_=L[0].endPoint,v=R;break}}if(V&&_&&v){let[S,R]=Sn(b,_);g.set(b,[S,R]);let D=((v.drawWindow.p.x-b.start.x)*y+(v.drawWindow.p.y-b.start.y)*w)/(x*x),W=((_.x-b.start.x)*y+(_.y-b.start.y)*w)/(x*x);D<=W?v.wallSegment=S:v.wallSegment=R}else{let S=Array.from(E).sort((D,W)=>D-W),R=Er(b,S);for(let D of z){let W=(D.left+D.right)/2,I=0;for(let C of R){let H=C.length/x;if(W>=I-P&&W<=I+H+P){let A=D.match.drawWindow;A&&(C.drawWindow||(C.drawWindow=[]),C.drawWindow.push(A),C.isWindow=!0),D.match.wallSegment=C;break}I+=H}}g.set(b,R)}}if(g.size>0){let b=[];for(let m of d)g.has(m)?b.push(...g.get(m)):b.push(m);for(let m of b)m.isWindow===void 0&&(m.isWindow=!!(m.drawWindow&&m.drawWindow.length>0));return{segments:b,matches:l}}for(let b of d)b.isWindow=!!(b.drawWindow&&b.drawWindow.length>0);return{segments:d,matches:l}}function Ze(t,e){let n=t.x-e.x,o=t.y-e.y;return Math.sqrt(n*n+o*o)}function no(t){let e=0,n=1/0,o=0,r=0;for(let s=0;s<4;s++){let i=t[s],l=t[(s+1)%4],u=l.x-i.x,d=l.y-i.y,f=Math.sqrt(u*u+d*d);f>e&&(e=f,o=u/f,r=d/f),f<n&&(n=f)}return{longSide:e,shortSide:n===1/0?e:n,dirX:o,dirY:r}}function Ye(t,e,n){let r=[];for(let s of t){let i=(s.start.x+s.end.x)/2,l=(s.start.y+s.end.y)/2,u=i-e,d=l-n;u*u+d*d<=9&&r.push(s.start.z,s.end.z)}if(r.length===0){let s=[];for(let i of t)s.push(i.start.z,i.end.z);return s.length?(s.sort((i,l)=>i-l),s[Math.floor(s.length/2)]):-1/0}return r.sort((s,i)=>s-i),r[Math.floor(r.length/2)]}function $t(t,e,n,o,r,s){let i=r-n,l=s-o,u=i*i+l*l;if(u<1e-12)return{dist:Math.sqrt((t-n)**2+(e-o)**2),t:0};let d=t-n,f=e-o,c=(d*i+f*l)/u,a=n+c*i,h=o+c*l;return{dist:Math.sqrt((t-a)**2+(e-h)**2),t:c}}function $o(t,e,n){let o=0;for(let r=0;r<4;r++){let s=n[r],i=n[(r+1)%4],l=(i.x-s.x)*(e-s.y)-(i.y-s.y)*(t-s.x);if(Math.abs(l)<1e-12)continue;let u=l>0?1:-1;if(o===0)o=u;else if(o!==u)return!1}return!0}function fl(t,e,n,o,r,s,i,l){let u=n-t,d=o-e,f=i-r,c=l-s,a=u*c-d*f;if(Math.abs(a)<1e-12)return null;let h=((r-t)*c-(s-e)*f)/a,g=((r-t)*d-(s-e)*u)/a;return h<-1e-12||h>1+1e-12||g<-1e-12||g>1+1e-12?null:Math.max(0,Math.min(1,h))}function Tr(t,e,n,o,r){let s=[];$o(t,e,r)&&s.push(0),$o(n,o,r)&&s.push(1);for(let u=0;u<4;u++){let d=r[u],f=r[(u+1)%4],c=fl(t,e,n,o,d.x,d.y,f.x,f.y);c!==null&&s.push(c)}if(s.length<2)return 0;s.sort((u,d)=>u-d);let i=Math.sqrt((n-t)**2+(o-e)**2),l=0;for(let u=0;u<s.length-1;u++){let d=s[u],f=s[u+1],c=(d+f)/2,a=t+c*(n-t),h=e+c*(o-e);$o(a,h,r)&&(l+=(f-d)*i)}return l}function Rr(t){if(!t||t.length<4)return[];let e=[...t].sort((i,l)=>i.z-l.z),n=e.slice(0,2),o=e.slice(2,4),r=[],s=new Set;for(let i of n){let l=-1,u=1/0;for(let d=0;d<o.length;d++){if(s.has(d))continue;let f=o[d].x-i.x,c=o[d].y-i.y,a=Math.sqrt(f*f+c*c);a<u&&(u=a,l=d)}if(l>=0){s.add(l);let d=o[l];r.push({bottom:i,top:d,midX:(i.x+d.x)/2,midY:(i.y+d.y)/2,height:Math.abs(d.z-i.z)})}}return r}function Sr(t,e,n){return $t(t.midX,t.midY,e.x,e.y,n.x,n.y)}function Dr(t,e,n,o=.08){if(!t||t.length<2)return null;let r=Sr(t[0],e,n),s=Sr(t[1],e,n);if(r.dist<=o&&s.dist<=o){let i=r.dist<=s.dist?0:1,l=1-i;return{hingeEdge:t[i],otherEdge:t[l],hingeDist:i===0?r.dist:s.dist,otherDist:l===0?r.dist:s.dist,isClosed:!0,hingeT:i===0?r.t:s.t}}if(r.dist<=o||s.dist<=o){let i=r.dist<=o?0:1,l=1-i;return{hingeEdge:t[i],otherEdge:t[l],hingeDist:i===0?r.dist:s.dist,otherDist:l===0?r.dist:s.dist,isClosed:!1,hingeT:i===0?r.t:s.t}}return null}function vr(t){if(!t||t.length<2)return 0;let e=t[0].midX-t[1].midX,n=t[0].midY-t[1].midY;return Math.sqrt(e*e+n*n)}function jo(t){if(!t||!t.start||!t.end)return null;let e=t.start,n=t.end,o=n.x-e.x,r=n.y-e.y,s=Math.sqrt(o*o+r*r)||1,i=0,l=0;return t.centerDir?(i=t.centerDir.x,l=t.centerDir.y):(i=-r/s,l=o/s),{p1:e,p2:n,dirX:o/s,dirY:r/s,length:s,midX:(e.x+n.x)/2,midY:(e.y+n.y)/2,normalX:i,normalY:l}}function Vr(t,e,n,o=.08){let r=jo(t);if(!r)return null;let s=$t(r.p1.x,r.p1.y,e.x,e.y,n.x,n.y),i=$t(r.p2.x,r.p2.y,e.x,e.y,n.x,n.y);if(s.dist<=o&&i.dist<=o){let l=s.dist<=i.dist;return{hingePoint:l?r.p1:r.p2,otherPoint:l?r.p2:r.p1,hingeDist:l?s.dist:i.dist,otherDist:l?i.dist:s.dist,isClosed:!0,hingeT:l?s.t:i.t}}if(s.dist<=o||i.dist<=o){let l=s.dist<=o;return{hingePoint:l?r.p1:r.p2,otherPoint:l?r.p2:r.p1,hingeDist:l?s.dist:i.dist,otherDist:l?i.dist:s.dist,isClosed:!1,hingeT:l?s.t:i.t}}return null}function oo(t,e=.1){let n=t.originalPoints;if(!n||n.length===0)return{densityProfile:[],binStartT:[],binEndT:[],avgDensity:0,maxDensity:0,minDensity:0,binSize:e};let o=t.end.x-t.start.x,r=t.end.y-t.start.y,s=t.length;if(s<=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*r)/(s*s);i.push(Math.max(0,Math.min(1,y)))}let l=Math.max(1,Math.ceil(s/e)),u=s/l,d=new Array(l).fill(0);for(let b of i){let m=Math.min(l-1,Math.floor(b*l));d[m]++}let f=d.map(b=>b/u),c=d.map((b,m)=>m/l),a=d.map((b,m)=>(m+1)/l),h=f.reduce((b,m)=>b+m,0)/l,g=Math.max(...f),p=Math.min(...f);return{densityProfile:f,binStartT:c,binEndT:a,avgDensity:h,maxDensity:g,minDensity:p,binSize:u}}function Ir(t){let{densityProfile:e,avgDensity:n}=t;if(e.length===0||n===0)return 0;let o=e.length,r=e.reduce((i,l)=>i+(l-n)**2,0)/o;return Math.sqrt(r)/n}function Cr(t){let e=[];for(let o of t)if(o.originalPoints&&o.originalPoints.length>=50&&o.length>=.5){let r=oo(o,.1);r.avgDensity>0&&e.push(r.avgDensity)}e.sort((o,r)=>o-r);let n=e.length>0?e[Math.floor(e.length/2)]:1;return{sortedDensities:e,medianDensity:n}}function Xo(t,e){let{sortedDensities:n}=e;if(n.length===0)return .5;if(t<=0)return 1;let o=0;for(let r of n)r<t&&o++;return 1-o/n.length}function Wr(t,e,n=.5,o=.5,r=3){let{densityProfile:s,avgDensity:i}=t;if(s.length===0||i===0)return[];let l=i*n,u=s.length,d=[],f=!1,c=0,a=0,h=0;for(let g=0;g<u;g++){let p=s[g]<l;if(p&&!f)f=!0,c=g,a=s[g],h=1;else if(p&&f)a+=s[g],h++;else if(!p&&f){f=!1;let b=g-1,m=c/u,x=(b+1)/u,y=(x-m)*e;y>=o&&y<=r&&d.push({startT:m,endT:x,startLen:m*e,endLen:x*e,avgDensity:a/h}),a=0,h=0}}if(f){let g=u-1,p=c/u,b=(g+1)/u,m=(b-p)*e;m>=o&&m<=r&&d.push({startT:p,endT:b,startLen:p*e,endLen:b*e,avgDensity:a/h})}return d}function dl(t,e,n){let o=t.originalPoints;if(!o||o.length<5)return{verticalGapRatio:1,isDoorSized:!0};let r=t.end.x-t.start.x,s=t.end.y-t.start.y,i=t.length*t.length;if(i<=0)return{verticalGapRatio:0,isDoorSized:!1};let l=[];for(let m of o){let x=m.x-t.start.x,y=m.y-t.start.y,w=(x*r+y*s)/i;w>=e&&w<=n&&m.z!==void 0&&isFinite(m.z)&&l.push(m.z)}if(l.length<5)return{verticalGapRatio:1,isDoorSized:!0};let u=1/0,d=-1/0;for(let m of o)m.z!==void 0&&isFinite(m.z)&&(m.z<u&&(u=m.z),m.z>d&&(d=m.z));let f=d-u;if(f<.5)return{verticalGapRatio:0,isDoorSized:!1};let c=15,a=new Array(c).fill(!1);for(let m of l){let x=Math.min(c-1,Math.max(0,Math.floor((m-u)/f*c)));a[x]=!0}let h=0,g=0;for(let m=0;m<c;m++)a[m]?(h=Math.max(h,g),g=0):g++;h=Math.max(h,g);let p=h/c,b=p>=.35;return{verticalGapRatio:p,isDoorSized:b}}function _r(t,e,n,o=.5,r=.5,s=3,i=.35){let l=Wr(e,n,o,r,s),u=[];for(let d of l){let{verticalGapRatio:f,isDoorSized:c}=dl(t,d.startT,d.endT);u.push({...d,verticalGapRatio:f,isRectangular:c})}return u}function Hr(t,e,n){if(!t||!t.start||!t.end)return null;let o=t.start,r=t.end,s=$t(o.x,o.y,e.x,e.y,n.x,n.y),i=$t(r.x,r.y,e.x,e.y,n.x,n.y),l=s.dist<=i.dist,u=l?o:r,d=l?s.dist:i.dist,f=$t(u.x,u.y,e.x,e.y,n.x,n.y);return{hingeT:Math.max(0,Math.min(1,f.t)),hingeDist:d}}function Ar(t,e,n,o=2e3){let{hingeT:r}=t,s=.25,i=0,l=null,u=0;for(let d of e){let f=(d.startT+d.endT)/2,c=Math.abs(f-r),a=Math.max(0,1-c/s),h=d.isRectangular?1:.3,g=Math.max(0,1-d.avgDensity/o),p=a*.5+h*.3+g*.2;p>i&&(i=p,l=d,u=a)}return{score:i>.5?i:-1,bestRegion:l,bestOverlap:u,bestOpeningStartT:l?.startT??0,bestOpeningEndT:l?.endT??0}}function hl(t,e,n=.15){let o=0,r=0;for(let i of e)i!==t&&((Ze(t.start,i.start)<=n||Ze(t.start,i.end)<=n)&&o++,(Ze(t.end,i.start)<=n||Ze(t.end,i.end)<=n)&&r++);let s=0;return o>=1&&r>=1?s=5:(o>=1||r>=1)&&(s=2),{left:o,right:r,score:s}}function ml(t,e){let n=[],{start:o,end:r}=t;for(let l of e){let{dist:u}=$t(l.x,l.y,o.x,o.y,r.x,r.y);n.push(u)}let s=n.reduce((l,u)=>l+u,0)/n.length,i=n.reduce((l,u)=>l+(u-s)**2,0)/n.length;return i<.01?3:i<.05?2:i<.1?1:0}function gl(t,e,n=.15){let o=t.end.x-t.start.x,r=t.end.y-t.start.y,s=Math.sqrt(o*o+r*r);if(s<1e-12)return 0;let i=-r/s,l=o/s,u=[[],[]];for(let c=0;c<2;c++){let a=c===0?t.start:t.end;for(let h of e){if(h===t)continue;let g=Ze(a,h.start),p=Ze(a,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+r*x)/(s*y)>=.342)continue;let z=(b.x-a.x)*i+(b.y-a.y)*l;u[c].push(z>0?1:-1)}}if(u[0].length===0||u[1].length===0)return 0;let d=[...u[0],...u[1]];return d.every(c=>c===d[0])?2:1}function Lr(t,e,n){let o=hl(t,n),r=ml(t,e),s=gl(t,n);return{score:o.score*3+r*2+s*2,details:{conn:o.score,variance:r,sameSide:s}}}function pl(t){let e=t.end.x-t.start.x,n=t.end.y-t.start.y,o=Math.atan2(n,e)*(180/Math.PI);return o<0&&(o+=180),o}function xl(t,e){let n=[];for(let o of t){let r=!1;for(let s of n){let i=Math.abs(o.angle-s[0].angle);if(Math.min(i,180-i)<=e){s.push(o),r=!0;break}}r||n.push([o])}return n}function yl(t,e=.05){let n=[];for(let o of t){let r=!1;for(let s of n)if(Math.abs(o.offset-s[0].offset)<=e){s.push(o),r=!0;break}r||n.push([o])}return n}function bl(t,e,n,o,r){let s=[];for(let d of t){let f=d.seg,c=(f.start.x-e.start.x)*n+(f.start.y-e.start.y)*o,a=(f.end.x-e.start.x)*n+(f.end.y-e.start.y)*o;c<=a?s.push({l:c,r:a,idx:d.idx,startPt:f.start,endPt:f.end}):s.push({l:a,r:c,idx:d.idx,startPt:f.end,endPt:f.start})}s.sort((d,f)=>d.l-f.l);let i=[],l=.01,u=.5;for(let{l:d,r:f,idx:c,startPt:a,endPt:h}of s){if(i.length===0){i.push({l:d,r:f,srcIdxs:[c],startPt:a,endPt:h});continue}let g=i[i.length-1];if(d<=g.r+r){let p=Math.min(g.r,f)-Math.max(g.l,d),b=Math.hypot(g.endPt.x-a.x,g.endPt.y-a.y);p>=u||b<=l?(d<g.l&&(g.l=d,g.startPt=a),f>g.r&&(g.r=f,g.endPt=h),g.srcIdxs.includes(c)||g.srcIdxs.push(c)):i.push({l:d,r:f,srcIdxs:[c],startPt:a,endPt:h})}else i.push({l:d,r:f,srcIdxs:[c],startPt:a,endPt:h})}return i}function wl(t,e,n,o,r,s,i){let l=Math.hypot(n.x-e.x,n.y-e.y),u={...t};return u.start={...e},u.end={...n},u.length=l,u.direction={x:o,y:r,z:0},s!==void 0&&(u.rooftopPz=s),u.buildRosource=i,u.isRebuild=!1,u.doorAndBeamData||(u.doorAndBeamData=[]),u.insetionArr||(u.insetionArr=[]),u}function zl(t,e){let n=!0;for(;n;){n=!1;for(let o=0;o<t.length;o++)for(let r=o+1;r<t.length;r++){let s=t[o],i=t[r];if(s.rooftopPz!==void 0&&i.rooftopPz!==void 0&&Math.abs(s.rooftopPz-i.rooftopPz)>.05)continue;let l=Math.abs(s.end.x-i.start.x)<.001&&Math.abs(s.end.y-i.start.y)<.001,u=Math.abs(s.start.x-i.end.x)<.001&&Math.abs(s.start.y-i.end.y)<.001,d=Math.abs(s.end.x-i.end.x)<.001&&Math.abs(s.end.y-i.end.y)<.001,f=Math.abs(s.start.x-i.start.x)<.001&&Math.abs(s.start.y-i.start.y)<.001;if(!(l||u||d||f)||s.direction.x*i.direction.x+s.direction.y*i.direction.y<.98)continue;let a=s.start,h=s.end;l?h=i.end:u?a=i.start:d?h=i.start:f&&(a=i.end);let g=Math.hypot(h.x-a.x,h.y-a.y),p={...s};p.start=a,p.end=h,p.length=g,p.direction={x:(h.x-a.x)/g,y:(h.y-a.y)/g,z:0},s.rooftopPz!==void 0&&i.rooftopPz!==void 0?p.rooftopPz=Math.max(s.rooftopPz,i.rooftopPz):p.rooftopPz=s.rooftopPz!==void 0?s.rooftopPz:i.rooftopPz,p.buildRosource=s.buildRosource||i.buildRosource,p.isRebuild=!1,p.doorAndBeamData||(p.doorAndBeamData=[]),p.insetionArr||(p.insetionArr=[]),t[o]=p,e[o]=[...new Set([...e[o],...e[r]])],t.splice(r,1),e.splice(r,1),r--,n=!0}}return{segments:t,sourceMap:e}}function Ue(t,e=5,n=.05){if(t.length<=1)return{segments:t,sourceMap:t.map((u,d)=>[d])};let o=t.map((u,d)=>({seg:u,angle:pl(u),idx:d}));o.sort((u,d)=>u.angle-d.angle);let r=xl(o,e),s=[],i=[],l=[];for(let u of r){let d=u[0].seg;for(let m of u)m.seg.length>d.length&&(d=m.seg);let f=d.end.x-d.start.x,c=d.end.y-d.start.y,a=Math.sqrt(f*f+c*c);if(a<1e-12)continue;let h=-c/a,g=f/a,p=u.map(m=>{let x=m.seg.start.x-d.start.x,y=m.seg.start.y-d.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=yl(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}));l.push({values:[...V],segments:S})}let _=[...new Set(m.map(S=>String(S.seg.buildRosource)))],v=bl(m,x,M,P,n);for(let{l:S,r:R,srcIdxs:D,startPt:W,endPt:I}of v){if(R-S<.01)continue;let C=wl(x,W,I,M,P,T,x.buildRosource);s.push(C),i.push(D)}}}return{...zl(s,i),debugRPZGroups:l}}function Ml(t){return{minLengthRatio:0,maxDistance:.5,angleThreshold:45,projectionMargin:.1,printOnly:!0,minEmbedRatioThreshold:.3,noWallSurroundDistance:.3,minEmbedRatio:.05,...t}}function El(t,e,n){return[{x:e,y:n,z:0},{x:t[0].x,y:t[0].y,z:0},{x:t[1].x,y:t[1].y,z:0},{x:t[2].x,y:t[2].y,z:0},{x:t[3].x,y:t[3].y,z:0}]}function Pl(t,e,n,o,r,s,i,l,u){if(!__DEBUG__||!["_008","_002","_014","_015","_020"].some(c=>t.includes(c)))return;e.map(c=>{let{start:a,end:h}=c,g=$t(n,o,a.x,a.y,h.x,h.y),p=r.map(z=>{let M=$t(z.x,z.y,a.x,a.y,h.x,h.y);return`t=${M.t.toFixed(3)},d=${M.dist.toFixed(3)}`}),b=h.x-a.x,m=h.y-a.y,x=Math.sqrt(b*b+m*m)||1,y=Math.abs(i*(b/x)+l*(m/x)),w=Math.acos(Math.min(y,1))*(180/Math.PI);return{seg:c,lineDist:g.dist,t:g.t,pts:p,angle:w,length:c.length}}).sort((c,a)=>c.lineDist-a.lineDist)}function Sl(t,e,n,o,r,s,i,l,u){let d=[{margin:s.projectionMargin,maxDist:s.maxDistance,label:"\u4E25\u683C"},{margin:.4,maxDist:.65,label:"\u5BBD\u677E"}],f=[],c=vr(l)||e;for(let a of d){if(f.length>0)break;for(let h of t){let{start:g,end:p}=h,b=!1,m=1/0;for(let E of r){let{dist:T,t:V}=$t(E.x,E.y,g.x,g.y,p.x,p.y);V>=-a.margin&&V<=1+a.margin&&T<=a.maxDist&&(b=!0,T<m&&(m=T))}if(!b)continue;let x=null;if(u&&(x=Vr(u,g,p,.3)),!x||!x.hingePoint){let E=Dr(l,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&&$t(r[0].x,r[0].y,g.x,g.y,p.x,p.y).dist>.3&&(x=null);let y=!1;if(!x||!x.hingePoint){let E=$t(r[0].x,r[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<-a.margin||x.hingeT>1+a.margin)){let E=$t(r[0].x,r[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=[r[1],r[2],r[3],r[4]],M=Tr(g.x,g.y,p.x,p.y,z),P=c>0?M/c:0;f.push({seg:h,minDist:m,embedRatio:P,ratio:h.length/c,score:0,details:{conn:0,variance:0,sameSide:0},hingeInfo:x,hingeScore:w})}}return f}function Tl(t,e,n,o){if(t.length<=1)return t.length===1&&(t[0].score=-1),t;for(let r of t){let{score:s,details:i}=Lr(r.seg,e,n);r.score=s,r.details=i}if(__DEBUG__&&o.includes("1527726772000"))for(let r of t){let s=r.seg,i=r.hingeInfo,l=r.hingeScore||0}return t.sort((r,s)=>{let i=r.hingeScore||0;return(s.hingeScore||0)-i||s.embedRatio-r.embedRatio||s.score-r.score||r.minDist-s.minDist}),t}function Rl(t,e,n,o){let r=t.end.x-t.start.x,s=t.end.y-t.start.y,i=Math.sqrt(r*r+s*s),l=r/i,u=s/i,d=e.map(P=>{let E=P.x-t.start.x,T=P.y-t.start.y;return(E*l+T*u)/i}),f=Math.min(...d),c=Math.max(...d),a=(c-f)*i,h=(f+c)/2,g=t.start.x+h*r,p=t.start.y+h*s,b=n.box.min.z,m=n.box.max.z,x=Math.abs(m-b),y=Ye(o,t.start.x,t.start.y),w=Math.max(0,b-y),z=f<=0&&c>=1,M=t.start.z+h*(t.end.z-t.start.z);return{p:{x:g,y:p,z:M},width:a,full:z,height:x,groundClearance:w,wallTMin:Math.max(0,Math.min(1,f)),wallTMax:Math.max(0,Math.min(1,c))}}function Go(t,e,n){let o=e.map(f=>n[f]),r=[],s=[],i=[],l=[],u,d;for(let f of o){if(f.originalPoints?.length)for(let c of f.originalPoints)r.push(c);if(f.doorAndBeamData?.length)for(let c of f.doorAndBeamData)s.push(c);if(f.insetionArr?.length)for(let c of f.insetionArr)i.push(c);if(f.DrawDoor?.length)for(let c of f.DrawDoor)l.push(c);f.boxData&&!u&&(u=f.boxData),f.rooftopPz!==void 0&&(d===void 0||f.rooftopPz>d)&&(d=f.rooftopPz)}r.length&&(t.originalPoints=r),s.length&&(t.doorAndBeamData=s),i.length&&(t.insetionArr=i),l.length&&(t.DrawDoor=l),u&&(t.boxData=u),d!==void 0&&(t.rooftopPz=d)}function un(t,e,n=10,o=.2,r=.2){let s=[];if(!t.DrawDoor)return s;let i=t.DrawDoor.p,l=t.wallSegment,u=l.end.x-l.start.x,d=l.end.y-l.start.y,f=Math.sqrt(u*u+d*d)||1,c=u/f,a=d/f,h=i.x-l.start.x,g=i.y-l.start.y,p=(h*c+g*a)/f;for(let b of e){if(b===l)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(c*w+a*z),E=Math.acos(Math.min(M,1))*(180/Math.PI);if(Math.abs(E-90)>n)continue;let T=[b.start,b.end];for(let V of T){let _=V.x-l.start.x,v=V.y-l.start.y,S=(_*c+v*a)/f,R=l.start.x+S*f*c,D=l.start.y+S*f*a;if(Math.sqrt((V.x-R)**2+(V.y-D)**2)>r)continue;let I=Math.abs((S-p)*f);if(I<=o){s.push({seg:b,distAlongWall:I,angle:E,endPoint:V});break}}}return s}function Rn(t,e){let n=t.start,o=t.end,r=o.x-n.x,s=o.y-n.y,i=Math.sqrt(r*r+s*s)||1,l=((e.x-n.x)*r+(e.y-n.y)*s)/(i*i),u=Math.max(0,Math.min(1,l)),d={x:n.x+u*r,y:n.y+u*s,z:n.z+(o.z-n.z)*u||0};function f(y){if(!y||!y.length)return[[],[]];let w=[],z=[];for(let M of y){let P=((M.x-n.x)*r+(M.y-n.y)*s)/(i*i);P<=u+1e-8&&w.push(M),P>=u-1e-8&&z.push(M)}return(w.length===0||c(w[w.length-1],d)>1e-6)&&w.push({...d}),(z.length===0||c(z[0],d)>1e-6)&&z.unshift({...d}),[w,z]}function c(y,w){return Math.sqrt((y.x-w.x)**2+(y.y-w.y)**2)}let[a,h]=f(t.originalPoints),g=Math.max(u*i,1e-6),p=Math.max((1-u)*i,1e-6),b=t.direction||{x:r/i,y:s/i,z:(o.z-n.z)/i||0},m={...t,start:{...n},end:{...d},length:g,direction:{...b},originalPoints:a.length?a:void 0},x={...t,start:{...d},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)*r+(z.p.y-n.y)*s)/(i*i);M<=u+1e-8&&y.push(z),M>=u-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 _ of w)_.x<z&&(z=_.x),_.y<M&&(M=_.y),_.z!==void 0&&_.z<P&&(P=_.z),_.x>E&&(E=_.x),_.y>T&&(T=_.y),_.z!==void 0&&_.z>V&&(V=_.z);return{isBox3:!0,min:{x:z,y:M,z:P},max:{x:E,y:T,z:V}}};m.boxData=y(a),x.boxData=y(h)}return[m,x]}function Dn(t,e,n,o){let r=Ml(n),s=[],{segments:i,sourceMap:l}=o??Ue(e),u=i,d=Cr(u);for(let f of t){let c=f.coordinatesByArea?.coordinates;if(!c||c.length<4)continue;let a=c.slice(0,4),h=jo(f.nline),g=no(a),p,b,m,x,y;if(h?(p=h.midX,b=h.midY,m=h.length,x=h.dirX,y=h.dirY):(p=a.reduce((L,B)=>L+B.x,0)/4,b=a.reduce((L,B)=>L+B.y,0)/4,m=g.longSide,x=g.dirX,y=g.dirY),m<.01)continue;let w=a.reduce((L,B)=>L+B.z,0)/4,z=Ye(e,p,b);if(w<z-.3)continue;let M=Rr(a),P=[...a].sort((L,B)=>L.z-B.z),E=P[0].x-P[1].x,T=P[0].y-P[1].y,V=Math.sqrt(E*E+T*T),_=El(a,p,b);Pl(f.name,u,p,b,_,m,x,y,r);let v=Sl(u,V,x,y,_,r,f.name,M,f.nline);if(v.length>0)for(let L=0;L<v.length;L++){let B=v[L],$=B.seg,G=!!B.hingeInfo?.hingePoint,Q=B.hingeInfo?.isClosed,q=B.hingeInfo?.hingeDist??-1,X=$t(_[0].x,_[0].y,$.start.x,$.start.y,$.end.x,$.end.y)}if(v=Tl(v,_,e,f.name),v.length===0){for(let B of u){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,ht=X/Y,St=Math.abs(it*x+ht*y),nt=Math.acos(Math.min(1,Math.abs(St)))*180/Math.PI,wt=$t(p,b,B.start.x,B.start.y,B.end.x,B.end.y)}let L=0;for(let B of u)$t(p,b,B.start.x,B.start.y,B.end.x,B.end.y).dist<2&&L++}let S=V;for(let L of v){let B=L.seg;if(B.originalPoints&&B.originalPoints.length>100&&B.length>.5)try{let $=oo(B,.1),G=_r(B,$,B.length,.5,.5,3,.35),Q,q=!1;if(f.nline){let ht=Hr(f.nline,B.start,B.end);if(ht)Q=ht.hingeT,q=ht.hingeDist>.05;else{let St=$t(p,b,B.start.x,B.start.y,B.end.x,B.end.y);Q=Math.max(0,Math.min(1,St.t))}}else{let ht=$t(p,b,B.start.x,B.start.y,B.end.x,B.end.y);Q=Math.max(0,Math.min(1,ht.t))}let X=Ir($),Y,it=X<=.3;it?Y={score:Xo($.avgDensity,d),bestRegion:null,bestOverlap:0,bestOpeningStartT:0,bestOpeningEndT:1}:(Y=Ar({hingeT:Q,doorWidth:S,isOpenDoor:q},G,B.length,d.medianDensity),Y.score<0&&(Y={score:Xo($.avgDensity,d),bestRegion:null,bestOverlap:0,bestOpeningStartT:0,bestOpeningEndT:1})),f.name.includes("door_002")&&(window.__doorLog=!0),L.densityScore=Y.score,L.densityOverlap=Y.bestOverlap,L.rectangularRegions=G,L.densityResult=$,L.densityOpeningStartT=Y.bestOpeningStartT,L.densityOpeningEndT=Y.bestOpeningEndT,L.densityCV=X,L.densityUsedGlobalRank=it}catch{L.densityScore=-1}else L.densityScore=-1}if(f.name.includes("door_002"))for(let L=0;L<v.length;L++){let $=v[L].seg,G=u.findIndex(q=>Math.abs(q.start.x-$.start.x)<.001&&Math.abs(q.start.y-$.start.y)<.001&&Math.abs(q.end.x-$.end.x)<.001&&Math.abs(q.end.y-$.end.y)<.001),Q=G>=0?l[G]||[]:[];for(let q of Q){let X=e[q]}}if(v.sort((L,B)=>{let $=L.densityScore>=0?L.densityScore:-1/0,G=B.densityScore>=0?B.densityScore:-1/0;if($!==G)return G-$;if(Math.abs($-G)<.3){let X=L.ratio||0,Y=B.ratio||0,it=Math.abs(X-1),ht=Math.abs(Y-1);if(it!==ht)return it-ht}let Q=L.hingeScore||0,q=B.hingeScore||0;return Q!==q?q-Q:L.minDist-B.minDist}),v.length>0)for(let L=0;L<v.length;L++){let B=v[L],$=B.seg,G=B.ratio||$.length/S,Q=Math.abs(G-1)}let R=null,D=1/0,W=0,I=0,C=null,H=-1,A=0,k=0,O=0;if(v.length>0){let L=v[0];R=L.seg,D=L.minDist,W=L.ratio,I=L.embedRatio,C=L.hingeInfo,H=L.densityScore??-1,A=L.densityOverlap??0,k=L.densityOpeningStartT??0,O=L.densityOpeningEndT??0}let N;if(R&&(N=Rl(R,a,f,i),N&&O>k&&(N.wallTMin=Math.max(0,Math.min(1,k)),N.wallTMax=Math.max(0,Math.min(1,O))),!r.printOnly)){let L=R;L.DrawDoor||(L.DrawDoor=[]),L.DrawDoor.push(N),L.isDoor=!0}if(R){let L=v.map(($,G)=>{let Q=$.seg;return{start:{x:Q.start.x,y:Q.start.y,z:Q.start.z},end:{x:Q.end.x,y:Q.end.y,z:Q.end.z},length:Q.length,densityScore:$.densityScore??-1,hingeScore:$.hingeScore??0,minDist:$.minDist,ratio:$.ratio,isWinner:G===0}}),B={doorName:f.name,doorCategory:f.category,doorCenter:f.center,wallSegment:R,distance:D,wallLengthRatio:W,DrawDoor:N,densityScore:H,densityOverlap:A,candidates:L,hingePoint:C?.hingePoint,otherPoint:C?.otherPoint,isClosed:C?.isClosed,doorWidth:N?.width,wallTMin:N?.wallTMin,wallTMax:N?.wallTMax};if(s.push(B),(f.name==="1527727501200_window_001"||f.name==="1527727427200_window_001")&&N){let $=R.end.x-R.start.x,G=R.end.y-R.start.y,Q=Math.sqrt($*$+G*G),q=$/Q,X=G/Q,Y=N.p.x-R.start.x,it=N.p.y-R.start.y,ht=(Y*q+it*X)/Q,St=0;for(let nt of i){if(nt===R)continue;let wt=nt.end.x-nt.start.x,zt=nt.end.y-nt.start.y,Dt=Math.sqrt(wt*wt+zt*zt)||1,Pt=wt/Dt,Mt=zt/Dt,It=Math.abs(q*Pt+X*Mt),ot=Math.acos(Math.min(It,1))*(180/Math.PI);if(Math.abs(ot-90)>10)continue;St++;let ft=[nt.start,nt.end],st="";for(let tt of ft){let ae=tt.x-R.start.x,bt=tt.y-R.start.y,Jt=(ae*q+bt*X)/Q,he=R.start.x+Jt*Q*q,Tt=R.start.y+Jt*Q*X,ee=Math.sqrt((tt.x-he)**2+(tt.y-Tt)**2),et=Math.abs((Jt-ht)*Q);st+=`\u7AEF(${tt.x.toFixed(2)},${tt.y.toFixed(2)})\u22A5=${ee.toFixed(3)}m \u6CBF\u5899=${et.toFixed(3)}m `}}}if(N&&N.width>1){let $=un(B,i);$.length>0&&$.forEach((G,Q)=>{})}}}for(let f of s){let c=f.wallSegment,a=i.indexOf(c);if(a===-1)continue;let h=l[a];!h||h.length<=1||Go(c,h,e)}return s}function so(t){return[t.wallTMin??0,t.wallTMax??1]}function Dl(t,e){let[n,o]=so(t),[r,s]=so(e),i=Math.max(0,Math.min(o,s)-Math.max(n,r)),l=Math.min(o-n,s-r);return l>0?i/l:0}function vl(t,e){if(!t.hingePoint||!e.hingePoint)return null;let n=t.hingePoint.x-e.hingePoint.x,o=t.hingePoint.y-e.hingePoint.y;return Math.sqrt(n*n+o*o)}function kr(t,e){let n=e.end.x-e.start.x,o=e.end.y-e.start.y,r=n*n+o*o;if(r<1e-10)return 0;let s=((t.x-e.start.x)*n+(t.y-e.start.y)*o)/r;return Math.max(0,Math.min(1,s))}function Br(t,e={}){let n=e.minTOverlapRatio??.5,o=e.maxHingeDist??.3,r=e.minHingeTOverlapRatio??.2;if(t.length<2)return{matches:t,removed:[]};let s=new Set,i=new Map;for(let f=0;f<t.length;f++){let a=t[f].wallSegment;i.has(a)||i.set(a,[]),i.get(a).push(f)}let l=0;for(let[f,c]of i){l++;let a=c.map(p=>t[p].doorName).join(", "),h=f.start,g=f.end}for(let[,f]of i){if(f.length<2)continue;let c=[...f].sort((a,h)=>{let g=t[a].densityScore??0;return(t[h].densityScore??0)-g});for(let a=0;a<c.length;a++){let h=c[a];if(s.has(h))continue;let g=t[h];for(let p=a+1;p<c.length;p++){let b=c[p];if(s.has(b))continue;let m=t[b],x=!1,y="",w=Dl(g,m),z=[g.hingePoint,g.otherPoint].filter(Boolean),M=[m.hingePoint,m.otherPoint].filter(Boolean),P=null;for(let W of z)for(let I of M){let C=Math.sqrt((W.x-I.x)**2+(W.y-I.y)**2);if(C>.25)continue;let H=kr(W,g.wallSegment),A=kr(I,m.wallSegment),k=Math.abs(H-A);(!P||C<P.dist)&&(P={dist:C,tDiff:k})}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]=so(g),[V,_]=so(m),v=vl(g,m);g.doorName.includes("door_002")||g.doorName.includes("door_004")||m.doorName.includes("door_002")||m.doorName.includes("door_004");let S=[g.hingePoint,g.otherPoint].filter(Boolean),R=[m.hingePoint,m.otherPoint].filter(Boolean),D=1/0;for(let W of S)for(let I of R){let C=Math.sqrt((W.x-I.x)**2+(W.y-I.y)**2);C<D&&(D=C)}x&&s.add(b)}}}let u=t.filter((f,c)=>!s.has(c)),d=t.filter((f,c)=>s.has(c)).map(f=>f.doorName);return{matches:u,removed:d}}function Zo(t,e,n){let o={printOnly:!1,skipMerge:!1,...n};for(let m of t)m.DrawDoor&&(m.DrawDoor=void 0),m.isDoor&&(m.isDoor=void 0),m.drawDoorData&&(m.drawDoorData=void 0);let r=Array.isArray(e)?e.filter(m=>m&&m.category==="door"&&!m.isFindBeam):[],s,i;if(o.skipMerge)s=t,i=t.map((m,x)=>[x]);else{let m=Ue(t);s=m.segments,i=m.sourceMap}for(let m=0;m<s.length;m++){let x=i[m];x&&!s[m].originalPoints&&Go(s[m],x,t)}let l=Dn(r,t,o,{segments:s,sourceMap:i}),d=Br(l,{minTOverlapRatio:.5}).matches,f=new Set(d.map(m=>m.doorName));for(let m of s){let x=m;if(x.DrawDoor&&x.DrawDoor.length>0){let y=l.filter(z=>z.wallSegment===m).length;d.filter(z=>z.wallSegment===m).length===0&&(x.DrawDoor=[],x.isDoor=!1)}}let c=new Map;for(let m=0;m<d.length;m++){let x=d[m],y=s.indexOf(x.wallSegment);y>=0&&c.set(y,m)}let a=[],h=new Set,g=new Map;for(let m of e)m&&m.name&&g.set(m.name,m);for(let[m,x]of c){let y=i[m];if(!y)continue;let w=s[m],z=w.DrawDoor,M=w.isDoor,P=w.end.x-w.start.x,E=w.end.y-w.start.y,T=P*P+E*E,V=0,_=1,v=d[x],R=(v?g.get(v.doorName):void 0)?.coordinatesByArea?.coordinates;if(R&&R.length>=4&&T>0){let C=R.slice(0,4).map(H=>{let A=H.x-w.start.x,k=H.y-w.start.y;return(A*P+k*E)/T});V=Math.max(0,Math.min(1,Math.min(...C))),_=Math.max(0,Math.min(1,Math.max(...C)))}let D,W;T>0&&_>V&&(D={x:w.start.x+V*P,y:w.start.y+V*E,z:w.start.z+V*(w.end.z-w.start.z)},W={x:w.start.x+_*P,y:w.start.y+_*E,z:w.start.z+_*(w.end.z-w.start.z)});let I=!1;for(let C of y){let H=t[C];if(!H)continue;let A=H.end.x-H.start.x,k=H.end.y-H.start.y,O=A*A+k*k,N=Math.sqrt(O);if(O<1e-10||!D||!W){h.add(C),a.push(H);continue}let L=((D.x-H.start.x)*A+(D.y-H.start.y)*k)/O,B=((W.x-H.start.x)*A+(W.y-H.start.y)*k)/O,$=Math.max(0,Math.min(1,Math.min(L,B))),G=Math.max(0,Math.min(1,Math.max(L,B)));if(G-$<.001)continue;h.add(C);let Q=nt=>({x:H.start.x+nt*A,y:H.start.y+nt*k,z:H.start.z+nt*(H.end.z-H.start.z)}),q=Q($),X=Q(G),Y=H.direction||{x:A/N,y:k/N,z:0},it,ht,St;if(H.originalPoints&&H.originalPoints.length>0){it=[],ht=[],St=[];for(let nt of H.originalPoints){let wt=((nt.x-H.start.x)*A+(nt.y-H.start.y)*k)/O;wt<$-1e-8?it.push(nt):wt>G+1e-8?St.push(nt):ht.push(nt)}it.length===0&&(it=void 0),ht.length===0&&(ht=void 0),St.length===0&&(St=void 0)}if($>.001){let nt={...H,start:{...H.start},end:{...q},length:$*N,direction:{...Y}};nt.DrawDoor=void 0,nt.isDoor=!1,nt.drawDoorData=void 0,nt.length<.01?(nt.isRebuild=!0,nt.originalPoints=[]):nt.originalPoints=it,a.push(nt)}{let nt={...H,start:{...q},end:{...X},length:(G-$)*N,direction:{...Y}};if(z&&(nt.DrawDoor=z),M&&(nt.isDoor=!0),nt.__matchIdx=x,nt.length<.01?(nt.isRebuild=!0,nt.originalPoints=[]):nt.originalPoints=ht,!I&&z&&z.length>0){I=!0;let wt=Math.sqrt(T),zt=wt>0?-E/wt:0,Dt=wt>0?P/wt:0,Pt={pointNum:2,start:D,end:W,n:{x:zt,y:Dt,z:0},height:z[0].height,groundClearance:z[0].groundClearance};nt.drawDoorData=Pt}a.push(nt)}if(G<.999){let nt={...H,start:{...X},end:{...H.end},length:(1-G)*N,direction:{...Y}};nt.DrawDoor=void 0,nt.isDoor=!1,nt.drawDoorData=void 0,nt.length<.01?(nt.isRebuild=!0,nt.originalPoints=[]):nt.originalPoints=St,a.push(nt)}}}for(let m=0;m<t.length;m++)h.has(m)||a.push(t[m]);let p=new Set(d.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 d){if(!m.DrawDoor||m.DrawDoor.width<=1)continue;let x=g.get(m.doorName);if(!x||!x.positionArr||!x.positionArr.length)continue;let y=un(m,s);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,_=y.filter(C=>{let H=(C.seg.start.x+C.seg.end.x)/2,A=(C.seg.start.y+C.seg.end.y)/2,k=H-z.x,O=A-z.y;return k*T+O*V>0});if(!_.length)continue;let v=_[0].endPoint,S=m.wallSegment;if(b.has(S))continue;let[R,D]=Rn(S,v);b.set(S,[R,D]);let W=((z.x-S.start.x)*(S.end.x-S.start.x)+(z.y-S.start.y)*(S.end.y-S.start.y))/(S.length*S.length),I=((v.x-S.start.x)*(S.end.x-S.start.x)+(v.y-S.start.y)*(S.end.y-S.start.y))/(S.length*S.length);W<=I?m.wallSegment=R:m.wallSegment=D}if(b.size>0){let m=[];for(let x of a)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:d}}for(let m of a)m.isDoor=!!(m.DrawDoor&&m.DrawDoor.length>0);return{segments:a,matches:d}}var Vl={findWalls:Tn,mergeSegments:Ge,computeFloorZ:Xe,analyzeQuadrangle:je,detectPerpWalls:Pn,splitSegment:Sn,process:qo},Il={findWalls:Dn,mergeSegments:Ue,computeFloorZ:Ye,analyzeQuadrangle:je,detectPerpWalls:un,splitSegment:Rn,process:Zo};function fn(t){return t==="window"?Vl:Il}function Cl(t,e,n,o,r){return fn(t).findWalls(e,n,o,r)}function Wl(t,e,n,o){return fn(t).process(e,n,o)}function _l(t,e){return fn(t).mergeSegments(e)}function Hl(t,e,n){return fn(t).detectPerpWalls(e,n)}function Al(t,e,n){return fn(t).splitSegment(e,n)}function Ke(t,e){let n=Math.atan2(e,t);return n<0&&(n+=Math.PI),n>=Math.PI&&(n-=Math.PI),n}function Ie(t,e,n){let o=Math.cos(n),r=Math.sin(n);return{x:t*o-e*r,z:t*r+e*o}}function ro(t,e,n,o,r,s){let i=r-n,l=s-o,u=i*i+l*l;if(u<1e-10){let g=t-n,p=e-o;return Math.sqrt(g*g+p*p)}let d=((t-n)*i+(e-o)*l)/u;d=Math.max(0,Math.min(1,d));let f=n+d*i,c=o+d*l,a=t-f,h=e-c;return Math.sqrt(a*a+h*h)}function Or(t){if(t.length<3)return 0;let e=0,n=t.length;for(let o=0;o<n;o++){let r=(o+1)%n;e+=t[o].x*t[r].z,e-=t[r].x*t[o].z}return Math.abs(e)/2}function Yo(t){let e=t.x2-t.x1,n=t.z2-t.z1;return Math.sqrt(e*e+n*n)}function io(t){if(!t.length)return{rotated:[],mainAngle:0};let e=180,n=new Array(e).fill(0),o=Math.PI/e;for(let f of t){let c=f.x2-f.x1,a=f.z2-f.z1,h=Math.sqrt(c*c+a*a);if(h<.01)continue;let g=Ke(c,a),p=Math.floor(g/o);p>=e&&(p=e-1),n[p]+=h}let r=new Array(e).fill(0),s=5;for(let f=0;f<e;f++){let c=0;for(let a=-s;a<=s;a++){let h=f+a;h<0&&(h+=e),h>=e&&(h-=e),c+=n[h]}r[f]=c}let i=0,l=0;for(let f=0;f<e;f++)r[f]>i&&(i=r[f],l=f);let u=(l+.5)*o;return{rotated:t.map(f=>{let c=Ie(f.x1,f.z1,-u),a=Ie(f.x2,f.z2,-u);return{...f,x1:c.x,z1:c.z,x2:a.x,z2:a.z}}),mainAngle:u}}var Uo=15*(Math.PI/180);function ao(t,e,n=.15,o=.5){let r=[];for(let f of t){let c=f.x2-f.x1,a=f.z2-f.z1,h=Math.sqrt(c*c+a*a);if(h<.01)continue;let g=Ke(c,a),p;if(e==="X"?p=g<Uo||g>Math.PI-Uo:p=Math.abs(g-Math.PI/2)<Uo,!p)continue;let b,m,x;e==="X"?(b=(f.z1+f.z2)/2,m=Math.min(f.x1,f.x2),x=Math.max(f.x1,f.x2)):(b=(f.x1+f.x2)/2,m=Math.min(f.z1,f.z2),x=Math.max(f.z1,f.z2)),r.push({line:f,offset:b,pStart:m,pEnd:x,length:h})}if(r.length===0)return{groups:[],lineToGroup:new Map};r.sort((f,c)=>f.offset-c.offset);let s=[],i=[r[0]],l=r[0].offset;for(let f=1;f<r.length;f++){let c=r[f];Math.abs(c.offset-l)<n?i.push(c):(s.push(i),i=[c],l=c.offset)}i.length>0&&s.push(i);let u=[],d=new Map;for(let f of s){f.sort((a,h)=>a.pStart-h.pStart);let c=[];for(let a of f){let h=!1;for(let g of c)if(a.pStart<=g.end+o){g.items.push(a),g.end=Math.max(g.end,a.pEnd),h=!0;break}h||c.push({items:[a],end:a.pEnd})}for(let a of c){let h=a.items.map(p=>p.line),g=u.length;u.push(h);for(let p of h)d.set(p.id,g)}}return{groups:u,lineToGroup:d}}function lo(t,e,n=.3){let o=new Map;for(let r of t){let s=null,i=1/0;for(let l of e){let u=ro(r.x,r.z,l.x1,l.z1,l.x2,l.z2);u<i&&(i=u,s=l.id)}s!==null&&i<=n&&o.set(r.id,s)}return o}var dn=.15;function Ll(t,e){return Math.round(t/dn)+"_"+Math.round(e/dn)}function Fr(t,e=5){if(t.length<3)return new Set;let n=new Map,o=0,r=0;function s(u,d){let f=Ll(u,d),c=n.get(f);if(c)return c;let a=Math.round(u/dn),h=Math.round(d/dn),g=null,p=dn*dn;for(let b=-1;b<=1;b++)for(let m=-1;m<=1;m++){let x=a+b+"_"+(h+m),y=n.get(x);if(!y)continue;let w=y.x-u,z=y.z-d,M=w*w+z*z;M<p&&(p=M,g=y)}return g?(n.set(f,g),g):(c={id:o++,x:u,z:d,edges:[]},n.set(f,c),c)}let i=[];for(let u of t){let d=s(u.x1,u.z1),f=s(u.x2,u.z2);if(d.id===f.id)continue;let c=Math.atan2(f.z-d.z,f.x-d.x),a=Math.atan2(d.z-f.z,d.x-f.x),h={id:r++,wallId:u.id,from:d,to:f,twin:null,angle:c,visited:!1},g={id:r++,wallId:u.id,from:f,to:d,twin:h,angle:a,visited:!1};h.twin=g,d.edges.push(h),f.edges.push(g),i.push(h,g)}if(i.length<6)return new Set;for(let u of n.values())u.edges.sort((d,f)=>d.angle-f.angle);let l=new Set;for(let u of i){if(u.visited)continue;let d=[],f=u,c=i.length+10;for(;!f.visited&&d.length<c;){f.visited=!0,d.push(f);let a=f.to,h=f.twin,g=a.edges.indexOf(h);if(g<0)break;let p=(g+1)%a.edges.length;f=a.edges[p]}if(d.length>=3){let a=d[0];if(d[d.length-1].to.id===a.from.id){let g=[],p=new Set;for(let m of d)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(Or(g)>=e)for(let m of p)l.add(m)}}}return l}var ag=12*(Math.PI/180);function Nr(t,e=2){let n=new Map;for(let o of t){let r=(o.x1+o.x2)/2,s=(o.z1+o.z2)/2,i=Math.floor(r/e),l=Math.floor(s/e),u=`${i},${l}`;n.has(u)||n.set(u,[]),n.get(u).push(o)}return n}var kl=0;function qr(){return++kl}function $r(t,e,n=.15,o=.5){if(!t.length)return[];let r=10*Math.PI/180,s=[];for(let f of t){let c=f.x2-f.x1,a=f.z2-f.z1,h=Math.sqrt(c*c+a*a);if(!(h<.01))if(e==="X"){if(Math.abs(a)>h*Math.sin(r))continue;let g=(f.z1+f.z2)/2,p=Math.min(f.x1,f.x2),b=Math.max(f.x1,f.x2);s.push({line:f,pStart:p,pEnd:b,offset:g,yMin:Math.min(f.y1,f.y2),yMax:Math.max(f.y1,f.y2)})}else{if(Math.abs(c)>h*Math.sin(r))continue;let g=(f.x1+f.x2)/2,p=Math.min(f.z1,f.z2),b=Math.max(f.z1,f.z2);s.push({line:f,pStart:p,pEnd:b,offset:g,yMin:Math.min(f.y1,f.y2),yMax:Math.max(f.y1,f.y2)})}}if(!s.length)return[];s.sort((f,c)=>f.offset-c.offset);let i=[],l=[s[0]],u=s[0].offset;for(let f=1;f<s.length;f++){let c=s[f];Math.abs(c.offset-u)<n?l.push(c):(i.push(l),l=[c],u=c.offset)}i.push(l);let d=[];for(let f of i){f.sort((a,h)=>a.pStart-h.pStart);let c=[];for(let a of f){if(c.length===0){c.push({pStart:a.pStart,pEnd:a.pEnd,offset:a.offset,count:1,yMin:a.yMin,yMax:a.yMax});continue}let h=c[c.length-1];a.pStart<=h.pEnd+o?(h.pEnd=Math.max(h.pEnd,a.pEnd),h.count+=1,h.yMin=Math.min(h.yMin,a.yMin),h.yMax=Math.max(h.yMax,a.yMax),h.offset=(h.offset*(h.count-1)+a.offset)/h.count):c.push({pStart:a.pStart,pEnd:a.pEnd,offset:a.offset,count:1,yMin:a.yMin,yMax:a.yMax})}for(let a of c){let h=a.pEnd-a.pStart;if(h<.01)continue;let g;e==="X"?g={id:qr(),x1:a.pStart,y1:a.yMin,z1:a.offset,x2:a.pEnd,y2:a.yMax,z2:a.offset,length:h,pointCount:a.count,isMain:!1}:g={id:qr(),x1:a.offset,y1:a.yMin,z1:a.pStart,x2:a.offset,y2:a.yMax,z2:a.pEnd,length:h,pointCount:a.count,isMain:!1},d.push(g)}}return d}function jr(t,e=.8,n=3){return t.filter(o=>o.length>=e&&o.pointCount>=n)}function Xr(t,e=1,n=3){return t.filter(o=>o.length>=e&&o.pointCount>=n)}function Bl(t,e,n={}){let{distTol:o=.15,gapTol:r=.5,minLen:s=.2,minGroupLen:i=1,minArea:l=3,maxWinDist:u=.3,minLongWall:d=2}=n,f=performance.now(),{rotated:c,mainAngle:a}=io(t),h=performance.now(),g=e.map(D=>{let W=Ie(D.x,D.z,-a);return{...D,x:W.x,z:W.z}}),{groups:p}=ao(c,"X",o,r),{groups:b}=ao(c,"Z",o,r),m=[...p,...b],x=performance.now(),y=new Map,w=[];for(let D=0;D<m.length;D++){let W=m[D];if(W.length===0){w.push(0);continue}let I=0;for(let C of W)I+=Yo(C),y.set(C.id,D);w.push(I)}let z=performance.now(),M=new Set;for(let D=0;D<m.length;D++)w[D]>=d&&M.add(D);if(M.size>0){let D=[...M];for(;D.length>0;){let W=D.shift(),I=m[W];for(let C=0;C<m.length;C++){if(M.has(C)||w[C]<i)continue;let H=m[C],A=!1;t:for(let k of I)for(let O of H)if(Math.hypot(k.x1-O.x1,k.z1-O.z1)<=co||Math.hypot(k.x1-O.x2,k.z1-O.z2)<=co||Math.hypot(k.x2-O.x1,k.z2-O.z1)<=co||Math.hypot(k.x2-O.x2,k.z2-O.z2)<=co){A=!0;break t}A&&(M.add(C),D.push(C))}}}let P=c.map((D,W)=>{let I=Yo(D),C=y.get(D.id),H=C!==void 0&&M.has(C),A=I>=d;return{id:W,x1:D.x1,y1:D.y1,z1:D.z1,x2:D.x2,y2:D.y2,z2:D.z2,length:I,pointCount:1,isMain:H||A}}),E=P.filter(D=>D.isMain),T=P.filter(D=>!D.isMain),V=performance.now(),_=lo(g,E,u),v=performance.now(),S=D=>D.map(W=>{let I=Ie(W.x1,W.z1,a),C=Ie(W.x2,W.z2,a);return{...W,x1:I.x,z1:I.z,x2:C.x,z2:C.z}}),R=performance.now();return console.log(`[\u4E3B\u4F53\u67B6\u6784] \u89D2\u5EA6\u5F52\u4E00\u5316: ${(h-f).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-f).toFixed(0)}ms`),{mainWalls:S(E),noiseWalls:S(T),windowToWall:_}}var co=.2;function Pe(t,e){let n=Math.atan2(e,t);return n<0&&(n+=Math.PI),n>=Math.PI&&(n-=Math.PI),n}function vn(t){for(;t>Math.PI;)t-=2*Math.PI;for(;t<-Math.PI;)t+=2*Math.PI;return t}function uo(t){return t*Math.PI/180}function Vn(t,e,n){let o=Math.cos(n),r=Math.sin(n);return{x:t*o-e*r,z:t*r+e*o}}function Se(t){let e=0;for(let n=1;n<t.length;n++){let o=t[n].x-t[n-1].x,r=t[n].z-t[n-1].z;e+=Math.sqrt(o*o+r*r)}return e}function Ko(t){if(t.length<3)return 0;let e=0,n=t.length;for(let o=0;o<n;o++){let r=(o+1)%n;e+=t[o].x*t[r].z,e-=t[r].x*t[o].z}return Math.abs(e)/2}function be(t,e,n,o){let r=n-t,s=o-e;return Math.sqrt(r*r+s*s)}function In(t,e,n,o,r,s){let i=r-n,l=s-o,u=i*i+l*l;if(u<1e-6)return be(t,e,n,o);let d=((t-n)*i+(e-o)*l)/u;return d=Math.max(0,Math.min(1,d)),be(t,e,n+d*i,o+d*l)}function Qo(t){if(t.length<4)return t;let e=t.map(n=>({x:n.x,z:n.z}));for(let n=0;n<3;n++){let o=[{...e[0]}];for(let r=1;r<e.length-1;r++)o.push({x:(e[r-1].x+e[r].x+e[r+1].x)/3,z:(e[r-1].z+e[r].z+e[r+1].z)/3});o.push({...e[e.length-1]}),e=o}return e}function Gr(t,e){let n=1/0;for(let o of t)for(let r=0;r<e.length-1;r++){let s=In(o.x,o.z,e[r].x,e[r].z,e[r+1].x,e[r+1].z);s<n&&(n=s)}return n}function fo(t,e){let n=new Map,o=1/0,r=-1/0,s=1/0,i=-1/0;for(let l of t){let u=Math.floor(l.x/e),d=Math.floor(l.z/e),f=u+","+d;n.set(f,(n.get(f)||0)+1),u<o&&(o=u),u>r&&(r=u),d<s&&(s=d),d>i&&(i=d)}return{cells:n,minX:o,maxX:r,minZ:s,maxZ:i}}function Zr(t,e){let n=new Set,o=1/0,r=-1/0,s=1/0,i=-1/0,l=(u,d)=>{let f=u+","+d;n.add(f),u<o&&(o=u),u>r&&(r=u),d<s&&(s=d),d>i&&(i=d)};for(let u of t){let d=u.x1,f=u.z1,c=u.x2,a=u.z2,h=Math.floor(d/e),g=Math.floor(f/e),p=Math.floor(c/e),b=Math.floor(a/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&&(l(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:r,minZ:s,maxZ:i}}function Wn(t,e=1){let n=new Set(t);for(let o=0;o<e;o++){let r=new Set(n);for(let i of n){let[l,u]=i.split(",").map(Number);for(let d=-1;d<=1;d++)for(let f=-1;f<=1;f++)d===0&&f===0||r.add(l+d+","+(u+f))}let s=new Set(r);for(let i of r){let[l,u]=i.split(",").map(Number),d=!0;for(let f=-1;f<=1;f++){for(let c=-1;c<=1;c++)if(!r.has(l+f+","+(u+c))){d=!1;break}if(!d)break}d||s.delete(i)}n.clear();for(let i of s)n.add(i)}return n}function Jo(t){let e=[],n=new Set;for(let o of t){if(n.has(o))continue;let r=new Set,s=[o];for(n.add(o);s.length>0;){let i=s.shift();r.add(i);let[l,u]=i.split(",").map(Number);for(let d=-1;d<=1;d++)for(let f=-1;f<=1;f++){if(d===0&&f===0)continue;let c=l+d+","+(u+f);t.has(c)&&!n.has(c)&&(n.add(c),s.push(c))}}r.size>=4&&e.push(r)}return e}function ts(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 r="",s=1/0,i=1/0;for(let g of n){let[p,b]=g.split(",").map(Number);(b<s||b===s&&p<i)&&(s=b,i=p,r=g)}if(!r)return[];let l=[[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1]],u=[],[d,f]=r.split(",").map(Number),c=0,a=new Set,h=n.size*8;for(let g=0;g<h;g++){let b=d+","+f+"|"+c;if(a.has(b))break;a.add(b),u.push({x:(d+.5)*e,z:(f+.5)*e});let m=(c+3)%8,x=!1;for(let y=0;y<8;y++){let w=(m+y)%8,z=d+l[w][0],M=f+l[w][1];if(n.has(z+","+M)){c=(w+4)%8,d=z,f=M,x=!0;break}}if(!x||d+","+f===r&&u.length>2)break}return u}function Cn(t,e){if(t.length<=2)return[...t];let n=0,o=0,r=t[0],s=t[t.length-1];for(let i=1;i<t.length-1;i++){let l=In(t[i].x,t[i].z,r.x,r.z,s.x,s.z);l>n&&(n=l,o=i)}if(n>e){let i=Cn(t.slice(0,o+1),e),l=Cn(t.slice(o),e);return[...i.slice(0,-1),...l]}return[r,s]}var es={cellSize:.1,densityThreshold:1,minComponentCells:20,simplifyEpsilon:.01,heightMin:.3,heightMax:2.8,closeIterations:5,sparseRadius:.3,sparseMinNeighbors:5,lineDensityMin:0,lineDensityMinLen:1,densityRatio:.12};function hn(t){let e=t.length;if(e<3)return{cx:0,cz:0,r:0,rmsResidual:0};let n=0,o=0,r=0,s=0,i=0,l=0,u=0,d=0,f=0;for(let m of t){let x=m.x,y=m.z;n+=x,o+=y,r+=x*x,s+=y*y,i+=x*y,l+=x*x*x,u+=y*y*y,d+=x*x*y,f+=x*y*y}let c=2*(e*(r+s)-n*n-o*o);if(Math.abs(c)<1e-10)return{cx:0,cz:0,r:0,rmsResidual:0};let a=(e*(l+f)-n*(r+s))/c,h=(e*(d+u)-o*(r+s))/c,g=Math.sqrt(Math.abs((r+s-2*a*n-2*h*o)/e+a*a+h*h)),p=0;for(let m of t){let y=Math.hypot(m.x-a,m.z-h)-g;p+=y*y}let b=Math.sqrt(p/e);return{cx:a,cz:h,r:g,rmsResidual:b}}function Ol(t){let e=t.length;if(e<4)return{eigenRatio:1,isLinear:!1,spread:0,mx:0,mz:0,v1x:1,v1z:0,v2x:0,v2z:1,s1:0,s2:0};let n=0,o=0;for(let w of t)n+=w.x,o+=w.z;n/=e,o/=e;let r=0,s=0,i=0;for(let w of t){let z=w.x-n,M=w.z-o;r+=z*z,s+=M*M,i+=z*M}r/=e,s/=e,i/=e;let l=r+s,u=Math.max(0,(r-s)*(r-s)+4*i*i),d=Math.sqrt(u),f=(l+d)/2,c=(l-d)/2,a=Math.sqrt(f),h=Math.sqrt(c),g=h,p=1,b=0,m=0,x=1;if(Math.abs(i)>1e-12||Math.abs(r-s)>1e-12){let w=i,z=f-r,M=Math.sqrt(w*w+z*z);M>1e-12&&(p=w/M,b=z/M);let P=i,E=c-r,T=Math.sqrt(P*P+E*E);T>1e-12&&(m=P/T,x=E/T)}let y=f>1e-10?c/f:0;return{eigenRatio:y,isLinear:y<.05,spread:g,mx:n,mz:o,v1x:p,v1z:b,v2x:m,v2z:x,s1:a,s2:h}}function Yr(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:r,spread:s,mx:i,mz:l,v1x:u,v1z:d,v2x:f,v2z:c,s1:a,s2:h}=Ol(t),g=0;for(let w=1;w<t.length;w++){let z=t[w].x-t[w-1].x,M=t[w].z-t[w-1].z;g+=Math.sqrt(z*z+M*M)}let p=Fl(t),b=hn(p);if(b.r>.1&&b.r<Math.max(g*5,2)&&b.rmsResidual<.07)return{type:"curved",eigenRatio:o,spread:s,cloudUsed:t.length,mx:i,mz:l,v1x:u,v1z:d,v2x:f,v2z:c,s1:a,s2:h};let x=g>.01?s/g:1;return{type:r&&(s<.05||x<.1)?"straight":"curved",eigenRatio:o,spread:s,cloudUsed:t.length,mx:i,mz:l,v1x:u,v1z:d,v2x:f,v2z:c,s1:a,s2:h}}function Fl(t){if(t.length<4)return[...t];let e=[{...t[0]}];for(let n=1;n<t.length-1;n++)e.push({x:(t[n-1].x+t[n].x+t[n+1].x)/3,z:(t[n-1].z+t[n].z+t[n+1].z)/3});return e.push({...t[t.length-1]}),e}function Nl(t,e,n=1.57){if(e<10)return[];let o=[];for(let 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 r=[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),r.push(r[p-1]+b)}let s=0;{let p=o[0]-o[e-1];p>Math.PI?p-=2*Math.PI:p<-Math.PI&&(p+=2*Math.PI),s=p}Math.abs(s)<.1;let i=[],l=5;for(let p=0;p<e;p++){let b=0;for(let m=-l;m<=l;m++)b+=r[(p+m+e)%e];i.push(b/(l*2+1))}let u=5,d=[];for(let p=0;p<e;p++){let b=i[(p+u)%e]-i[p];b>Math.PI?b-=2*Math.PI:b<-Math.PI&&(b+=2*Math.PI),d.push(b)}let f=10,c=.003,a=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=d[w],E=Math.abs(P),T=P>0?1:P<0?-1:0;if(E<c){w=(w+1)%e;continue}if(y===0){y=T,x=E,m=w,w=(w+1)%e;continue}if(T!==y){let V=E,_=T,v=(w+1)%e,S=1;for(let R=0;R<a&&S<a*2;R++){let D=d[v],W=Math.abs(D);if(W<c){v=(v+1)%e;continue}(D>0?1:-1)===_?V+=W:(V-=W,V<0&&(_=-_,V=-V)),v=(v+1)%e,S++}if(_===y&&V>h){w=(w+1)%e;continue}break}if(x+=E,m=w,w=(w+1)%e,w===p)break}if((m>b?m-b+1:e-b+m+1)>=f&&x>=n){let P=b,E=(b+u)%e,T=(m-u+e)%e,V=m,_=t[P],v=t[E],S=t[T],R=t[V],D=Math.atan2(v.z-_.z,v.x-_.x),I=Math.atan2(R.z-S.z,R.x-S.x)-D;I>Math.PI?I-=2*Math.PI:I<-Math.PI&&(I+=2*Math.PI);let C=Math.abs(I);if(!g.some(A=>{function k(L,B,$){return L<=B?$>=L&&$<=B:$>=L||$<=B}let O=0,N=0;for(let L=b;N++,k(A.start,A.end,L)&&O++,L!==m;L=(L+1)%e);return N>0&&O/N>.7})){let A=g.findIndex(k=>{function O(B,$,G){return B<=$?G>=B&&G<=$:G>=B||G<=$}let N=0,L=0;for(let B=k.start;L++,O(b,m,B)&&N++,B!==k.end;B=(B+1)%e);return L>0&&N/L>.7});A>=0?x>g[A].cumAngle&&(g[A]={start:b,end:m,cumAngle:x,actualAngle:C}):g.push({start:b,end:m,cumAngle:x,actualAngle:C})}}}return g}function ql(t,e){let s=new Array(e).fill(!1);for(let d=0;d<e;d++){let f=t[d],c=t[(d+15)%e],a=t[(d+30)%e],h=Math.atan2(c.z-f.z,c.x-f.x),g=Math.atan2(a.z-c.z,a.x-c.x),p=Math.abs(g-h);p>Math.PI&&(p=2*Math.PI-p),p>.07&&(s[(d+15)%e]=!0)}let i=new Set,l=[],u=-1;for(let d=0;d<e*2;d++){let f=d%e;if(s[f])u<0&&(u=f);else if(u>=0){let c=(f-1+e)%e,a=0;for(let h=u;a++,h!==c;h=(h+1)%e);if(a>=12){let h=`${u},${c}`;i.has(h)||(i.add(h),l.push({start:u,end:c}))}u=-1}}if(l.length>1){let d=l[0],f=l[l.length-1];f.end>e-3&&d.start<3&&(l[0]={start:f.start,end:d.end},l.pop())}return l}function $l(t,e){let n=[10,15,20,25,30,40],o=.15,r=.15,s=.5,i=3,l=6,u=new Array(e).fill(0);for(let c of n)if(!(c>=e))for(let a=0;a<e;a+=i){let h=a+c;if(h>=e)break;let g=[];for(let w=a;w<=h;w++)g.push(t[w]);if(g.length<c-1)continue;let{cx:p,cz:b,r:m,rmsResidual:x}=hn(g);if(m<.1||x>o||m<s)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<r))for(let w=a;w<=h;w++)u[w]++}let d=[],f=-1;for(let c=0;c<e*2;c++){let a=c%e;if(u[a]>=2)f<0&&(f=a);else if(f>=0){let h=(a-1+e)%e,g=0;for(let p=f;g++,p!==h;p=(p+1)%e);g>=l&&d.push({start:f,end:h}),f=-1}}if(d.length>1){let c=d[0],a=d[d.length-1];a.end>e-3&&c.start<3&&(d[0]={start:a.start,end:c.end},d.pop())}return d}function jl(t,e,n){function o(h,g){return h<=g?g-h+1:n-h+(g+1)}function r(h,g,p){return h<=g?p>=h&&p<=g:p>=h||p<=g}let s=o(t.start,t.end),i=o(e.start,e.end),l=s<=i?t.start:e.start,u=s<=i?t.end:e.end,d=s<=i?e.start:t.start,f=s<=i?e.end:t.end,c=0;for(let h=l;r(d,f,h)&&c++,h!==u;h=(h+1)%n);let a=s+i-c;return a>0?c/a:0}function Xl(t){if(t.length<2)return[];let e=[],n=.15,o=1.22,r=1.92;for(let l=0;l<t.length;l++){let u=t[l];for(let d=l+1;d<t.length;d++){let f=t[d],c=u.bx-u.ax,a=u.bz-u.az,h=f.bx-f.ax,g=f.bz-f.az,p=Math.sqrt(c*c+a*a),b=Math.sqrt(h*h+g*g);if(p<.01||b<.01)continue;let m=Math.abs(Math.atan2(c*g-a*h,c*h+a*g));if(m<o||m>r)continue;let x=[{x:u.ax,z:u.az},{x:u.bx,z:u.bz}],y=[{x:f.ax,z:f.az},{x:f.bx,z:f.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 s=[],i=new Array(e.length).fill(!1);for(let l=0;l<e.length;l++){if(i[l])continue;let u=e[l].x,d=e[l].z,f=1;i[l]=!0;for(let c=l+1;c<e.length;c++){if(i[c])continue;let a=e[c].x-u/f,h=e[c].z-d/f;Math.sqrt(a*a+h*h)<.3&&(u+=e[c].x,d+=e[c].z,f++,i[c]=!0)}s.push({x:u/f,z:d/f})}return s}function Ur(t,e){if(t.length<6)return[];let n={minCurveAngle:.05,minCurvePoints:5,smoothWindow:3,...e},o=t.length,r=[];for(let S=0;S<o;S++){let R=t[(S-1+o)%o],D=t[S],W=t[(S+1)%o],I=D.x-R.x,C=D.z-R.z,H=W.x-D.x,A=W.z-D.z,k=Math.sqrt(I*I+C*C),O=Math.sqrt(H*H+A*A);if(k<.001||O<.001){r.push(0);continue}r.push(Math.atan2((I*A-C*H)/(k*O),(I*H+C*A)/(k*O)))}let s=[],i=n.smoothWindow;for(let S=0;S<o;S++){let R=0;for(let D=-i;D<=i;D++)R+=r[(S+D+o)%o];s.push(R/(i*2+1))}let l=.008,u=[],d=-1,f=0,c=new Set;for(let S=0;S<o*2;S++){let R=S%o,D=s[R],W=D>=0?1:-1;if(Math.abs(D)>l&&(f===0||f===W))d<0&&(d=R,f=W);else if(d>=0){let I=(R-1+o)%o,C=0,H=0;for(let A=d;C+=Math.abs(s[A]),H++,A!==I;A=(A+1)%o);if(H>=n.minCurvePoints&&C>n.minCurveAngle){let A=`${d},${I}`;c.has(A)||(c.add(A),u.push({start:d,end:I,sign:f}))}d=-1,f=0}}if(u.length>1){let S=u[0],R=u[u.length-1];S.sign===R.sign&&R.end>o-3&&S.start<3&&(u[0]={start:R.start,end:S.end,sign:S.sign},u.pop())}{let S=s.filter(I=>Math.abs(I)>.001).map(I=>Math.abs(I)),R=S.length>0?Math.max(...S):0,D=S.length>0?S.reduce((I,C)=>I+C,0)/S.length:0,W=u.reduce((I,C)=>{let H=0;for(let A=C.start;H++,A!==C.end;A=(A+1)%o);return I+H},0)}let a=ql(t,o),h=$l(t,o),g=[...u,...a.map(S=>({start:S.start,end:S.end,sign:1})),...h.map(S=>({start:S.start,end:S.end,sign:1}))],p=u.length,m=g.map((S,R)=>{let D=[];for(let G=S.start;D.push({...t[G]}),G!==S.end;G=(G+1)%o);let W=0;for(let G=1;G<D.length;G++)s[(S.start+G-1)%o]*s[(S.start+G)%o]<-1e-8&&W++;let{cx:I,cz:C,r:H,rmsResidual:A}=hn(D),k=0,O=0;for(let G=1;G<D.length;G++){let Q=D[G-1].x-I,q=D[G-1].z-C,X=D[G].x-I,Y=D[G].z-C,it=Math.atan2(Q*Y-q*X,Q*X+q*Y);k+=Math.abs(it),O+=it}let N=Se(D),L=W===0?.12:.08;if(H>.1&&A>L||H>.1&&H>Math.max(N*15,8)||Math.abs(O)<.05)return null;let B=R<p?"turning":"sliding",$=B!=="turning"?Math.abs(O)>.35?"C_curve":"S_curve":W>0?"S_curve":"C_curve";return{seg:{points:D,type:$,radius:H,centerX:I,centerZ:C,arcAngle:k,arcLength:N},start:S.start,end:S.end,source:B}}).filter(S=>S!==null),x=new Set;function y(S,R){return S<=R?R-S+1:o-S+(R+1)}function w(S,R,D,W){for(let I=S;;I=(I+1)%o){let C;if(D<=W?C=I>=D&&I<=W:C=I>=D||I<=W,!C)return!1;if(I===R)break}return!0}for(let S=0;S<m.length;S++)if(!x.has(S))for(let R=S+1;R<m.length;R++){if(x.has(R))continue;if(jl({start:m[S].start,end:m[S].end},{start:m[R].start,end:m[R].end},o)>.6){let I=(m[S].seg.arcAngle>=m[R].seg.arcAngle?S:R)===S?R:S;if(m[S].seg.arcAngle>=m[R].seg.arcAngle)x.add(R);else{x.add(S);break}}else{let W=y(m[S].start,m[S].end),I=y(m[R].start,m[R].end),C=W<=I?S:R,H=W<=I?R:S;w(m[C].start,m[C].end,m[H].start,m[H].end)&&y(m[C].start,m[C].end)/y(m[H].start,m[H].end)<.7&&x.add(C)}}let z=m.filter((S,R)=>!x.has(R)),M=10,P=10,E=30,T=15,V=[],_=0;if(z.length>0){for(let D of z)D.start=(D.start-T+o)%o,D.end=(D.end+T)%o;let S=[...z].sort((D,W)=>D.start-W.start),R=S[0];for(let D=1;D<S.length;D++){let W=S[D],I=W.start-R.end;I<0&&(R.end>o*.5&&W.start<o*.5?I=W.start+o-R.end:I=0);let C=I===0,H=I<=E&&C;if(!H&&I<=E){let A=Math.sqrt((R.seg.centerX-W.seg.centerX)**2+(R.seg.centerZ-W.seg.centerZ)**2),k=Math.max(R.seg.radius,W.seg.radius),O=Math.min(R.seg.radius,W.seg.radius),N=O>0?k/O:99;H=A<P&&N<M}if(H){let A=Math.min(R.start,W.start),k=Math.max(R.end,W.end),O=[];for(let G=A;O.push({...t[G]}),G!==k;G=(G+1)%o);let{cx:N,cz:L,r:B}=hn(O),$=0;for(let G=1;G<O.length;G++){let Q=O[G-1].x-N,q=O[G-1].z-L,X=O[G].x-N,Y=O[G].z-L;$+=Math.abs(Math.atan2(Q*Y-q*X,Q*X+q*Y))}R={seg:{points:O,type:"C_curve",radius:B,centerX:N,centerZ:L,arcAngle:$,arcLength:Se(O)},start:R.start,end:W.end,source:R.source},_++}else V.push(R),R=W}V.push(R)}{if(V.length>1){let R=V.map((D,W)=>{if(W===0)return 0;let I=D.start-V[W-1].end;return I<0&&(I=D.start+o-V[W-1].end),I})}let S=[];for(let R=0;R<V.length;R++){if(S.length===0){S.push(V[R]);continue}let D=S[S.length-1],W=V[R].start-D.end;if(W<0&&(W=V[R].start+o-D.end),W<=30){let I=[...D.seg.points];for(let O=(D.end+1)%o;I.push({...t[O]}),O!==V[R].end;O=(O+1)%o);let{cx:C,cz:H,r:A}=hn(I),k=0;for(let O=1;O<I.length;O++){let N=I[O-1].x-C,L=I[O-1].z-H,B=I[O].x-C,$=I[O].z-H;k+=Math.abs(Math.atan2(N*$-L*B,N*B+L*$))}S[S.length-1]={seg:{points:I,type:"C_curve",radius:A,centerX:C,centerZ:H,arcAngle:k,arcLength:Se(I)},start:D.start,end:V[R].end,source:D.source}}else S.push(V[R])}V=S}return V.map((S,R)=>{let D=S.seg;return D.candidateId=R,D})}function Gl(t){let e=t.length;if(e<6)return null;let n=Nl(t,e,.35);if(n.length===0)return null;let o=n.filter(a=>a.actualAngle!=null&&a.actualAngle>.17);if(o.length===0)return null;o.sort((a,h)=>{let g=a.end>=a.start?a.end-a.start+1:e-a.start+a.end+1;return(h.end>=h.start?h.end-h.start+1:e-h.start+h.end+1)-g});let r=o[0],s=[];for(let a=r.start;s.push({...t[a]}),a!==r.end;a=(a+1)%e);if(s.length<10)return null;let{cx:i,cz:l,r:u,rmsResidual:d}=hn(s);if(u>.1&&d>.1)return null;let f=r.actualAngle,c=s.reduce((a,h,g)=>g===0?0:a+Math.hypot(h.x-s[g-1].x,h.z-s[g-1].z),0);return u>.3&&f>.17?{points:s,type:"C_curve",radius:u,centerX:i,centerZ:l,arcAngle:f,arcLength:c}:null}function ho(t,e,n){let o={...es,...n},r=Date.now(),s=t,i=Array.isArray(e)?e:[],l=[];if(i.length>10)try{for(let S of i){let R=S.x1,D=S.z1,W=S.x2,I=S.z2;if(R==null||D==null||W==null||I==null){let C=S.start?.x,H=S.start?.y,A=S.end?.x,k=S.end?.y;if(C==null||H==null||A==null||k==null)continue;l.push({ax:C,az:H,bx:A,bz:k})}else l.push({ax:R,az:D,bx:W,bz:I})}let v=.1*.1;if(l.length>5){let S=[],R=[],D=new Array(l.length).fill(0);for(let I of t){let C=1/0,H=-1;for(let A=0;A<l.length;A++){let k=l[A],O=k.bx-k.ax,N=k.bz-k.az,L=O*O+N*N,B;if(L<1e-8)B=(I.x-k.ax)**2+(I.y-k.az)**2;else{let $=((I.x-k.ax)*O+(I.y-k.az)*N)/L;$=Math.max(0,Math.min(1,$));let G=k.ax+$*O,Q=k.az+$*N;B=(I.x-G)**2+(I.y-Q)**2}if(B<C&&(C=B,H=A),C<=v)break}C<=v&&(R.push(I),S.push(H),D[H]++)}let W=R;if(o.lineDensityMin>0&&o.lineDensityMinLen>0){let I=new Set;for(let C=0;C<l.length;C++){let H=l[C],A=Math.hypot(H.bx-H.ax,H.bz-H.az);if(A>=o.lineDensityMinLen)continue;(A>.01?D[C]/A:0)<o.lineDensityMin&&I.add(C)}if(I.size>0){let C=[];for(let H=0;H<R.length;H++)I.has(S[H])||C.push(R[H]);W=C}}s=W}}catch(v){console.warn("[\u70B9\u4E91\u8F6E\u5ED3] \u7EBF\u6BB5\u8FC7\u6EE4\u5931\u8D25:",v)}let u=Xl(l),d=[];for(let v of s){let S=v.z;S<o.heightMin||S>o.heightMax||d.push({x:v.x,z:v.y})}if(d.length<50)return Qe(e,r);if(o.sparseRadius>0){let v=new Map,S=o.cellSize;for(let I of d){let C=`${Math.round(I.x/S)},${Math.round(I.z/S)}`;v.has(C)||v.set(C,[]),v.get(C).push(I)}let R=[],D=Math.ceil(o.sparseRadius/S);for(let I=-D;I<=D;I++)for(let C=-D;C<=D;C++)R.push(`${I},${C}`);let W=[];for(let I of d){let C=Math.round(I.x/S),H=Math.round(I.z/S),A=0;for(let k of R){let[O,N]=k.split(",").map(Number),L=v.get(`${C+O},${H+N}`);if(L&&(A+=L.length),A>=o.sparseMinNeighbors)break}A>=o.sparseMinNeighbors&&W.push(I)}d.length=0;for(let I=0;I<W.length;I++)d.push(W[I])}if(d.length<50)return Qe(e,r);let f=Date.now(),{cells:c}=fo(d,o.cellSize),a=new Set;if(o.densityRatio>0&&c.size>10){let v=Array.from(c.values()).sort((D,W)=>D-W),S=v[Math.floor(v.length/2)],R=Math.max(o.densityThreshold,Math.ceil(S*o.densityRatio));for(let[D,W]of c)W>=R&&a.add(D);if(a.size<o.minComponentCells){a.clear();for(let[D,W]of c)W>=o.densityThreshold&&a.add(D)}}else for(let[v,S]of c)S>=o.densityThreshold&&a.add(v);if(a.size<o.minComponentCells)return Qe(e,r);let h=a;o.closeIterations>0&&(h=Wn(a,o.closeIterations));let g=Date.now(),p=Jo(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=ts(v,o.cellSize);S.length>=4&&x.push(S)}let y=Date.now(),w=x.map(v=>{let S=Cn(v,o.simplifyEpsilon);if(S.length>=7)for(let R=0;R<2;R++){let D=S.length,W=S.map(I=>({x:I.x,z:I.z}));for(let I=0;I<D;I++){let C=S[(I-1+D)%D],H=S[I],A=S[(I+1)%D],k=H.x-C.x,O=H.z-C.z,N=A.x-H.x,L=A.z-H.z,B=Math.sqrt(k*k+O*O),$=Math.sqrt(N*N+L*L);if(B<.001||$<.001)continue;if(Math.abs(Math.atan2(k*L-O*N,k*N+O*L))>1.8){let Q=[-2,-1,0,1,2].map(Y=>S[(I+Y+D)%D]),q=Q.map(Y=>Y.x).sort((Y,it)=>Y-it),X=Q.map(Y=>Y.z).sort((Y,it)=>Y-it);W[I]={x:q[2],z:X[2]}}}S=W}if(S=Qo(S),u.length>0&&S.length>=5)for(let R of u){let D=1/0,W=-1;for(let I=0;I<S.length;I++){let C=S[I].x-R.x,H=S[I].z-R.z,A=C*C+H*H;A<D&&(D=A,W=I)}W>=0&&D<.3*.3&&(S[W]={x:R.x,z:R.z})}if(S.length>2){let R=S[0],D=S[S.length-1];(Math.abs(R.x-D.x)>.001||Math.abs(R.z-D.z)>.001)&&S.push({...R})}return S}),z=o.cellSize/2;function M(v){let S=0;for(let R=0;R<v.length;R++){let D=(R+1)%v.length;S+=v[R].x*v[D].z-v[D].x*v[R].z}return S/2}let P=w.map(v=>{if(v.length<3)return v;let S=M(v)>=0;return v.map((R,D)=>{let W=v[(D-1+v.length)%v.length],I=v[(D+1)%v.length],C=I.x-W.x,H=I.z-W.z;if(Math.sqrt(C*C+H*H)<.001)return{...R};let k=S?H:-H,O=S?-C:C,N=Math.sqrt(k*k+O*O);return N<.001?{...R}:{x:R.x+k/N*z,z:R.z+O/N*z}})}),E=Date.now(),T=[];for(let v=0;v<P.length;v++){let S=P[v];S.length<3||T.push({id:-v-1,points:S,length:Se(S),pointCount:S.length,type:"straight",isMain:!1})}let V=Date.now()-r,_=[];for(let v of w){let S=Ur(v);for(let D of S)_.push(D);let R=Gl(v);R&&_.push(R)}return{mainWalls:[],noiseWalls:[],contours:T,curvedSegments:_,filteredPoints:s,stats:{totalRawLines:e?.length??t.length,totalWalls:0,mainCount:0,noiseCount:T.length,elapsedMs:V}}}function Kr(t,e){let n=e?.cellSize??.05,o=e?.closeIterations??2,r=e?.minComponentCells??10,s=e?.simplifyEpsilon??.02,i=Date.now();if(t.length<3)return Qe(t,i);let l=t.map(T=>({x1:T.x1,z1:T.z1,x2:T.x2,z2:T.z2})),{active:u}=Zr(l,n);if(u.size<r)return Qe(t,i);let d=Date.now(),f=Wn(u,o),c=Date.now(),a=Jo(f).filter(T=>T.size>=r);if(a.length===0)return Qe(t,i);let h=a.reduce((T,V)=>T.size>=V.size?T:V),g=Date.now(),p=ts(h,n);if(p.length<4)return Qe(t,i);let b=Date.now(),m=Cn(p,s);if(m=Qo(m),m.length>2){let T=m[0],V=m[m.length-1];(Math.abs(T.x-V.x)>.001||Math.abs(T.z-V.z)>.001)&&m.push({...T})}let x=n/2;function y(T){let V=0;for(let _=0;_<T.length;_++){let v=(_+1)%T.length;V+=T[_].x*T[v].z-T[v].x*T[_].z}return V/2}let w=y(m)>=0,z=m.map((T,V)=>{let _=m[(V-1+m.length)%m.length],v=m[(V+1)%m.length],S=v.x-_.x,R=v.z-_.z;if(Math.sqrt(S*S+R*R)<.001)return{...T};let W=w?R:-R,I=w?-S:S,C=Math.sqrt(W*W+I*I);return C<.001?{...T}:{x:T.x+W/C*x,z:T.z+I/C*x}}),M=Date.now(),P=[];z.length>=3&&P.push({id:-1,points:z,length:Se(z),pointCount:z.length,type:"straight",isMain:!0});let E=Date.now()-i;return{mainWalls:[],noiseWalls:[],contours:P,stats:{totalRawLines:t.length,totalWalls:0,mainCount:0,noiseCount:P.length,elapsedMs:E}}}function Qe(t,e){return{mainWalls:[],noiseWalls:[],stats:{totalRawLines:t?.length??0,totalWalls:0,mainCount:0,noiseCount:0,elapsedMs:Date.now()-e}}}function mo(t,e,n){if(!t.length||n<=1)return t;let o=new Map;for(let l of t){let u=Math.floor(l.x/e),d=Math.floor(l.y/e),f=`${u},${d}`;o.has(f)||o.set(f,[]),o.get(f).push(l)}let r=new Map;for(let[l,u]of o){let[d,f]=l.split(","),c=parseInt(d),a=parseInt(f),h=0;for(let g=-2;g<=2;g++)for(let p=-2;p<=2;p++){let b=`${c+g},${a+p}`;h+=o.get(b)?.length??0}r.set(l,h)}let s=[],i=0;for(let l of t){let u=Math.floor(l.x/e),d=Math.floor(l.y/e),f=`${u},${d}`;(r.get(f)??0)>=n?s.push(l):i++}return s}function go(t,e,n){if(!t.length||n<=1||e<=0)return t;let o=new Map;for(let s of t){let i=Math.floor(s.x/e),l=Math.floor(s.y/e),u=Math.floor(s.z/e),d=`${i},${l},${u}`;o.has(d)||o.set(d,[]),o.get(d).push(s)}let r=[];for(let s of o.values())if(s.length>=n){let i=s.reduce((d,f)=>d+f.x,0)/s.length,l=s.reduce((d,f)=>d+f.y,0)/s.length,u=s.reduce((d,f)=>d+f.z,0)/s.length;r.push({x:i,y:l,z:u})}return r}function Qr(t,e,n){let o=go(t,e,n),r=t.length-o.length;return o}function Jr(t){let e=[];for(let d of t){let f=d.originalPoints??d.points??[];if(!Array.isArray(f)||f.length<2)continue;let c=Math.min(f.length,200);for(let a=1;a<c;a++){let h=Math.hypot(f[a].x-f[a-1].x,f[a].y-f[a-1].y,f[a].z-f[a-1].z);h>.001&&e.push(h)}}let n={voxelSize:.08,minPoints:3,minCentroids:3};if(e.length<10)return n;e.sort((d,f)=>d-f);let o=e[Math.floor(e.length/2)],r=Math.max(.03,Math.min(.25,o*3.5));r=Math.round(r*100)/100;let s=Math.pow(r/o,2),i=Math.max(2,Math.min(5,Math.round(s/4))),l=e.length/Math.max(1,t.length),u=Math.max(2,Math.min(4,Math.round(l/50)));return{voxelSize:r,minPoints:i,minCentroids:u}}function ti(t,e,n,o,r=3){if(!t.length||n<=0||o<=1)return{data:t,lines:e,removedCount:0};let s=[],i=[],l=0;for(let u=0;u<t.length;u++){let d=t[u],f=d.originalPoints??d.points??[];if(!Array.isArray(f)||f.length===0){s.push(d),i.push(e[u]);continue}let c=go(f,n,o);c.length>=r?(d.originalPoints&&(d.originalPoints=c),d.points&&(d.points=c),s.push(d),i.push(e[u])):l++}return{data:s,lines:i,removedCount:l}}function ei(t,e,n,o){let r=[],s=[],i=0;for(let l=0;l<t.length;l++){let u=t[l],d=u.originalPoints??u.points??[],c=(Array.isArray(d)?d.filter(b=>b&&b.x!==void 0&&b.y!==void 0):[]).length;if(c===0){r.push(u),s.push({...e[l],id:r.length-1});continue}let a=u.start??u,h=u.end??u,g=Math.hypot(h.x??0-a.x??0,h.y??0-a.y??0);if(g>=o||g<=.01){r.push(u),s.push({...e[l],id:r.length-1});continue}if(c/g<n){i++;continue}r.push(u),s.push({...e[l],id:r.length-1})}return{data:r,lines:s}}function Je(t,e,n,o,r,s){let i=r-n,l=s-o,u=i*i+l*l;if(u===0)return Math.hypot(t-n,e-o);let d=((t-n)*i+(e-o)*l)/u;return d=Math.max(0,Math.min(1,d)),Math.hypot(t-(n+d*i),e-(o+d*l))}function ns(t,e,n=.2){for(let o of e)if(Je(o.x,o.z,t.x1,t.z1,t.x2,t.z2)<=n)return!0;return!1}function ni(t,e,n=.2){let o=1/0,r={x:0,z:0};for(let i of e){let l=Je(i.x,i.z,t.x1,t.z1,t.x2,t.z2);l<o&&(o=l,r=i)}return o<=n}function oi(t,e,n,o=!0){function g(y,w,z,M){let P=z.points[0],E=z.points[z.points.length-1];return Math.hypot(y-P.x,w-P.z)<=M||Math.hypot(y-E.x,w-E.z)<=M}function p(y,w,z,M){for(let P=0;P<z.points.length-1;P++)if(Je(y,w,z.points[P].x,z.points[P].z,z.points[P+1].x,z.points[P+1].z)<=M)return!0;return!1}function b(y,w,z){let M=0,P=y[0],E=y[y.length-1];for(let T of w)if(g(P.x,P.z,T,z)||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,_=b(w,e,.8),v=y.arcAngle>1.745&&y.radius<5,S=y.radius>15&&P>.15&&w.length>=10,R=P>.12&&y.radius>1&&y.radius<4&&y.arcAngle>=.35&&w.length>=3;if(o&&console.log(` \u7279\u5F81: \u5F26\u957F/\u534A\u5F84=${P.toFixed(3)} \u5F13\u9AD8/\u5F26\u957F=${V.toFixed(4)} \u8FDE\u63A5=${_}/2${v?" \u5927\u5F27\u89D2\u8C41\u514D":""}${S?" \u5927\u534A\u5F84\u7ED3\u6784\u5F27":""}${R?" \u5408\u7406\u77ED\u5F27\u8C41\u514D":""}`),w.length>20&&y.arcAngle>5.2&&y.radius>.2){o&&console.log(` \u2192 \u8FD1\u95ED\u5408\u5706\u8C41\u514D(\u5F27\u89D2=${(y.arcAngle*180/Math.PI).toFixed(1)}\xB0, ${w.length}pts)`),x.push(y);continue}if(P<.15)if(_>=2&&y.arcAngle>=.35)o&&console.log(` \u2192 \u5F26\u957F/\u534A\u5F84=${P.toFixed(3)} < ${.15}\uFF0C\u4F46\u4E24\u7AEF\u8FDE\u63A5+\u5F27\u89D2>20\xB0\uFF0C\u8C41\u514D`);else{o&&console.log(` \u2192 \u5F26\u957F/\u534A\u5F84=${P.toFixed(3)} < ${.15}\uFF0C\u8F6E\u5ED3\u6296\u52A8\u5047\u5F27 \u8FC7\u6EE4`);continue}let D=_>=2?.025:.035;if(V<D&&!v&&!R&&!S){o&&console.log(` \u2192 \u5F13\u9AD8/\u5F26\u957F=${V.toFixed(4)} < ${D}(${_>=2?"\u5BBD\u677E":"\u6807\u51C6"})\uFF0C\u6781\u6241\u5F27(\u76F4\u7EBF\u6BB5\u566A\u58F0) \u8FC7\u6EE4`);continue}if(!v&&!R&&!S){if(y.arcAngle<.17){o&&console.log(` \u2192 \u5F27\u89D2<${(.17*180/Math.PI).toFixed(0)}\xB0 \u8FC7\u6EE4`);continue}if(y.arcAngle<.35&&_<2){o&&console.log(` \u2192 \u5F27\u89D2<${(.35*180/Math.PI).toFixed(0)}\xB0 \u4E14\u672A\u4E24\u7AEF\u8FDE\u63A5 \u8FC7\u6EE4`);continue}}if(P>2.01){o&&console.log(` \u2192 \u5F26\u957F/\u534A\u5F84=${P.toFixed(3)} > 2.01\uFF0C\u5F26\u957F\u8D85\u8FC7\u76F4\u5F84\uFF0C\u5F02\u5E38 \u8FC7\u6EE4`);continue}if(!v&&!S){let W=_>=2?2.5:1.5,I=Math.floor(w.length/2),C=w[I].x-w[0].x,H=w[I].z-w[0].z,A=w[w.length-1].x-w[I].x,k=w[w.length-1].z-w[I].z,O=Math.atan2(H,C),N=Math.atan2(k,A),L=Math.abs(N-O);if(L>Math.PI&&(L=2*Math.PI-L),L>60*Math.PI/180&&L>y.arcAngle*W){o&&console.log(` \u2192 V\u5F62\u62D0\u89D2\u8FC7\u6EE4 \u8F6C\u89D2=${(L*180/Math.PI).toFixed(1)}\xB0 > \u5F27\u89D2\xD7${W.toFixed(1)}=${(y.arcAngle*180/Math.PI*W).toFixed(1)}\xB0`);continue}}if(n&&n.length>5&&!(y.radius>15&&y.arcAngle>.26)){let W=w[0],I=w[w.length-1],C=.3,H=null,A=1/0,k=null,O=1/0;for(let N of n){let L=Je(W.x,W.z,N.x1,N.z1,N.x2,N.z2),B=Je(I.x,I.z,N.x1,N.z1,N.x2,N.z2);L<C&&L<A&&(H=N,A=L),B<C&&B<O&&(k=N,O=B)}if(!H||!k)console.log(` [\u7EBF\u6BB5\u8F6C\u89D2\u8C03\u8BD5 #${M}] \u672A\u627E\u5230\u5B8C\u6574\u7EBF\u6BB5: \u8D77\u7AEF=${!!H}(d=${A.toFixed(3)}) \u672B\u7AEF=${!!k}(d=${O.toFixed(3)})`);else if(H===k){console.log(" \u2192 \u7EBF\u6BB5\u8F6C\u89D2\u9A8C\u8BC1: \u5F27\u4E24\u7AEF\u5728\u540C\u4E00\u6761\u7EBF\u6BB5\u4E0A, \u76F4\u7EBF\u566A\u58F0\u5047\u5F27 \u8FC7\u6EE4");continue}else{let N=H.x2-H.x1,L=H.z2-H.z1,B=k.x2-k.x1,$=k.z2-k.z1,G=Math.sqrt(N*N+L*L),Q=Math.sqrt(B*B+$*$);if(G>.01&&Q>.01){let q=Math.abs(Math.atan2(N*$-L*B,N*B+L*$)),X=q*180/Math.PI;if(console.log(` [\u7EBF\u6BB5\u8F6C\u89D2\u8C03\u8BD5 #${M}] \u5F27\u4E24\u7AEF\u6BB5\u5939\u89D2=${X.toFixed(1)}\xB0 \u5F27\u89D2=${(y.arcAngle*180/Math.PI).toFixed(1)}\xB0`),q>.35&&q<3.05){let Y=q>2.09;if(!Y||y.arcAngle<.44){console.log(` \u2192 \u7EBF\u6BB5\u8F6C\u89D2\u9A8C\u8BC1: \u5F27\u4E24\u7AEF\u6BB5\u5939\u89D2=${X.toFixed(1)}\xB0\uFF0C${Y?"\u659C\u5899":"\u6298\u5899"}\u78E8\u5706\u5047\u5F27 \u8FC7\u6EE4`);continue}}}}}o&&console.log(" \u2192 \u2713 \u4FDD\u7559"),x.push(y)}return o&&console.log(`[\u56DE\u52A0\u5224\u65AD] ${t.length} \u2192 ${x.length} \u4E2A\u5F27\u6BB5`),x}function si(t,e){for(let n=0;n<t.length;n++){let o=t[n],r=[];for(let i of e)ns(i,o.points)&&r.push({id:i.id,len:Math.hypot(i.x2-i.x1,i.z2-i.z1)});r.sort((i,l)=>l.len-i.len);let s=r.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 ${r.length} \u6761: ${s}`)}}var ss={gridSize:2,connectDist:.8,angleTol:25,minLength:.8,minPointCount:3,hardCornerThreshold:30,minArea:5,minCurvePoints:6,curveStraightDist:.25,longWallMinLength:5};function ri(t){if(!t.length)return{rotated:[],mainAngle:0};let e=180,n=new Array(e).fill(0),o=Math.PI/e;for(let f of t){let c=f.x2-f.x1,a=f.z2-f.z1,h=Math.sqrt(c*c+a*a);if(h<.01)continue;let g=Pe(c,a),p=Math.floor(g/o);p>=e&&(p=e-1),n[p]+=h}let r=new Array(e).fill(0),s=5;for(let f=0;f<e;f++){let c=0;for(let a=-s;a<=s;a++){let h=f+a;h<0&&(h+=e),h>=e&&(h-=e),c+=n[h]}r[f]=c}let i=0,l=0;for(let f=0;f<e;f++)r[f]>i&&(i=r[f],l=f);let u=(l+.5)*o;return{rotated:t.map(f=>{let c=Vn(f.x1,f.z1,-u),a=Vn(f.x2,f.z2,-u);return{...f,x1:c.x,z1:c.z,x2:a.x,z2:a.z}}),mainAngle:u}}function ii(t,e){let n=new Map;for(let o of t){let r=(o.x1+o.x2)/2,s=(o.z1+o.z2)/2,i=Math.floor(r/e),l=Math.floor(s/e),u=`${i},${l}`;n.has(u)||n.set(u,[]),n.get(u).push(o)}return n}function ai(t,e,n){if(t.length===0)return[];let o=new Set,r=[];for(let s of t){if(o.has(s.id))continue;let i=[s],l=[],u=new Set([s.id]);o.add(s.id);let d=!0;for(;d;){d=!1;let a=i[i.length-1],h=a.x2,g=a.z2,p=Pe(a.x2-a.x1,a.z2-a.z1),b=null,m=e;for(let x of t){if(o.has(x.id))continue;let y=be(h,g,x.x1,x.z1),w=be(h,g,x.x2,x.z2),z=w<y,M=Math.min(y,w);if(M>m)continue;let P=z?Pe(x.x1-x.x2,x.z1-x.z2):Pe(x.x2-x.x1,x.z2-x.z1);Math.abs(vn(P-p))>n||(b=x,m=M)}if(b){o.add(b.id),u.add(b.id);let x=i[i.length-1],y=be(x.x2,x.z2,b.x1,b.z1),w=be(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}),d=!0}}for(d=!0;d;){d=!1;let a=l.length>0?l[l.length-1]:i[0],h=l.length>0?a.x2:a.x1,g=l.length>0?a.z2:a.z1,p=l.length>0?Pe(a.x2-a.x1,a.z2-a.z1):Pe(a.x2-a.x1,a.z2-a.z1),b=null,m=e;for(let x of t){if(o.has(x.id))continue;let y=be(h,g,x.x1,x.z1),w=be(h,g,x.x2,x.z2),z=w<y,M=Math.min(y,w);if(M>m)continue;let P=z?Pe(x.x1-x.x2,x.z1-x.z2):Pe(x.x2-x.x1,x.z2-x.z1);Math.abs(vn(P-p))>n||(b=x,m=M)}if(b){o.add(b.id),u.add(b.id);let x=be(h,g,b.x1,b.z1),y=be(h,g,b.x2,b.z2);x<=y?l.push({id:b.id,x1:b.x2,z1:b.z2,x2:b.x1,z2:b.z1}):l.push({...b}),d=!0}}let f=[];for(let a=l.length-1;a>=0;a--){let h=l[a];a===l.length-1&&f.push({x:h.x1,z:h.z1}),f.push({x:h.x2,z:h.z2})}for(let a=0;a<i.length;a++){let h=i[a];a===0&&f.length===0&&f.push({x:h.x1,z:h.z1}),f.push({x:h.x2,z:h.z2})}let c=[];for(let a of f){if(c.length>0){let h=c[c.length-1];if(Math.abs(a.x-h.x)<.001&&Math.abs(a.z-h.z)<.001)continue}c.push(a)}if(c.length>=2){let a=Se(c);r.push({points:c,length:a,pointCount:i.length+l.length,lineIds:[...u]})}}return r}function li(t){if(t.length<3)return[];let e=[];for(let n=1;n<t.length-1;n++){let o=t[n].x-t[n-1].x,r=t[n].z-t[n-1].z,s=t[n+1].x-t[n].x,i=t[n+1].z-t[n].z,l=Math.atan2(r,o),u=Math.atan2(i,s),d=vn(u-l);e.push(d)}return e}function ci(t,e=6){if(t.length<3)return"straight";let n=t[0],o=t[t.length-1],r=o.x-n.x,s=o.z-n.z;if(Math.sqrt(r*r+s*s)>.1){let f=0;for(let c of t){let a=In(c.x,c.z,n.x,n.z,o.x,o.z);a>f&&(f=a)}if(f<.05)return"straight"}let l=li(t);if(l.reduce((f,c)=>f+Math.abs(c),0)<.1||t.length<e)return"straight";let d=0;for(let f=0;f<l.length-1;f++)l[f]*l[f+1]<0&&d++;return d>0?"S_curve":"C_curve"}function ui(t,e){if(t.length<3)return[t];let n=uo(e),o=li(t),r=[],s=0;for(let i=0;i<o.length;i++)Math.abs(o[i])>n&&(r.push(t.slice(s,i+2)),s=i+1);return s<t.length-1&&r.push(t.slice(s)),r}function fi(t,e,n=6){let o=[],r=0;for(let s of t){let i=ui(s.points,e);for(let l of i){if(l.length<2)continue;let u=ci(l,n),d=Se(l),f=d/(s.length||1),c=Math.max(1,Math.round(s.pointCount*f));o.push({id:r++,points:l,length:d,pointCount:c,lineIds:s.lineIds,type:u,isMain:!1})}}return o}function di(t,e){if(t.length<3)return new Set;let n=.15;function o(d,f){return Math.round(d/n)+"_"+Math.round(f/n)}let r=new Map,s=0;function i(d,f){let c=o(d,f),a=r.get(c);if(a)return a;let h=Math.round(d/n),g=Math.round(f/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=r.get(y);if(!w)continue;let z=w.x-d,M=w.z-f,P=z*z+M*M;P<b&&(b=P,p=w)}return p?(r.set(c,p),p):(a={id:s++,x:d,z:f,edges:[]},r.set(c,a),a)}for(let d of t){if(d.points.length<2)continue;let f=d.points[0],c=d.points[d.points.length-1],a=i(f.x,f.z),h=i(c.x,c.z);if(a.id===h.id)continue;let g={to:h,wallId:d.id,visited:!1,twin:null},p={to:a,wallId:d.id,visited:!1,twin:g};g.twin=p,a.edges.push(g),h.edges.push(p)}for(let d of r.values())d.edges.sort((f,c)=>{let a=Math.atan2(f.to.z-d.z,f.to.x-d.x),h=Math.atan2(c.to.z-d.z,c.to.x-d.x);return a-h});let l=new Set,u=new Set;for(let d of r.values())for(let f of d.edges)u.add(f);for(let d of u){if(d.visited)continue;let f=[],c=d,a=u.size+10;for(;!c.visited&&f.length<a;){c.visited=!0,f.push(c);let h=c.to,g=c.twin,p=h.edges.indexOf(g);if(p<0)break;let b=(p+1)%h.edges.length;c=h.edges[b]}if(f.length>=3){let h=f[0];if(f[f.length-1].to.id===h.from?.id){let p=[],b=new Set,m=null;for(let x of r.values())if(x.edges.includes(f[0])){m=x;break}if(!m)continue;p.push({x:m.x,z:m.z});for(let x of f)b.add(x.wallId),p.push({x:x.to.x,z:x.to.z});if(f[f.length-1].to.id===m.id&&Ko(p)>=e)for(let y of b)l.add(y)}}}return l}function mn(t,e){let n={...ss,...e},o=Date.now(),{rotated:r,mainAngle:s}=ri(t),i=Date.now(),l=ii(r,n.gridSize),u=Date.now(),d=uo(n.angleTol),f=[];for(let v of l.values()){let S=v.map(D=>({id:D.id,x1:D.x1,z1:D.z1,x2:D.x2,z2:D.z2})),R=ai(S,n.connectDist,d);f.push(...R)}let c=Date.now(),a=new Set,h=f.filter(v=>{let S=v.length>=n.minLength||v.pointCount>=n.minPointCount;return S&&a.add(v),S}),g=f.filter(v=>!a.has(v)),p=Date.now(),b=fi(h,n.hardCornerThreshold,n.minCurvePoints),m=Date.now(),x=di(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],W=v[v.length-1],I=S[0],C=S[S.length-1];return Math.hypot(D.x-I.x,D.z-I.z)<R||Math.hypot(D.x-C.x,D.z-C.z)<R||Math.hypot(W.x-I.x,W.z-I.z)<R||Math.hypot(W.x-C.x,W.z-C.z)<R}let z=[],M=[];for(let v of b){if(v.type==="straight"&&v.points.length>=2){let S=!1;for(let R of b){if(R.id===v.id||R.type==="straight"||w(v.points,R.points))continue;if(Gr(v.points,R.points)<n.curveStraightDist){S=!0;break}}if(S){z.push({...v,id:-z.length-1});continue}}M.push(v)}let P=Date.now(),E=M,T=[];for(let v=0;v<g.length;v++){let S=g[v];T.push({id:-v-1,points:S.points,length:S.length,pointCount:S.pointCount,lineIds:S.lineIds,type:"straight",isMain:!1})}for(let v of z)T.push(v);let V=v=>v.map(S=>({...S,points:S.points.map(R=>Vn(R.x,R.z,s))})),_=Date.now()-o;return{mainWalls:V(E),noiseWalls:V(T),stats:{totalRawLines:t.length,totalWalls:b.length,mainCount:E.length,noiseCount:T.length,elapsedMs:_}}}function rs(t,e,n){let o={...es,...n},r=Date.now(),s=[];for(let h of t){let g=h.z;g<o.heightMin||g>o.heightMax||s.push({x:h.x,z:h.y})}if(s.length<100)return mn(e);let{cells:i}=fo(s,o.cellSize),l=new Set;for(let[h,g]of i)g>=o.densityThreshold&&l.add(h);let u=Wn(l,o.morphIterations),d=[],f={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){d.push(h);continue}let y=0,w=9;for(let z=0;z<w;z++){let M=z/(w-1),P=g+(b-g)*M,E=p+(m-p)*M,T=Math.floor(P/o.cellSize),V=Math.floor(E/o.cellSize);u.has(T+","+V)&&y++}y>=Math.ceil(w*.5)?d.push(h):f.lowDensity++,f.total++}if(d.length<5)return mn(e);let c=mn(d),a=Date.now()-r;return c}function os(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 is(t,e,n){let o={outlierEnabled:!0,outlierCellSize:.1,outlierMinNeighbors:3,densityFilterEnabled:!1,...n},r=Date.now(),s=mn(t),i=s.mainWalls,l=s.noiseWalls,u=new Set(i.map(M=>M.id)),d=[];for(let M=0;M<e.length;M++){if(!u.has(M))continue;let P=e[M];if(!(!P||!Array.isArray(P)))for(let E of P)E&&E.x!==void 0&&E.y!==void 0&&E.z!==void 0&&d.push({x:E.x,y:E.y,z:E.z})}let f=d.length,c=d;o.outlierEnabled&&c.length>0&&(c=mo(c,o.outlierCellSize,o.outlierMinNeighbors));let a=[],h=[];if(c.length>=100){let M=o.pcConfig??{},P=ho(c,t,{cellSize:.05,densityThreshold:1,minComponentCells:8,simplifyEpsilon:.008,heightMin:.3,heightMax:2.8,closeIterations:8,densityRatio:.12,...M});a=P.contours??[],h=P.curvedSegments??[]}let g=[];if(h.length>0)for(let M=0;M<h.length;M++){let E=h[M].points;if(E.length<2)continue;let T=1/0,V=-1/0,_=1/0,v=-1/0;for(let D of E)D.x<T&&(T=D.x),D.x>V&&(V=D.x),D.z<_&&(_=D.z),D.z>v&&(v=D.z);let S=[];for(let D of t)ni(D,E,.2)&&S.push(D.id);let R=E.map(D=>({x:D.x,y:D.z,z:0}));g.push({id:M,originalPoints:R,rawLineIds:S})}let p;if(o.densityFilterEnabled&&c.length>0&&i.length>0){let M=new Set(s.mainWalls.map(T=>T.id)),P=t.filter(T=>M.has(T.id));p=rs(c,P).mainWalls}let b=new Set;for(let M of s.mainWalls)if(M.lineIds)for(let P of M.lineIds)b.add(P);let m=new Set;for(let M of s.noiseWalls)if(M.lineIds)for(let P of M.lineIds)m.add(P);let x=t.filter(M=>b.has(M.id)).map(os),y=t.filter(M=>m.has(M.id)).map(os),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(os)}let z=Date.now()-r;return{mainWalls:x,noiseWalls:y,contours:a,curvedSegments:h,lineCurves:g.length>0?g:void 0,filteredPoints:c,secondMainWalls:w,stats:{totalRawLines:t.length,firstMainCount:x.length,firstNoiseCount:y.length,contourCount:a.length,curvedCount:h.length,secondMainCount:p?.length,mainWallPointCount:f,filteredPointCount:c.length,elapsedMs:z}}}function hi(t,e){let n=Array.isArray(t)?t:t?.data??[],o=[],r=[];for(let l=0;l<n.length;l++){let u=n[l],d=u.start??u,f=u.end??u;o.push({id:l,x1:d.x??0,y1:d.z??0,z1:d.y??0,x2:f.x??0,y2:f.z??0,z2:f.y??0});let c=u.originalPoints??u.points??[],a=Array.isArray(c)?c.filter(h=>h&&h.x!==void 0):[];r.push(a)}let s=is(o,r,e),i=Array.isArray(t)?{data:t}:{...t};return i.lineCurves=s.lineCurves??[],i.lineCurveNum=s.curvedSegments?.length??0,i}export{ss as CONFIG,no as analyzeDoorQuad,je as analyzeQuad,go as applyVoxelFilter,lo as attachWindows,Ke as calcAngle,qi as checkBeamIsReasonable,Yr as classifyWallByPointCloudPCA,mn as classifyWallShapes,Ya as computeContour,Ye as computeDoorLocalFloorZ,Xe as computeLocalFloorZ,Jr as computeVoxelParams,ei as densityPreFilter,un as detectDoorPerpendicularWalls,Hl as detectPerpWalls,Pn as detectPerpendicularWalls,Aa as drawStaircase,oi as filterFalseArcCurves,jr as filterWalls,Xr as filterWallsHard,Dn as findDoorWalls,Fr as findMainByLoops,Tn as findWindowWalls,Ni as getBeamLine,Zi as getColLine,Pi as getLineCheckResults,fn as getMatcherAPI,ka as getMergeFloorMeaning,La as getMergeMeaning,Ei as getOneLineCheckResults,Ti as getOneLineClusterResults,Ba as getStaircase,ns as isRawLineNearArc,si as logArcRawSegments,Cl as matchWalls,$r as mergeCollinear,Ge as mergeCollinearSegments,Ue as mergeDoorCollinearSegments,_l as mergeWallSegments,io as normalizeAngles,$t as pointToDoorSegmentDist,ro as pointToSegDist,Je as pointToSegDist2D,Ve as pointToSegmentDist,qo as processData,Zo as processDoorData,rs as processFilteredByPointCloud,ho as processFromPointCloud,Kr as processFromSegments,Bl as processPipeline,hi as processSegments,Wl as processWallData,mo as removeOutlierPoints,Ie as rotateXZ,is as runMainWallPipeline,Nr as spatialGrid,Rn as splitDoorWallSegment,Al as splitWallSeg,Sn as splitWallSegment,_i as updateStEdPoint,Qr as voxelFilter,ti as voxelFilterLines};
|