rm-graphical-computing-node 1.0.20 → 1.0.21
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 ar=Object.defineProperty;var pi=Object.getOwnPropertyDescriptor;var gi=Object.getOwnPropertyNames;var xi=Object.getPrototypeOf,yi=Object.prototype.hasOwnProperty;var Oe=(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 gi(e))!yi.call(t,r)&&r!==n&&ar(t,r,{get:()=>e[r],enumerable:!(o=pi(e,r))||o.enumerable});return t};var wi=(t,e,n)=>(n=t!=null?mi(xi(t)):{},bi(e||!t||!t.__esModule?ar(n,"default",{value:t,enumerable:!0}):n,t));var _r=Oe((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(x,b,z,M,P){e(x,b,z||0,M||x.length-1,P||o)}function e(x,b,z,M,P){for(;M>z;){if(M-z>600){var E=M-z+1,S=b-z+1,I=Math.log(E),H=.5*Math.exp(2*I/3),D=.5*Math.sqrt(I*H*(E-H)/E)*(S-E/2<0?-1:1),T=Math.max(z,Math.floor(b-S*H/E+D)),R=Math.min(M,Math.floor(b+(E-S)*H/E+D));e(x,b,T,R,P)}var v=x[b],W=z,V=M;for(n(x,z,b),P(x[M],v)>0&&n(x,z,M);W<V;){for(n(x,W,V),W++,V--;P(x[W],v)<0;)W++;for(;P(x[V],v)>0;)V--}P(x[z],v)===0?n(x,z,V):(V++,n(x,V,M)),V<=b&&(z=V+1),b<=V&&(M=V-1)}}function n(x,b,z){var M=x[b];x[b]=x[z],x[z]=M}function o(x,b){return x<b?-1:x>b?1:0}var r=function(b){b===void 0&&(b=9),this._maxEntries=Math.max(4,b),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(b){var z=this.data,M=[];if(!w(b,z))return M;for(var P=this.toBBox,E=[];z;){for(var S=0;S<z.children.length;S++){var I=z.children[S],H=z.leaf?P(I):I;w(b,H)&&(z.leaf?M.push(I):y(b,H)?this._all(I,M):E.push(I))}z=E.pop()}return M},r.prototype.collides=function(b){var z=this.data;if(!w(b,z))return!1;for(var M=[];z;){for(var P=0;P<z.children.length;P++){var E=z.children[P],S=z.leaf?this.toBBox(E):E;if(w(b,S)){if(z.leaf||y(b,S))return!0;M.push(E)}}z=M.pop()}return!1},r.prototype.load=function(b){if(!(b&&b.length))return this;if(b.length<this._minEntries){for(var z=0;z<b.length;z++)this.insert(b[z]);return this}var M=this._build(b.slice(),0,b.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(b){return b&&this._insert(b,this.data.height-1),this},r.prototype.clear=function(){return this.data=m([]),this},r.prototype.remove=function(b,z){if(!b)return this;for(var M=this.data,P=this.toBBox(b),E=[],S=[],I,H,D;M||E.length;){if(M||(M=E.pop(),H=E[E.length-1],I=S.pop(),D=!0),M.leaf){var T=s(b,M.children,z);if(T!==-1)return M.children.splice(T,1),E.push(M),this._condense(E),this}!D&&!M.leaf&&y(M,P)?(E.push(M),S.push(I),I=0,H=M,M=M.children[0]):H?(I++,M=H.children[I],D=!1):M=null}return this},r.prototype.toBBox=function(b){return b},r.prototype.compareMinX=function(b,z){return b.minX-z.minX},r.prototype.compareMinY=function(b,z){return b.minY-z.minY},r.prototype.toJSON=function(){return this.data},r.prototype.fromJSON=function(b){return this.data=b,this},r.prototype._all=function(b,z){for(var M=[];b;)b.leaf?z.push.apply(z,b.children):M.push.apply(M,b.children),b=M.pop();return z},r.prototype._build=function(b,z,M,P){var E=M-z+1,S=this._maxEntries,I;if(E<=S)return I=m(b.slice(z,M+1)),i(I,this.toBBox),I;P||(P=Math.ceil(Math.log(E)/Math.log(S)),S=Math.ceil(E/Math.pow(S,P-1))),I=m([]),I.leaf=!1,I.height=P;var H=Math.ceil(E/S),D=H*Math.ceil(Math.sqrt(S));p(b,z,M,D,this.compareMinX);for(var T=z;T<=M;T+=D){var R=Math.min(T+D-1,M);p(b,T,R,H,this.compareMinY);for(var v=T;v<=R;v+=H){var W=Math.min(v+H-1,R);I.children.push(this._build(b,v,W,P-1))}}return i(I,this.toBBox),I},r.prototype._chooseSubtree=function(b,z,M,P){for(;P.push(z),!(z.leaf||P.length-1===M);){for(var E=1/0,S=1/0,I=void 0,H=0;H<z.children.length;H++){var D=z.children[H],T=c(D),R=h(b,D)-T;R<S?(S=R,E=T<E?T:E,I=D):R===S&&T<E&&(E=T,I=D)}z=I||z.children[0]}return z},r.prototype._insert=function(b,z,M){var P=M?b:this.toBBox(b),E=[],S=this._chooseSubtree(P,this.data,z,E);for(S.children.push(b),u(S,P);z>=0&&E[z].children.length>this._maxEntries;)this._split(E,z),z--;this._adjustParentBBoxes(P,E,z)},r.prototype._split=function(b,z){var M=b[z],P=M.children.length,E=this._minEntries;this._chooseSplitAxis(M,E,P);var S=this._chooseSplitIndex(M,E,P),I=m(M.children.splice(S,M.children.length-S));I.height=M.height,I.leaf=M.leaf,i(M,this.toBBox),i(I,this.toBBox),z?b[z-1].children.push(I):this._splitRoot(M,I)},r.prototype._splitRoot=function(b,z){this.data=m([b,z]),this.data.height=b.height+1,this.data.leaf=!1,i(this.data,this.toBBox)},r.prototype._chooseSplitIndex=function(b,z,M){for(var P,E=1/0,S=1/0,I=z;I<=M-z;I++){var H=l(b,0,I,this.toBBox),D=l(b,I,M,this.toBBox),T=g(H,D),R=c(H)+c(D);T<E?(E=T,P=I,S=R<S?R:S):T===E&&R<S&&(S=R,P=I)}return P||M-z},r.prototype._chooseSplitAxis=function(b,z,M){var P=b.leaf?this.compareMinX:f,E=b.leaf?this.compareMinY:d,S=this._allDistMargin(b,z,M,P),I=this._allDistMargin(b,z,M,E);S<I&&b.children.sort(P)},r.prototype._allDistMargin=function(b,z,M,P){b.children.sort(P);for(var E=this.toBBox,S=l(b,0,z,E),I=l(b,M-z,M,E),H=a(S)+a(I),D=z;D<M-z;D++){var T=b.children[D];u(S,b.leaf?E(T):T),H+=a(S)}for(var R=M-z-1;R>=z;R--){var v=b.children[R];u(I,b.leaf?E(v):v),H+=a(I)}return H},r.prototype._adjustParentBBoxes=function(b,z,M){for(var P=M;P>=0;P--)u(z[P],b)},r.prototype._condense=function(b){for(var z=b.length-1,M=void 0;z>=0;z--)b[z].children.length===0?z>0?(M=b[z-1].children,M.splice(M.indexOf(b[z]),1)):this.clear():i(b[z],this.toBBox)};function s(x,b,z){if(!z)return b.indexOf(x);for(var M=0;M<b.length;M++)if(z(x,b[M]))return M;return-1}function i(x,b){l(x,0,x.children.length,b,x)}function l(x,b,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=b;E<z;E++){var S=x.children[E];u(P,x.leaf?M(S):S)}return P}function u(x,b){return x.minX=Math.min(x.minX,b.minX),x.minY=Math.min(x.minY,b.minY),x.maxX=Math.max(x.maxX,b.maxX),x.maxY=Math.max(x.maxY,b.maxY),x}function f(x,b){return x.minX-b.minX}function d(x,b){return x.minY-b.minY}function c(x){return(x.maxX-x.minX)*(x.maxY-x.minY)}function a(x){return x.maxX-x.minX+(x.maxY-x.minY)}function h(x,b){return(Math.max(b.maxX,x.maxX)-Math.min(b.minX,x.minX))*(Math.max(b.maxY,x.maxY)-Math.min(b.minY,x.minY))}function g(x,b){var z=Math.max(x.minX,b.minX),M=Math.max(x.minY,b.minY),P=Math.min(x.maxX,b.maxX),E=Math.min(x.maxY,b.maxY);return Math.max(0,P-z)*Math.max(0,E-M)}function y(x,b){return x.minX<=b.minX&&x.minY<=b.minY&&b.maxX<=x.maxX&&b.maxY<=x.maxY}function w(x,b){return b.minX<=x.maxX&&b.minY<=x.maxY&&b.maxX>=x.minX&&b.maxY>=x.minY}function m(x){return{children:x,height:1,leaf:!0,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0}}function p(x,b,z,M,P){for(var E=[b,z];E.length;)if(z=E.pop(),b=E.pop(),!(z-b<=M)){var S=b+Math.ceil((z-b)/M/2)*M;t(x,S,b,z,P),E.push(b,S,S,z)}}return r})});var Ar=Oe((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,f=s[u];if(i(l,f)>=0)break;s[o]=f,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 f=(o<<1)+1,d=s[f],c=f+1;if(c<this.length&&i(s[c],d)<0&&(f=c,d=s[c]),i(d,u)>=0)break;s[o]=d,o=f}s[o]=u};function e(n,o){return n<o?-1:n>o?1:0}return t})});var Br=Oe((th,Lr)=>{Lr.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,f=0,d=u-1;f<u;d=f++){var c=n[o+f*2+0],a=n[o+f*2+1],h=n[o+d*2+0],g=n[o+d*2+1],y=a>i!=g>i&&s<(h-c)*(i-a)/(g-a)+c;y&&(l=!l)}return l}});var Or=Oe((eh,kr)=>{kr.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,f=0,d=u-1;f<u;d=f++){var c=n[f+o][0],a=n[f+o][1],h=n[d+o][0],g=n[d+o][1],y=a>i!=g>i&&s<(h-c)*(i-a)/(g-a)+c;y&&(l=!l)}return l}});var qr=Oe((nh,Gn)=>{var Fr=Br(),Nr=Or();Gn.exports=function(e,n,o,r){return n.length>0&&Array.isArray(n[0])?Nr(e,n,o,r):Fr(e,n,o,r)};Gn.exports.nested=Nr;Gn.exports.flat=Fr});var $r=Oe((Yn,jr)=>{(function(t,e){typeof Yn=="object"&&typeof jr<"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,y,w,m){let p,x,b,z,M=g[0],P=w[0],E=0,S=0;P>M==P>-M?(p=M,M=g[++E]):(p=P,P=w[++S]);let I=0;if(E<h&&S<y)for(P>M==P>-M?(b=p-((x=M+p)-M),M=g[++E]):(b=p-((x=P+p)-P),P=w[++S]),p=x,b!==0&&(m[I++]=b);E<h&&S<y;)P>M==P>-M?(b=p-((x=p+M)-(z=x-p))+(M-z),M=g[++E]):(b=p-((x=p+P)-(z=x-p))+(P-z),P=w[++S]),p=x,b!==0&&(m[I++]=b);for(;E<h;)b=p-((x=p+M)-(z=x-p))+(M-z),M=g[++E],p=x,b!==0&&(m[I++]=b);for(;S<y;)b=p-((x=p+P)-(z=x-p))+(P-z),P=w[++S],p=x,b!==0&&(m[I++]=b);return p===0&&I!==0||(m[I++]=p),I}function r(h){return new Float64Array(h)}let s=33306690738754716e-32,i=22204460492503146e-32,l=11093356479670487e-47,u=r(4),f=r(8),d=r(12),c=r(16),a=r(4);t.orient2d=function(h,g,y,w,m,p){let x=(g-p)*(y-m),b=(h-m)*(w-p),z=x-b;if(x===0||b===0||x>0!=b>0)return z;let M=Math.abs(x+b);return Math.abs(z)>=s*M?z:-(function(P,E,S,I,H,D,T){let R,v,W,V,C,_,A,B,k,F,L,O,$,G,Q,j,Z,Y,it=P-H,ht=S-H,Tt=E-D,nt=I-D;C=(Q=(B=it-(A=(_=134217729*it)-(_-it)))*(F=nt-(k=(_=134217729*nt)-(_-nt)))-((G=it*nt)-A*k-B*k-A*F))-(L=Q-(Z=(B=Tt-(A=(_=134217729*Tt)-(_-Tt)))*(F=ht-(k=(_=134217729*ht)-(_-ht)))-((j=Tt*ht)-A*k-B*k-A*F))),u[0]=Q-(L+C)+(C-Z),C=($=G-((O=G+L)-(C=O-G))+(L-C))-(L=$-j),u[1]=$-(L+C)+(C-j),C=(Y=O+L)-O,u[2]=O-(Y-C)+(L-C),u[3]=Y;let wt=(function(It,ot){let ft=ot[0];for(let rt=1;rt<It;rt++)ft+=ot[rt];return ft})(4,u),zt=i*T;if(wt>=zt||-wt>=zt||(R=P-(it+(C=P-it))+(C-H),W=S-(ht+(C=S-ht))+(C-H),v=E-(Tt+(C=E-Tt))+(C-D),V=I-(nt+(C=I-nt))+(C-D),R===0&&v===0&&W===0&&V===0)||(zt=l*T+n*Math.abs(wt),(wt+=it*V+nt*R-(Tt*W+ht*v))>=zt||-wt>=zt))return wt;C=(Q=(B=R-(A=(_=134217729*R)-(_-R)))*(F=nt-(k=(_=134217729*nt)-(_-nt)))-((G=R*nt)-A*k-B*k-A*F))-(L=Q-(Z=(B=v-(A=(_=134217729*v)-(_-v)))*(F=ht-(k=(_=134217729*ht)-(_-ht)))-((j=v*ht)-A*k-B*k-A*F))),a[0]=Q-(L+C)+(C-Z),C=($=G-((O=G+L)-(C=O-G))+(L-C))-(L=$-j),a[1]=$-(L+C)+(C-j),C=(Y=O+L)-O,a[2]=O-(Y-C)+(L-C),a[3]=Y;let Dt=o(4,u,4,a,f);C=(Q=(B=it-(A=(_=134217729*it)-(_-it)))*(F=V-(k=(_=134217729*V)-(_-V)))-((G=it*V)-A*k-B*k-A*F))-(L=Q-(Z=(B=Tt-(A=(_=134217729*Tt)-(_-Tt)))*(F=W-(k=(_=134217729*W)-(_-W)))-((j=Tt*W)-A*k-B*k-A*F))),a[0]=Q-(L+C)+(C-Z),C=($=G-((O=G+L)-(C=O-G))+(L-C))-(L=$-j),a[1]=$-(L+C)+(C-j),C=(Y=O+L)-O,a[2]=O-(Y-C)+(L-C),a[3]=Y;let Pt=o(Dt,f,4,a,d);C=(Q=(B=R-(A=(_=134217729*R)-(_-R)))*(F=V-(k=(_=134217729*V)-(_-V)))-((G=R*V)-A*k-B*k-A*F))-(L=Q-(Z=(B=v-(A=(_=134217729*v)-(_-v)))*(F=W-(k=(_=134217729*W)-(_-W)))-((j=v*W)-A*k-B*k-A*F))),a[0]=Q-(L+C)+(C-Z),C=($=G-((O=G+L)-(C=O-G))+(L-C))-(L=$-j),a[1]=$-(L+C)+(C-j),C=(Y=O+L)-O,a[2]=O-(Y-C)+(L-C),a[3]=Y;let Mt=o(Pt,d,4,a,c);return c[Mt-1]})(h,g,y,w,m,p,M)},t.orient2dfast=function(h,g,y,w,m,p){return(g-p)*(y-m)-(h-m)*(w-p)},Object.defineProperty(t,"__esModule",{value:!0})})});var Kr=Oe((oh,Ho)=>{"use strict";var Xr=_r(),Kn=Ar(),ga=qr(),xa=$r().orient2d;Kn.default&&(Kn=Kn.default);Ho.exports=Ur;Ho.exports.default=Ur;function Ur(t,e,n){e=Math.max(0,e===void 0?2:e),n=n||0;var o=Ma(t),r=new Xr(16);r.toBBox=function(p){return{minX:p[0],minY:p[1],maxX:p[0],maxY:p[1]}},r.compareMinX=function(p,x){return p[0]-x[0]},r.compareMinY=function(p,x){return p[1]-x[1]},r.load(t);for(var s=[],i=0,l;i<o.length;i++){var u=o[i];r.remove(u),l=Yr(u,l),s.push(l)}var f=new Xr(16);for(i=0;i<s.length;i++)f.insert(Io(s[i]));for(var d=e*e,c=n*n;s.length;){var a=s.shift(),h=a.p,g=a.next.p,y=Co(h,g);if(!(y<c)){var w=y/d;u=ya(r,a.prev.p,h,g,a.next.next.p,w,f),u&&Math.min(Co(u,h),Co(u,g))<=w&&(s.push(a),s.push(Yr(u,a)),r.remove(u),f.remove(a),f.insert(Io(a)),f.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 f=0;f<u.children.length;f++){var d=u.children[f],c=u.leaf?Wo(d,n,o):wa(n,o,d);c>s||l.push({node:d,dist:c})}for(;l.length&&!l.peek().node.children;){var a=l.pop(),h=a.node,g=Wo(h,e,n),y=Wo(h,o,r);if(a.dist<g&&a.dist<y&&Gr(n,h,i)&&Gr(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(Zr(t,n)||Zr(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 Zr(t,e){return t[0]>=e.minX&&t[0]<=e.maxX&&t[1]>=e.minY&&t[1]<=e.maxY}function Gr(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 un(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&&un(t,e,n)>0!=un(t,e,o)>0&&un(n,o,t)>0!=un(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++)ga(t[s],l)||u.push(t[s]);return Pa(u)}function Yr(t,e){var n={p:t,prev:null,next:null,minX:0,minY:0,maxX:0,maxY:0};return e?(n.next=e.next,n.prev=e,e.next.prev=n,e.next=n):(n.prev=n,n.next=n),n}function Co(t,e){var n=t[0]-e[0],o=t[1]-e[1];return n*n+o*o}function Wo(t,e,n){var o=e[0],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,f=o-e,d=i-r,c=l-s,a=t-r,h=e-s,g=u*u+f*f,y=u*d+f*c,w=d*d+c*c,m=u*a+f*h,p=d*a+c*h,x=g*w-y*y,b,z,M,P,E=x,S=x;x===0?(z=0,E=1,P=p,S=w):(z=y*p-w*m,P=g*p-y*m,z<0?(z=0,P=p,S=w):z>E&&(z=E,P=p+y,S=w)),P<0?(P=0,-m<0?z=0:-m>g?z=E:(z=-m,E=g)):P>S&&(P=S,-m+y<0?z=0:-m+y>g?z=E:(z=-m+y,E=g)),b=z===0?0:z/E,M=P===0?0:P/S;var I=(1-b)*t+b*n,H=(1-b)*e+b*o,D=(1-M)*r+M*i,T=(1-M)*s+M*l,R=D-I,v=T-H;return R*R+v*v}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&&un(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&&un(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 Ne from"three";import*as Fe from"three";var _t=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,f=Math.cos(n),d=Math.sin(n),c=i*o+l*r+u*s;return this.x=i*c*(1-f)+o*f+(-u*r+l*s)*d,this.y=l*c*(1-f)+r*f+(u*o-i*s)*d,this.z=u*c*(1-f)+s*f+(-l*o+i*r)*d,this}},An=class{constructor(e=new _t(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 _t().subVectors(n,e),s=new _t().subVectors(o,e),i=new _t().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 _t){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 _t(e.start.x,e.start.y,e.start.z),l=new _t(e.end.x,e.end.y,e.end.z),u=new _t(e.end.x,e.end.y,e.rooftopPz),f=new _t(e.start.x,e.start.y,e.rooftopPz),d=[i,l,u,f];for(let P=0;P<d.length;P++)if(!this.isValidVector3(d[P]))return console.error(`\u5899\u4F53\u57FA\u7840\u70B9${P}\u65E0\u6548:`,d[P]),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,y=new _t().subVectors(l,i).normalize(),w=i.x,m=i.y,p=i.z,x=y.x,b=y.y,z=y.z,M=(P,E)=>new _t(w+x*P,m+b*P,p+z*P+E);for(let P=0;P<n;P++){let E=P*g,S=(P+1)*g;for(let I=0;I<o;I++){let H=I*h,D=(I+1)*h;s.push({points:[M(H,E),M(D,E),M(D,S),M(H,S)],userData:{type:"wallSegment",row:P,col:I,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,f=1/0,d=-1/0,c=1/0,a=-1/0;for(let H=0;H<e.length;H++){let D=e[H];if(D.userData&&D.userData.type==="wallSegment"){let T=this.getWorldVerticesNew(D.points);if(T.length<4)continue;let R=new _t().add(T[0]).add(T[1]).add(T[2]).add(T[3]).multiplyScalar(.25);D.userData.center=R,D.vertices=T;let v=D.userData.row,W=D.userData.col,V=`row${v}_col${W}`;l.push(D),u.set(V,D),v<f&&(f=v),v>d&&(d=v),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${f}_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 y=g.vertices[0],w=g.vertices[1],m=g.vertices[3],p=new _t().subVectors(w,y).normalize(),x=new _t().subVectors(m,y).normalize(),b=g.userData.width,z=g.userData.height,M=d-f+1,P=a-c+1,E=new An;E.setFromCoplanarPoints(y,w,m);let S=new _t,I=new _t;for(let H=0;H<n.length;H+=3){let D=new _t(n[H],n[H+1],n[H+2]),T=s?s.projectPoint(D,I):D;if(Math.abs(E.distanceToPoint(T))>o)continue;S.subVectors(T,y);let v=S.dot(p),W=S.dot(x),V=Math.ceil((v-o)/b-1),C=Math.floor((v+o)/b),_=Math.ceil((W-o)/z-1),A=Math.floor((W+o)/z);if(C<0||V>P-1||A<0||_>M-1)continue;let B=Math.max(0,V),k=Math.min(P-1,C),F=Math.max(0,_),L=Math.min(M-1,A);for(let O=F;O<=L;O++){let $=f+O;for(let G=B;G<=k;G++){let Q=c+G,j=`row${$}_col${Q}`;u.has(j)&&(this.results.pointsInSegments.has(j)||this.results.pointsInSegments.set(j,[H]))}}}for(let H of l){let D=`row${H.userData.row}_col${H.userData.col}`,T=this.results.pointsInSegments.has(D)?this.results.pointsInSegments.get(D).length:0,R=T>=1,v={row:H.userData.row,col:H.userData.col,width:H.userData.width,height:H.userData.height,segmentKey:D,vertices:H.vertices,center:H.userData.center,mesh:H,pointCount:T,hasPointsButNotEnough:T>0&&T<1};R?(this.results.segmentsWithPoints++,this.results.existSegments.push(v)):(this.results.segmentsWithoutPoints++,this.results.missingSegments.push(v))}return this.results.analysisTime=_n()-i,this.printAnalysisResults(),this.results}isPointInWallSegmentOptimized(e,n,o,r,s,i,l,u,f,d,c){if(Math.abs(o.distanceToPoint(e))>c)return!1;let h=new _t().subVectors(e,n),g=Math.abs(h.dot(s)),y=Math.abs(h.dot(i));if(g>f&&y>d)return!1;let w=new _t().subVectors(e,r),m=w.dot(s),p=w.dot(i),x=m>=-c&&m<=l+c,b=p>=-c&&p<=u+c;return x&&b}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 f of this.results.missingSegments)s.set(f.segmentKey,f),i.has(f.row)||i.set(f.row,new Map),i.get(f.row).set(f.col,{segmentKey:f.segmentKey,isEmpty:!0,visited:!1});for(let f of e)if(f.userData&&f.userData.type==="wallSegment"){let d=`row${f.userData.row}_col${f.userData.col}`,c=s.has(d);i.has(f.userData.row)||i.set(f.userData.row,new Map),i.get(f.userData.row).has(f.userData.col)||i.get(f.userData.row).set(f.userData.col,{segmentKey:d,isEmpty:c,visited:!1})}let l=[],u=[[0,1],[1,0],[0,-1],[-1,0]];for(let[f,d]of s){let c=i.get(d.row)?.get(d.col);if(c&&!c.visited){let a=[],h=[[d.row,d.col]],g=0;for(c.visited=!0;g<h.length;){let y=h[g++],w=y[0],m=y[1],p=`row${w}_col${m}`;s.has(p)&&a.push(s.get(p));for(let x of u){let b=w+x[0],z=m+x[1];if(i.has(b)&&i.get(b).has(z)){let M=i.get(b).get(z);!M.visited&&M.isEmpty&&(M.visited=!0,h.push([b,z]))}}}a.length>=r&&l.push(a)}}return this.clusterResults={clusters:l.sort((f,d)=>d.length-f.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)}},lr=(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},zi=(t,e)=>{let n=new _t().copy(t.start).add(t.end).multiplyScalar(.5),o=new _t().subVectors(new _t(n.x,n.y,n.z+1),n).normalize(),r=new _t(t.direction.x,t.direction.y,0);r.applyAxisAngle(o,Math.PI/2);let s=new _t().copy(n).add(r.clone().multiplyScalar(t.length)),i=new _t().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]}},cr=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 An().setFromCoplanarPoints(new _t(t.start.x,t.start.y,t.start.z),new _t(t.end.x,t.end.y,t.end.z),new _t(t.start.x,t.start.y,t.rooftopPz)),r=new _t(t.start.x,t.start.y,t.start.z).distanceTo(new _t(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),f=i.createSubdividedWallPlane(t,u,l,null);i.analyzePointDistribution(f,t.originalPoints,.01,{projectPlane:o});let d=i.highlightEmptySegments(f,null,null),c=[];if(d&&d.clusters)for(let g of d.clusters){let y=lr(g,n);y&&c.push(y)}let h=zi(t,n).direction;if(t.checkResults=c,t.verticalDirection=h,t.saveExistSegments){let g=[],y=lr(i.results.existSegments,n);y&&g.push(y),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,f=Math.cos(n),d=Math.sin(n),c=i*o+l*r+u*s;return this.x=i*c*(1-f)+o*f+(-u*r+l*s)*d,this.y=l*c*(1-f)+r*f+(u*o-i*s)*d,this.z=u*c*(1-f)+s*f+(-l*o+i*r)*d,this}},bn=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}},Ln=()=>typeof performance<"u"&&performance.now?performance.now():Date.now(),Bn=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),f=new Rt(e.start.x,e.start.y,e.rooftopPz),d=[i,l,u,f];for(let P=0;P<d.length;P++)if(!this.isValidVector3(d[P]))return console.error(`\u5899\u4F53\u57FA\u7840\u70B9${P}\u65E0\u6548:`,d[P]),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,y=new Rt().subVectors(l,i).normalize(),w=i.x,m=i.y,p=i.z,x=y.x,b=y.y,z=y.z,M=(P,E)=>new Rt(w+x*P,m+b*P,p+z*P+E);for(let P=0;P<n;P++){let E=P*g,S=(P+1)*g;for(let I=0;I<o;I++){let H=I*h,D=(I+1)*h;s.push({points:[M(H,E),M(D,E),M(D,S),M(H,S)],userData:{type:"wallSegment",row:P,col:I,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=Ln(),l=[],u=new Map,f=1/0,d=-1/0,c=1/0,a=-1/0;for(let H=0;H<e.length;H++){let D=e[H];if(D.userData&&D.userData.type==="wallSegment"){let T=this.getWorldVerticesNew(D.points);if(T.length<4)continue;let R=new Rt().add(T[0]).add(T[1]).add(T[2]).add(T[3]).multiplyScalar(.25);D.userData.center=R,D.vertices=T;let v=D.userData.row,W=D.userData.col,V=`row${v}_col${W}`;l.push(D),u.set(V,D),v<f&&(f=v),v>d&&(d=v),W<c&&(c=W),W>a&&(a=W)}}if(this.results.totalSegments=l.length,l.length===0)return this.results.analysisTime=Ln()-i,this.printAnalysisResults(),this.results;let h=`row${f}_col${c}`,g=u.get(h)||l[0];if(!g||!g.vertices||g.vertices.length<4)return this.results.analysisTime=Ln()-i,this.printAnalysisResults(),this.results;let y=g.vertices[0],w=g.vertices[1],m=g.vertices[3],p=new Rt().subVectors(w,y).normalize(),x=new Rt().subVectors(m,y).normalize(),b=g.userData.width,z=g.userData.height,M=d-f+1,P=a-c+1,E=new bn;E.setFromCoplanarPoints(y,w,m);let S=new Rt,I=new Rt;for(let H=0;H<n.length;H++){let D=n[H],T=s?s.projectPoint(D,I):D;if(Math.abs(E.distanceToPoint(T))>o)continue;S.subVectors(T,y);let v=S.dot(p),W=S.dot(x),V=Math.ceil((v-o)/b-1),C=Math.floor((v+o)/b),_=Math.ceil((W-o)/z-1),A=Math.floor((W+o)/z);if(C<0||V>P-1||A<0||_>M-1)continue;let B=Math.max(0,V),k=Math.min(P-1,C),F=Math.max(0,_),L=Math.min(M-1,A);for(let O=F;O<=L;O++){let $=f+O;for(let G=B;G<=k;G++){let Q=c+G,j=`row${$}_col${Q}`;u.has(j)&&(this.results.pointsInSegments.has(j)||this.results.pointsInSegments.set(j,[H]))}}}for(let H of l){let D=`row${H.userData.row}_col${H.userData.col}`,T=this.results.pointsInSegments.has(D)?this.results.pointsInSegments.get(D).length:0,R=T>=1,v={row:H.userData.row,col:H.userData.col,width:H.userData.width,height:H.userData.height,segmentKey:D,vertices:H.vertices,center:H.userData.center,mesh:H,pointCount:T,hasPointsButNotEnough:T>0&&T<1};R?(this.results.segmentsWithPoints++,this.results.existSegments.push(v)):(this.results.segmentsWithoutPoints++,this.results.missingSegments.push(v))}return this.results.analysisTime=Ln()-i,this.printAnalysisResults(),this.results}isPointInWallSegmentOptimized(e,n,o,r,s,i,l,u,f,d,c){if(Math.abs(o.distanceToPoint(e))>c)return!1;let h=new Rt().subVectors(e,n),g=Math.abs(h.dot(s)),y=Math.abs(h.dot(i));if(g>f&&y>d)return!1;let w=new Rt().subVectors(e,r),m=w.dot(s),p=w.dot(i),x=m>=-c&&m<=l+c,b=p>=-c&&p<=u+c;return x&&b}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 f of this.results.missingSegments)s.set(f.segmentKey,f),i.has(f.row)||i.set(f.row,new Map),i.get(f.row).set(f.col,{segmentKey:f.segmentKey,isEmpty:!0,visited:!1});for(let f of e)if(f.userData&&f.userData.type==="wallSegment"){let d=`row${f.userData.row}_col${f.userData.col}`,c=s.has(d);i.has(f.userData.row)||i.set(f.userData.row,new Map),i.get(f.userData.row).has(f.userData.col)||i.get(f.userData.row).set(f.userData.col,{segmentKey:d,isEmpty:c,visited:!1})}let l=[],u=[[0,1],[1,0],[0,-1],[-1,0]];for(let[f,d]of s){let c=i.get(d.row)?.get(d.col);if(c&&!c.visited){let a=[],h=[[d.row,d.col]],g=0;for(c.visited=!0;g<h.length;){let y=h[g++],w=y[0],m=y[1],p=`row${w}_col${m}`;s.has(p)&&a.push(s.get(p));for(let x of u){let b=w+x[0],z=m+x[1];if(i.has(b)&&i.get(b).has(z)){let M=i.get(b).get(z);!M.visited&&M.isEmpty&&(M.visited=!0,h.push([b,z]))}}}a.length>=r&&l.push(a)}}return this.clusterResults={clusters:l.sort((f,d)=>d.length-f.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)}},ur=(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 Ne.Vector3(s.center.x,s.center.y,s.center.z));let i=[];for(let l=0;l<s.vertices.length;l++)i.push(new Ne.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 Ne.Vector3(s.x,s.y,s.z),end:new Ne.Vector3(i.x,i.y,i.z),center:new Ne.Vector3(n.x,n.y,n.z),direction:new Ne.Vector3(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"?fr(t,e,n):o=="array"&&bo(t,e,n)},Pi=(t,e=!0,n="three",o="xyz")=>{o=="xyz"?Ti(t,e,n):o=="array"&&cr(t,e,n)},Ti=(t,e=!0,n="three")=>{for(let o=0;o<t.length;o++){let r=t[o];fr(r,e,n)}},fr=(t,e=!0,n="three")=>{if((t.isBayWindow||t.isWindow||t.isBalconyRailing)&&e)return;let o=new bn().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 Bn,{horizontalSubdivisions:l,verticalSubdivisions:u}=i.initLimits4(r,s),f=i.createSubdividedWallPlane(t,u,l,null);i.analyzePointDistribution(f,t.originalPoints,.01,{projectPlane:o});let d=i.highlightEmptySegments(f,null,null),c=[];if(d&&d.clusters)for(let g of d.clusters){let y=ur(g,n);y&&c.push(y)}let h=Mi(t,n).direction;if(t.checkResults=c,t.verticalDirection=h,t.saveExistSegments){let g=[],y=ur(i.results.existSegments,n);y&&g.push(y),t.existSegments=g}},Si=t=>{if((t.isBayWindow||t.isWindow||t.isBalconyRailing)&&limit)return;let e=new bn().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 Bn,{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 N from"three";import"three/examples/jsm/utils/BufferGeometryUtils.js";import*as U from"three";import{CSS2DObject as Tc}from"three/examples/jsm/renderers/CSS2DRenderer.js";import"three/examples/jsm/utils/BufferGeometryUtils.js";import ze from"path";import{fileURLToPath as vi}from"url";import kn from"path";import{fileURLToPath as Ri}from"url";import{Vector3 as oc}from"three";var Di=Ri(import.meta.url),wo=kn.dirname(Di),rc=kn.resolve(wo,"./data/lines.meta.json"),sc=kn.resolve(wo,"./data/lines.bin"),ic=kn.resolve(wo,"./data/checks.bin");var Vi=vi(import.meta.url),ve=ze.dirname(Vi),dc=ze.resolve(ve,"./data/lines.tmp.bin"),hc=ze.resolve(ve,"./data/checks.tmp.bin"),mc=ze.resolve(ve,"./data/lines.new_points.tmp.bin"),pc=ze.resolve(ve,"./data/lines.new_points.bin"),gc=ze.resolve(ve,"./data/lines.meta.json"),xc=ze.resolve(ve,"./data/lines.bin"),yc=ze.resolve(ve,"./data/checks.bin"),bc=ze.resolve(ve,"./data/lines.exist_segments.bin"),wc=ze.resolve(ve,"./data/lines.exist_segments.tmp.bin");import{Vector3 as Ii}from"three";var On=class{points=[];_tempArr=[0,0,0];constructor(e){}initPoints(e){this.points=e}getPointByIndex(e,n){let o=e*3;return n.x=this.points[o],n.y=this.points[o+1],n.z=this.points[o+2],n}getPointArrByIndex(e){let n=e*3;return[this.points[n],this.points[n+1],this.points[n+2]]}getPoint2ArrByIndex(e){let n=e*3;return[this.points[n],this.points[n+1]]}getIndexsByIndex(e,n){n.length=0,n.push(e*3),n.push(e*3+1),n.push(e*3+2)}pointsToVector3Arr(e){let n=[];for(let o=0;o<e.length/3;o++)n.push(new Ii(e[o*3],e[o*3+1],e[o*3+2]));return n}vector3ArrToPoints(e){let n=[];for(let o=0;o<e.length;o++)n.push(e[o].x,e[o].y,e[o].z);return n}vector3ArrToFloat32Array(e){return new Float32Array(e.flatMap(o=>[o.x,o.y,o.z]))}clsoe(){this.points=[]}};var hr=(t,e,n)=>{let o=new U.LineBasicMaterial({color:"#0011ff"}),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))},Me=(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,f=s*u-i*l;if(Math.abs(f)<r)return null;let d=((n.x-t.x)*u-(n.y-t.y)*l)/f,c=((n.x-t.x)*i-(n.y-t.y)*s)/f;return d<-r||d>1+r||c<-r||c>1+r?null:{point:new U.Vector3(t.x+d*s,t.y+d*i,t.z)}},mr=(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,d=document.createElement("canvas").getContext("2d");d.font=`bold ${o}px ${r}`;let a=d.measureText(t).width,h=Math.min(a+l*2,u),g=o+l*2,y=document.createElement("canvas");y.width=h,y.height=g;let w=y.getContext("2d");w.fillStyle=s,w.fillRect(0,0,h,g),w.fillStyle=i,w.font=`bold ${o}px ${r}`,w.textAlign="center",w.textBaseline="middle",a>u-l*2?Ci(w,t,h/2,g/2,u,o):w.fillText(t,h/2,g/2);let m=new U.CanvasTexture(y),p=new U.SpriteMaterial({map:m,depthTest:!1,transparent:!0}),x=new U.Sprite(p);x.position.set(e.x,e.y,e.z);let b=.005;return x.scale.set(h*b,g*b,1),x};function Ci(t,e,n,o,r,s){let i=e.split(""),l="",u=s*1.2,f=o;for(let d=0;d<i.length;d++){let c=l+i[d];t.measureText(c).width>r&&d>0?(t.fillText(l,n,f),l=i[d],f+=u):l=c}t.fillText(l,n,f)}var $t=(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)),f=u<=n;return{parallel:f,sameDirection:f?l>0:null,angle:u}};var pr=(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(),f=1/0,d=-1/0,c=1/0,a=-1/0;for(let M of r){let P=M.dot(i),E=M.dot(l);P<f&&(f=P),P>d&&(d=P),E<c&&(c=E),E>a&&(a=E)}let h=r[0].dot(u),g=i.clone().multiplyScalar(f).add(l.clone().multiplyScalar(c)).add(u.clone().multiplyScalar(h)),y=i.clone().multiplyScalar(d).add(l.clone().multiplyScalar(c)).add(u.clone().multiplyScalar(h)),w=i.clone().multiplyScalar(d).add(l.clone().multiplyScalar(a)).add(u.clone().multiplyScalar(h)),m=i.clone().multiplyScalar(f).add(l.clone().multiplyScalar(a)).add(u.clone().multiplyScalar(h)),p=[g,y,w,m],x=$t(new U.Vector3().subVectors(g,y),new U.Vector3(0,0,1));x&&x.parallel&&(p=[g,m,w,y]);let b=0;if(o.length>0){let M=new U.Vector3().subVectors(p[1],p[0]).normalize(),P=M.clone().negate(),E=new U.Vector3().subVectors(p[3],p[0]).normalize(),S=E.clone().negate(),I=p[0].distanceTo(p[1]),H=p[0].distanceTo(p[3]),D=I/e,T=H/n,R=.001;for(let v=0;v<D;v++){let W=p[0],V=0;for(let C=0;C<T;C++){let _=W.clone().addScaledVector(M,e),A=_.clone().addScaledVector(E,n),B=W.clone().addScaledVector(E,n),k=new U.Vector3().add(W).add(_).add(A).add(B).multiplyScalar(.25);for(let F=0;F<s.length;F++)if(s[F].distanceTo(k)<R){V++;break}W=B}if(V>=T/2)break;b+=V,p[0]=p[0].addScaledVector(M,e),p[3]=p[3].addScaledVector(M,e)}I=p[0].distanceTo(p[1]),D=I/e;for(let v=0;v<D;v++){let W=p[1],V=0;for(let C=0;C<T;C++){let _=W.clone().addScaledVector(P,e),A=_.clone().addScaledVector(E,n),B=W.clone().addScaledVector(E,n),k=new U.Vector3().add(W).add(_).add(A).add(B).multiplyScalar(.25);for(let F=0;F<s.length;F++)if(s[F].distanceTo(k)<R){V++;break}W=B}if(V>=T/2)break;b+=V,p[1]=p[1].addScaledVector(P,e),p[2]=p[2].addScaledVector(P,e)}I=p[0].distanceTo(p[1]),D=I/e;for(let v=0;v<T;v++){let W=p[3],V=0;for(let C=0;C<D;C++){let _=W.clone().addScaledVector(M,e),A=_.clone().addScaledVector(S,n),B=W.clone().addScaledVector(S,n),k=new U.Vector3().add(W).add(_).add(A).add(B).multiplyScalar(.25);for(let F=0;F<s.length;F++)if(s[F].distanceTo(k)<R){V++;break}W=_}if(V>=D/2)break;b+=V,p[2]=p[2].addScaledVector(S,n),p[3]=p[3].addScaledVector(S,n)}}let z=p[0].distanceTo(p[1])*p[0].distanceTo(p[3]);return{facePoints:p,boxArea:z,totalInPlaneNum:b}},Xt=(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)),f=1-Math.min(u/r,1),d=l>0?"same":"opposite";return{parallelism:f,angle:u,angleDeg:U.MathUtils.radToDeg(u),isParallel:u<r,direction:d,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)),f=Math.min(1,Math.max(0,u)),d=Math.acos(f),c=U.MathUtils.radToDeg(d),a=1-f,h=1e-6;return{rate:a,percent:`${(a*100).toFixed(2)}%`,angle:c,isPerpendicular:Math.abs(c-90)<.01,isParallel:c<.01}},At=(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,f=new U.Vector3().subVectors(e,t),d=new U.Vector3().subVectors(o,n),c=f.clone().normalize(),a=d.clone().normalize(),h=U.MathUtils.clamp(c.dot(a),-1,1),g=Math.acos(Math.abs(h)),y=U.MathUtils.radToDeg(g);if(g>s)return{type:"not_parallel",angleDeg:y,avgPerpendicularDistance:null,maxPerpendicularDistance:null,gap:null,overlap:null,closestDistance:null};h<0&&a.negate();let w=new U.Vector3().addVectors(c,a).normalize(),m=new U.Vector3().addVectors(t,e).multiplyScalar(.5),p=dr(n,m,c),x=dr(o,m,c),b=(p+x)/2,z=Math.max(p,x),M=t.dot(w),P=e.dot(w),E=n.dot(w),S=o.dot(w),I=Math.min(M,P),H=Math.max(M,P),D=Math.min(E,S),T=Math.max(E,S),R=H-I,v=T-D,W=Math.min(R,v),V=Math.min(H,T)-Math.max(I,D),C=V<0?-V:0,_=V>0?V:0,A=W>0?_/W:0,B=Wi(t,e,n,o),k=g<=i&&b<l,F;return k?F=A>.5?"collinear_overlap":"collinear_gap":g<=s&&(F="parallel_offset"),{type:F,angleDeg:y,avgPerpendicularDistance:b,maxPerpendicularDistance:z,gap:C,overlap:_,closestDistance:B}};function dr(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),f=s.dot(s),d=r.dot(i),c=s.dot(i),a=l*f-u*u,h,g;a<1e-10?(h=0,g=f!==0?c/f:0):(h=(u*c-f*d)/a,g=(l*c-u*d)/a),h=U.MathUtils.clamp(h,0,1),g=f!==0?U.MathUtils.clamp((u*h+c)/f,0,1):0,h=l!==0?U.MathUtils.clamp((u*g-d)/l,0,1):0;let y=t.clone().add(r.clone().multiplyScalar(h)),w=n.clone().add(s.clone().multiplyScalar(g));return y.distanceTo(w)}var qe=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}},wn=(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(w=>{let m=new U.Vector3;o.projectPoint(w,m),u.push(m.clone()),m.z=r.z,l.push(m)});let f=new U.Vector3,d=new U.Vector3;o.projectPoint(r,f),o.projectPoint(s,d);let c=new U.Line3(f,d),a=[],h=[],g=[],y=new U.Vector3;return l.forEach((w,m)=>{c.closestPointToPoint(w,!0,y).distanceTo(w)<.001?(a.push(n[m]),h.push(u[m])):g.push(w)}),{newOriginalPoints:a,newProjectPoints:g,newOnLinePoints:h}},gr=(t,e,n)=>{function o(r,s,i,l,u,f,d,c,a){let h=new U.Line3(r,s),g=new Map,y=new U.Vector3,w=r.clone(),m=s.clone(),p=0;for(;;){let x=new Map,b=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 S=h.closestPointToPoint(E,!0,y),I=E.distanceTo(S);Math.abs(I-u)<.01&&(b++,x.has(z)?x.get(z).removePtsIndex.push(P):x.set(z,{index:z,removePtsIndex:[P]}))}if(p==d){r=w,s=m;break}if(b<f/20*19||b==0){x.clear(),d-p<5&&(r=w,s=m,g.clear());break}else{p++;for(let[z,M]of x)g.has(z)?g.get(z).removePtsIndex.push(...M.removePtsIndex):g.set(z,M);x.clear(),r=r.addScaledVector(i,l),s=s.addScaledVector(i,l),h.set(r,s)}}if(g.size>0&&p!=d)for(let[x,b]of g){let z=[],M=[];for(let P=0;P<a.checkResults[x].allCenterPoints.length;P++)b.removePtsIndex.includes(P)||(z.push(a.checkResults[x].allCenterPoints[P]),M.push(a.checkResults[x].originalVertices[P]));a.checkResults[x].allCenterPoints=z,a.checkResults[x].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 v=0;v<s.checkResults.length;v++)for(let W=0;W<s.checkResults[v].originalVertices.length;W++){let V=Fn(s.checkResults[v].originalVertices[W]);s.checkResults.allCenterPoints.push(V)}if(!s.checkResults||s.checkResults.length<=0)continue;if(s.checkResults[0].originalVertices&&s.checkResults[0].originalVertices.length>0){let v=s.checkResults[0].originalVertices[0],[W,V,C,_]=v;W=new U.Vector3(W.x,W.y,W.z),V=new U.Vector3(V.x,V.y,V.z),C=new U.Vector3(C.x,C.y,C.z),_=new U.Vector3(_.x,_.y,_.z),i=W.distanceTo(V),l=W.distanceTo(_);let A=new U.Vector3().subVectors(W,V).normalize(),B=$t(A,new U.Vector3(0,0,1));B&&B.parallel&&([l,i]=[i,l])}if(i<0||l<0)continue;let f=new U.Vector3(s.start.x,s.start.y,s.start.z),d=new U.Vector3(s.end.x,s.end.y,s.end.z),c=f.distanceTo(d),a=s.rooftopPz-s.start.z,h=Math.ceil(c/i),g=Math.ceil(a/l),y=f.clone(),w=d.clone(),m=w.clone().add(new U.Vector3(0,0,a)),p=y.clone().add(new U.Vector3(0,0,a)),x=new U.Vector3().subVectors(w,y).normalize(),b=x.clone().negate(),M=new U.Vector3().subVectors(m,y).normalize().clone().negate(),P=i/2,E=l/2,S=c*a,I=i*l,H=S/I;o(y,p,x,i,P,g,h,H,s),o(w,m,b,i,P,g,h,H,s),s.start=y,s.end=w;let{newOriginalPoints:D}=wn(y,w,s.originalPoints);s.originalPoints=D,n.stageReplaceCheckResults(s.id,s.checkResults);let R=new On().vector3ArrToFloat32Array(s.originalPoints);n.stageReplacePoints(s.id,R),s.checkResults=null,s.originalPoints=null}n.commit()},Zt=(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},We=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 xr=()=>{let t=Math.floor(Math.random()*75+180).toString(16).padStart(2,"0"),e=Math.floor(Math.random()*75+180).toString(16).padStart(2,"0"),n=Math.floor(Math.random()*75+180).toString(16).padStart(2,"0");return`#${t}${e}${n}`};var Mo=(t,e=.001)=>{let n=new Map,o=[];for(let 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},yr=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(d,c,a){return e.clone().addScaledVector(s,d).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(),f=l.length();i.normalize(),l.normalize();let d=new U.Vector3(0,0,1),a=new U.Vector3().add(n).add(o).add(r).add(s).multiplyScalar(.25).clone().addScaledVector(d,e/2),h=new U.BoxGeometry(u,f,e),g=new U.Matrix4;return g.makeBasis(i,l,d),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 Gt from"three";var Hi=(t,e)=>{console.log("lines",t);for(let n=0;n<t.length;n++){let o=t[n],r=[];o.originalPoints.forEach(x=>{let b=new Gt.Vector3(x.x,x.y,0),z=!1;for(let M=0;M<r.length;M++)if(ct(b,r[M],.01)){z=!0;break}z||r.push(b)});let s=Math.round(Math.max(5,Math.min(350,20*Math.sqrt(o.length)))),i=1,l=new Gt.Vector3(o.start.x,o.start.y,o.start.z),u=new Gt.Vector3(o.end.x,o.end.y,o.end.z),f=new Gt.Vector3().subVectors(u,l).normalize(),d=f.clone().cross(new Gt.Vector3(0,0,1)).normalize(),c=d.clone().negate(),a=[],h=[],g=o.length/s;console.log(g);for(let x=0;x<s;x++){let b=[];b.push(l.clone().addScaledVector(d,i)),b.push(b[0].clone().addScaledVector(f,g)),b.push(b[1].clone().addScaledVector(c,i*2)),b.push(l.clone().addScaledVector(c,g));let z=[];for(let M=0;M<r.length;M++)a.includes(M)||Ai(r[M],b)&&(a.push(M),z.push(r[M]));z.length>0&&h.push(Li(z)),l=l.addScaledVector(f,g)}let y=new Float32Array(r.length*3);r.forEach((x,b)=>{y[b*3]=x.x,y[b*3+1]=x.y,y[b*3+2]=x.z});let w=new Gt.BufferGeometry;w.setAttribute("position",new Gt.BufferAttribute(y,3)),w.rotateX(-Math.PI/2),e.add(new Gt.Points(w,new Gt.PointsMaterial({color:xr(),size:.02})));let[m,p]=Fi(h,{plane:"xy",trimRatio:0});hr(m,p,e)}};function br(t,e="xy"){if(e==="xy")return{x:t.x,y:t.y};if(e==="xz")return{x:t.x,y:t.z};if(e==="yz")return{x:t.y,y:t.z};throw new Error(`Unsupported plane: ${e}`)}function _i(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=br(t,n),r=e.map(l=>br(l,n)),s=!1,i=!1;for(let l=0;l<4;l++){let u=r[l],f=r[(l+1)%4],d=_i(u,f,o);if(d>1e-9&&(s=!0),d<-1e-9&&(i=!0),s&&i)return!1}return!0}function Li(t){if(!t||t.length===0)return null;let e=new Gt.Vector3(0,0,0);for(let n of t)Array.isArray(n)?(e.x+=n[0],e.y+=n[1],e.z+=n[2]):(e.x+=n.x,e.y+=n.y,e.z+=n.z);return e.divideScalar(t.length),e}function Bi(t){return t instanceof Gt.Vector3?t.clone():Array.isArray(t)?new Gt.Vector3(t[0],t[1],t[2]):new Gt.Vector3(t.x,t.y,t.z)}function ki(t,e="xy"){let n=Bi(t);if(e==="xy")return{x:n.x,y:n.y,up:n.z};if(e==="xz")return{x:n.x,y:n.z,up:n.y};if(e==="yz")return{x:n.y,y:n.z,up:n.x};throw new Error(`Unsupported plane: ${e}`)}function wr(t,e,n,o="xy"){if(o==="xy")return new Gt.Vector3(t,e,n);if(o==="xz")return new Gt.Vector3(t,n,e);if(o==="yz")return new Gt.Vector3(n,t,e);throw new Error(`Unsupported plane: ${o}`)}function 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,f=l-t,d=Math.hypot(u,f);return d<1e-12?{x:1,y:0}:{x:u/d,y:f/d}}function Fi(t,e={}){let{plane:n="xy",trimRatio:o=0}=e;if(!t||t.length<2)return null;let r=t.map(V=>ki(V,n)),s=0,i=0,l=0;for(let V of r)s+=V.x,i+=V.y,l+=V.up;s/=r.length,i/=r.length,l/=r.length;let u=0,f=0,d=0;for(let V of r){let C=V.x-s,_=V.y-i;u+=C*C,f+=C*_,d+=_*_}u/=r.length,f/=r.length,d/=r.length;let c=Oi(u,f,d),a={x:-c.y,y:c.x},h=[];for(let V of r){let C=V.x-s,_=V.y-i,A=C*c.x+_*c.y,B=C*a.x+_*a.y;h.push({s:A,t:B,up:V.up})}h.sort((V,C)=>V.s-C.s);let g=h.length,y=Math.floor(g*o),w=Math.ceil(g*(1-o))-1;y=Math.max(0,Math.min(g-1,y)),w=Math.max(0,Math.min(g-1,w));let m=h[y],p=h[w],x=(()=>{let V=h.map(_=>_.t).sort((_,A)=>_-A),C=Math.floor(V.length/2);return V.length%2===0?(V[C-1]+V[C])*.5:V[C]})(),b=(()=>{let V=h.map(_=>_.up).sort((_,A)=>_-A),C=Math.floor(V.length/2);return V.length%2===0?(V[C-1]+V[C])*.5:V[C]})(),z=m.s,M=p.s,P=x,E=x,S=b,I=b,H=s+c.x*z+a.x*P,D=i+c.y*z+a.y*P,T=s+c.x*M+a.x*E,R=i+c.y*M+a.y*E,v=wr(H,D,S,n),W=wr(T,R,I,n);return[v,W]}var Ni=async(t,e,n,o,r)=>{if(gr(t,o,r),t.length<=0||e.length<=0)return t;n||(n=[]);for(let m of t){let p=[],x=o.readLineById(m.id);if(x.checkResults=o.getLineCheckReultsById(m.id),m.checkResults=x.checkResults,!(!m.checkResults||m.checkResults.length<=0)){for(let b=0;b<m.checkResults.length;b++){let S=function(R){for(;E[R]!==R;)E[R]=E[E[R]],R=E[R];return R},z=m.checkResults[b];if(!z.originalVertices||z.originalVertices.length==0)continue;let M=[];z.originalVertices.forEach(R=>{let v=[];R.forEach(W=>{v.push(new N.Vector3(W.x,W.y,W.z))}),M.push(v)});let P=M.length,E=Array.from({length:P},(R,v)=>v);for(let R=0;R<P;R++)for(let v=R+1;v<P;v++){let W=M[R],V=M[v];if(W.some(_=>V.some(A=>_.equals(A)))){let _=S(R),A=S(v);_!==A&&(E[_]=A)}}let I=new Map,H=-1,D=-1;for(let R=0;R<P;R++){let v=S(R);I.has(v)||I.set(v,{points:[],area:0,index:-1,gridWidth:-1,gridHeight:-1,centerPts:[],facePoints:[],boxArea:-1,totalInPlaneNum:-1});let W=I.get(v),[V,C,_,A]=M[R],B=new N.Vector3().add(V).add(C).add(_).add(A).multiplyScalar(.25);if(W.points.push(...M[R]),W.area+=V.distanceTo(C)*V.distanceTo(A),W.index=b,W.centerPts.push(B),H==-1||D==-1){let k=new N.Vector3().subVectors(V,C).normalize();D=V.distanceTo(A),H=V.distanceTo(C);let F=$t(k,new N.Vector3(0,0,1));F&&F.parallel&&([D,H]=[H,D])}W.gridWidth=H,W.gridHeight=D}let T=I.values();for(let R of I.values()){let{facePoints:v,boxArea:W,totalInPlaneNum:V}=pr(R.points,R.gridWidth,R.gridHeight,R.centerPts);R.centerPts=null,R.facePoints=v,R.boxArea=W,R.totalInPlaneNum=V}p.push(...T)}m.checkResults=null,m.mergeCheckRegion=p}}let s=[];for(let m=0;m<n.length;m++){let p=n[m];if(p.isFindBeam=!1,p.category=="door"){let x=[];p.coordinatesByArea.coordinates.forEach(E=>{x.push(new N.Vector3(E.x,E.y,E.z))}),x[0].equals(x[x.length-1])&&x.pop();let b=x[0].distanceTo(x[1]),z=x[0].distanceTo(x[3]);z>b&&([b,z]=[z,b],x=[x[0],x[3],x[2],x[1]]);let M=At(x[0],x[3],!0),P=At(x[1],x[2],!0);s.push({doorStartPt:M,doorEndPt:P,boxPoints:x,minZ:p.coordinatesByArea.heightData.minZ,maxZ:p.coordinatesByArea.heightData.maxZ,index:m,isFind:!1,inWall:!1})}}for(let m=0;m<s.length;m++){let p=s[m];for(let x=0;x<t.length;x++){if(t[x].length<.5)continue;let b=[],z=At(t[x].start,t[x].end,!0);b.push(z),b.push(At(z,t[x].start,!0)),b.push(At(z,t[x].end,!0));let M=!1,P=p.boxPoints.length;for(let E=0;E<b.length;E++){let S=b[E].x,I=b[E].y;for(let H=0,D=P-1;H<P;D=H++){let T=p.boxPoints[H].x,R=p.boxPoints[H].y,v=p.boxPoints[D].x,W=p.boxPoints[D].y;R>I!=W>I&&S<(v-T)*(I-R)/(W-R)+T&&(M=!M)}if(M)break}if(M){let E=new N.Vector3(t[x].start.x,t[x].start.y,0),S=new N.Vector3(t[x].end.x,t[x].end.y,0),I=p.doorStartPt.distanceTo(p.doorEndPt),H=E.distanceTo(S),D=Xt(p.doorStartPt,p.doorEndPt,E,S);if(Math.abs(H-I)<.5&&D&&D.angleDeg<15){p.doorStartPt=new N.Vector3(t[x].start.x,t[x].start.y,0),p.doorEndPt=new N.Vector3(t[x].end.x,t[x].end.y,0);break}else if(Math.abs(H-I)>1.3&&D&&D.angleDeg<15){let T=ye(p.doorStartPt,p.doorEndPt,E,S,{parallelAngleMax:N.MathUtils.degToRad(15)}),R=p.doorStartPt.distanceTo(E),v=p.doorStartPt.distanceTo(S),W=p.doorEndPt.distanceTo(E),V=p.doorEndPt.distanceTo(S),C=R<.2||v<.2||W<.2||V<.2;if(T&&T.type=="collinear_overlap"&&T.maxPerpendicularDistance<.1&&!C){p.inWall=!0;break}else{let _=new N.Line3(E,S),A=_.closestPointToPoint(p.doorStartPt,!0,new N.Vector3),B=_.closestPointToPoint(p.doorEndPt,!0,new N.Vector3),k=A.distanceTo(p.doorStartPt),F=B.distanceTo(p.doorEndPt);if(k<.1||F<.1){p.inWall=!0;break}}}}else continue}}let i=0,l=[],u=[],f=[],d=[],c=.15;for(let m=0;m<t.length;m++){let p=t[m];if(p.noDetection)continue;let x=o.readLineById(p.id);if(x.originalPoints=o.getOriginalPointsById(p.id),x.checkResults=o.getLineCheckReultsById(p.id),p.originalPoints=x.originalPoints,p.checkResults=x.checkResults,x=null,p.doorAndBeamData=[],p.doorAndBeamIdToCheckResults=[],!p.mergeCheckRegion||p.mergeCheckRegion.length==0)continue;p.completePointAreaPercentage=-1;let b=new N.Box3;b.setFromPoints(p.originalPoints);let z=b.max.z,M=b.min.z,P=new N.Vector3(p.start.x,p.start.y,p.start.z),E=new N.Vector3(p.end.x,p.end.y,p.end.z),S=p.rooftopPz-p.start.z,I=0;for(let D of p.mergeCheckRegion){let T=D.facePoints,R=D.boxArea,v=D.totalInPlaneNum;if(!T||T.length<=0)continue;let W=T[0].distanceTo(T[1]),V=T[0].distanceTo(T[3]),C=D.gridHeight*(V/D.gridHeight/3*2)+D.gridHeight/2,_=new N.Vector3(T[0].x,T[0].y,T[0].z+C),A=new N.Vector3(T[1].x,T[1].y,T[1].z+C),B=new N.Line3(_,A),k=[],F=new N.Vector3;D.points.forEach(j=>{B.closestPointToPoint(j,!0,F).distanceTo(j)<D.gridHeight+.01&&k.push(j)});let L=[],O=[];for(;;){let j=[];for(let Z=0;Z<k.length;Z++)O.includes(Z)||j.length==0&&(j.push(k[Z]),O.push(Z));for(let Z=0;Z<k.length;Z++)if(!O.includes(Z)){for(let Y=0;Y<j.length;Y++)if(k[Z].distanceTo(j[Y])<D.gridWidth+.01){j.push(k[Z]),O.push(Z),Z=-1;break}}if(j.length==0)break;L.push(j)}let $=[];for(let j=0;j<L.length;j++){let Z={lineSt:new N.Vector3,lineEd:new N.Vector3,facePoints:[]},Y=We(L[j]);Array.isArray(Y)&&Y.length==2&&(Z.lineSt=Y[0],Z.lineEd=Y[1],Z.facePoints.push(new N.Vector3(Y[0].x,Y[0].y,T[0].z)),Z.facePoints.push(new N.Vector3(Y[1].x,Y[1].y,T[0].z)),Z.facePoints.push(new N.Vector3(Y[1].x,Y[1].y,T[2].z)),Z.facePoints.push(new N.Vector3(Y[0].x,Y[0].y,T[2].z)),$.push(Z))}I+=D.area;let G=0;if(v!=0&&(G=D.gridHeight*D.gridWidth*v),(D.area-G)/R*100>70&&$.length==1||$.length>1)for(let j=0;j<$.length;j++){let Z=$[j],Y=Z.facePoints[0].distanceTo(Z.facePoints[1]),it=Z.facePoints[0].distanceTo(Z.facePoints[3]),ht=Y/p.length*100,Tt=p.rooftopPz-Z.facePoints[2].z;if(it<1.5||z<Z.facePoints[2].z||Tt>S/3*2)continue;let nt=!1,wt=!1,zt=!1,Dt=new N.Vector3(0,0,0),Pt=new N.Vector3(0,0,0),Mt=!1,It=[],ot=Z.facePoints[2].clone(),ft=Z.facePoints[3].clone(),rt=Z.facePoints[0].clone(),tt=Z.facePoints[1].clone(),ae=!1,bt=-1;if(Math.abs(Z.facePoints[0].z-p.start.z)<.25){let Jt=!1;for(let st=0;st<e.length;st++){let Ct=st+1;if(Ct>=e.length)continue;let Nt=new N.Vector3(e[st].x,e[st].y,e[st].z),at=new N.Vector3(e[Ct].x,e[Ct].y,e[Ct].z);if(Me(new N.Vector3(Nt.x,Nt.y,0),new N.Vector3(at.x,at.y,0),new N.Vector3(Z.facePoints[0].x,Z.facePoints[0].y,0),new N.Vector3(Z.facePoints[1].x,Z.facePoints[1].y,0),.1)!=null){Jt=!0;break}}let{newOriginalPoints:he}=wn(rt,tt,p.originalPoints),St=[],ee=[];if(he.forEach(st=>{st.z>=ot.z?St.push(st):st.z<=rt.z&&ee.push(st)}),St.length<20)continue;let et=p.rooftopPz-ot.z,me=ot.clone();me.z+=et;let Le=ot.distanceTo(ft),Be=new N.Vector3().subVectors(ft,ot).normalize(),gn=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(Le)))),ke=Le/gn,pe=[],nn=[];for(let st=0;st<gn;st++)pe.push(new N.Vector3(ot.x,ot.y,ot.z+et/5).addScaledVector(Be,ke*st)),pe.push(new N.Vector3(me.x,me.y,me.z-et/5).addScaledVector(Be,ke*st));let on=pe.length;for(let st=0;st<St.length;st++)for(let Ct=0;Ct<pe.length;Ct++)if(new N.Vector3(St[st].x,St[st].y,St[st].z).distanceTo(pe[Ct])<.05){nn.push(pe[Ct]),pe.splice(Ct,1);break}if(nn.length/on<.5)continue;if(Y>.17&&p.length>.5){let st=Zt(P,rt),Ct=Zt(P,tt),Nt=Zt(E,rt),at=Zt(E,tt),X=.15,Et=10;if(st<X||Ct<X)if(St.length>10){let yt=new N.Vector3(p.start.x,p.start.y,0),ut=new N.Vector3(p.end.x,p.end.y,0),pt=new N.Vector3().subVectors(yt,ut).normalize(),kt=new N.Vector3,gt=1/0,Ft=-1,xt=!1,dt=!1;for(let J=0;J<t.length;J++){if(J==m)continue;let mt=new N.Vector3(t[J].start.x,t[J].start.y,0),lt=new N.Vector3(t[J].end.x,t[J].end.y,0),vt=Me(yt,ut,mt,lt,.1),Wt=ie(yt,ut,mt,lt);if(vt!=null){if(Wt&&Wt.angle>85){let Ht=vt.point.distanceTo(yt),Lt=vt.point.distanceTo(ut);if(Ht<.3){dt=!0,gt=1/0,Ft=-1;break}}continue}if(Wt&&Wt.angle>85){let Lt=new N.Line3(mt,lt).closestPointToPoint(yt,!0,kt),Ot=Xt(yt,ut,Lt,yt);if(!Ot||Ot.direction!="same")continue;let re=yt.clone().addScaledVector(pt,Et),Kt=ut.clone().addScaledVector(pt.clone().negate(),Et),se=new N.Vector3().subVectors(lt,mt).normalize(),te=mt.clone().addScaledVector(se.clone().negate(),.03),Re=lt.clone().addScaledVector(se,.03),le=Me(re,Kt,te,Re);if(le==null)continue;let ne=yt.distanceTo(le.point);ne<gt&&(gt=ne,Ft=J)}else if(Wt&&Wt.angle<5){let Ht=new N.Vector3(rt.x,rt.y,0),Lt=new N.Vector3(tt.x,tt.y,0),Ot=Zt(Ht,mt),re=Zt(Ht,lt),Kt=Zt(Lt,mt),se=Zt(Lt,lt),te=Xt(yt,ut,mt,Ht),Re=!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 yn=[];for(let xe=0;xe<t[J].checkResults[ne].originalVertices.length;xe++){let De=Fn(t[J].checkResults[ne].originalVertices[xe]);De.z=0,yn.push(De)}let ge=We(yn);if(ge.length==2){let xe=Zt(Ht,ge[0]),De=Zt(Ht,ge[1]),go=Zt(Lt,ge[0]),xo=Zt(Lt,ge[1]);if(xe<.2||De<.2||go<.2||xo<.2){Re=!0;break}}}t[J].checkResults=null}if(te&&te.direction=="same"&&!Re&&(Ot<.1||re<.1||Kt<.1||se<.1)){xt=!0,gt=1/0,Ft=-1;break}}}if(gt!=1/0&><2&&(p.length-Y>.2||p.length-Y<.02)&><Y*2)t[Ft].length>.25&&Y+gt>.5&&(ae=!0,st<X?(ft=ft.addScaledVector(pt,gt),rt=rt.addScaledVector(pt,gt)):(ot=ot.addScaledVector(pt,gt),tt=tt.addScaledVector(pt,gt)));else{if(!xt&&!dt&&p.length-Y>.1)continue;if(!xt&&!dt&&p.length-Y<.1&&p.length<1.8)continue}}else continue;if(Nt<X||at<X)if(St.length>10){let yt=new N.Vector3(p.start.x,p.start.y,0),ut=new N.Vector3(p.end.x,p.end.y,0),pt=new N.Vector3().subVectors(ut,yt).normalize(),kt=new N.Vector3,gt=1/0,Ft=-1,xt=!1,dt=!1;for(let J=0;J<t.length;J++){if(J==m)continue;let mt=new N.Vector3(t[J].start.x,t[J].start.y,0),lt=new N.Vector3(t[J].end.x,t[J].end.y,0),vt=Me(yt,ut,mt,lt,.03),Wt=ie(yt,ut,mt,lt);if(vt!=null){if(Wt&&Wt.angle>85){let Ht=vt.point.distanceTo(yt);if(vt.point.distanceTo(ut)<.3){dt=!0,gt=1/0,Ft=-1;break}}continue}if(Wt&&Wt.angle>85){let Lt=new N.Line3(mt,lt).closestPointToPoint(ut,!0,kt),Ot=Xt(ut,yt,Lt,ut);if(!Ot||Ot.direction!="same")continue;let re=yt.clone().addScaledVector(pt.clone().negate(),Et),Kt=ut.clone().addScaledVector(pt,Et),se=new N.Vector3().subVectors(lt,mt).normalize(),te=mt.clone().addScaledVector(se.clone().negate(),.03),Re=lt.clone().addScaledVector(se,.03),le=Me(re,Kt,te,Re);if(le==null)continue;let ne=ut.distanceTo(le.point);ne<gt&&(gt=ne,Ft=J)}else if(Wt&&Wt.angle<5){let Ht=new N.Vector3(rt.x,rt.y,0),Lt=new N.Vector3(tt.x,tt.y,0),Ot=Zt(Ht,mt),re=Zt(Ht,lt),Kt=Zt(Lt,mt),se=Zt(Lt,lt),te=Xt(ut,yt,mt,Ht),Re=!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 yn=[];for(let xe=0;xe<t[J].checkResults[ne].originalVertices.length;xe++){let De=Fn(t[J].checkResults[ne].originalVertices[xe]);De.z=0,yn.push(De)}let ge=We(yn);if(ge.length==2){let xe=Zt(Ht,ge[0]),De=Zt(Ht,ge[1]),go=Zt(Lt,ge[0]),xo=Zt(Lt,ge[1]);if(xe<.2||De<.2||go<.2||xo<.2){Re=!0;break}}}t[J].checkResults=null}if(te&&te.direction=="same"&&!Re&&(Ot<.1||re<.1||Kt<.1||se<.1)){xt=!0,gt=1/0,Ft=-1;break}}}if(gt!=1/0&><2&&(p.length-Y>.2||p.length-Y<.02)&><Y*2)t[Ft].length>.25&&Y+gt>.5&&(ae=!0,Nt<X?(ft=ft.addScaledVector(pt,gt),rt=rt.addScaledVector(pt,gt)):(ot=ot.addScaledVector(pt,gt),tt=tt.addScaledVector(pt,gt)));else{if(!xt&&!dt&&p.length-Y>.1)continue;if(!xt&&!dt&&p.length-Y<.1&&p.length<1.8)continue}}else continue;Y=ft.distanceTo(ot)}if(ht<85&&Y>.3||Y>.7&&it>S-S/2){if(!p.isLine2){if(Y<3.5)for(let st=0;st<s.length;st++){let Ct=new N.Vector3(s[st].doorStartPt.x,s[st].doorStartPt.y,0),Nt=new N.Vector3(s[st].doorEndPt.x,s[st].doorEndPt.y,0),at=new N.Vector3(Z.facePoints[0].x,Z.facePoints[0].y,0),X=new N.Vector3(Z.facePoints[1].x,Z.facePoints[1].y,0),Et=Z.facePoints[2].z<s[st].maxZ||Math.abs(Z.facePoints[2].z-s[st].maxZ)<.3,yt=Math.abs(Z.facePoints[2].z-s[st].maxZ)>.2;if(Et){let ut=ye(Ct.clone(),Nt.clone(),at.clone(),X.clone(),{distanceThreshold:2});if(ut&&ut.type=="collinear_gap"){let pt=At(Ct,Nt),kt=new N.Line3(new N.Vector3(p.start.x,p.start.y,0),new N.Vector3(p.end.x,p.end.y,0)),gt=new N.Vector3,Ft=kt.closestPointToPoint(pt,!0,gt);if(pt.distanceTo(Ft)<.15){let dt=at.distanceTo(Ct),J=X.distanceTo(Ct);if(dt>.25&&J>.25){let vt=at.distanceTo(Nt),Wt=X.distanceTo(Nt);if(vt>.2&&Wt>.2)continue}wt=!0,Mt=!0,It.push(s[st].index),s[st].isFind=!0,bt=st,zt=n[s[st].index].isFindBeam,n[s[st].index].isFindBeam=!0;let mt=new N.Vector3().subVectors(at,X).normalize(),lt=Ct.distanceTo(Nt)-ut.overlap;J<dt&&mt.negate(),dt>J?(ot=Z.facePoints[2].clone().addScaledVector(mt,lt),ft=Z.facePoints[3].clone(),rt=ft.clone(),tt=ot.clone(),rt.z=tt.z=Z.facePoints[0].z):(ot=Z.facePoints[2].clone(),ft=Z.facePoints[3].clone().addScaledVector(mt,lt),rt=ft.clone(),tt=ot.clone(),rt.z=tt.z=Z.facePoints[0].z)}}else if(ut&&ut.type=="collinear_overlap"&&ut.maxPerpendicularDistance<.35){let pt=at.distanceTo(X),kt=Nt.distanceTo(Ct);if(Math.abs(pt-ut.overlap)<.25||Math.abs(kt-ut.overlap)<.25){if(kt>pt&&Math.abs(kt-ut.overlap)>1){let gt=at.distanceTo(Ct),Ft=at.distanceTo(Nt),xt=X.distanceTo(Ct),dt=X.distanceTo(Nt),J=gt<Ft?gt:Ft,mt=xt<dt?xt:dt,lt=new N.Vector3().subVectors(at,X).normalize(),vt=kt-ut.overlap;J<mt?(lt.negate(),ot=Z.facePoints[2].clone().addScaledVector(lt,vt),ft=Z.facePoints[3].clone(),rt=ft.clone(),tt=ot.clone(),rt.z=tt.z=Z.facePoints[0].z):(ot=Z.facePoints[2].clone(),ft=Z.facePoints[3].clone().addScaledVector(lt,vt),rt=ft.clone(),tt=ot.clone(),rt.z=tt.z=Z.facePoints[0].z)}Y>1.5&&(wt=!0,Mt=!0,It.push(s[st].index),s[st].isFind=!0,zt=n[s[st].index].isFindBeam,n[s[st].index].isFindBeam=!0,bt=st)}}}}if(!Mt&&Y<1.5)for(let st=0;st<s.length;st++){if(s[st].inWall)continue;let Ct=new N.Vector3(s[st].doorStartPt.x,s[st].doorStartPt.y,0),Nt=new N.Vector3(s[st].doorEndPt.x,s[st].doorEndPt.y,0),at=new N.Vector3(ft.x,ft.y,0),X=new N.Vector3(ot.x,ot.y,0),Et=new N.Vector3().subVectors(Ct,Nt).normalize(),yt=new N.Vector3().subVectors(at,X).normalize(),ut=.25,pt=Ct.clone().addScaledVector(Et,ut),kt=Nt.clone().addScaledVector(Et.clone().negate(),ut),gt=at.clone().addScaledVector(yt,ut),Ft=X.clone().addScaledVector(yt.clone().negate(),ut);if(Xt(pt,kt,gt,Ft).isParallel)continue;let dt=Me(pt,kt,gt,Ft),J=!0,mt=Ct.distanceTo(at),lt=Ct.distanceTo(X),vt=Nt.distanceTo(at),Wt=Nt.distanceTo(X);if((mt<c||lt<c||vt<c||Wt<c||dt)&&J){let Lt=new N.Line3(at,X);if(mt<c||vt<c)if(Dt=at.clone(),mt<c){let Ot=Lt.closestPointToPoint(Nt,!1,new N.Vector3);Pt=new N.Vector3().subVectors(Nt,Ot).normalize()}else{let Ot=Lt.closestPointToPoint(Ct,!1,new N.Vector3);Pt=new N.Vector3().subVectors(Ct,Ot).normalize()}else if(lt<c||Wt<c)if(Dt=X.clone(),lt<c){let Ot=Lt.closestPointToPoint(Nt,!1,new N.Vector3);Pt=new N.Vector3().subVectors(Nt,Ot).normalize()}else{let Ot=Lt.closestPointToPoint(Ct,!1,new N.Vector3);Pt=new N.Vector3().subVectors(Ct,Ot).normalize()}else if(dt){let Ot=dt.point.distanceTo(at),re=dt.point.distanceTo(X),Kt=dt.point.distanceTo(pt),se=dt.point.distanceTo(kt);if(Ot<re?Dt=at.clone():Dt=X.clone(),Kt<se){let te=Lt.closestPointToPoint(kt,!1,new N.Vector3);Pt=new N.Vector3().subVectors(kt,te).normalize()}else{let te=Lt.closestPointToPoint(pt,!1,new N.Vector3);Pt=new N.Vector3().subVectors(pt,te).normalize()}}zt=n[s[st].index].isFindBeam,n[s[st].index].isFindBeam=!0,wt=!0,s[st].isFind=!0,bt=st}}}(wt||Jt||Math.abs(it-S)>.1&&it>S/3&&Y>.3)&&(nt=!0)}}if(nt){{let at=new N.Vector3().subVectors(rt,tt),X=new N.Vector3().subVectors(tt,rt),Et=1/0,yt=1/0,ut=rt.clone(),pt=tt.clone(),kt=[],gt=[],Ft=new N.Line3(ot,ft),xt=new N.Vector3,dt=999999;if(p.originalPoints.forEach(J=>{if(J.z-rt.z<it/2+.1&&J.z-rt.z>it/2-.1&&kt.push(J),J.z>ot.z){let mt=Ft.closestPointToPoint(J,!0,xt),lt=new N.Vector3().subVectors(mt,ot),vt=new N.Vector3().subVectors(mt,ft),Wt=$t(at,vt),Ht=$t(X,lt);Wt&&Wt.parallel&&!Wt.sameDirection&&Ht&&Ht.parallel&&!Ht.sameDirection&>.push(J)}}),kt.length>0){let{newProjectPoints:J}=wn(rt,tt,kt);for(let mt of J)mt.z=rt.z;J.forEach(mt=>{let lt=new N.Vector3(mt.x,mt.y,rt.z),vt=new N.Vector3().subVectors(lt,tt),Wt=new N.Vector3().subVectors(lt,rt),Ht=$t(at,Wt),Lt=$t(X,vt);if(Ht&&Ht.parallel&&Ht.sameDirection){let Ot=lt.distanceTo(rt);Ot<Et&&(Et=Ot,ut=lt)}else if(Lt&&Lt.parallel&&Lt.sameDirection){let Ot=lt.distanceTo(tt);Ot<yt&&(yt=Ot,pt=lt)}})}if(ut.equals(rt)||(rt=ut,ft=new N.Vector3(rt.x,rt.y,ft.z)),pt.equals(tt)||(tt=pt,ot=new N.Vector3(tt.x,tt.y,ot.z)),gt.length>10){let{newOnLinePoints:J}=wn(ft,ot,gt);for(let mt=0;mt<J.length;mt++){let vt=Ft.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<f.length;at++){let X=ye(f[at].start,f[at].end,rt,tt);X&&X.type=="collinear_overlap"&&X.maxPerpendicularDistance<.07&&(Jt=!0)}if(Jt){bt!=-1&&(zt||(n[s[bt].index].isFindBeam=!1,s[bt].isFind=!1));continue}let he=tt.distanceTo(rt);if(he<.4&&!wt||he<.3&&wt)continue;u.includes(m)||u.push(m);let St="",ee=wt?"singleDoor":"";ee=Mt?"pullOutDoor":ee;let et={id:i,beamStart:ot,beamEnd:ft,beamHeight:p.rooftopPz-ot.z,doorStart:rt,doorEnd:tt,doorHeight:it,nearId:-1,type:St,isExtend:ae,isDoor:wt,isPullOutDoor:Mt,pcbDoorIndexs:It,beamNearWallVec:new N.Vector3(0,0,0),doorType:ee,doorOpenEndPoint:Dt,doorOpenVector:Pt,lineIsOnlyBeam:!1};if(et.beamHeight<.1)continue;let me=1/0,Le=!1,Be=new N.Vector3,gn=new N.Vector3,ke=-1,pe=-1,nn=-1,on=!1,xn=!1;if(!Le){let at=new N.Line3(rt.clone(),tt.clone()),X=-1;for(let Et=0;Et<t.length;Et++){if(t[Et].length<.5||Et==m)continue;let yt=new N.Vector3(t[Et].start.x,t[Et].start.y,t[Et].start.z),ut=new N.Vector3(t[Et].end.x,t[Et].end.y,t[Et].end.z),pt=ye(yt,ut,rt,tt),kt=Xt(yt,ut,rt,tt);if(pt&&pt.maxPerpendicularDistance<.5){if(kt&&kt.isParallel){let lt=new N.Line3(yt,ut),vt=new N.Vector3(rt.x,rt.y,yt.z),Wt=lt.closestPointToPoint(vt,!0,new N.Vector3),Ht=ie(Wt,vt,rt,tt);Ht&&Ht.angle>85&&(et.beamNearWallVec=new N.Vector3().subVectors(Wt,vt).normalize(),et.beamStart.z>t[Et].rooftopPz-.03&&Y>1?xn=!0:xn=!1)}let gt=[],Ft=o.readLineById(t[Et].id);Ft.originalPoints=o.getOriginalPointsById(t[Et].id),t[Et].originalPoints=Ft.originalPoints,Ft=null,t[Et].originalPoints.forEach(lt=>{lt.z>rt.z+.2&<.z<rt.z+it/2&>.push(new N.Vector3(lt.x,lt.y,rt.z))}),t[Et].originalPoints=null;let xt=new N.Vector3,dt=[],J=[];for(let lt=0;lt<gt.length;lt++){let vt=at.closestPointToPoint(gt[lt],!0,xt);vt.distanceTo(gt[lt])<.15&&(dt.push(gt[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=We(dt);if(mt.length==2){let lt=mt[0].distanceTo(mt[1]);if(Math.abs(lt-at.distance())<.3){X=pt.maxPerpendicularDistance;let vt=new N.Line3(yt,ut),Wt=new N.Vector3(rt.x,rt.y,yt.z),Ht=vt.closestPointToPoint(Wt,!0,new N.Vector3);if(et.beamNearWallVec=new N.Vector3().subVectors(Ht,Wt).normalize(),et.beamStart.z>t[Et].rooftopPz-.03&&Y>.8)xn=!0,on=!0;else if(Jt=!0,bt!=-1&&(zt||(n[s[bt].index].isFindBeam=!1,s[bt].isFind=!1)),pe!=-1&&nn!=-1){let Lt=t[pe].doorAndBeamData[nn];Lt.nearId=-1}break}}if(Jt)break}else pt&&pt.type=="collinear_overlap"&&pt.maxPerpendicularDistance>.3&&pt.maxPerpendicularDistance<.7&&(on=!0)}if(Jt){if(Y<1.5||X<.08)continue;on=!0}}let st=!1;if(ke!=-1)for(let at=0;at<d.length&&!(d[at].length==1&&(d[at][0].id==i?(d[at].push({id:ke,beamStart:Be,beamEnd:gn}),st=!0):d[at][0].id==ke&&(d[at].push({id:i,beamStart:ot,beamEnd:ft}),st=!0),st));at++);st||d.push([{id:i,beamStart:ot,beamEnd:ft}]);let Ct=et.doorStart.distanceTo(et.doorEnd),Nt=qe(p.originalPoints);if(et.lineIsOnlyBeam=Nt.minZ>p.start.z&&Nt.minZ-p.start.z>1,wt?St="door":Ct>1.5||ae?St="beam":St=on&&Ct>.8?"beam":"hole",St!="beam"&&t[m].isLine2)continue;et.type=St,et.wallBelowBeam=xn;for(let at=0;at<l.length;at++){let X=t[l[at].linesIndex].doorAndBeamData[l[at].doorIndex];if(X.nearId!=-1||et.type=="beam"&&X.type!="beam"||et.type!="beam"&&X.type=="beam")continue;let Et=Xt(ot.clone(),ft.clone(),X.beamStart.clone(),X.beamEnd.clone());if(Et&&Et.isParallel){let yt=ot.distanceTo(ft),ut=X.beamStart.distanceTo(X.beamEnd),pt=new N.Line3(ot.clone(),ft.clone());pt.start.z=0,pt.end.z=0;let kt=At(X.beamStart,X.beamEnd,!0);ut>yt&&(pt.start=new N.Vector3(X.beamStart.x,X.beamStart.y,0),pt.end=new N.Vector3(X.beamEnd.x,X.beamEnd.y,0),kt=At(ot,ft,!0));let gt=new N.Vector3,Ft=pt.closestPointToPoint(kt,!0,gt),xt=Ft.distanceTo(kt),dt=new N.Vector3().subVectors(kt,Ft).normalize(),J=dt.clone().negate(),mt=kt.clone().addScaledVector(J,xt+.1),lt=Me(pt.start,pt.end,kt,mt),vt=!wt&&!X.isDoor&&(yt>ut*2||ut>yt*2);if(xt<.4&<!=null&&!vt){let Wt=!1;for(let Kt=0;Kt<p.doorAndBeamData.length;Kt++)if(p.doorAndBeamData[Kt].id==X.id){Wt=!0;break}if(Wt)continue;X.nearId=i,et.nearId=X.id;let Ht=.8;(X.isDoor||et.isDoor)&&(X.isDoor=!0,et.isDoor=!0),X.doorType!=""?et.doorType=X.doorType:et.doorType!=""&&(X.doorType=et.doorType),X.isPullOutDoor?et.isPullOutDoor=!0:et.isPullOutDoor&&(X.isPullOutDoor=!0);let Lt=It.some(Kt=>X.pcbDoorIndexs.includes(Kt)),Ot=!1,re=!1;if(et.type=="beam"&&X.type=="beam"){let Kt=o.readLineById(t[l[at].linesIndex].id);Kt.originalPoints=o.getOriginalPointsById(t[l[at].linesIndex].id),t[l[at].linesIndex].originalPoints=Kt.originalPoints,Kt=null;let se=qe(t[l[at].linesIndex].originalPoints),te=qe(p.originalPoints);t[l[at].linesIndex].originalPoints=null,se.minZ>t[l[at].linesIndex].start.z&&se.minZ-t[l[at].linesIndex].start.z>1&&te.minZ>p.start.z&&te.minZ-p.start.z>1&&(Ot=yt>ut,re=yt<ut,ut>yt&&(et.isExtend=!0),yt>ut&&(t[l[at].linesIndex].isExtend=!0))}yt<ut&&!re||Ot?(Ot&&(J=J.negate(),dt=dt.negate()),yt>Ht&&!X.isPullOutDoor?(X.beamStart=ot.clone().addScaledVector(J,xt),X.beamEnd=ft.clone().addScaledVector(J,xt),X.doorStart=rt.clone().addScaledVector(J,xt),X.doorEnd=tt.clone().addScaledVector(J,xt),X.doorHeight=et.doorHeight,X.beamStart.z=X.beamEnd.z=X.doorStart.z+X.doorHeight,X.doorOpenEndPoint=et.doorOpenEndPoint.clone(),X.doorOpenVector=et.doorOpenVector.clone()):!Mt||Mt&&X.isPullOutDoor&&Lt?(et.beamStart=X.beamStart.clone().addScaledVector(dt,xt),et.beamEnd=X.beamEnd.clone().addScaledVector(dt,xt),et.doorStart=X.doorStart.clone().addScaledVector(dt,xt),et.doorEnd=X.doorEnd.clone().addScaledVector(dt,xt),et.doorHeight=X.doorHeight,et.beamStart.z=et.beamEnd.z=et.doorStart.z+et.doorHeight,et.doorOpenEndPoint=X.doorOpenEndPoint.clone(),et.doorOpenVector=X.doorOpenVector.clone()):(X.beamStart=ot.clone().addScaledVector(J,xt),X.beamEnd=ft.clone().addScaledVector(J,xt),X.doorStart=rt.clone().addScaledVector(J,xt),X.doorEnd=tt.clone().addScaledVector(J,xt),X.doorHeight=et.doorHeight,X.beamStart.z=X.beamEnd.z=X.doorStart.z+X.doorHeight,X.doorOpenEndPoint=et.doorOpenEndPoint.clone(),X.doorOpenVector=et.doorOpenVector.clone())):(yt>ut&&!Ot||re)&&(re&&(J=J.negate(),dt=dt.negate()),ut>Ht&&!Mt?(et.beamStart=X.beamStart.clone().addScaledVector(J,xt),et.beamEnd=X.beamEnd.clone().addScaledVector(J,xt),et.doorStart=X.doorStart.clone().addScaledVector(J,xt),et.doorEnd=X.doorEnd.clone().addScaledVector(J,xt),et.doorHeight=X.doorHeight,et.beamStart.z=et.beamEnd.z=et.doorStart.z+et.doorHeight,et.doorOpenEndPoint=X.doorOpenEndPoint.clone(),et.doorOpenVector=X.doorOpenVector.clone()):!X.isPullOutDoor||Mt&&X.isPullOutDoor&&Lt?(X.beamStart=ot.clone().addScaledVector(dt,xt),X.beamEnd=ft.clone().addScaledVector(dt,xt),X.doorStart=rt.clone().addScaledVector(dt,xt),X.doorEnd=tt.clone().addScaledVector(dt,xt),X.doorHeight=et.doorHeight,X.beamStart.z=X.beamEnd.z=X.doorStart.z+X.doorHeight,X.doorOpenEndPoint=et.doorOpenEndPoint.clone(),X.doorOpenVector=et.doorOpenVector.clone()):(et.beamStart=X.beamStart.clone().addScaledVector(J,xt),et.beamEnd=X.beamEnd.clone().addScaledVector(J,xt),et.doorStart=X.doorStart.clone().addScaledVector(J,xt),et.doorEnd=X.doorEnd.clone().addScaledVector(J,xt),et.doorHeight=X.doorHeight,et.beamStart.z=et.beamEnd.z=et.doorStart.z+et.doorHeight,et.doorOpenEndPoint=X.doorOpenEndPoint.clone(),et.doorOpenVector=X.doorOpenVector.clone())),ke=et.nearId,Be=X.beamStart.clone(),gn=X.beamEnd.clone(),Le=!0,pe=l[at].linesIndex,nn=l[at].doorIndex;break}}}if(et.nearId!=-1&&St=="hole"){let at=!1;for(let X=0;X<t.length;X++)if(t[X].doorAndBeamData){for(let Et=0;Et<t[X].doorAndBeamData.length;Et++)if(t[X].doorAndBeamData[Et].nearId==i&&t[X].doorAndBeamData[Et].type=="beam"){t[X].doorAndBeamData[Et].type=St,at=!0;break}if(at)break}}if(p.doorAndBeamIdToCheckResults.push([D.index,i]),p.doorAndBeamData.push(et),l.push({linesIndex:m,doorIndex:p.doorAndBeamData.length-1}),f.push({start:rt,end:tt}),i++,Mt&&Y<2)break}}}let H=p.length*(p.rooftopPz-p.start.z);p.completePointAreaPercentage=I/H*100,p.checkResults=null,p.originalPoints=null,p.mergeCheckRegion=null}if(u.length>1)for(let m=0;m<u.length;m++){let p=[];for(let x=0;x<t[u[m]].doorAndBeamData.length;x++){let b=!1;if(t[u[m]].doorAndBeamData[x].type==="beam"&&(t[u[m]].doorAndBeamData[x].beamNearWallVec.x==0&&t[u[m]].doorAndBeamData[x].beamNearWallVec.y==0&&t[u[m]].doorAndBeamData[x].beamNearWallVec.z==0&&t[u[m]].doorAndBeamData[x].nearId==-1||!t[u[m]].doorAndBeamData[x].wallBelowBeam&&t[u[m]].doorAndBeamData[x].nearId==-1)&&(t[u[m]].doorAndBeamData[x].lineIsOnlyBeam?b=!0:t[u[m]].doorAndBeamData[x].type="hole"),!b){let z=t[u[m]].doorAndBeamData[x].doorStart.clone(),M=t[u[m]].doorAndBeamData[x].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 S=0;S<t[u[E]].doorAndBeamData.length;S++){let I=t[u[E]].doorAndBeamData[S].doorStart.clone(),H=t[u[E]].doorAndBeamData[S].doorEnd.clone();I.z=H.z=0;let D=I.distanceTo(H),T=ye(z,M,I,H);if(T.type=="collinear_overlap"&&T.maxPerpendicularDistance<.2){let R=new N.Line3(I,H),v=At(z,M),W=R.closestPointToPoint(v,!0,new N.Vector3),V=v.distanceTo(W);if(Math.abs(P-T.overlap)<.1&&V<.04){t[u[E]].doorAndBeamData[S].nearId==t[u[m]].doorAndBeamData[x].id&&(t[u[E]].doorAndBeamData[S].nearId=-1),b=!0;break}}}}if(b){for(let z=0;z<t[u[m]].doorAndBeamIdToCheckResults.length;z++)if(t[u[m]].doorAndBeamIdToCheckResults[1]==t[u[m]].doorAndBeamData[x].id){t[u[m]].doorAndBeamIdToCheckResults.splice(z,1);break}}b||p.push(t[u[m]].doorAndBeamData[x])}p.length!=t[u[m]].doorAndBeamData.length&&(t[u[m]].doorAndBeamData=p)}let a=.65,h=2,g=[],y=[];for(let m=0;m<s.length;m++){if(s[m].isFind||s[m].inWall)continue;let p=new N.Vector3(s[m].doorStartPt.x,s[m].doorStartPt.y,0),x=new N.Vector3(s[m].doorEndPt.x,s[m].doorEndPt.y,0),b=new N.Vector3().subVectors(p,x).normalize();for(let z=0;z<t.length;z++){if(t[z].length<.7||t[z].completePointAreaPercentage>60)continue;let M=new N.Vector3(t[z].start.x,t[z].start.y,0),P=new N.Vector3(t[z].end.x,t[z].end.y,0),E=new N.Vector3().subVectors(M,P).normalize(),S=.3,I=p.clone().addScaledVector(b,S),H=x.clone().addScaledVector(b.clone().negate(),S),D=M.clone().addScaledVector(E,S),T=P.clone().addScaledVector(E.clone().negate(),S),R=Me(I,H,D,T),v=Xt(I,H,D,T),W=p.distanceTo(M)>x.distanceTo(M)?x:p,V=W.distanceTo(M),C=W.distanceTo(P);if((V<c||C<c)&&v&&!v.isParallel){let A=p.distanceTo(M),B=p.distanceTo(P),k=A<B?M:P,F=!1;for(let L=0;L<t.length;L++){if(L==z||g.includes(L)||t[L].length<.7)continue;let O=new N.Vector3(t[L].start.x,t[L].start.y,0),$=new N.Vector3(t[L].end.x,t[L].end.y,0),G=new N.Vector3().subVectors(O,$).normalize(),Q=G.clone().negate(),j=O.clone().addScaledVector(G,5),Z=$.clone().addScaledVector(Q,5),Y=ie(M,P,O,$),it=ye(M,P,O,$),ht=Me(M,P,j,Z),Tt=!0;if(ht!=null&&(Tt=ht.point.distanceTo(M)<c||ht.point.distanceTo(P)<c),(Y&&Y.angle>85||it&&it.type=="collinear_gap")&&Tt){let nt=new N.Line3(M,P),wt=new N.Vector3,zt=nt.closestPointToPoint(O,!0,wt),Dt=nt.closestPointToPoint($,!0,wt),Pt=zt.distanceTo(O),Mt=Dt.distanceTo($),It,ot;if(Pt>Mt&&Mt>a)It=$,ot=Dt;else if(Pt<Mt&&Pt>a)It=O,ot=zt;else continue;if(Pt=k.distanceTo(O),Mt=k.distanceTo($),Pt>h&&Mt>h)continue;let ft=Xt(It,ot,O,$),rt=Xt(It,ot,I,H);if(rt&&rt.isParallel||!ft||!ft.isParallel)continue;let tt=ye(p,x,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 St=0;St<y.length;St++){let ee=ye(y[St].start,y[St].end,It,ot);if(ee&&ee.type=="collinear_overlap"&&ee.maxPerpendicularDistance<.2){ae=!0;break}}if(ae)continue;for(let St=0;St<t.length;St++){if(t[St].length<.5)continue;let ee=new N.Vector3(t[St].start.x,t[St].start.y,t[St].start.z),et=new N.Vector3(t[St].end.x,t[St].end.y,t[St].end.z),me=ye(ee,et,It,ot);if(me&&me.type=="collinear_overlap"&&me.maxPerpendicularDistance<.1){ae=!0;break}}if(ae)continue;y.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 N.Vector3(0,0,0)}),n[s[m].index].isFindBeam=!0,n[s[m].index].isFindOnlyDoor=!0,d.push([{id:i,beamStart:It,beamEnd:ot}]),i++,F=!0;break}}if(F)break}}}let w=[];for(let m=0;m<t.length;m++)t[m].isLine2||w.push(t[m]),t[m].isLine2&&t[m].doorAndBeamData.length!=0&&w.push(t[m]);return t.length=0,t.push(...w),{lines:t,beamGroup:d}},qi=async(t,e)=>{for(let n=0;n<t.length;n++){let o=t[n],r=new N.Vector3(o.start.x,o.start.y,o.start.z),s=new N.Vector3(o.end.x,o.end.y,o.end.z),i=new N.Line3(r.clone(),s.clone()),l=-1;for(let u=0;u<o.doorAndBeamData.length;u++){let f=o.doorAndBeamData[u],d=f.doorHeight;f.isRebuild=!1;let c=!1,a=!1;if(!(f.nearId!=-1||f.type!="beam")){for(let h=0;h<t.length;h++){if(t[h].length<.5||h==n)continue;let g=new N.Vector3(t[h].start.x,t[h].start.y,t[h].start.z),y=new N.Vector3(t[h].end.x,t[h].end.y,t[h].end.z),w=ye(g,y,r,s),m=Xt(g,y,r,s);if(w&&w.maxPerpendicularDistance<.5){if(m&&m.isParallel){let E=new N.Line3(g,y),S=new N.Vector3(r.x,r.y,g.z),I=E.closestPointToPoint(S,!0,new N.Vector3),H=ie(I,S,r,s);H&&H.angle>85&&(f.beamNearWallVec=new N.Vector3().subVectors(I,S).normalize())}let p=[],x=e.readLineById(t[h].id);x.originalPoints=e.getOriginalPointsById(t[h].id),t[h].originalPoints=x.originalPoints,x=null,t[h].originalPoints.forEach(E=>{E.z>r.z+.2&&E.z<r.z+d/2&&p.push(new N.Vector3(E.x,E.y,r.z))}),t[h].originalPoints=null;let b=new N.Vector3,z=[],M=[];for(let E=0;E<p.length;E++){let S=i.closestPointToPoint(p[E],!0,b);S.distanceTo(p[E])<.15&&(z.push(p[E]),M.push(S.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=We(z);if(P.length==2){let E=P[0].distanceTo(P[1]);if(Math.abs(E-i.distance())<.3){l=w.maxPerpendicularDistance;let S=new N.Line3(g,y),I=new N.Vector3(r.x,r.y,g.z),H=S.closestPointToPoint(I,!0,new N.Vector3);f.beamNearWallVec=new N.Vector3().subVectors(H,I).normalize(),f.beamStart.z>t[h].rooftopPz-.03&&length>1?a=!0:c=!0;break}}if(c)break}else w&&w.type=="collinear_overlap"&&w.maxPerpendicularDistance>.3&&w.maxPerpendicularDistance<.7&&(a=!0)}if(c){if(length<1.8||l<.2)continue;a=!0}a||(f.isRebuild=!0)}}}};import*as Bt from"three";import"three/examples/jsm/utils/BufferGeometryUtils.js";var zr=(t,e={})=>{let n=e.eps??1e-6,o=e.project??(m=>({x:m.x,y:m.z})),r=e.skipSplit??!1,s=e.insideAreaSign??"positive",i=r?t.map((m,p)=>({start:Nn(m.start),end:Nn(m.end),uuid:m.uuid,sourceIndex:p,sourceSegment:m})):ji(t,o,n),l=[],u=new Map;function f(m){let p=Math.round(m.x/n),x=Math.round(m.y/n);return`${p},${x}`}function d(m){let p=f(m);if(u.has(p))return u.get(p);let x=l.length;return l.push({id:x,x:m.x,y:m.y}),u.set(p,x),x}let c=[],a=new Map;for(let m of i){let p=o(m.start),x=o(m.end);if(Mr(p,x)<n*n)continue;let b=d(p),z=d(x);if(b===z)continue;let M=b<z?`${b}_${z}`:`${z}_${b}`;if(a.has(M))continue;let P=c.length;c.push({id:P,a:b,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 y(m,p,x,b,z){let M=l[m],P=l[p],E=h.length,S=Math.atan2(P.y-M.y,P.x-M.x),I={id:E,from:m,to:p,twin:null,next:null,angle:S,edgeId:x,uuid:b,sourceIndex:z,visited:!1};return h.push(I),g[m].push(E),E}for(let m of c){let p=y(m.a,m.b,m.id,m.uuid,m.sourceIndex),x=y(m.b,m.a,m.id,m.uuid,m.sourceIndex);h[p].twin=x,h[x].twin=p}for(let m of g)m.sort((p,x)=>h[p].angle-h[x].angle);for(let m of h){let p=g[m.to],x=m.twin,b=p.indexOf(x);if(b===-1)continue;let z=(b-1+p.length)%p.length;m.next=p[z]}let w=[];for(let m of h){if(m.visited)continue;let p=[],x=[],b=m.id,z=0,M=h.length+10;for(;;){let D=h[b];if(!D||D.visited)break;if(D.visited=!0,p.push(b),x.push(D.from),b=D.next,z++,z>M){console.warn("\u534A\u8FB9\u904D\u5386\u5F02\u5E38\uFF0C\u53EF\u80FD\u5B58\u5728\u975E\u5E73\u9762\u56FE\u3001\u91CD\u590D\u7EBF\u3001\u60AC\u6302\u7EBF\u6216\u810F\u6570\u636E");break}}if(p.length<3)continue;let P=x.map(D=>l[D]),E=Xi(P),S=!1;if(s==="positive"?S=E>n:S=E<-n,!S)continue;let I=p.map(D=>h[D].uuid),H=p.map(D=>h[D].sourceIndex);w.push({uuids:I,area:Math.abs(E),lineIndexes:H})}return w};function ji(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 d=0;d<t.length;d++){if(r===d)continue;let c=t[d],a=e(c.start),h=e(c.end),g=$i(i,l,a,h,n);g&&g.t>n&&g.t<1-n&&u.push({t:g.t,point:Zi(s.start,s.end,g.t)})}u.sort((d,c)=>d.t-c.t);let f=[];for(let d of u)(f.length===0||Math.abs(d.t-f[f.length-1].t)>n)&&f.push(d);for(let d=0;d<f.length-1;d++){let c=f[d].point,a=f[d+1].point,h=e(c),g=e(a);Mr(h,g)<n*n||o.push({start:c,end:a,uuid:s.uuid,sourceIndex:r,sourceSegment:s})}}return o}function $i(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 f=Po(l,i)/u,d=Po(l,s)/u;return f>=-r&&f<=1+r&&d>=-r&&d<=1+r?{t:f,u:d,point:{x:t.x+f*s.x,y:t.y+f*s.y}}:null}function Po(t,e){return t.x*e.y-t.y*e.x}function Mr(t,e){let n=t.x-e.x,o=t.y-e.y;return n*n+o*o}function Xi(t){let e=0;for(let n=0;n<t.length;n++){let o=t[n],r=t[(n+1)%t.length];e+=o.x*r.y-r.x*o.y}return e/2}function Zi(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 Gi=(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,f=95;if(!t[0].uuid){let a=1e4;for(let h=0;h<t.length;h++)t[h].uuid=a++}let d=[];for(let a=0;a<t.length;a++)d.push({start:t[a].start,end:t[a].end,uuid:t[a].uuid});let c=zr(d,{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 y=t[c[a].lineIndexes[g]].length;if(y<r||y>s)break;let w=new Bt.Vector3(t[c[a].lineIndexes[g]].start.x,t[c[a].lineIndexes[g]].start.y,t[c[a].lineIndexes[g]].start.z),m=new Bt.Vector3(t[c[a].lineIndexes[g]].end.x,t[c[a].lineIndexes[g]].end.y,t[c[a].lineIndexes[g]].end.z),p=!1,x=new Bt.Vector3(0,0,0);for(let b=g+1;b<c[a].lineIndexes.length;b++){let z=t[c[a].lineIndexes[b]].length;if(z<r||z>s)break;let M=new Bt.Vector3(t[c[a].lineIndexes[b]].start.x,t[c[a].lineIndexes[b]].start.y,t[c[a].lineIndexes[b]].start.z),P=new Bt.Vector3(t[c[a].lineIndexes[b]].end.x,t[c[a].lineIndexes[b]].end.y,t[c[a].lineIndexes[b]].end.z),E=Xt(w,m,M,P);if(E&&E.isParallel){if(y+z>s){p=!0;break}y+=z;let I=ct(w,M),H=ct(w,P),D=ct(m,M),T=ct(m,P);I?(w=m.clone(),m=P.clone()):H?(w=m.clone(),m=M.clone()):D?m=P.clone():T&&(m=M.clone());continue}let S=ie(w,m,M,P);if(!S||S.angle<u||S.angle>f){p=!0;break}for(let I=b+1;I<c[a].lineIndexes.length;I++){let H=t[c[a].lineIndexes[I]].length;if(H<r||H>s)break;let D=new Bt.Vector3(t[c[a].lineIndexes[I]].start.x,t[c[a].lineIndexes[I]].start.y,t[c[a].lineIndexes[I]].start.z),T=new Bt.Vector3(t[c[a].lineIndexes[I]].end.x,t[c[a].lineIndexes[I]].end.y,t[c[a].lineIndexes[I]].end.z),R=Xt(M,P,D,T);if(R&&R.isParallel){if(z+H>s){p=!0;break}z+=H;let W=ct(M,D),V=ct(M,T),C=ct(P,D),_=ct(P,T);W?(M=P.clone(),P=T.clone()):V?(M=P.clone(),P=D.clone()):C?P=T.clone():_&&(P=D.clone());continue}let v=ie(M,P,D,T);if(!v||v.angle<u||v.angle>f){p=!0;break}for(let W=I+1;W<c[a].lineIndexes.length;W++){let V=t[c[a].lineIndexes[W]].length;if(V<r||V>s)break;let C=new Bt.Vector3(t[c[a].lineIndexes[W]].start.x,t[c[a].lineIndexes[W]].start.y,t[c[a].lineIndexes[W]].start.z),_=new Bt.Vector3(t[c[a].lineIndexes[W]].end.x,t[c[a].lineIndexes[W]].end.y,t[c[a].lineIndexes[W]].end.z),A=Xt(D,T,C,_);if(A&&A.isParallel){if(H+V>s){p=!0;break}H+=V;let $=ct(D,C),G=ct(D,_),Q=ct(T,C),j=ct(T,_);$?(D=T.clone(),T=_.clone()):G?(D=T.clone(),T=C.clone()):Q?T=_.clone():j&&(T=C.clone());continue}let B=ie(D,T,C,_);if(!B||B.angle<u||B.angle>f){p=!0;break}let k=ct(C,w),F=ct(C,m),L=ct(_,w),O=ct(_,m);if(k||F||L||O)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 Bt.Vector3(t[c[a].lineIndexes[$]].start.x,t[c[a].lineIndexes[$]].start.y,t[c[a].lineIndexes[$]].start.z),j=new Bt.Vector3(t[c[a].lineIndexes[$]].end.x,t[c[a].lineIndexes[$]].end.y,t[c[a].lineIndexes[$]].end.z),Z=Xt(C,_,Q,j);if(Z&&Z.isParallel){if(V+G>s){p=!0;break}V+=G;let Y=ct(C,Q),it=ct(C,j),ht=ct(_,Q),Tt=ct(_,j);if(Y)C=_.clone(),_=j.clone();else if(it)C=_.clone(),_=Q.clone();else if(ht)_=j.clone();else if(Tt)_=Q.clone();else continue;if(k=ct(C,w),F=ct(C,m),L=ct(_,w),O=ct(_,m),k||F||L||O){h=!0;break}}}break}if(p)break}if(p)break}if(p)break}h&&n.rectangles.push(c[a].uuids)}for(let a=0;a<t.length;a++){let h=t[a].length;if(o.has(t[a].uuid)||h<r||h>s)continue;let g={uuids:[],missingEdge:{start:new Bt.Vector3,end:new Bt.Vector3}},y=new Bt.Vector3(t[a].start.x,t[a].start.y,t[a].start.z),w=new Bt.Vector3(t[a].end.x,t[a].end.y,t[a].end.z),m=!0,p=!0;for(let z=0;z<t.length;z++){if(z==a)continue;let M=new Bt.Vector3(t[z].start.x,t[z].start.y,t[z].start.z),P=new Bt.Vector3(t[z].end.x,t[z].end.y,t[z].end.z),E=ct(M,y),S=ct(P,y),I=ct(M,w),H=ct(P,w);if(E||S?m=!1:(I||H)&&(p=!1),!m&&!p)break}if(!m&&!p)continue;let x=new Bt.Vector3;m||([y,w]=[w,y]),x=new Bt.Vector3().subVectors(w,y).normalize();let b=x.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 Bt.Vector3(t[z].start.x,t[z].start.y,t[z].start.z),E=new Bt.Vector3(t[z].end.x,t[z].end.y,t[z].end.z),S=ie(y,w,P,E);if(!S||S.angle<85)continue;let I=ct(P,w),H=ct(E,w);if(!I&&!H)continue;let D=new Bt.Vector3,T=new Bt.Vector3;I?(D=P.clone(),T=E.clone()):(D=E.clone(),T=P.clone());for(let R=0;R<t.length;R++){let v=t[R].length;if(R==a||R==z||o.has(R)||v<r||v>s)continue;let W=new Bt.Vector3(t[R].start.x,t[R].start.y,t[R].start.z),V=new Bt.Vector3(t[R].end.x,t[R].end.y,t[R].end.z),C=ie(P,E,W,V);if(!C||C.angle<85)continue;let _=ct(W,T),A=ct(V,T);if(!_&&!A)continue;let B=new Bt.Vector3,k=new Bt.Vector3;_?(B=W.clone(),k=V.clone()):(B=V.clone(),k=W.clone());let F=new Bt.Vector3().subVectors(k,B).normalize(),L=$t(b,F,.1);if(!L||!L.parallel||!L.sameDirection)continue;let O=!0,$=!0;for(let Q=0;Q<t.length;Q++){if(Q==R)continue;let j=new Bt.Vector3(t[Q].start.x,t[Q].start.y,t[Q].start.z),Z=new Bt.Vector3(t[Q].end.x,t[Q].end.y,t[Q].end.z),Y=ct(j,W),it=ct(Z,W),ht=ct(j,V),Tt=ct(Z,V);if(Y||it?O=!1:(ht||Tt)&&($=!1),!O&&!$)break}if(!O&&!$)continue;let G=h*M;if(!(G<i||G>l)){g.uuids=[t[a].uuid,t[z].uuid,t[R].uuid],g.missingEdge.start=k,g.missingEdge.end=y;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 q from"three";import"three/examples/jsm/utils/BufferGeometryUtils.js";var Vt=11102230246251565e-32,Yt=134217729,zn=(3+8*Vt)*Vt;function je(t,e,n,o,r){let s,i,l,u,f=e[0],d=o[0],c=0,a=0;d>f==d>-f?(s=f,f=e[++c]):(s=d,d=o[++a]);let h=0;if(c<t&&a<n)for(d>f==d>-f?(i=f+s,l=s-(i-f),f=e[++c]):(i=d+s,l=s-(i-d),d=o[++a]),s=i,l!==0&&(r[h++]=l);c<t&&a<n;)d>f==d>-f?(i=s+f,u=i-s,l=s-(i-u)+(f-u),f=e[++c]):(i=s+d,u=i-s,l=s-(i-u)+(d-u),d=o[++a]),s=i,l!==0&&(r[h++]=l);for(;c<t;)i=s+f,u=i-s,l=s-(i-u)+(f-u),f=e[++c],s=i,l!==0&&(r[h++]=l);for(;a<n;)i=s+d,u=i-s,l=s-(i-u)+(d-u),d=o[++a],s=i,l!==0&&(r[h++]=l);return(s!==0||h===0)&&(r[h++]=s),h}function Mn(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,rn=K(4),Er=K(8),Pr=K(12),Tr=K(16),oe=K(4);function Qi(t,e,n,o,r,s,i){let l,u,f,d,c,a,h,g,y,w,m,p,x,b,z,M,P,E,S=t-r,I=n-r,H=e-s,D=o-s;b=S*D,a=Yt*S,h=a-(a-S),g=S-h,a=Yt*D,y=a-(a-D),w=D-y,z=g*w-(b-h*y-g*y-h*w),M=H*I,a=Yt*H,h=a-(a-H),g=H-h,a=Yt*I,y=a-(a-I),w=I-y,P=g*w-(M-h*y-g*y-h*w),m=z-P,c=z-m,rn[0]=z-(m+c)+(c-P),p=b+m,c=p-b,x=b-(p-c)+(m-c),m=x-M,c=x-m,rn[1]=x-(m+c)+(c-M),E=p+m,c=E-p,rn[2]=p-(E-c)+(m-c),rn[3]=E;let T=Mn(4,rn),R=Ui*i;if(T>=R||-T>=R||(c=t-S,l=t-(S+c)+(c-r),c=n-I,f=n-(I+c)+(c-r),c=e-H,u=e-(H+c)+(c-s),c=o-D,d=o-(D+c)+(c-s),l===0&&u===0&&f===0&&d===0)||(R=Ki*i+zn*Math.abs(T),T+=S*d+D*l-(H*f+I*u),T>=R||-T>=R))return T;b=l*D,a=Yt*l,h=a-(a-l),g=l-h,a=Yt*D,y=a-(a-D),w=D-y,z=g*w-(b-h*y-g*y-h*w),M=u*I,a=Yt*u,h=a-(a-u),g=u-h,a=Yt*I,y=a-(a-I),w=I-y,P=g*w-(M-h*y-g*y-h*w),m=z-P,c=z-m,oe[0]=z-(m+c)+(c-P),p=b+m,c=p-b,x=b-(p-c)+(m-c),m=x-M,c=x-m,oe[1]=x-(m+c)+(c-M),E=p+m,c=E-p,oe[2]=p-(E-c)+(m-c),oe[3]=E;let v=je(4,rn,4,oe,Er);b=S*d,a=Yt*S,h=a-(a-S),g=S-h,a=Yt*d,y=a-(a-d),w=d-y,z=g*w-(b-h*y-g*y-h*w),M=H*f,a=Yt*H,h=a-(a-H),g=H-h,a=Yt*f,y=a-(a-f),w=f-y,P=g*w-(M-h*y-g*y-h*w),m=z-P,c=z-m,oe[0]=z-(m+c)+(c-P),p=b+m,c=p-b,x=b-(p-c)+(m-c),m=x-M,c=x-m,oe[1]=x-(m+c)+(c-M),E=p+m,c=E-p,oe[2]=p-(E-c)+(m-c),oe[3]=E;let W=je(v,Er,4,oe,Pr);b=l*d,a=Yt*l,h=a-(a-l),g=l-h,a=Yt*d,y=a-(a-d),w=d-y,z=g*w-(b-h*y-g*y-h*w),M=u*f,a=Yt*u,h=a-(a-u),g=u-h,a=Yt*f,y=a-(a-f),w=f-y,P=g*w-(M-h*y-g*y-h*w),m=z-P,c=z-m,oe[0]=z-(m+c)+(c-P),p=b+m,c=p-b,x=b-(p-c)+(m-c),m=x-M,c=x-m,oe[1]=x-(m+c)+(c-M),E=p+m,c=E-p,oe[2]=p-(E-c)+(m-c),oe[3]=E;let V=je(W,Pr,4,oe,Tr);return Tr[V-1]}function sn(t,e,n,o,r,s){let i=(e-s)*(n-r),l=(t-r)*(o-s),u=i-l,f=Math.abs(i+l);return Math.abs(u)>=Yi*f?u:-Qi(t,e,n,o,r,s,f)}var zu=(7+56*Vt)*Vt,Mu=(3+28*Vt)*Vt,Eu=(26+288*Vt)*Vt*Vt,Pu=K(4),Tu=K(4),Su=K(4),Ru=K(4),Du=K(4),vu=K(4),Vu=K(4),Iu=K(4),Cu=K(4),Wu=K(8),Hu=K(8),_u=K(8),Au=K(4),Lu=K(8),Bu=K(8),ku=K(16),Ou=K(12),Fu=K(192),Nu=K(192);var $u=(10+96*Vt)*Vt,Xu=(4+48*Vt)*Vt,Zu=(44+576*Vt)*Vt*Vt,Gu=K(4),Yu=K(4),Uu=K(4),Ku=K(4),Qu=K(4),Ju=K(4),tf=K(4),ef=K(4),nf=K(8),of=K(8),rf=K(8),sf=K(8),af=K(8),lf=K(8),cf=K(8),uf=K(8),ff=K(8),df=K(4),hf=K(4),mf=K(4),pf=K(8),gf=K(16),xf=K(16),yf=K(16),bf=K(32),wf=K(32),zf=K(48),Mf=K(64),Ef=K(1152),Pf=K(1152);var Df=(16+224*Vt)*Vt,vf=(5+72*Vt)*Vt,Vf=(71+1408*Vt)*Vt*Vt,If=K(4),Cf=K(4),Wf=K(4),Hf=K(4),_f=K(4),Af=K(4),Lf=K(4),Bf=K(4),kf=K(4),Of=K(4),Ff=K(24),Nf=K(24),qf=K(24),jf=K(24),$f=K(24),Xf=K(24),Zf=K(24),Gf=K(24),Yf=K(24),Uf=K(24),Kf=K(1152),Qf=K(1152),Jf=K(1152),td=K(1152),ed=K(1152),nd=K(2304),od=K(2304),rd=K(3456),sd=K(5760),id=K(8),ad=K(8),ld=K(8),cd=K(16),ud=K(24),fd=K(48),dd=K(48),hd=K(96),md=K(192),pd=K(384),gd=K(384),xd=K(384),yd=K(768);var bd=K(96),wd=K(96),zd=K(96),Md=K(1152);var Rr=Math.pow(2,-52),qn=new Uint32Array(512),ln=class t{static from(e,n=ra,o=sa){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,f=-1/0,d=-1/0;for(let S=0;S<i;S++){let I=e[2*S],H=e[2*S+1];I<l&&(l=I),H<u&&(u=H),I>f&&(f=I),H>d&&(d=H),this._ids[S]=S}let c=(l+f)/2,a=(u+d)/2,h=0,g=0,y=0;for(let S=0,I=1/0;S<i;S++){let H=To(c,a,e[2*S],e[2*S+1]);H<I&&(h=S,I=H)}let w=e[2*h],m=e[2*h+1];for(let S=0,I=1/0;S<i;S++){if(S===h)continue;let H=To(w,m,e[2*S],e[2*S+1]);H<I&&H>0&&(g=S,I=H)}let p=e[2*g],x=e[2*g+1],b=1/0;for(let S=0;S<i;S++){if(S===h||S===g)continue;let I=na(w,m,p,x,e[2*S],e[2*S+1]);I<b&&(y=S,b=I)}let z=e[2*y],M=e[2*y+1];if(b===1/0){for(let H=0;H<i;H++)this._dists[H]=e[2*H]-e[0]||e[2*H+1]-e[1];an(this._ids,this._dists,0,i-1);let S=new Uint32Array(i),I=0;for(let H=0,D=-1/0;H<i;H++){let T=this._ids[H],R=this._dists[T];R>D&&(S[I++]=T,D=R)}this.hull=S.subarray(0,I),this.triangles=new Uint32Array(0),this.halfedges=new Int32Array(0);return}if(sn(w,m,p,x,z,M)<0){let S=g,I=p,H=x;g=y,p=z,x=M,y=S,z=I,M=H}let P=oa(w,m,p,x,z,M);this._cx=P.x,this._cy=P.y;for(let S=0;S<i;S++)this._dists[S]=To(e[2*S],e[2*S+1],P.x,P.y);an(this._ids,this._dists,0,i-1),this._hullStart=h;let E=3;o[h]=n[y]=g,o[g]=n[h]=y,o[y]=n[g]=h,r[h]=0,r[g]=1,r[y]=2,s.fill(-1),s[this._hashKey(w,m)]=h,s[this._hashKey(p,x)]=g,s[this._hashKey(z,M)]=y,this.trianglesLen=0,this._addTriangle(h,g,y,-1,-1,-1);for(let S=0,I=0,H=0;S<this._ids.length;S++){let D=this._ids[S],T=e[2*D],R=e[2*D+1];if(S>0&&Math.abs(T-I)<=Rr&&Math.abs(R-H)<=Rr||(I=T,H=R,D===h||D===g||D===y))continue;let v=0;for(let A=0,B=this._hashKey(T,R);A<this._hashSize&&(v=s[(B+A)%this._hashSize],!(v!==-1&&v!==o[v]));A++);v=n[v];let W=v,V;for(;V=o[W],sn(T,R,e[2*W],e[2*W+1],e[2*V],e[2*V+1])>=0;)if(W=V,W===v){W=-1;break}if(W===-1)continue;let C=this._addTriangle(W,D,o[W],-1,-1,r[W]);r[D]=this._legalize(C+2),r[W]=C,E++;let _=o[W];for(;V=o[_],sn(T,R,e[2*_],e[2*_+1],e[2*V],e[2*V+1])<0;)C=this._addTriangle(_,D,V,r[D],-1,r[_]),r[D]=this._legalize(C+2),o[_]=_,E--,_=V;if(W===v)for(;V=n[W],sn(T,R,e[2*V],e[2*V+1],e[2*W],e[2*W+1])<0;)C=this._addTriangle(V,D,W,-1,r[W],r[V]),this._legalize(C+2),r[V]=C,o[W]=W,E--,W=V;this._hullStart=n[D]=W,o[W]=n[_]=D,o[D]=_,s[this._hashKey(T,R)]=D,s[this._hashKey(e[2*W],e[2*W+1])]=W}this.hull=new Uint32Array(E);for(let S=0,I=this._hullStart;S<E;S++)this.hull[S]=I,I=o[I];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 f=l-l%3,d=u+(e+1)%3,c=f+(l+2)%3,a=n[i],h=n[e],g=n[d],y=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*y],r[2*y+1])){n[e]=y,n[l]=a;let m=o[c];if(m===-1){let x=this._hullStart;do{if(this._hullTri[x]===c){this._hullTri[x]=e;break}x=this._hullPrev[x]}while(x!==this._hullStart)}this._link(e,m),this._link(l,o[i]),this._link(i,c);let p=f+(l+1)%3;s<qn.length&&(qn[s++]=p)}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 To(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,f=e-l,d=n-i,c=o-l,a=r-i,h=s-l,g=u*u+f*f,y=d*d+c*c,w=a*a+h*h;return u*(c*w-y*h)-f*(d*w-y*a)+g*(d*h-c*a)<0}function na(t,e,n,o,r,s){let i=n-t,l=o-e,u=r-t,f=s-e,d=i*i+l*l,c=u*u+f*f,a=.5/(i*f-l*u),h=(f*d-l*c)*a,g=(i*c-u*d)*a;return h*h+g*g}function oa(t,e,n,o,r,s){let i=n-t,l=o-e,u=r-t,f=s-e,d=i*i+l*l,c=u*u+f*f,a=.5/(i*f-l*u),h=t+(f*d-l*c)*a,g=e+(i*c-u*d)*a;return{x:h,y:g}}function an(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;En(t,r,s),e[t[n]]>e[t[o]]&&En(t,n,o),e[t[s]]>e[t[o]]&&En(t,s,o),e[t[n]]>e[t[s]]&&En(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;En(t,s,i)}t[n+1]=t[i],t[i]=l,o-s+1>=i-n?(an(t,e,s,o),an(t,e,n,i-1)):(an(t,e,n,i-1),an(t,e,s,o))}}function En(t,e,n){let o=t[e];t[e]=t[n],t[n]=o}function ra(t){return t[0]}function sa(t){return t[1]}var fe=class{constructor(){this._x0=this._y0=this._x1=this._y1=null,this._=""}moveTo(e,n){this._+=`M${this._x0=this._x1=+e},${this._y0=this._y1=+n}`}closePath(){this._x1!==null&&(this._x1=this._x0,this._y1=this._y0,this._+="Z")}lineTo(e,n){this._+=`L${this._x1=+e},${this._y1=+n}`}arc(e,n,o){e=+e,n=+n,o=+o;let 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 He=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 Pn=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 y=0,w=0,m=o.length,p,x;y<m;y+=3,w+=2){let b=o[y]*2,z=o[y+1]*2,M=o[y+2]*2,P=e[b],E=e[b+1],S=e[z],I=e[z+1],H=e[M],D=e[M+1],T=S-P,R=I-E,v=H-P,W=D-E,V=(T*W-R*v)*2;if(Math.abs(V)<1e-9){if(s===void 0){s=i=0;for(let _ of n)s+=e[_*2],i+=e[_*2+1];s/=n.length,i/=n.length}let C=1e9*Math.sign((s-P)*W-(i-E)*v);p=(P+H)/2-C*W,x=(E+D)/2+C*v}else{let C=1/V,_=T*T+R*R,A=v*v+W*W;p=P+(W*_-R*A)*C,x=E+(T*A-v*_)*C}l[w]=p,l[w+1]=x}let u=n[n.length-1],f,d=u*4,c,a=e[2*u],h,g=e[2*u+1];r.fill(0);for(let y=0;y<n.length;++y)u=n[y],f=d,c=a,h=g,d=u*4,a=e[2*u],g=e[2*u+1],r[f+2]=r[d]=h-g,r[f+3]=r[d+1]=a-c}render(e){let n=e==null?e=new fe:void 0,{delaunay:{halfedges:o,inedges:r,hull:s},circumcenters:i,vectors:l}=this;if(s.length<=1)return null;for(let d=0,c=o.length;d<c;++d){let a=o[d];if(a<d)continue;let h=Math.floor(d/3)*2,g=Math.floor(a/3)*2,y=i[h],w=i[h+1],m=i[g],p=i[g+1];this._renderSegment(y,w,m,p,e)}let u,f=s[s.length-1];for(let d=0;d<s.length;++d){u=f,f=s[d];let c=Math.floor(r[f]/3)*2,a=i[c],h=i[c+1],g=u*4,y=this._project(a,h,l[g+2],l[g+3]);y&&this._renderSegment(a,h,y[0],y[1],e)}return n&&n.value()}renderBounds(e){let n=e==null?e=new fe:void 0;return e.rect(this.xmin,this.ymin,this.xmax-this.xmin,this.ymax-this.ymin),n&&n.value()}renderCell(e,n){let o=n==null?n=new fe:void 0,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 He;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 f=Math.floor(u/3);if(l.push(n[f*2],n[f*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],f,d=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],f=d,d=this._regioncode(l,u),f===0&&d===0)c=a,a=0,r?r.push(l,u):r=[l,u];else{let g,y,w,m,p;if(f===0){if((g=this._clipSegment(s,i,l,u,f,d))===null)continue;[y,w,m,p]=g}else{if((g=this._clipSegment(l,u,s,i,d,f))===null)continue;[m,p,y,w]=g,c=a,a=this._edgecode(y,w),c&&a&&this._edge(e,c,a,r,r.length),r?r.push(y,w):r=[y,w]}c=a,a=this._edgecode(m,p),c&&a&&this._edge(e,c,a,r,r.length),r?r.push(m,p):r=[m,p]}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,f,d=s||i;d&8?(u=e+(o-e)*(this.ymax-n)/(r-n),f=this.ymax):d&4?(u=e+(o-e)*(this.ymin-n)/(r-n),f=this.ymin):d&2?(f=n+(r-n)*(this.xmax-e)/(o-e),u=this.xmax):(f=n+(r-n)*(this.xmin-e)/(o-e),u=this.xmin),s?(e=u,n=f,s=this._regioncode(e,n)):(o=u,r=f,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 f=0,d=l.length,c,a=this._edgecode(l[d-2],l[d-1]);f<d;f+=2)c=a,a=this._edgecode(l[f],l[f+1]),c&&a&&(f=this._edge(e,c,a,l,f),d=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,cn=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 _e=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 ln(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],f=this.collinear[this.collinear.length-1],d=[n[2*u],n[2*u+1],n[2*f],n[2*f+1]],c=1e-8*Math.hypot(d[3]-d[1],d[2]-d[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 ln(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,f=o.length;u<f;++u){let d=s[u%3===2?u-2:u+1];(o[u]===-1||i[d]===-1)&&(i[d]=u)}for(let u=0,f=r.length;u<f;++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 Pn(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 f=u,d=-1;do{if(yield d=i[f],f=f%3===2?f-2:f+1,i[f]!==e)return;if(f=s[f],f===-1){let c=o[(r[e]+1)%o.length];c!==d&&(yield c);return}}while(f!==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:f}=this;if(r[e]===-1||!f.length)return(e+1)%(f.length>>1);let d=e,c=cn(n-f[e*2],2)+cn(o-f[e*2+1],2),a=r[e],h=a;do{let g=u[h],y=cn(n-f[g*2],2)+cn(o-f[g*2+1],2);if(y<c&&(c=y,d=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&&cn(n-f[h*2],2)+cn(o-f[h*2+1],2)<c)return h;break}}while(h!==a);return d}render(e){let n=e==null?e=new fe: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 f=s[i]*2,d=s[u]*2;e.moveTo(o[f],o[f+1]),e.lineTo(o[d],o[d+1])}return this.renderHull(e),n&&n.value()}renderPoints(e,n){n===void 0&&(!e||typeof e.moveTo!="function")&&(n=e,e=null),n=n==null?2:+n;let o=e==null?e=new fe:void 0,{points: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 fe: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 He;return this.renderHull(e),e.value()}renderTriangle(e,n){let o=n==null?n=new fe: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 He;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 So(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 Dr(t,e,n){let o=t.get(e);o===void 0&&(o=[],t.set(e,o)),o.push(n)}function Ee(t){if(!t||t.length<3)return[];let e=new Set,n=[];for(let y=0;y<t.length;y++){let w=t[y],m=`${w[0]}_${w[1]}`;e.has(m)||(e.add(m),n.push(w))}let o=n.length;if(o<3)return[];let r=new Float64Array(o*2);for(let y=0,w=0;y<o;y++){let m=n[y];r[w++]=m[0],r[w++]=m[1]}let s=new _e(r),{triangles:i}=s;if(!i.length)return[];let l=new Map;for(let y=0;y<i.length;y+=3){let w=i[y],m=i[y+1],p=i[y+2],x=w*2,b=m*2,z=p*2,M=r[x],P=r[x+1],E=r[b],S=r[b+1],I=r[z],H=r[z+1],D=M-E,T=P-S,R=M-I,v=P-H,W=E-I,V=S-H,C=W*W+V*V,_=R*R+v*v,A=D*D+T*T,B=(E-M)*(H-P)-(I-M)*(S-P);if(B===0)continue;let k=B*B,L=M===0||E===0||I===0?k:4*k;C*_*A<=L&&(So(l,o,w,m),So(l,o,m,p),So(l,o,p,w))}if(!l.size)return[];let u=new Map,f=0,d=-1;for(let[y,w]of l){if(w!==1)continue;let m=Math.floor(y/o),p=y-m*o;d===-1&&(d=m),Dr(u,m,p),Dr(u,p,m),f++}if(f===0)return[];let c=[],a=new Uint8Array(o),h=d,g=-1;do{c.push(n[h]),a[h]=1;let y=u.get(h)||[],w=-1;for(let m=0;m<y.length;m++){let p=y[m];if(p!==g&&!a[p]){w=p;break}}if(w===-1)for(let m=0;m<y.length;m++){let p=y[m];if(p!==g){w=p;break}}if(w===-1)break;g=h,h=w}while(h!==d&&c.length<=f+1);return c.length>0&&c.push(c[0]),c}import*as qt from"three";import{OBB as Ia}from"three/examples/jsm/math/OBB.js";var Ut=63710088e-1,Vr={centimeters:Ut*100,centimetres:Ut*100,degrees:360/(2*Math.PI),feet:Ut*3.28084,inches:Ut*39.37,kilometers:Ut/1e3,kilometres:Ut/1e3,meters:Ut,metres:Ut,miles:Ut/1609.344,millimeters:Ut*1e3,millimetres:Ut*1e3,nauticalmiles:Ut/1852,radians:1,yards:Ut*1.0936};function Ir(t,e,n={}){let o={type:"Feature"};return(n.id===0||n.id)&&(o.id=n.id),n.bbox&&(o.bbox=n.bbox),o.properties=e||{},o.geometry=t,o}function jn(t,e,n={}){if(!t)throw new Error("coordinates is required");if(!Array.isArray(t))throw new Error("coordinates must be an Array");if(t.length<2)throw new Error("coordinates must be at least 2 numbers long");if(!vr(t[0])||!vr(t[1]))throw new Error("coordinates must contain numbers");return Ir({type:"Point",coordinates:t},e,n)}function $n(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 Ir({type:"Polygon",coordinates:t},e,n)}function ha(t,e="kilometers"){let n=Vr[e];if(!n)throw new Error(e+" units is invalid");return t*n}function ma(t,e="kilometers"){let n=Vr[e];if(!n)throw new Error(e+" units is invalid");return t/n}function Xn(t){return t%(2*Math.PI)*180/Math.PI}function de(t){return t%360*Math.PI/180}function Zn(t,e="kilometers",n="kilometers"){if(!(t>=0))throw new Error("length must be a positive number");return ha(ma(t,e),n)}function vr(t){return!isNaN(t)&&t!==null&&!Array.isArray(t)}function Cr(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Pe(t,e,n){if(t!==null)for(var o,r,s,i,l,u,f,d=0,c=0,a,h=t.type,g=h==="FeatureCollection",y=h==="Feature",w=g?t.features.length:1,m=0;m<w;m++){f=g?t.features[m].geometry:y?t.geometry:t,a=f?f.type==="GeometryCollection":!1,l=a?f.geometries.length:1;for(var p=0;p<l;p++){var x=0,b=0;if(i=a?f.geometries[p]:f,i!==null){u=i.coordinates;var z=i.type;switch(d=n&&(z==="Polygon"||z==="MultiPolygon")?1:0,z){case null:break;case"Point":if(e(u,c,m,x,b)===!1)return!1;c++,x++;break;case"LineString":case"MultiPoint":for(o=0;o<u.length;o++){if(e(u[o],c,m,x,b)===!1)return!1;c++,z==="MultiPoint"&&x++}z==="LineString"&&x++;break;case"Polygon":case"MultiLineString":for(o=0;o<u.length;o++){for(r=0;r<u[o].length-d;r++){if(e(u[o][r],c,m,x,b)===!1)return!1;c++}z==="MultiLineString"&&x++,z==="Polygon"&&b++}z==="Polygon"&&x++;break;case"MultiPolygon":for(o=0;o<u.length;o++){for(b=0,r=0;r<u[o].length;r++){for(s=0;s<u[o][r].length-d;s++){if(e(u[o][r][s],c,m,x,b)===!1)return!1;c++}b++}x++}break;case"GeometryCollection":for(o=0;o<i.geometries.length;o++)if(Pe(i.geometries[o],e,n)===!1)return!1;break;default:throw new Error("Unknown Geometry Type")}}}}}function Wr(t){var e=[];return Pe(t,function(n){e.push(n)}),e}function pa(t,e){var n,o,r,s,i,l,u,f,d,c,a=0,h=t.type==="FeatureCollection",g=t.type==="Feature",y=h?t.features.length:1;for(n=0;n<y;n++){for(l=h?t.features[n].geometry:g?t.geometry:t,f=h?t.features[n].properties:g?t.properties:{},d=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,f,d,c)===!1)return!1;continue}switch(s.type){case"Point":case"LineString":case"MultiPoint":case"Polygon":case"MultiLineString":case"MultiPolygon":{if(e(s,a,f,d,c)===!1)return!1;break}case"GeometryCollection":{for(o=0;o<s.geometries.length;o++)if(e(s.geometries[o],a,f,d,c)===!1)return!1;break}default:throw new Error("Unknown Geometry Type")}}a++}}function Hr(t,e,n){var o=n;return pa(t,function(r,s,i,l,u){s===0&&n===void 0?o=r:o=e(o,r,s,i,l,u)}),o}var Qr=wi(Kr(),1);function Jr(t,e={}){e.concavity=e.concavity||1/0;let n=[];if(Pe(t,r=>{n.push([r[0],r[1]])}),!n.length)return null;let o=(0,Qr.default)(n,e.concavity);return o.length>3?$n([o]):null}function Qn(t,e={}){let n=0,o=0,r=0;return Pe(t,function(s){n+=s[0],o+=s[1],r++},!0),jn([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 ts(t){if(Array.isArray(t))return t;if(t.type==="Feature"){if(t.geometry!==null)return t.geometry.coordinates}else if(t.coordinates)return t.coordinates;throw new Error("coords must be GeoJSON Feature, Geometry Object or an Array")}function ns(t,e,n={}){let o;return n.final?o=es(ce(e),ce(t)):o=es(ce(t),ce(e)),o>180?-(360-o):o}function es(t,e){let n=de(t[1]),o=de(e[1]),r=de(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 os(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=Ta(o,r);return Zn(s,"meters",n.units)}function Ta(t,e,n){n=n===void 0?Ut: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)),f=Math.abs(u)>1e-11?i/u:Math.cos(r);return Math.sqrt(i*i+f*f*l*l)*o}function rs(t,e,n,o={}){let r=e<0,s=Zn(Math.abs(e),o.units,"meters");r&&(s=-Math.abs(s));let i=ce(t),l=Sa(i,s,n);return l[0]+=l[0]-i[0]>180?-360:i[0]-l[0]>180?360:0,jn(l,o.properties)}function Sa(t,e,n,o){o=o===void 0?Ut:Number(o);let r=e/o,s=t[0]*Math.PI/180,i=de(t[1]),l=de(n),u=r*Math.cos(l),f=i+u;Math.abs(f)>Math.PI/2&&(f=f>0?Math.PI-f:-Math.PI-f);let d=Math.log(Math.tan(f/2+Math.PI/4)/Math.tan(i/2+Math.PI/4)),c=Math.abs(d)>1e-11?u/d:Math.cos(i),a=r*Math.sin(l)/c;return[((s+a)*180/Math.PI+540)%360-180,f*180/Math.PI]}function ss(t){if(!t)throw new Error("geojson is required");switch(t.type){case"Feature":return is(t);case"FeatureCollection":return Ra(t);case"Point":case"LineString":case"Polygon":case"MultiPoint":case"MultiLineString":case"MultiPolygon":case"GeometryCollection":return _o(t);default:throw new Error("unknown GeoJSON type")}}function is(t){let e={type:"Feature"};return Object.keys(t).forEach(n=>{switch(n){case"type":case"properties":case"geometry":return;default:e[n]=t[n]}}),e.properties=as(t.properties),t.geometry==null?e.geometry=null:e.geometry=_o(t.geometry),e}function as(t){let e={};return t&&Object.keys(t).forEach(n=>{let o=t[n];typeof o=="object"?o===null?e[n]=null:Array.isArray(o)?e[n]=o.map(r=>r):e[n]=as(o):e[n]=o}),e}function Ra(t){let e={type:"FeatureCollection"};return Object.keys(t).forEach(n=>{switch(n){case"type":case"features":return;default:e[n]=t[n]}}),e.features=t.features.map(n=>is(n)),e}function _o(t){let e={type:t.type};return t.bbox&&(e.bbox=t.bbox),t.type==="GeometryCollection"?(e.geometries=t.geometries.map(n=>_o(n)),e):(e.coordinates=ls(t.coordinates),e)}function ls(t){let e=t;return typeof e[0]!="object"?e.slice():e.map(n=>ls(n))}function Ao(t,e,n){if(n=n||{},!Cr(n))throw new Error("options is invalid");let o=n.pivot,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=ss(t)),Pe(t,function(i){let u=ns(s,i)+e,f=os(s,i),d=ts(rs(s,f,u));i[0]=d[0],i[1]=d[1]}),t}function Lo(t,e,n={}){if(n.final===!0)return Da(t,e);let o=ce(t),r=ce(e),s=de(o[0]),i=de(r[0]),l=de(o[1]),u=de(r[1]),f=Math.sin(i-s)*Math.cos(u),d=Math.cos(l)*Math.sin(u)-Math.sin(l)*Math.cos(u)*Math.cos(i-s);return Xn(Math.atan2(f,d))}function Da(t,e){let n=Lo(e,t);return n=(n+180)%360,n}function cs(t,e={}){if(t.bbox!=null&&e.recompute!==!0)return t.bbox;let n=[1/0,1/0,-1/0,-1/0];return Pe(t,o=>{n[0]>o[0]&&(n[0]=o[0]),n[1]>o[1]&&(n[1]=o[1]),n[2]<o[0]&&(n[2]=o[0]),n[3]<o[1]&&(n[3]=o[1])}),n}function us(t,e={}){let n=Number(t[0]),o=Number(t[1]),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 $n([[i,[r,o],[r,s],[n,s],i]],e.properties,{bbox:t,id:e.id})}function fs(t){return us(cs(t))}function ms(t){return Hr(t,(e,n)=>e+va(n),0)}function va(t){let e=0,n;switch(t.type){case"Polygon":return ds(t.coordinates);case"MultiPolygon":for(n=0;n<t.coordinates.length;n++)e+=ds(t.coordinates[n]);return e;case"Point":case"MultiPoint":case"LineString":case"MultiLineString":return 0}return 0}function ds(t){let e=0;if(t&&t.length>0){e+=Math.abs(hs(t[0]));for(let n=1;n<t.length;n++)e-=Math.abs(hs(t[n]))}return e}var Va=Ut*Ut/2,Bo=Math.PI/180;function hs(t){let e=t.length-1;if(e<=2)return 0;let n=0,o=0;for(;o<e;){let r=t[o],s=t[o+1===e?0:o+1],i=t[o+2>=e?(o+2)%e:o+2],l=r[0]*Bo,u=s[1]*Bo,f=i[0]*Bo;n+=(f-l)*Math.sin(u),o++}return n*Va}function ps(t){let e=Jr(t);if(!e)throw new Error("Can't calculate smallestSurroundingRectangleByArea for given geometry");let n=Qn(e),o=Wr(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}),f=fs(u),d=ms(f);d<r&&(r=d,s=Ao(f,l,{pivot:n}))}return s}function gs(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(){Ae.identity(),Ae.setFromMatrix3(this.rotation),Ae.decompose(Jn,$e,new qt.Vector3);let e=this.halfSize.clone().multiplyScalar(2),n=new qt.Mesh(new qt.BoxGeometry(e.x,e.y,e.z));return n.position.copy(this.center),n.rotation.setFromQuaternion($e),n}getBoxEdge(e=16776960){let n=this.getBoxMesh();Ha.setFromObject(n);let o=new qt.EdgesGeometry(n.geometry.clone().applyMatrix4(n.matrixWorld));return new qt.LineSegments(o,new qt.LineBasicMaterial({color:e,toneMapped:!1}))}toJson(){return Ae.identity(),Ae.setFromMatrix3(this.rotation),Ae.decompose(Jn,$e,new qt.Vector3),{size:this.halfSize.toArray(),center:this.center.toArray(),quaternion:$e.toArray()}}static from(e,n,o,r=new t){if(o instanceof qt.Euler)$e.setFromEuler(o);else if(o instanceof qt.Quaternion)$e.copy(o);else throw new Error("\u4F20\u5165\u7684\u65CB\u8F6C\u4E0D\u662F\u6B27\u62C9\u89D2\u6216\u8005\u56DB\u5143\u6570");return Ae.compose(n,$e,Wa),r.center.copy(n),r.halfSize.copy(e.multiplyScalar(.5)),r.rotation.setFromMatrix4(Ae),r}static fromByPath2D(e,n,o,r=new t){let s=ps({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=gs(i[0],i[1]),u=gs(i[1],i[2]),f=Math.atan2(i[1][1]-i[0][1],i[1][0]-i[0][0]);Jn.set(l,u,o),xs.set(0,0,f);let[d,c]=Ca(i);return n.x=d,n.y=c,this.from(Jn,n,xs,r)}},Ae=new qt.Matrix4,$e=new qt.Quaternion,xs=new qt.Euler,Wa=new qt.Vector3(1,1,1),Jn=new qt.Vector3,Ha=new qt.Box3;import"three";function _a(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,f=Math.ceil(n/r)+1,d=[];for(let c=-f;c<=f;c++)for(let a=-f;a<=f;a++)for(let h=-f;h<=f;h++)c*c+a*a+h*h<=f*f&&d.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),y=!1;for(let[w,m,p]of d){let x=`${a+w},${h+m},${g+p}`;if(i.has(x)){for(let b of i.get(x))if(c.distanceToSquared(b)<s){y=!0;break}if(y)break}}if(y&&(u++,u/t.length>o))return u/t.length}return u/t.length}function Ve(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 ko(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 q.Vector3,o=new q.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 ue(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 be(t,e,n,o){let r=[];for(let i=0;i<t.length;i++)r.push(new q.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 q.Group,o=new q.MeshStandardMaterial({color:16737792,side:q.DoubleSide});for(let r=0;r<t.length;r++){let s=[];for(let y=0;y<t[r].path.length;y++)s.push(new q.Vector3(t[r].path[y][0],t[r].path[y][1],0));if(s.length==0)continue;n.add(t[r].obb.getBoxEdge());let i=new q.BufferGeometry;i.setFromPoints(s);let l="green",u=new q.LineBasicMaterial({color:l,depthTest:!1,depthWrite:!1}),f=new q.Line(i,u);f.position.z=t[r].maxz,n.add(f);let d=t[r].obb.center.clone(),c=mr(t[r].type,d),a=t[r].stairBottomPt1.clone(),h=t[r].stairBottomPt2.clone();for(let y=0;y<t[r].stairStepNum;y++){let w=[a,h];w.push(h.clone().addScaledVector(t[r].vecStepWidth,t[r].stairStepWidth)),w.push(a.clone().addScaledVector(t[r].vecStepWidth,t[r].stairStepWidth));let m=Eo(w,t[r].stairStepHeight),p=new q.Mesh(m,o);n.add(p),a=a.addScaledVector(t[r].vecStepWidth,t[r].stairStepWidth),a=a.addScaledVector(new q.Vector3(0,0,1),t[r].stairStepHeight),h=h.addScaledVector(t[r].vecStepWidth,t[r].stairStepWidth),h=h.addScaledVector(new q.Vector3(0,0,1),t[r].stairStepHeight)}if(t[r].rectPt1.x!=0&&t[r].rectPt1.y!=0){let y=[t[r].stairBottomPt1,t[r].stairBottomPt2,t[r].rectPt2,t[r].rectPt1],w=Eo(y,t[r].stairStepHeight),m=new q.Mesh(w,o);n.add(m)}let g=new q.MeshBasicMaterial({color:16776960});for(let y=0;y<t[r].stairBottom1BalconyRailing.length;y++){let w=new q.CylinderGeometry(.03,.03,t[r].balconyRailingHeight,32),m=new q.Mesh(w,g);m.position.set(t[r].stairBottom1BalconyRailing[y].x,t[r].stairBottom1BalconyRailing[y].z+t[r].balconyRailingHeight/2,-t[r].stairBottom1BalconyRailing[y].y),e.add(m)}for(let y=0;y<t[r].stairBottom2BalconyRailing.length;y++){let w=new q.CylinderGeometry(.03,.03,t[r].balconyRailingHeight,32),m=new q.Mesh(w,g);m.position.set(t[r].stairBottom2BalconyRailing[y].x,t[r].stairBottom2BalconyRailing[y].z+t[r].balconyRailingHeight/2,-t[r].stairBottom2BalconyRailing[y].y),e.add(m)}}return n},La=(t,e,n=null)=>{if(t.length==0)return[];e||(e=t[0].averagePz);let o=[],r=new Map;for(let i=0;i<t.length;i++){let l=t[i].points.map(p=>[p.x,p.y]),u=t[i].obj_id;u=u.replace(/calcony railing/g,"balcony railing").replace(/glass balcony railing/g,"balcony railing").replace(/metal balcony railing/g,"balcony railing").replace(/temporary construction guardrail/g,"balcony railing").replace(/the floor of the house/g,"floor").replace(/the outdoor floor/g,"floor").replace(/roof/g,"Ceiling");let f=u.split("_").slice(1,3).join("_").split(".")[0].split("_")[0],d=u.indexOf("_")+1,c=u.lastIndexOf("_"),a=u.substring(d,c);if(a.includes("top")&&(d=a.indexOf("top")+4,a=a.substring(d,c)),a.includes("left")&&(d=a.indexOf("left")+5,a=a.substring(d,c)),a.includes("right")&&(d=a.indexOf("right")+6,a=a.substring(d,c)),a.includes("front")&&(d=a.indexOf("front")+6,a=a.substring(d,c)),a!=="balcony railing"&&a!=="Staircase")continue;let h=[];for(let p=0;p<t[i].points.length;p++)h.push(new q.Vector3(t[i].points[p].x,t[i].points[p].y,t[i].points[p].z));let g=-99999;if(a==="floor"){let p=new Map;for(let b=0;b<t[i].points.length;b++){let z=t[i].points[b].z;if(z=Math.floor(z*10)/10,p.has(z)){let M=p.get(z);M.num+=1,M.points.push(t[i].points[b]),p.set(z,M)}else p.set(z,{num:1,points:[t[i].points[b]]})}let x=[...p.entries()].reduce((b,z)=>z[1].num>b[1].num?z:b);l=[],l=x[1].points.map(b=>[b.x,b.y]),h=[],h=x[1].points.map(b=>new q.Vector3(b.x,b.y,b.z)),g=x[0]}let y=ue(h),w={points:h,path:Ee(l),h:y.h,minz:y.minz,maxz:y.maxz,center:{x:y.x,y:y.y,z:y.z},obj_id:t[i].obj_id,type:a,averagePz:e,obb:null,isDel:!1,obj_id:u,positionArr:[t[i].position],isStaircaseBalconyRailing:!1};if(w.obb=be(w.path,w.center,w.h,(w.maxz+w.minz)/2),w.obb==null)continue;let m=-1;for(let p=0;p<o.length;p++)if(o[p].type==a){m=p;break}if(m!=-1?o[m].array.push(w):o.push({type:a,array:[w]}),a=="floor"&&g!=-99999)if(r.has(g)){let p=r.get(g);p.num+=w.points.length,p.datas.push(w),r.set(g,p)}else r.set(g,{num:w.points.length,datas:[w]})}if(r.size>0){let i=[];for(let[l,u]of r.entries()){let{num:f,datas:d}=u;f>3e3&&i.push(...d)}for(let l=0;l<o.length;l++)if(o[l].type=="floor"){o[l].array=i;break}}for(let i=0;i<o.length;i++){let l=o[i].array,u=new Set,f=[];for(let c=0;c<l.length;c++){if(l[c].obb==null||u.has(c))continue;let a={...l[c],obb:l[c].obb.clone()},h=0,g=0;if(a.type=="pipe"){let w=qe(a.points);h=w.minZ,g=w.maxZ}let y=!0;h!=0&&g!=0&&Math.abs(g-h)<.3&&(y=!1);for(let w=c+1;w<l.length;w++){if(l[w].obb==null||u.has(w))continue;let m=0,p=0;if(l[w].type=="pipe"){let z=qe(l[w].points);m=z.minZ,p=z.maxZ}let x=!0;if(m!=0&&p!=0&&Math.abs(p-m)<.3&&(x=!1),a.type=="pipe"&&l[w].type=="pipe"&&y!=x)continue;let b=!1;if(a.type=="pipe"&&!y?b=Ve(l[w].points,a.obb)>.3:(b=a.obb.intersectsOBB(l[w].obb,.01),b||(b=$a(a.obb,l[w].obb))),b){u.add(w);for(let P=0;P<l[w].points.length;P++)(l[w].points[P].z>e&&l[w].points[P].z-e>.1||a.type=="floor"||a.type=="Staircase")&&a.points.push(l[w].points[P]);let z=a.points.map(P=>[P.x,P.y]);a.type=="floor"&&(z=Ga(z,.1)),a.path=Ee(z);let M=ue(a.points);a.h=M.h,a.minz=M.minz,a.maxz=M.maxz,a.center={x:M.x,y:M.y,z:M.z},a.obb=be(a.path,a.center,a.h,(a.maxz+a.minz)/2),a.positionArr.push(...l[w].positionArr),w=c}}a.path.length>l[c].path.length&&(u.add(c),f.push(a))}let d=[];for(let c=0;c<l.length;c++)u.has(c)||d.push(l[c]);d.push(...f),o[i].array=d}for(let i=0;i<o.length;i++){let l=o[i].type;if(l==="people"||l==="floor")continue;let u=o[i].array;for(let f=0;f<u.length;f++){let d=u[f].obb,c=u[f].minz,a=u[f].maxz,h=u[f].averagePz;if(l==="window"||l==="door"||l==="tv"||l==="chair"||l==="cabinet"||l==="table"){let g=new q.Vector3;d.getSize(g);let y=[g.x,g.y,g.z],w=0;for(let m of y)if(m<.2&&(w++,w===2)){u[f].isDel=!0;break}}if(!u[f].isDel)for(let g=i+1;g<o.length;g++){let y=o[g].type;if(y==="people")continue;let w=o[g].array;for(let m=0;m<w.length;m++){if(w[m].isDel)continue;let p=w[m].obb,x=w[m].minz,b=w[m].maxz;if(d.intersectsOBB(p)){let z=Ve(w[m].points,d),M=Ve(u[f].points,p),P=Oo(d,p);if(M>=.5&&P==-1&&l!=="Staircase"&&y!=="Staircase"){u[f].isDel=!0;break}if(l!=="wall"&&l!=="floor"&&l!=="roof"){if(l==="window"){if(y==="balcony railing"&&Qt(d,w[m].points)){w[m].isDel=!0;continue}if(y==="balcony railing"&&Qt(p,u[f].points)){u[f].isDel=!0;break}if(y==="balcony railing"&&ko(d,p,u[f].points,w[m].points)&&(Math.abs(c-x)<.1||Math.abs(x-h)>.3)){w[m].isDel=!0;continue}if(y==="door"&&Qt(d,w[m].points)){w[m].isDel=!0;continue}if(y==="door"&&Qt(p,u[f].points)){w[m].isDel=!0;continue}if(y==="window sill")continue}else if(l==="balcony railing"){if(y==="window"&&Qt(d,w[m].points)){w[m].isDel=!0;continue}if(y==="window"&&Qt(p,u[f].points)){u[f].isDel=!0;break}if(y==="window"&&ko(d,p,u[f].points,w[m].points)&&(Math.abs(c-x)<.1||Math.abs(c-h)>.3)){u[f].isDel=!0;break}if(y==="Staircase"&&Qt(d,w[m].points)){u[f].isStaircaseBalconyRailing=!0;break}if(y==="Staircase"&&Qt(p,u[f].points)){u[f].isStaircaseBalconyRailing=!0;break}if(y==="Staircase"&&d.intersectsOBB(p)){u[f].isStaircaseBalconyRailing=!0;break}}else if(l==="door"){if(y==="window"&&Qt(d,w[m].points)){u[f].isDel=!0;break}if(y==="window"&&Qt(p,u[f].points)){u[f].isDel=!0;break}if(y==="window sill"&&Qt(d,w[m].points)){u[f].isDel=!0;break}if(y==="window sill"&&Qt(p,u[f].points)){u[f].isDel=!0;break}}else if(l==="window sill"){if(y==="window")continue;if(y==="floor"&&Qt(d,w[m].points)){w[m].isDel=!0;continue}if(y==="door"&&Qt(d,w[m].points)){w[m].isDel=!0;continue}if(y==="door"&&Qt(p,u[f].points)){w[m].isDel=!0;continue}}else if(l==="Staircase"){if(y==="balcony railing"&&Qt(d,w[m].points)){w[m].isStaircaseBalconyRailing=!0;continue}if(y==="balcony railing"&&Qt(p,u[f].points)){w[m].isStaircaseBalconyRailing=!0;continue}if(y==="balcony railing"&&d.intersectsOBB(p)){w[m].isStaircaseBalconyRailing=!0;continue}}let E=!1,S=[],I=[],H=u[f].points,D=w[m].points;if(H.length>D.length?(E=!0,S=H,I=D):(S=D,I=H),_a(I,S,.03,.5)>.5)if(E)w[m].isDel=!0;else{u[f].isDel=!0;break}else if(ko(d,p,u[f].points,w[m].points)){let R=Oo(d,p);if(R===1||R===0){if(y==="switch"||y==="Staircase")continue;H.length>D.length?Ve(I,d)>=.5&&(w[m].isDel=!0):Ve(S,d)>=.5&&(w[m].isDel=!0)}else{if(l==="switch"||l==="Staircase")continue;if(H.length>D.length){if(Ve(S,p)>=.5){u[f].isDel=!0;break}}else if(Ve(I,p)>=.5){u[f].isDel=!0;break}}}}}}if(u[f].isDel)break}}}for(let i=0;i<o.length;i++){let l=o[i].type,u=o[i].array;for(let f=0;f<u.length;f++){let d=u[f].maxz,c=u[f].minz,a=l==="switch"?.1:.3;if(Math.abs(d-e)<a&&l!="floor"){u[f].isDel=!0;continue}if(l==="window"||l==="door"||l==="tv"){let h=Math.abs(d-e),g=Math.abs(c-e);(l==="tv"&&g<1.6||l!=="window"&&h<1.6)&&(u[f].isDel=!0),l==="window"&&h<1&&(u[f].isDel=!0),l==="door"&&g>1&&(u[f].isDel=!0)}if(l==="chair"){let h=new q.Vector3;u[f].obb.getSize(h),(h.x<.1||h.y<.1||h.z<.2)&&(u[f].isDel=!0)}if(l==="balcony railing"&&(Math.abs(d-c)<.4&&(u[f].isDel=!0),(c<e&&Math.abs(c-e)>1||c>e&&Math.abs(c-e)>1)&&(u[f].isDel=!0),d<e&&(u[f].isDel=!0)),l==="people"&&(Math.abs(d-c)<1&&(u[f].isDel=!0),c>e&&c-e>.3&&(u[f].isDel=!0),d<e&&(u[f].isDel=!0)),l==="floor"){let h=new q.Vector3;u[f].obb.getSize(h),(h.x<.1||h.y<.1)&&(u[f].isDel=!0)}l==="stair guardrail"&&u[f].points.length<100&&(u[f].isDel=!0)}}for(let i=0;i<o.length;i++)o[i].array=o[i].array.filter(l=>!l.isDel);if(n!=null)for(let i=0;i<o.length;i++){if(o[i].type=="floor")continue;let u=o[i].array,f=new Set,d=[];for(let c=0;c<u.length;c++){if(f.has(c))continue;let a=u[c].points,h=u[c].obj_id,g=u[c].type,y=u[c].averagePz,w=u[c].positionArr,m=u[c].isStaircaseBalconyRailing;if(a.length<50)continue;let p=n([a],{tolerance:.2,minClusterSize:50,maxClusterSize:1e7,threadCount:1}),x=d.length;if(p.length>0&&p[0].length>1)for(let b of p[0]){if(b.length<50)continue;let z=b.map(S=>a[S]),M=ue(z),P=z.map(S=>[S.x,S.y]),E={points:z,path:Ee(P),h:M.h,minz:M.minz,maxz:M.maxz,center:{x:M.x,y:M.y,z:M.z},type:g,averagePz:y,obb:null,obj_id:h,positionArr:w,isStaircaseBalconyRailing:m};E.obb=be(E.path,E.center,E.h,(E.maxz+E.minz)/2),E.obb!=null&&d.push(E)}d.length!=x&&f.add(c)}if(f.size>0){for(let c=0;c<u.length;c++)f.has(c)||d.push(u[c]);o[i].array=d}}let s=[];for(let i=0;i<o.length;i++){let l=o[i].array;for(let u=0;u<l.length;u++)s.push({obbBox:l[u].obb,box:new q.Box3().setFromPoints(l[u].points),category:l[u].type,center:{x:l[u].center.x,y:l[u].center.y,z:(l[u].minz+l[u].maxz)/2},name:l[u].obj_id,obj_id:l[u].obj_id,pcdPoints:l[u].points,positionArr:l[u].positionArr,isStaircaseBalconyRailing:l[u].isStaircaseBalconyRailing})}return s},Ba=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(w=>[w.x,w.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,f=i.lastIndexOf("_"),d=i.substring(u,f);if(d!=="floor")continue;let c=[];for(let w=0;w<t[r].points.length;w++)c.push(new q.Vector3(t[r].points[w].x,t[r].points[w].y,t[r].points[w].z));let a=-99999;if(d==="floor"){let w=new Map;for(let p=0;p<t[r].points.length;p++){let x=t[r].points[p].z;if(x=Math.floor(x*10)/10,w.has(x)){let b=w.get(x);b.num+=1,b.points.push(t[r].points[p]),w.set(x,b)}else w.set(x,{num:1,points:[t[r].points[p]]})}let m=[...w.entries()].reduce((p,x)=>x[1].num>p[1].num?x:p);s=[],s=m[1].points.map(p=>[p.x,p.y]),c=[],c=m[1].points.map(p=>new q.Vector3(p.x,p.y,p.z)),a=m[0]}let h=ue(c),g={points:c,path:Ee(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:d,obb:null,isDel:!1,obj_id:i,positionArr:[t[r].position]};if(g.obb=be(g.path,g.center,g.h,(g.maxz+g.minz)/2),g.obb==null)continue;let y=-1;for(let w=0;w<e.length;w++)if(e[w].type==d){y=w;break}if(y!=-1?e[y].array.push(g):e.push({type:d,array:[g]}),d=="floor"&&a!=-99999)if(n.has(a)){let w=n.get(a);w.num+=g.points.length,w.datas.push(g),n.set(a,w)}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 f=0;f<s.length;f++){if(s[f].obb==null||i.includes(f))continue;let d={...s[f],obb:s[f].obb.clone()};for(let c=f+1;c<s.length;c++){if(s[c].obb==null||i.includes(c))continue;if(d.obb.intersectsOBB(s[c].obb)){i.push(c);for(let y=0;y<s[c].points.length;y++)d.points.push(s[c].points[y]);let h=d.points.map(y=>[y.x,y.y]);d.path=Ee(h);let g=ue(d.points);d.h=g.h,d.minz=g.minz,d.maxz=g.maxz,d.center={x:g.x,y:g.y,z:g.z},d.obb=be(d.path,d.center,d.h,(d.maxz+d.minz)/2),d.positionArr.push(...s[c].positionArr),c=f}}d.path.length>s[f].path.length&&(i.push(f),l.push(d))}let u=[];for(let f=0;f<s.length;f++)i.includes(f)||u.push(s[f]);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 q.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},ka=(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 y=0;y<g.length;y++){let w=g[y].points.map(S=>[S.x,S.y]),m=g[y].obj_id;m=m.replace(/the floor of the house/g,"floor").replace(/the outdoor floor/g,"floor").replace(/calcony railing/g,"balcony railing").replace(/glass balcony railing/g,"balcony railing").replace(/metal balcony railing/g,"balcony railing").replace(/temporary construction guardrail/g,"balcony railing");let p=m.split("_").slice(1,3).join("_").split(".")[0].split("_")[0],x=m.indexOf("_")+1,b=m.lastIndexOf("_"),z=m.substring(x,b);if(z.includes("top")&&(x=z.indexOf("top")+4,z=z.substring(x,b)),z.includes("left")&&(x=z.indexOf("left")+5,z=z.substring(x,b)),z.includes("right")&&(x=z.indexOf("right")+6,z=z.substring(x,b)),z.includes("front")&&(x=z.indexOf("front")+6,z=z.substring(x,b)),z!=="Staircase"&&z!=="balcony railing")continue;let M=[];for(let S=0;S<g[y].points.length;S++)M.push(new q.Vector3(g[y].points[S].x,g[y].points[S].y,g[y].points[S].z));let P=ue(M),E={points:M,path:Ee(w),h:P.h,minz:P.minz,maxz:P.maxz,center:{x:P.x,y:P.y,z:P.z},obj_id:g[y].obj_id,type:z,averagePz:0,obb:null,isDel:!1,obj_id:m,positionArr:[g[y].position],aabbBox:new q.Box3().setFromPoints(M)};E.obb=be(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:[]},y=r.get(a);if(!y){g.otherTrajectoryResults=h,l.push(g);continue}let w=[],m=[],p=[];for(let x=0;x<y.length;x++){let b=[];for(let M=0;M<y[x].points.length;M++){let P=[new q.Vector3(y[x].points[M].x,y[x].points[M].y,y[x].points[M].z)];P.push(P[0].clone().addScaledVector(new q.Vector3(0,0,-1),2));let E=new q.Box3().setFromPoints(P);b.push(E)}let z=[];for(let M=0;M<h.length;M++)for(let P=0;P<b.length;P++)!p.includes(M)&&h[M].aabbBox.intersectsBox(b[P])&&(p.push(M),z.push(h[M]));z.length>0&&m.push(z)}for(let x=0;x<h.length;x++)p.includes(x)||w.push(h[x]);g.findTrajectoryResults=m,g.otherTrajectoryResults=w,l.push(g)}function u(a,h){let g=a,y=[],w=[];for(let p=0;p<a.length;p++){if(a[p].obb==null||y.includes(p))continue;let x={...a[p],obb:a[p].obb.clone()};for(let b=p+1;b<a.length;b++){if(a[b].obb==null||y.includes(b))continue;if(x.obb.intersectsOBB(a[b].obb)||h){y.push(b);for(let E=0;E<a[b].points.length;E++)x.points.push(a[b].points[E]);let M=x.points.map(E=>[E.x,E.y]);x.path=Ee(M);let P=ue(x.points);x.h=P.h,x.minz=P.minz,x.maxz=P.maxz,x.center={x:P.x,y:P.y,z:P.z},x.obb=be(x.path,x.center,x.h,(x.maxz+x.minz)/2),x.positionArr.push(...a[b].positionArr),b=p}}x.path.length>a[p].path.length&&(y.push(p),w.push(x))}let m=[];for(let p=0;p<a.length;p++)y.includes(p)||m.push(a[p]);return m.push(...w),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 y=ys(l[a].findTrajectoryResults[h][g].points,{binCount:100,minBinPoints:5,sideK:2.2,zK:2.2,minSideRange:.2,minZRange:.2,lowerZScale:.4,upperZScale:1.8}),w=bs(y.keep,{radius:.1,minClusterSize:50,lowPercent:.45});if(w.keep.length==0){l[a].findTrajectoryResults[h][g].isDel=!0;continue}l[a].findTrajectoryResults[h][g].points=w.keep;let m=l[a].findTrajectoryResults[h][g].points.map(x=>[x.x,x.y]);l[a].findTrajectoryResults[h][g].path=Ee(m);let p=ue(l[a].findTrajectoryResults[h][g].points);l[a].findTrajectoryResults[h][g].h=p.h,l[a].findTrajectoryResults[h][g].minz=p.minz,l[a].findTrajectoryResults[h][g].maxz=p.maxz,l[a].findTrajectoryResults[h][g].center={x:p.x,y:p.y,z:p.z},l[a].findTrajectoryResults[h][g].obb=be(l[a].findTrajectoryResults[h][g].path,l[a].findTrajectoryResults[h][g].center,l[a].findTrajectoryResults[h][g].h,(l[a].findTrajectoryResults[h][g].maxz+l[a].findTrajectoryResults[h][g].minz)/2)}l[a].findTrajectoryResults[h]=l[a].findTrajectoryResults[h].filter(g=>!g.isDel)}for(let h=0;h<l[a].otherTrajectoryResults.length;h++){let g=ys(l[a].otherTrajectoryResults[h].points,{binCount:100,minBinPoints:5,sideK:2.2,zK:2.2,minSideRange:.2,minZRange:.2,lowerZScale:.4,upperZScale:1.8}),y=bs(g.keep,{radius:.1,minClusterSize:50,lowPercent:.45});if(y.keep.length==0){l[a].otherTrajectoryResults[h].isDel=!0;continue}l[a].otherTrajectoryResults[h].points=y.keep;let w=l[a].otherTrajectoryResults[h].points.map(p=>[p.x,p.y]);l[a].otherTrajectoryResults[h].path=Ee(w);let m=ue(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=be(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 f(a){for(let h=0;h<a.length;h++){let g=a[h].obb;for(let y=h+1;y<a.length;y++){let w=a[y].obb;if(!a[y].isDel){if(g.intersectsOBB(w)){let m=Ve(a[y].points,g),p=Ve(a[h].points,w),x=Oo(g,w);if(m>=.5&&(x==1||x==0)&&(a[y].isDel=!0),p>=.5&&x==-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=f(h)}function d(a){let h=[];if(a.length>0){let g=.3,y=.5,w=.5,m=.2;for(let p=0;p<a.length;p++){let x=a[p].obb.halfSize.clone().multiplyScalar(2),b=a[p].points,z=x.x,M=x.y,P=x.z;if(z>M&&([z,M]=[M,z]),z<y||M<g||P<w)continue;let E=yr(a[p].obb);if(E.length!=8)continue;let S=new q.Line3(E[0],E[1]),I=new q.Line3(E[1],E[2]),H=new q.Line3(E[2],E[3]),D=new q.Line3(E[3],E[0]),T=new q.Line3(E[4],E[5]),R=new q.Line3(E[5],E[6]),v=new q.Line3(E[6],E[7]),W=new q.Line3(E[7],E[4]),V=[],C=[],_=[],A=[],B=[],k=[],F=[],L=[];for(let bt=0;bt<b.length;bt++){let Jt=S.closestPointToPoint(b[bt],!0,new q.Vector3),he=I.closestPointToPoint(b[bt],!0,new q.Vector3),St=H.closestPointToPoint(b[bt],!0,new q.Vector3),ee=D.closestPointToPoint(b[bt],!0,new q.Vector3),et=T.closestPointToPoint(b[bt],!0,new q.Vector3),me=R.closestPointToPoint(b[bt],!0,new q.Vector3),Le=v.closestPointToPoint(b[bt],!0,new q.Vector3),Be=W.closestPointToPoint(b[bt],!0,new q.Vector3);Jt.distanceTo(b[bt])<m&&V.push(b[bt]),he.distanceTo(b[bt])<m&&C.push(b[bt]),St.distanceTo(b[bt])<m&&_.push(b[bt]),ee.distanceTo(b[bt])<m&&A.push(b[bt]),et.distanceTo(b[bt])<m&&B.push(b[bt]),me.distanceTo(b[bt])<m&&k.push(b[bt]),Le.distanceTo(b[bt])<m&&F.push(b[bt]),Be.distanceTo(b[bt])<m&&L.push(b[bt])}let O=E[0].distanceTo(E[1]),$=E[1].distanceTo(E[2]),G=E[2].distanceTo(E[3]),Q=E[3].distanceTo(E[0]),j=new q.Vector3,Z=new q.Vector3,Y=new q.Vector3,it=new q.Vector3;Math.abs(O-z)<.01?V.length>_.length?(j=E[0].clone(),Z=E[1].clone(),Y=new q.Vector3().subVectors(Z,j).normalize(),it=new q.Vector3().subVectors(E[2],E[1]).normalize()):(j=E[2].clone(),Z=E[3].clone(),Y=new q.Vector3().subVectors(Z,j).normalize(),it=new q.Vector3().subVectors(E[0],E[3]).normalize()):C.length>A.length?(j=E[1].clone(),Z=E[2].clone(),Y=new q.Vector3().subVectors(Z,j).normalize(),it=new q.Vector3().subVectors(E[3],E[2]).normalize()):(j=E[3].clone(),Z=E[0].clone(),Y=new q.Vector3().subVectors(Z,j).normalize(),it=new q.Vector3().subVectors(E[1],E[0]).normalize());let ht=E[4].distanceTo(E[5]),Tt=E[5].distanceTo(E[6]),nt=E[6].distanceTo(E[7]),wt=E[7].distanceTo(E[4]),zt=new q.Vector3,Dt=new q.Vector3,Pt=new q.Vector3(j.x,j.y,E[4].z),Mt=new q.Vector3(Z.x,Z.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=j.distanceTo(Z),ot=zt.distanceTo(Dt),ft=new q.Vector3().subVectors(new q.Vector3(j.x,j.y,zt.z),j).normalize();if(Math.abs(It-ot)>.01||Math.abs(It-z)>.01){console.log("\u4E0A\u4E0B\u957F\u5EA6\u4E0D\u4E00\u81F4,\u6216\u4E0E\u5BBD\u4E0D\u4E00\u81F4",It,ot,z);continue}let rt=Math.sqrt(It*It+ot*ot),tt=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(rt)))),ae={stairStepHeight:P/tt,stairStepWidth:M/tt,staitWidth:z,stairLength:M,stairHeigth:P,stairStepNum:tt,stairBottomPt1:j,stairBottomPt2:Z,stairTopPt1:zt,stairTopPt2:Dt,vecStepLength:Y,vecStepWidth:it,vecStepHeight:ft,path:a[p].path,obb:a[p].obb,maxz:a[p].maxz,points:a[p].points,rectPt1:new q.Vector3(0,0,0),rectPt2:new q.Vector3(0,0,0)};h.push(ae)}}return h}let c=[];for(let a=0;a<l.length;a++)c.push(...d(l[a].lastTrajectoryResults));for(let a=0;a<c.length;a++){let h=c[a].stairTopPt1.clone(),g=c[a].stairTopPt2.clone(),y=c[a].stairBottomPt1.clone(),w=c[a].stairBottomPt2.clone(),m=h.clone(),p=g.clone(),x=y.clone(),b=w.clone();m.z=p.z=x.z=b.z=0;let z=At(h,g,!0),M=At(y,w,!0),P=At(z,M),E=new q.Vector3().subVectors(z,P).normalize(),S=new q.Vector3().subVectors(M,P).normalize(),I=z.distanceTo(M),H=!1,D=!1;for(let T=0;T<c.length;T++){if(a==T)continue;let R=c[T].stairTopPt1.clone(),v=c[T].stairTopPt2.clone(),W=c[T].stairBottomPt1.clone(),V=c[T].stairBottomPt2.clone(),C=new q.Vector3().subVectors(R,v).normalize(),_=new q.Vector3().subVectors(W,V).normalize(),A=R.clone(),B=v.clone(),k=W.clone(),F=V.clone();A.z=B.z=k.z=F.z=0;let L=At(R,v,!0),O=At(W,V,!0),$=L.distanceTo(O),G=Xt(z,M,L,O),Q=!1;if(G&&G.isParallel&&R.z<=y.z&&y.z-R.z<.3){Q=!0,D=!0;let j=A.addScaledVector(C.clone().negate(),100),Z=B.addScaledVector(C,100),Y=k.addScaledVector(_.clone().negate(),100),it=F.addScaledVector(_,100),ht=new q.Line3(j,Z),Tt=new q.Line3(Y,it),nt=ht.closestPointToPoint(P,!0,new q.Vector3),wt=Tt.closestPointToPoint(P,!0,new q.Vector3),zt=new q.Vector3().subVectors(nt,P),Dt=new q.Vector3().subVectors(wt,P),Pt=zt.length(),Mt=Dt.length();Dt=Dt.normalize(),zt=zt.normalize();let It=$t(E,zt,.1),ot=$t(S,zt,.1),ft=$t(S,Dt,.1),rt=$t(E,Dt,.1);if(It&&It.sameDirection&&Pt>I/2){let tt=Pt-I/2;c[a].stairBottomPt1=c[a].stairBottomPt1.addScaledVector(S,tt),c[a].stairBottomPt2=c[a].stairBottomPt2.addScaledVector(S,tt)}else if(ot&&ot.sameDirection&&Pt>I/2){let tt=Pt-I/2;c[a].stairBottomPt1=c[a].stairBottomPt1.addScaledVector(S,tt),c[a].stairBottomPt2=c[a].stairBottomPt2.addScaledVector(S,tt)}if(ft&&ft.sameDirection&&Mt>I/2){let tt=Mt-I/2;c[a].stairTopPt1=c[a].stairTopPt1.addScaledVector(E,tt),c[a].stairTopPt2=c[a].stairTopPt2.addScaledVector(E,tt)}else if(rt&&rt.sameDirection&&Mt>I/2){let tt=Mt-I/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,H=!0;let j=A.addScaledVector(C.clone().negate(),100),Z=B.addScaledVector(C,100),Y=k.addScaledVector(_.clone().negate(),100),it=F.addScaledVector(_,100),ht=new q.Line3(j,Z),Tt=new q.Line3(Y,it),nt=ht.closestPointToPoint(P,!1,new q.Vector3),wt=Tt.closestPointToPoint(P,!1,new q.Vector3),zt=new q.Vector3().subVectors(nt,P),Dt=new q.Vector3().subVectors(wt,P),Pt=zt.length(),Mt=Dt.length();Dt=Dt.normalize(),zt=zt.normalize();let It=$t(E,zt,.1),ot=$t(S,zt,.1),ft=$t(S,Dt,.1),rt=$t(E,Dt,.1);if(It&&It.sameDirection&&Pt>I/2){let tt=Pt-I/2;c[a].stairBottomPt1=c[a].stairBottomPt1.addScaledVector(S,tt),c[a].stairBottomPt2=c[a].stairBottomPt2.addScaledVector(S,tt)}else if(ot&&ot.sameDirection&&Pt>I/2){let tt=Pt-I/2;c[a].stairBottomPt1=c[a].stairBottomPt1.addScaledVector(S,tt),c[a].stairBottomPt2=c[a].stairBottomPt2.addScaledVector(S,tt)}if(ft&&ft.sameDirection&&Mt>I/2){let tt=Mt-I/2;c[a].stairTopPt1=c[a].stairTopPt1.addScaledVector(E,tt),c[a].stairTopPt2=c[a].stairTopPt2.addScaledVector(E,tt)}else if(rt&&rt.sameDirection&&Mt>I/2){let tt=Mt-I/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(),y=c[a].stairBottomPt1.clone(),w=c[a].stairBottomPt2.clone(),m=h.clone(),p=g.clone(),x=y.clone(),b=w.clone(),m.z=p.z=x.z=b.z=0,z=At(h,g,!0),M=At(y,w,!0),P=At(z,M),E=new q.Vector3().subVectors(z,P).normalize(),S=new q.Vector3().subVectors(M,P).normalize(),I=z.distanceTo(M)),D&&H)break}if(D||H){let T=c[a].stairTopPt1.clone(),R=c[a].stairTopPt2.clone(),v=c[a].stairBottomPt1.clone(),W=c[a].stairBottomPt2.clone(),V=At(T,R,!0),C=At(v,W,!0),_=V.distanceTo(C),A=c[a].stairTopPt1.distanceTo(c[a].stairTopPt2),B=c[a].stairBottomPt1.distanceTo(c[a].stairBottomPt2),k=Math.sqrt(A*A+B*B),F=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(k))));c[a].stairStepNum=F,c[a].stairHeigth=c[a].stairTopPt1.z-c[a].stairBottomPt1.z,c[a].stairStepHeight=c[a].stairHeigth/c[a].stairStepNum,c[a].stairStepWidth=_/c[a].stairStepNum}}for(let a=0;a<c.length;a++){let h=c[a].stairTopPt1,g=c[a].stairTopPt2,y=c[a].stairBottomPt1.clone(),w=c[a].stairBottomPt2.clone(),m=new q.Vector3(h.x,h.y,y.z),p=c[a].vecStepWidth;for(let x=0;x<c.length;x++){if(a==x)continue;let b=c[x].stairTopPt1,z=c[x].stairTopPt2,M=c[x].stairBottomPt1.clone(),P=c[x].stairBottomPt2.clone(),E=new q.Vector3(b.x,b.y,M.z),S=c[x].vecStepWidth;if(Math.abs(h.z-M.z)<.3&&M.z>y.z&&c[a].obb.intersectsOBB(c[x].obb)){let I=ie(m,y,E,M);if(I&&I.angle>75){let H=M.distanceTo(h),D=M.distanceTo(g),T=P.distanceTo(h),R=P.distanceTo(g),v=h.clone(),W=v.clone().addScaledVector(p,c[x].staitWidth),V=new q.Vector3().subVectors(g,h).normalize(),C=h.distanceTo(g),_=v.clone().addScaledVector(V,C),A=W.clone().addScaledVector(V,C),B=v.clone().addScaledVector(V,c[x].stairLength),k=W.clone().addScaledVector(V,c[x].stairLength),F=H;(F>D||F>R)&&(F=D,v=g.clone(),W=v.clone().addScaledVector(p,c[x].staitWidth),V=new q.Vector3().subVectors(h,g).normalize(),C=h.distanceTo(g),_=v.clone().addScaledVector(V,C),A=W.clone().addScaledVector(V,C),B=v.clone().addScaledVector(V,c[x].stairLength),k=W.clone().addScaledVector(V,c[x].stairLength));let L=new q.Vector3().subVectors(B,_).normalize(),O=B.distanceTo(_);B.z=k.z=c[x].maxz,c[x].stairBottomPt1=_,c[x].stairBottomPt2=A,c[x].stairTopPt1=B,c[x].stairTopPt2=k,c[x].rectPt1=v,c[x].rectPt2=W;let $=_.distanceTo(A),G=B.distanceTo(k),Q=Math.sqrt(O*O+c[x].stairHeigth*c[x].stairHeigth),j=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(Q))));c[x].stairStepNum=j,c[x].stairHeigth=B.z-_.z,c[x].stairStepHeight=c[x].stairHeigth/c[x].stairStepNum,c[x].stairStepWidth=O/c[x].stairStepNum,c[x].vecStepLength=V.clone().negate(),c[x].vecStepWidth=L;break}}}}return t.finalFloorMap&&Fa(c,t.finalFloorMap),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(),f=t[s].stairBottomPt2.clone(),d=new q.Vector3().subVectors(l,i).normalize();i=i.addScaledVector(d,.05),l=l.addScaledVector(d.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 y=g.map(z=>[z.x,z.y]);g.push(new q.Vector3(g[3].x,g[3].y,g[3].z+o)),g.push(new q.Vector3(g[2].x,g[2].y,g[2].z+o)),g.push(new q.Vector3(g[1].x,g[1].y,g[1].z+o)),g.push(new q.Vector3(g[0].x,g[0].y,g[0].z+o));let w=ue(g),m=be(y,{x:w.x,y:w.y,z:w.z},w.h,(w.maxz+w.minz)/2),p=[],x=!1,b=0;for(let z=0;z<e.length;z++)if(m.intersectsOBB(e[z].obb)){for(let M=0;M<e[z].points.length&&!(m.containsPoint(e[z].points[M])&&(h==0&&p.push(e[z].points[M]),e[z].points[M].z>i.z&&e[z].points[M].z-i.z<1&&(b++,b>10&&h!=0)));M++);if(b>10&&(x=!0),h!=0&&x)break}if(r==0&&(r=ue(p).maxz),x){let z=At(g[1],g[2]);z.z+=t[s].stairStepHeight,c.push(z)}g=[],g=[l,f],g.push(g[1].clone().addScaledVector(t[s].vecStepWidth,t[s].stairStepWidth)),g.push(g[0].clone().addScaledVector(t[s].vecStepWidth,t[s].stairStepWidth)),y=g.map(z=>[z.x,z.y]),g.push(new q.Vector3(g[3].x,g[3].y,g[3].z+o)),g.push(new q.Vector3(g[2].x,g[2].y,g[2].z+o)),g.push(new q.Vector3(g[1].x,g[1].y,g[1].z+o)),g.push(new q.Vector3(g[0].x,g[0].y,g[0].z+o)),w=ue(g),m=be(y,{x:w.x,y:w.y,z:w.z},w.h,(w.maxz+w.minz)/2),p=[],x=!1;for(let z=0;z<e.length;z++)if(m.intersectsOBB(e[z].obb)){let M=0;for(let P=0;P<e[z].points.length&&!(m.containsPoint(e[z].points[P])&&(h==0&&p.push(e[z].points[P]),e[z].points[P].z>i.z&&e[z].points[P].z-i.z<1&&(M++,M>10&&h!=0)));P++);if(M>10&&(x=!0),h!=0&&x)break}if(r==0&&(r=ue(p).maxz),x){let z=At(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),f=f.addScaledVector(t[s].vecStepWidth,t[s].stairStepWidth),f=f.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 Fa(t,e){if(!t||!e)return;let n=[];for(let o=0;o<t.length;o++){let r=t[o].stairTopPt1.clone(),s=t[o].stairTopPt2.clone(),i=t[o].stairBottomPt1.clone(),l=t[o].stairBottomPt2.clone(),u=r.clone(),f=s.clone(),d=i.clone(),c=l.clone();u.z=f.z=d.z=c.z=0;let a=At(r,s,!0),h=At(i,l,!0),g=At(a,h),y=new q.Vector3().subVectors(a,g).normalize(),w=new q.Vector3().subVectors(h,g).normalize(),m=a.distanceTo(h),p=-1,x=-1;for(let b=0;b<t.length;b++){if(o==b)continue;let z=t[b].stairTopPt1.clone(),M=t[b].stairTopPt2.clone(),P=t[b].stairBottomPt1.clone(),E=t[b].stairBottomPt2.clone(),S=new q.Vector3().subVectors(z,M).normalize(),I=new q.Vector3().subVectors(P,E).normalize(),H=z.clone(),D=M.clone(),T=P.clone(),R=E.clone();H.z=D.z=T.z=R.z=0;let v=At(z,M,!0),W=At(P,E,!0),V=v.distanceTo(W),C=Xt(a,h,v,W);if(C&&C.isParallel&&r.z<=P.z&&P.z-r.z<=.2?p=b:C&&C.isParallel&&z.z<=i.z&&i.z-z.z<=.3&&(x=b),p!=-1&&x!=-1)break}for(let b=0;b<e.length;b++){let z=e[b][1];for(let M=0;M<z.length;M++){let P=`${b}+${M}`;if(n.includes(P))continue;let E=z[M].points;if(o==0&&Math.abs(E[0].z-i.z)<.2){let S=i.clone().addScaledVector(t[o].vecStepWidth.clone().negate(),5),I=l.clone().addScaledVector(t[o].vecStepWidth.clone().negate(),5),H=new q.Line3(S,I),D=new q.Line3(i,l),T=999999,R=0,v=new q.Vector3,W=0;for(let V=0;V<E.length;V++){let C=new q.Vector3(E[V].x,E[V].y,S.z),A=H.closestPointToPoint(C,!1,new q.Vector3).distanceTo(C),B=D.closestPointToPoint(C,!1,new q.Vector3),k=new q.Vector3().subVectors(C,B).normalize(),F=$t(k,t[o].vecStepWidth.clone().negate(),.1);A<T&&F.sameDirection&&(T=A,R=C.distanceTo(B),v=C.clone(),W=E[V].z)}T!=-999999&&(n.push(P),t[o].stairBottomPt1.z=t[o].stairBottomPt2.z=W)}else if(Math.abs(E[0].z-r.z)<.2){let S=r.clone().addScaledVector(t[o].vecStepWidth,5),I=s.clone().addScaledVector(t[o].vecStepWidth,5),H=new q.Line3(S,I),D=new q.Line3(r,s),T=0,R=999999,v=new q.Vector3,W=0;for(let V=0;V<E.length;V++){let C=new q.Vector3(E[V].x,E[V].y,S.z),_=H.closestPointToPoint(C,!1,new q.Vector3),A=D.closestPointToPoint(C,!1,new q.Vector3),B=new q.Vector3().subVectors(C,A).normalize(),k=_.distanceTo(C),F=$t(B,t[o].vecStepWidth);k<R&&F.sameDirection&&(R=k,T=C.distanceTo(A),v=C,W=E[V].z)}if(R!=-999999){if(n.push(P),t[o].stairTopPt1.z=t[o].stairTopPt2.z=W,p!=-1){t[p].stairBottomPt1.z=t[p].stairBottomPt2.z=W;let V=[t[o].stairTopPt1.clone(),t[o].stairTopPt2.clone(),t[p].stairBottomPt1.clone(),t[p].stairBottomPt2.clone()],C=We(V);C.length==2&&(t[o].stairTopFloorPts=C,t[o].stairTopFloorPts.push(t[o].stairTopFloorPts[1].clone().addScaledVector(t[o].vecStepWidth,T)),t[o].stairTopFloorPts.push(t[o].stairTopFloorPts[0].clone().addScaledVector(t[o].vecStepWidth,T)))}else t[o].stairTopFloorPts=[t[o].stairTopPt1.clone(),t[o].stairTopPt2.clone()],t[o].stairTopFloorPts.push(t[o].stairTopPt2.clone().addScaledVector(t[o].vecStepWidth,T)),t[o].stairTopFloorPts.push(t[o].stairTopPt1.clone().addScaledVector(t[o].vecStepWidth,T));if(t[o].stairTopFloorPts)for(let V=0;V<t[o].stairTopFloorPts.length;V++)t[o].stairTopFloorPts[V].z-=t[o].stairStepHeight;break}}}}if(p!=-1){let b=t[o].stairTopPt1.clone(),z=t[o].stairTopPt2.clone(),M=t[o].stairBottomPt1.clone(),P=t[o].stairBottomPt2.clone(),E=At(b,z,!0),S=At(M,P,!0),I=E.distanceTo(S),H=t[o].stairTopPt1.distanceTo(t[o].stairTopPt2),D=t[o].stairBottomPt1.distanceTo(t[o].stairBottomPt2),T=Math.sqrt(H*H+D*D),R=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(T))));t[o].stairStepNum=R,t[o].stairHeigth=t[o].stairTopPt1.z-t[o].stairBottomPt1.z,t[o].stairStepHeight=t[o].stairHeigth/t[o].stairStepNum,t[o].stairStepWidth=I/t[o].stairStepNum;let v=t[p].stairTopPt1.clone(),W=t[p].stairTopPt2.clone(),V=t[p].stairBottomPt1.clone(),C=t[p].stairBottomPt2.clone(),_=At(v,W,!0),A=At(V,C,!0),B=_.distanceTo(A),k=t[p].stairTopPt1.distanceTo(t[p].stairTopPt2),F=t[p].stairBottomPt1.distanceTo(t[p].stairBottomPt2),L=Math.sqrt(k*k+F*F),O=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(L))));t[p].stairStepNum=O,t[p].stairHeigth=t[p].stairTopPt1.z-t[p].stairBottomPt1.z,t[p].stairStepHeight=t[p].stairHeigth/t[p].stairStepNum,t[p].stairStepWidth=B/t[p].stairStepNum}}}function ys(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:f=1,upperZScale:d=1}=e;if(!t||t.length===0)return[];let c=t.map((_,A)=>({index:A,x:_.x,y:_.y,z:_.z,raw:_})),a=0,h=0;for(let _ of c)a+=_.x,h+=_.y;a/=c.length,h/=c.length;let g=0,y=0,w=0;for(let _ of c){let A=_.x-a,B=_.y-h;g+=A*A,y+=A*B,w+=B*B}g/=c.length,y/=c.length,w/=c.length;let m=g+w,p=Math.sqrt((g-w)*(g-w)+4*y*y),x=(m+p)/2,b,z;Math.abs(y)>1e-8?(b=x-w,z=y):g>=w?(b=1,z=0):(b=0,z=1);let M=Math.sqrt(b*b+z*z)||1;b/=M,z/=M;let P=-z,E=b,S=1/0,I=-1/0,H=c.map(_=>{let A=_.x-a,B=_.y-h,k=A*b+B*z,F=A*P+B*E;return S=Math.min(S,k),I=Math.max(I,k),{..._,t:k,side:F}}),T=(I-S||1)/n,R=new Map;for(let _ of H){let A=Math.floor((_.t-S)/T);A<0&&(A=0),A>=n&&(A=n-1),R.has(A)||R.set(A,[]),R.get(A).push(_)}let v=new Map;for(let[_,A]of R){if(A.length<o)continue;let B=A.map(j=>j.side).sort((j,Z)=>j-Z),k=A.map(j=>j.z).sort((j,Z)=>j-Z),F=eo(B),L=eo(k),O=eo(B.map(j=>Math.abs(j-F)).sort((j,Z)=>j-Z)),$=eo(k.map(j=>Math.abs(j-L)).sort((j,Z)=>j-Z)),G=Math.max(i,O*1.4826*r),Q=Math.max(l,$*1.4826*s);v.set(_,{sideMedian:F,zMedian:L,sideRange:G,zRange:Q})}function W(_){if(v.has(_))return v.get(_);for(let A=1;A<=u;A++){if(v.has(_-A))return v.get(_-A);if(v.has(_+A))return v.get(_+A)}return null}let V=[],C=[];for(let _ of H){let A=Math.floor((_.t-S)/T);A<0&&(A=0),A>=n&&(A=n-1);let B=W(A);if(!B){C.push(_.raw);continue}let k=Math.abs(_.side-B.sideMedian)<=B.sideRange,F=B.zMedian-B.zRange*f,L=B.zMedian+B.zRange*d,O=_.z>=F&&_.z<=L;k&&O?V.push(_.raw):C.push(_.raw)}return{keep:V,removed:C,debug:{meanX:a,meanY:h,dirX:b,dirY:z,sideX:P,sideY:E,minT:S,maxT:I,binSize:T,stats:v}}}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 Na(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 qa(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),f=[];for(let d=-1;d<=1;d++)for(let c=-1;c<=1;c++)for(let a=-1;a<=1;a++){let h=`${i+d},${l+c},${u+a}`,g=e.get(h);if(g)for(let y of g){if(y===n)continue;let w=t[y],m=s.x-w.x,p=s.y-w.y,x=s.z-w.z;m*m+p*p+x*x<=r&&f.push(y)}}return f}function bs(t,e={}){let{radius:n=.35,minClusterSize:o=20,lowPercent:r=.35}=e,s=ja(t,{radius:n}),i=t.map(d=>d.z).sort((d,c)=>d-c),l=i[Math.floor(i.length*r)],u=[],f=[];for(let d of s.clusters){let c=d.map(g=>s.points[g]),a=c.reduce((g,y)=>g+y.z,0)/c.length;c.length<o&&a<=l?f.push(...c.map(g=>g.raw)):u.push(...c.map(g=>g.raw))}return{keep:u,removed:f}}function ja(t,e={}){let{radius:n=.35}=e,o=t.map((u,f)=>({index:f,x:u.x,y:u.y,z:u.z,raw:u})),r=Na(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 f=[],d=[u];for(i[u]=!0;d.length>0;){let c=d.shift();f.push(c);let a=qa(o,r,c,n,s);for(let h of a)i[h]||(i[h]=!0,d.push(h))}l.push(f)}return{points:o,clusters:l}}function $a(t,e,n=1e-6){let o=Xa(e);for(let r of o)if(!Za(t,r,n))return!1;return!0}function Xa(t){let e=t.center,n=t.halfSize,o=t.rotation.elements,r=new q.Vector3(o[0],o[1],o[2]).multiplyScalar(n.x),s=new q.Vector3(o[3],o[4],o[5]).multiplyScalar(n.y),i=new q.Vector3(o[6],o[7],o[8]).multiplyScalar(n.z),l=[];for(let u of[-1,1])for(let f of[-1,1])for(let d of[-1,1]){let c=e.clone().addScaledVector(r,u).addScaledVector(s,f).addScaledVector(i,d);l.push(c)}return l}function Za(t,e,n=1e-6){let o=new q.Vector3().subVectors(e,t.center),r=t.rotation.elements,s=t.halfSize,i=new q.Vector3(r[0],r[1],r[2]),l=new q.Vector3(r[3],r[4],r[5]),u=new q.Vector3(r[6],r[7],r[8]),f=o.dot(i),d=o.dot(l),c=o.dot(u);return Math.abs(f)<=s.x+n&&Math.abs(d)<=s.y+n&&Math.abs(c)<=s.z+n}function Ga(t,e){if(!t||t.length===0)return[];let n=new Map;for(let i=0;i<t.length;i++){let l=t[i],u=l[0],f=l[1],d=Math.floor(u/e),c=Math.floor(f/e),a=`${d}_${c}`,h=n.get(a);if(!h){let m=(d+.5)*e,p=(c+.5)*e,x=u-m,b=f-p;h={minX:l,maxX:l,minY:l,maxY:l,center:l,centerDist2:x*x+b*b,cx:m,cy:p},n.set(a,h);continue}u<h.minX[0]&&(h.minX=l),u>h.maxX[0]&&(h.maxX=l),f<h.minY[1]&&(h.minY=l),f>h.maxY[1]&&(h.maxY=l);let g=u-h.cx,y=f-h.cy,w=g*g+y*y;w<h.centerDist2&&(h.center=l,h.centerDist2=w)}let o=new Set,r=[];function s(i){let l=`${i[0]}_${i[1]}`;o.has(l)||(o.add(l),r.push(i))}for(let i of n.values())s(i.minX),s(i.maxX),s(i.minY),s(i.maxY),s(i.center);return r}function Ya(t,e,n,o){return 1+(t[e][0]===0||t[n][0]===0||t[o][0]===0?1:0)}function Ua(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),f=Math.abs((n-t)*(s-e)-(r-t)*(o-e))/2;return f===0?1/0:i*l*u/(4*f)}function Ka(t){if(!t||t.length<3)return[];let e=new Set,n=[];for(let g of t){let y=`${g[0]}_${g[1]}`;e.has(y)||(e.add(y),n.push(g))}if(n.length<3)return[];let o=new _e(Float64Array.from(n.flat())),{triangles:r}=o;if(!r.length)return[];let s=new Map,i=(g,y)=>g<y?`${g}_${y}`:`${y}_${g}`;for(let g=0;g<r.length;g+=3){let y=r[g],w=r[g+1],m=r[g+2],[p,x]=n[y],[b,z]=n[w],[M,P]=n[m],E=Ua(p,x,b,z,M,P),S=Ya(n,y,w,m);if(E<=1/S)for(let[I,H]of[[y,w],[w,m],[m,y]]){let D=i(I,H);s.set(D,(s.get(D)||0)+1)}}let l=[];for(let[g,y]of s)y===1&&l.push(g.split("_").map(Number));if(!l.length)return[];let u=new Map;for(let[g,y]of l)(u.get(g)||u.set(g,[]).get(g)).push(y),(u.get(y)||u.set(y,[]).get(y)).push(g);let f=l[0][0],d=[],c=new Set,a=f,h=-1;do{d.push(n[a]),c.add(a);let g=u.get(a)||[],y=g.find(w=>w!==h&&!c.has(w));if(y===void 0&&(y=g.find(w=>w!==h)),y===void 0)break;h=a,a=y}while(a!==f&&d.length<=l.length+1);return d.length>0&&d.push(d[0]),d}function Xe(t,e){let n=t.x-e.x,o=t.y-e.y;return Math.sqrt(n*n+o*o)}function Ze(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,f=Math.sqrt(l*l+u*u);f>e&&(e=f,n=l/f,o=u/f)}return{longSide:e,dirX:n,dirY:o}}function Ge(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,f=l-n;u*u+f*f<=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 Ie(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 f=t-n,d=e-o,c=(f*i+d*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 ws(t,e,n,o,r,s,i,l){let u=n-t,f=o-e,d=i-r,c=l-s,a=u*c-f*d;if(Math.abs(a)<1e-12)return null;let h=((r-t)*c-(s-e)*d)/a,g=((r-t)*f-(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 zs(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 f=r[u],d=r[(u+1)%4],c=ws(t,e,n,o,f.x,f.y,d.x,d.y);c!==null&&s.push(c)}if(s.length<2)return 0;s.sort((u,f)=>u-f);let i=Math.sqrt((n-t)**2+(o-e)**2),l=0;for(let u=0;u<s.length-1;u++){let f=s[u],d=s[u+1],c=(f+d)/2,a=t+c*(n-t),h=e+c*(o-e);Fo(a,h,r)&&(l+=(d-f)*i)}return l}function Ms(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 d of e){if(d===t)continue;let c=ws(r,s,i,l,d.start.x,d.start.y,d.end.x,d.end.y);c!==null&&c>n&&c<1-n&&o.push(c)}o.sort((d,c)=>d-c);let u=[],f=-1/0;for(let d of o)d-f>n&&(u.push(d),f=d);return u}function Es(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),f=o===0?{...t.start}:{x:t.start.x+o*(t.end.x-t.start.x),y:t.start.y+o*(t.end.y-t.start.y),z:t.start.z+o*(t.end.z-t.start.z)},d={...t,start:f,end:{x:i,y:l,z:u},length:t.length*(s-o)};d.drawWindow=void 0,d.isWindow=!1,n.push(d),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 Qa(t,e,n=.15){let o=0,r=0;for(let i of e)i!==t&&((Xe(t.start,i.start)<=n||Xe(t.start,i.end)<=n)&&o++,(Xe(t.end,i.start)<=n||Xe(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 Ja(t,e){let n=[],{start:o,end:r}=t;for(let l of e){let{dist:u}=Ie(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 tl(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=Xe(a,h.start),y=Xe(a,h.end),w=null;if(g<=n?w=h.end:y<=n&&(w=h.start),!w)continue;let m=h.end.x-h.start.x,p=h.end.y-h.start.y,x=Math.sqrt(m*m+p*p);if(x<1e-12||Math.abs(o*m+r*p)/(s*x)>=.342)continue;let z=(w.x-a.x)*i+(w.y-a.y)*l;u[c].push(z>0?1:-1)}}if(u[0].length===0||u[1].length===0)return 0;let f=[...u[0],...u[1]];return f.every(c=>c===f[0])?2:1}function Ps(t,e,n){let o=Qa(t,n),r=Ja(t,e),s=tl(t,n);return{score:o.score*3+r*2+s*2,details:{conn:o.score,variance:r,sameSide:s}}}function el(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 nl(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 ol(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 rl(t,e,n,o,r){let s=[];for(let f of t){let d=f.seg,c=(d.start.x-e.start.x)*n+(d.start.y-e.start.y)*o,a=(d.end.x-e.start.x)*n+(d.end.y-e.start.y)*o;c<=a?s.push({l:c,r:a,idx:f.idx,startPt:d.start,endPt:d.end}):s.push({l:a,r:c,idx:f.idx,startPt:d.end,endPt:d.start})}s.sort((f,d)=>f.l-d.l);let i=[],l=.2,u=.5;for(let{l:f,r:d,idx:c,startPt:a,endPt:h}of s){if(i.length===0){i.push({l:f,r:d,srcIdxs:[c],startPt:a,endPt:h});continue}let g=i[i.length-1];if(f<=g.r+r){let y=Math.min(g.r,d)-Math.max(g.l,f),w=Math.hypot(g.endPt.x-a.x,g.endPt.y-a.y);y>=u||w<=l?(f<g.l&&(g.l=f,g.startPt=a),d>g.r&&(g.r=d,g.endPt=h),g.srcIdxs.includes(c)||g.srcIdxs.push(c)):i.push({l:f,r:d,srcIdxs:[c],startPt:a,endPt:h})}else i.push({l:f,r:d,srcIdxs:[c],startPt:a,endPt:h})}return i}function sl(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 il(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,f=Math.abs(s.end.x-i.end.x)<.001&&Math.abs(s.end.y-i.end.y)<.001,d=Math.abs(s.start.x-i.start.x)<.001&&Math.abs(s.start.y-i.start.y)<.001;if(!(l||u||f||d)||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:f?h=i.start:d&&(a=i.end);let g=Math.hypot(h.x-a.x,h.y-a.y),y={...s};y.start=a,y.end=h,y.length=g,y.direction={x:(h.x-a.x)/g,y:(h.y-a.y)/g,z:0},s.rooftopPz!==void 0&&i.rooftopPz!==void 0?y.rooftopPz=Math.max(s.rooftopPz,i.rooftopPz):y.rooftopPz=s.rooftopPz!==void 0?s.rooftopPz:i.rooftopPz,y.buildRosource=s.buildRosource||i.buildRosource,y.isRebuild=!1,y.doorAndBeamData||(y.doorAndBeamData=[]),y.insetionArr||(y.insetionArr=[]),t[o]=y,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 Ye(t,e=5,n=.05){if(t.length<=1)return{segments:t,sourceMap:t.map((u,f)=>[f])};let o=t.map((u,f)=>({seg:u,angle:el(u),idx:f}));o.sort((u,f)=>u.angle-f.angle);let r=nl(o,e),s=[],i=[],l=[];for(let u of r){let f=u[0].seg;for(let m of u)m.seg.length>f.length&&(f=m.seg);let d=f.end.x-f.start.x,c=f.end.y-f.start.y,a=Math.sqrt(d*d+c*c);if(a<1e-12)continue;let h=-c/a,g=d/a,y=u.map(m=>{let p=m.seg.start.x-f.start.x,x=m.seg.start.y-f.start.y;return{seg:m.seg,offset:Math.abs(p*h+x*g),idx:m.idx}});y.sort((m,p)=>m.offset-p.offset);let w=ol(y);for(let m of w){let p=m[0].seg;for(let T of m)T.seg.length>p.length&&(p=T.seg);let x=p.end.x-p.start.x,b=p.end.y-p.start.y,z=Math.sqrt(x*x+b*b);if(z<1e-12)continue;let M=x/z,P=b/z,E=m.map(T=>T.seg.rooftopPz).filter(T=>T!==void 0),S=E.length>0?Math.max(...E):void 0,I=[...new Set(E.map(T=>T.toFixed(3)))];if(I.length>1){let T=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:[...I],segments:T})}let H=[...new Set(m.map(T=>String(T.seg.buildRosource)))],D=rl(m,p,M,P,n);for(let{l:T,r:R,srcIdxs:v,startPt:W,endPt:V}of D){if(R-T<.01)continue;let C=sl(p,W,V,M,P,S,p.buildRosource);s.push(C),i.push(v)}}}return{...il(s,i),debugRPZGroups:l}}function al(t){return{minLengthRatio:.95,maxDistance:.5,angleThreshold:45,projectionMargin:.1,printOnly:!0,minEmbedRatioThreshold:.3,noWallSurroundDistance:.3,minEmbedRatio:.05,...t}}function ll(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 cl(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=Ie(n,o,a.x,a.y,h.x,h.y),y=r.map(z=>{let M=Ie(z.x,z.y,a.x,a.y,h.x,h.y);return`t=${M.t.toFixed(3)},d=${M.dist.toFixed(3)}`}),w=h.x-a.x,m=h.y-a.y,p=Math.sqrt(w*w+m*m)||1,x=Math.abs(i*(w/p)+l*(m/p)),b=Math.acos(Math.min(x,1))*(180/Math.PI);return{seg:c,lineDist:g.dist,t:g.t,pts:y,angle:b,length:c.length}}).sort((c,a)=>c.lineDist-a.lineDist)}function ul(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 f of l){if(u.length>0)break;for(let d of t){let c=!1,a=!1,h=!1,g=e*s.minLengthRatio;if(d.length<g){continue}c=!0;let{start:y,end:w}=d,m=!1,p=1/0;for(let D of r){let{dist:T,t:R}=Ie(D.x,D.y,y.x,y.y,w.x,w.y);R>=-f.margin&&R<=1+f.margin&&T<=f.maxDist&&(m=!0,p=Math.min(p,T))}if(!m){`${f.maxDist}${(-f.margin).toFixed(1)}${(1+f.margin).toFixed(1)}`;continue}a=!0;let x=Ie(r[0].x,r[0].y,y.x,y.y,w.x,w.y);if(x.t<0||x.t>1){`${x.t.toFixed(3)}`;continue}let b=Math.sqrt((w.x-y.x)**2+(w.y-y.y)**2);if(b<1e-12)continue;let z=(w.x-y.x)/b,M=(w.y-y.y)/b,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 S=[r[1],r[2],r[3],r[4]],I=zs(y.x,y.y,w.x,w.y,S),H=e>0?I/e:0;u.push({seg:d,minDist:p,embedRatio:H,ratio:d.length/e,score:0,details:{conn:0,variance:0,sameSide:0}})}}return u}function fl(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}=Ps(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 dl(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,f=e.map(P=>{let E=P.x-t.start.x,S=P.y-t.start.y;return(E*l+S*u)/i}),d=Math.min(...f),c=Math.max(...f),a=(c-d)*i,h=(d+c)/2,g=t.start.x+h*r,y=t.start.y+h*s,w=n.box.min.z,m=n.box.max.z,p=Math.abs(m-w),x=Ge(o,t.start.x,t.start.y),b=Math.max(0,w-x),z=d<=0&&c>=1,M=t.start.z+h*(t.end.z-t.start.z);return{p:{x:g,y,z:M},width:a,full:z,height:p,groundClearance:b}}function No(t,e,n){let o=e.map(d=>n[d]),r=[],s=[],i=[],l=[],u,f;for(let d of o){if(d.originalPoints?.length)for(let c of d.originalPoints)r.push(c);if(d.doorAndBeamData?.length)for(let c of d.doorAndBeamData)s.push(c);if(d.insetionArr?.length)for(let c of d.insetionArr)i.push(c);if(d.drawWindow?.length)for(let c of d.drawWindow)l.push(c);d.boxData&&!u&&(u=d.boxData),d.rooftopPz!==void 0&&(f===void 0||d.rooftopPz>f)&&(f=d.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),f!==void 0&&(t.rooftopPz=f)}function Tn(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,f=l.end.y-l.start.y,d=Math.sqrt(u*u+f*f)||1,c=u/d,a=f/d,h=i.x-l.start.x,g=i.y-l.start.y,y=(h*c+g*a)/d;for(let w of e){if(w===l)continue;let m=w.end.x-w.start.x,p=w.end.y-w.start.y,x=Math.sqrt(m*m+p*p)||1,b=m/x,z=p/x,M=Math.abs(c*b+a*z),E=Math.acos(Math.min(M,1))*(180/Math.PI);if(Math.abs(E-90)>n)continue;let S=[w.start,w.end];for(let I of S){let H=I.x-l.start.x,D=I.y-l.start.y,T=(H*c+D*a)/d,R=l.start.x+T*d*c,v=l.start.y+T*d*a;if(Math.sqrt((I.x-R)**2+(I.y-v)**2)>r)continue;let V=Math.abs((T-y)*d);if(V<=o){s.push({seg:w,distAlongWall:V,angle:E,endPoint:I});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)),f={x:n.x+u*r,y:n.y+u*s,z:n.z+(o.z-n.z)*u||0};function d(x){if(!x||!x.length)return[[],[]];let b=[],z=[];for(let M of x){let P=((M.x-n.x)*r+(M.y-n.y)*s)/(i*i);P<=u+1e-8&&b.push(M),P>=u-1e-8&&z.push(M)}return(b.length===0||c(b[b.length-1],f)>1e-6)&&b.push({...f}),(z.length===0||c(z[0],f)>1e-6)&&z.unshift({...f}),[b,z]}function c(x,b){return Math.sqrt((x.x-b.x)**2+(x.y-b.y)**2)}let[a,h]=d(t.originalPoints),g=Math.max(u*i,1e-6),y=Math.max((1-u)*i,1e-6),w=t.direction||{x:r/i,y:s/i,z:(o.z-n.z)/i||0},m={...t,start:{...n},end:{...f},length:g,direction:{...w},originalPoints:a.length?a:void 0},p={...t,start:{...f},end:{...o},length:y,direction:{...w},originalPoints:h.length?h:void 0};if(t.drawWindow&&t.drawWindow.length>0){let x=[],b=[];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&&x.push(z),M>=u-1e-8&&b.push(z)}m.drawWindow=x.length?x:void 0,p.drawWindow=b.length?b:void 0}else m.drawWindow=void 0,p.drawWindow=void 0;if(t.boxData){let x=b=>{if(!b.length)return;let z=1/0,M=1/0,P=1/0,E=-1/0,S=-1/0,I=-1/0;for(let H of b)H.x<z&&(z=H.x),H.y<M&&(M=H.y),H.z!==void 0&&H.z<P&&(P=H.z),H.x>E&&(E=H.x),H.y>S&&(S=H.y),H.z!==void 0&&H.z>I&&(I=H.z);return{isBox3:!0,min:{x:z,y:M,z:P},max:{x:E,y:S,z:I}}};m.boxData=x(a),p.boxData=x(h)}return[m,p]}function Rn(t,e,n,o){let r=al(n),s=[],{segments:i,sourceMap:l}=o??Ye(e),u=i;for(let f of t){let d=f.coordinatesByArea?.coordinates;if(!d||d.length<4)continue;let c=d.slice(0,4),a=c.reduce((I,H)=>I+H.x,0)/4,h=c.reduce((I,H)=>I+H.y,0)/4,{longSide:g,dirX:y,dirY:w}=Ze(c);if(g<.01)continue;let m=c.reduce((I,H)=>I+H.z,0)/4,p=Ge(e,a,h);if(m<p-.3)continue;let x=ll(c,a,h);cl(f.name,u,a,h,x,g,y,w,r);let b=ul(u,g,y,w,x,r,f.name);if(b.length>1&&r.minEmbedRatioThreshold>0){let I=Math.max(...b.map(H=>H.embedRatio));if(I>0){let H=b.length;b=b.filter(D=>D.embedRatio>=I*r.minEmbedRatioThreshold)}}if(b.length>0&&r.minEmbedRatio>0){let I=b.length;b=b.filter(H=>H.embedRatio>=r.minEmbedRatio)}b=fl(b,x,e,f.name);let z=null,M=1/0,P=0,E=0;if(b.length>0){let I=b[0];z=I.seg,M=I.minDist,P=I.ratio,E=I.embedRatio}if(z&&E<=0&&r.noWallSurroundDistance>0){let I=r.noWallSurroundDistance,H=c.map(C=>C.x),D=c.map(C=>C.y),T=Math.min(...H)-I,R=Math.max(...H)+I,v=Math.min(...D)-I,W=Math.max(...D)+I,V=!1;for(let C of u){let _=Math.min(C.start.x,C.end.x),A=Math.max(C.start.x,C.end.x),B=Math.min(C.start.y,C.end.y),k=Math.max(C.start.y,C.end.y);if(!(A<T||_>R)&&!(k<v||B>W)){V=!0;break}}V||(z=null)}let S;if(z&&(S=dl(z,c,f,i),!r.printOnly)){let I=z;I.drawWindow||(I.drawWindow=[]),I.drawWindow.push(S),I.isWindow=!0}if(z){let I={windowName:f.name,windowCategory:f.category,windowCenter:f.center,wallSegment:z,distance:M,wallLengthRatio:P,drawWindow:S};s.push(I)}}for(let f of s){let d=f.wallSegment,c=i.indexOf(d);if(c===-1)continue;let a=l[c];!a||a.length<=1||No(d,a,e)}return s}function qo(t,e,n){let o={printOnly:!1,skipMerge:!1,...n};for(let w of t)w.drawWindow&&(w.drawWindow=void 0),w.isWindow&&(w.isWindow=void 0);let r=Array.isArray(e)?e.filter(w=>w&&w.category==="window"&&!w.isBayWindowObj):[],s,i;if(o.skipMerge)s=t,i=t.map((w,m)=>[m]);else{let w=Ye(t);s=w.segments,i=w.sourceMap}let l=Rn(r,t,o,{segments:s,sourceMap:i}),u=new Set;for(let w of l){let m=s.indexOf(w.wallSegment);m>=0&&u.add(m)}let f=[],d=new Set;for(let w of u){let m=i[w];if(m){No(s[w],m,t);for(let p of m)d.add(p)}f.push(s[w])}for(let w=0;w<t.length;w++)d.has(w)||f.push(t[w]);let c=new Set(l.map(w=>w.windowName));for(let w of e)w&&w.category==="window"&&!w.isBayWindowObj&&(c.has(w.name)?delete w.AbnormalWindow:w.AbnormalWindow=!0);let a=new Map;for(let w of e)w&&w.name&&a.set(w.name,w);let h=new Map;for(let w of l){let m=w.wallSegment;h.has(m)||h.set(m,[]),h.get(m).push(w)}let g=new Map,y=f;for(let[w,m]of h){if(!w.drawWindow||!w.drawWindow.length||g.has(w))continue;let p=w.length,x=w.end.x-w.start.x,b=w.end.y-w.start.y,z=[];for(let T of m){if(!T.drawWindow)continue;let R=T.drawWindow.width/2,v=((T.drawWindow.p.x-w.start.x)*x+(T.drawWindow.p.y-w.start.y)*b)/(p*p),W=R/p;z.push({left:v-W,right:v+W,match:T})}if(z.length===0)continue;let M=Ms(w,y),P=1e-6,E=new Set,S=!1;for(let T of z){let R=!1,v=!1,W=null;for(let C of M)C<T.left-P&&((W===null||C>W)&&(W=C),R=!0);let V=null;for(let C of M)C>T.right+P&&((V===null||C<V)&&(V=C),v=!0);W!==null&&(E.add(W),S=!0),V!==null&&(E.add(V),S=!0)}if(!S)continue;let I=!1,H=null,D=null;for(let T of z){let R=T.match;if(!R.drawWindow||R.drawWindow.width<=1)continue;let v=a.get(R.windowName);if(!v||!v.positionArr||!v.positionArr.length)continue;let W=Tn(R,s);if(W.length<=1)continue;let V=v.positionArr[0],C=R.drawWindow.p,_=V.x-C.x,A=V.y-C.y,B=Math.sqrt(_*_+A*A);if(B<.001)continue;let k=_/B,F=A/B,L=W.filter(O=>{let $=(O.seg.start.x+O.seg.end.x)/2,G=(O.seg.start.y+O.seg.end.y)/2,Q=$-C.x,j=G-C.y;return Q*k+j*F>0});if(L.length){I=!0,H=L[0].endPoint,D=R;break}}if(I&&H&&D){let[T,R]=Sn(w,H);g.set(w,[T,R]);let v=((D.drawWindow.p.x-w.start.x)*x+(D.drawWindow.p.y-w.start.y)*b)/(p*p),W=((H.x-w.start.x)*x+(H.y-w.start.y)*b)/(p*p);v<=W?D.wallSegment=T:D.wallSegment=R}else{let T=Array.from(E).sort((v,W)=>v-W),R=Es(w,T);for(let v of z){let W=(v.left+v.right)/2,V=0;for(let C of R){let _=C.length/p;if(W>=V-P&&W<=V+_+P){let A=v.match.drawWindow;A&&(C.drawWindow||(C.drawWindow=[]),C.drawWindow.push(A),C.isWindow=!0),v.match.wallSegment=C;break}V+=_}}g.set(w,R)}}if(g.size>0){let w=[];for(let m of f)g.has(m)?w.push(...g.get(m)):w.push(m);for(let m of w)m.isWindow===void 0&&(m.isWindow=!!(m.drawWindow&&m.drawWindow.length>0));return{segments:w,matches:l}}for(let w of f)w.isWindow=!!(w.drawWindow&&w.drawWindow.length>0);return{segments:f,matches:l}}function Ue(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,f=l.y-i.y,d=Math.sqrt(u*u+f*f);d>e&&(e=d,o=u/d,r=f/d),d<n&&(n=d)}return{longSide:e,shortSide:n===1/0?e:n,dirX:o,dirY:r}}function Ke(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,f=l-n;u*u+f*f<=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 jt(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 f=t-n,d=e-o,c=(f*i+d*l)/u,a=n+c*i,h=o+c*l;return{dist:Math.sqrt((t-a)**2+(e-h)**2),t:c}}function jo(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 hl(t,e,n,o,r,s,i,l){let u=n-t,f=o-e,d=i-r,c=l-s,a=u*c-f*d;if(Math.abs(a)<1e-12)return null;let h=((r-t)*c-(s-e)*d)/a,g=((r-t)*f-(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 Ss(t,e,n,o,r){let s=[];jo(t,e,r)&&s.push(0),jo(n,o,r)&&s.push(1);for(let u=0;u<4;u++){let f=r[u],d=r[(u+1)%4],c=hl(t,e,n,o,f.x,f.y,d.x,d.y);c!==null&&s.push(c)}if(s.length<2)return 0;s.sort((u,f)=>u-f);let i=Math.sqrt((n-t)**2+(o-e)**2),l=0;for(let u=0;u<s.length-1;u++){let f=s[u],d=s[u+1],c=(f+d)/2,a=t+c*(n-t),h=e+c*(o-e);jo(a,h,r)&&(l+=(d-f)*i)}return l}function Rs(t){if(!t||t.length<4)return[];let e=[...t].sort((i,l)=>i.z-l.z),n=e.slice(0,2),o=e.slice(2,4),r=[],s=new Set;for(let i of n){let l=-1,u=1/0;for(let f=0;f<o.length;f++){if(s.has(f))continue;let d=o[f].x-i.x,c=o[f].y-i.y,a=Math.sqrt(d*d+c*c);a<u&&(u=a,l=f)}if(l>=0){s.add(l);let f=o[l];r.push({bottom:i,top:f,midX:(i.x+f.x)/2,midY:(i.y+f.y)/2,height:Math.abs(f.z-i.z)})}}return r}function Ts(t,e,n){return jt(t.midX,t.midY,e.x,e.y,n.x,n.y)}function Ds(t,e,n,o=.08){if(!t||t.length<2)return null;let r=Ts(t[0],e,n),s=Ts(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 vs(t){if(!t||t.length<2)return 0;let e=t[0].midX-t[1].midX,n=t[0].midY-t[1].midY;return Math.sqrt(e*e+n*n)}function $o(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 Vs(t,e,n,o=.08){let r=$o(t);if(!r)return null;let s=jt(r.p1.x,r.p1.y,e.x,e.y,n.x,n.y),i=jt(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 w of n){let m=w.x-t.start.x,p=w.y-t.start.y,x=(m*o+p*r)/(s*s);i.push(Math.max(0,Math.min(1,x)))}let l=Math.max(1,Math.ceil(s/e)),u=s/l,f=new Array(l).fill(0);for(let w of i){let m=Math.min(l-1,Math.floor(w*l));f[m]++}let d=f.map(w=>w/u),c=f.map((w,m)=>m/l),a=f.map((w,m)=>(m+1)/l),h=d.reduce((w,m)=>w+m,0)/l,g=Math.max(...d),y=Math.min(...d);return{densityProfile:d,binStartT:c,binEndT:a,avgDensity:h,maxDensity:g,minDensity:y,binSize:u}}function Is(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 Cs(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 Ws(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,f=[],d=!1,c=0,a=0,h=0;for(let g=0;g<u;g++){let y=s[g]<l;if(y&&!d)d=!0,c=g,a=s[g],h=1;else if(y&&d)a+=s[g],h++;else if(!y&&d){d=!1;let w=g-1,m=c/u,p=(w+1)/u,x=(p-m)*e;x>=o&&x<=r&&f.push({startT:m,endT:p,startLen:m*e,endLen:p*e,avgDensity:a/h}),a=0,h=0}}if(d){let g=u-1,y=c/u,w=(g+1)/u,m=(w-y)*e;m>=o&&m<=r&&f.push({startT:y,endT:w,startLen:y*e,endLen:w*e,avgDensity:a/h})}return f}function ml(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 p=m.x-t.start.x,x=m.y-t.start.y,b=(p*r+x*s)/i;b>=e&&b<=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,f=-1/0;for(let m of o)m.z!==void 0&&isFinite(m.z)&&(m.z<u&&(u=m.z),m.z>f&&(f=m.z));let d=f-u;if(d<.5)return{verticalGapRatio:0,isDoorSized:!1};let c=15,a=new Array(c).fill(!1);for(let m of l){let p=Math.min(c-1,Math.max(0,Math.floor((m-u)/d*c)));a[p]=!0}let h=0,g=0;for(let m=0;m<c;m++)a[m]?(h=Math.max(h,g),g=0):g++;h=Math.max(h,g);let y=h/c,w=y>=.35;return{verticalGapRatio:y,isDoorSized:w}}function Hs(t,e,n,o=.5,r=.5,s=3,i=.35){let l=Ws(e,n,o,r,s),u=[];for(let f of l){let{verticalGapRatio:d,isDoorSized:c}=ml(t,f.startT,f.endT);u.push({...f,verticalGapRatio:d,isRectangular:c})}return u}function _s(t,e,n){if(!t||!t.start||!t.end)return null;let o=t.start,r=t.end,s=jt(o.x,o.y,e.x,e.y,n.x,n.y),i=jt(r.x,r.y,e.x,e.y,n.x,n.y),l=s.dist<=i.dist,u=l?o:r,f=l?s.dist:i.dist,d=jt(u.x,u.y,e.x,e.y,n.x,n.y);return{hingeT:Math.max(0,Math.min(1,d.t)),hingeDist:f}}function As(t,e,n,o=2e3){let{hingeT:r}=t,s=.25,i=0,l=null,u=0;for(let f of e){let d=(f.startT+f.endT)/2,c=Math.abs(d-r),a=Math.max(0,1-c/s),h=f.isRectangular?1:.3,g=Math.max(0,1-f.avgDensity/o),y=a*.5+h*.3+g*.2;y>i&&(i=y,l=f,u=a)}return{score:i>.5?i:-1,bestRegion:l,bestOverlap:u,bestOpeningStartT:l?.startT??0,bestOpeningEndT:l?.endT??0}}function pl(t,e,n=.15){let o=0,r=0;for(let i of e)i!==t&&((Ue(t.start,i.start)<=n||Ue(t.start,i.end)<=n)&&o++,(Ue(t.end,i.start)<=n||Ue(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 gl(t,e){let n=[],{start:o,end:r}=t;for(let l of e){let{dist:u}=jt(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 xl(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=Ue(a,h.start),y=Ue(a,h.end),w=null;if(g<=n?w=h.end:y<=n&&(w=h.start),!w)continue;let m=h.end.x-h.start.x,p=h.end.y-h.start.y,x=Math.sqrt(m*m+p*p);if(x<1e-12||Math.abs(o*m+r*p)/(s*x)>=.342)continue;let z=(w.x-a.x)*i+(w.y-a.y)*l;u[c].push(z>0?1:-1)}}if(u[0].length===0||u[1].length===0)return 0;let f=[...u[0],...u[1]];return f.every(c=>c===f[0])?2:1}function Ls(t,e,n){let o=pl(t,n),r=gl(t,e),s=xl(t,n);return{score:o.score*3+r*2+s*2,details:{conn:o.score,variance:r,sameSide:s}}}function yl(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 bl(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 wl(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 zl(t,e,n,o,r){let s=[];for(let f of t){let d=f.seg,c=(d.start.x-e.start.x)*n+(d.start.y-e.start.y)*o,a=(d.end.x-e.start.x)*n+(d.end.y-e.start.y)*o;c<=a?s.push({l:c,r:a,idx:f.idx,startPt:d.start,endPt:d.end}):s.push({l:a,r:c,idx:f.idx,startPt:d.end,endPt:d.start})}s.sort((f,d)=>f.l-d.l);let i=[],l=.01,u=.5;for(let{l:f,r:d,idx:c,startPt:a,endPt:h}of s){if(i.length===0){i.push({l:f,r:d,srcIdxs:[c],startPt:a,endPt:h});continue}let g=i[i.length-1];if(f<=g.r+r){let y=Math.min(g.r,d)-Math.max(g.l,f),w=Math.hypot(g.endPt.x-a.x,g.endPt.y-a.y);y>=u||w<=l?(f<g.l&&(g.l=f,g.startPt=a),d>g.r&&(g.r=d,g.endPt=h),g.srcIdxs.includes(c)||g.srcIdxs.push(c)):i.push({l:f,r:d,srcIdxs:[c],startPt:a,endPt:h})}else i.push({l:f,r:d,srcIdxs:[c],startPt:a,endPt:h})}return i}function Ml(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 El(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,f=Math.abs(s.end.x-i.end.x)<.001&&Math.abs(s.end.y-i.end.y)<.001,d=Math.abs(s.start.x-i.start.x)<.001&&Math.abs(s.start.y-i.start.y)<.001;if(!(l||u||f||d)||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:f?h=i.start:d&&(a=i.end);let g=Math.hypot(h.x-a.x,h.y-a.y),y={...s};y.start=a,y.end=h,y.length=g,y.direction={x:(h.x-a.x)/g,y:(h.y-a.y)/g,z:0},s.rooftopPz!==void 0&&i.rooftopPz!==void 0?y.rooftopPz=Math.max(s.rooftopPz,i.rooftopPz):y.rooftopPz=s.rooftopPz!==void 0?s.rooftopPz:i.rooftopPz,y.buildRosource=s.buildRosource||i.buildRosource,y.isRebuild=!1,y.doorAndBeamData||(y.doorAndBeamData=[]),y.insetionArr||(y.insetionArr=[]),t[o]=y,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 Qe(t,e=5,n=.05){if(t.length<=1)return{segments:t,sourceMap:t.map((u,f)=>[f])};let o=t.map((u,f)=>({seg:u,angle:yl(u),idx:f}));o.sort((u,f)=>u.angle-f.angle);let r=bl(o,e),s=[],i=[],l=[];for(let u of r){let f=u[0].seg;for(let m of u)m.seg.length>f.length&&(f=m.seg);let d=f.end.x-f.start.x,c=f.end.y-f.start.y,a=Math.sqrt(d*d+c*c);if(a<1e-12)continue;let h=-c/a,g=d/a,y=u.map(m=>{let p=m.seg.start.x-f.start.x,x=m.seg.start.y-f.start.y;return{seg:m.seg,offset:Math.abs(p*h+x*g),idx:m.idx}});y.sort((m,p)=>m.offset-p.offset);let w=wl(y);for(let m of w){let p=m[0].seg;for(let T of m)T.seg.length>p.length&&(p=T.seg);let x=p.end.x-p.start.x,b=p.end.y-p.start.y,z=Math.sqrt(x*x+b*b);if(z<1e-12)continue;let M=x/z,P=b/z,E=m.map(T=>T.seg.rooftopPz).filter(T=>T!==void 0),S=E.length>0?Math.max(...E):void 0,I=[...new Set(E.map(T=>T.toFixed(3)))];if(I.length>1){let T=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:[...I],segments:T})}let H=[...new Set(m.map(T=>String(T.seg.buildRosource)))],D=zl(m,p,M,P,n);for(let{l:T,r:R,srcIdxs:v,startPt:W,endPt:V}of D){if(R-T<.01)continue;let C=Ml(p,W,V,M,P,S,p.buildRosource);s.push(C),i.push(v)}}}return{...El(s,i),debugRPZGroups:l}}function Pl(t){return{minLengthRatio:0,maxDistance:.5,angleThreshold:45,projectionMargin:.1,printOnly:!0,minEmbedRatioThreshold:.3,noWallSurroundDistance:.3,minEmbedRatio:.05,...t}}function Tl(t,e,n){return[{x:e,y:n,z:0},{x:t[0].x,y:t[0].y,z:0},{x:t[1].x,y:t[1].y,z:0},{x:t[2].x,y:t[2].y,z:0},{x:t[3].x,y:t[3].y,z:0}]}function Sl(t,e,n,o,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=jt(n,o,a.x,a.y,h.x,h.y),y=r.map(z=>{let M=jt(z.x,z.y,a.x,a.y,h.x,h.y);return`t=${M.t.toFixed(3)},d=${M.dist.toFixed(3)}`}),w=h.x-a.x,m=h.y-a.y,p=Math.sqrt(w*w+m*m)||1,x=Math.abs(i*(w/p)+l*(m/p)),b=Math.acos(Math.min(x,1))*(180/Math.PI);return{seg:c,lineDist:g.dist,t:g.t,pts:y,angle:b,length:c.length}}).sort((c,a)=>c.lineDist-a.lineDist)}function Rl(t,e,n,o,r,s,i,l,u){let f=[{margin:s.projectionMargin,maxDist:s.maxDistance,label:"\u4E25\u683C"},{margin:.4,maxDist:.65,label:"\u5BBD\u677E"}],d=[],c=vs(l)||e;for(let a of f){if(d.length>0)break;for(let h of t){let{start:g,end:y}=h,w=!1,m=1/0;for(let E of r){let{dist:S,t:I}=jt(E.x,E.y,g.x,g.y,y.x,y.y);I>=-a.margin&&I<=1+a.margin&&S<=a.maxDist&&(w=!0,S<m&&(m=S))}if(!w)continue;let p=null;if(u&&(p=Vs(u,g,y,.3)),!p||!p.hingePoint){let E=Ds(l,g,y,.1);E&&E.hingeEdge&&(p={...E,hingePoint:E.hingeEdge?{x:E.hingeEdge.midX,y:E.hingeEdge.midY,z:0}:null,otherPoint:E.otherEdge?{x:E.otherEdge.midX,y:E.otherEdge.midY,z:0}:null})}p&&p.hingePoint&&jt(r[0].x,r[0].y,g.x,g.y,y.x,y.y).dist>.3&&(p=null);let x=!1;if(!p||!p.hingePoint){let E=jt(r[0].x,r[0].y,g.x,g.y,y.x,y.y);if(m<.15&&E.dist<.3&&h.originalPoints&&h.originalPoints.length>=50&&h.length>=.5)x=!0;else continue}if(!x&&(p.hingeT<-a.margin||p.hingeT>1+a.margin)){let E=jt(r[0].x,r[0].y,g.x,g.y,y.x,y.y);if(m<.15&&E.dist<.3&&h.originalPoints&&h.originalPoints.length>=50&&h.length>=.5)x=!0,h.__candidatesDebug="hingeT\u8D85\u8303\u56F4-\u5BC6\u5EA6\u515C\u5E95";else continue}let b=x?0:p.isClosed?1:.5,z=[r[1],r[2],r[3],r[4]],M=Ss(g.x,g.y,y.x,y.y,z),P=c>0?M/c:0;d.push({seg:h,minDist:m,embedRatio:P,ratio:h.length/c,score:0,details:{conn:0,variance:0,sameSide:0},hingeInfo:p,hingeScore:b})}}return d}function Dl(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}=Ls(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 vl(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,f=e.map(P=>{let E=P.x-t.start.x,S=P.y-t.start.y;return(E*l+S*u)/i}),d=Math.min(...f),c=Math.max(...f),a=(c-d)*i,h=(d+c)/2,g=t.start.x+h*r,y=t.start.y+h*s,w=n.box.min.z,m=n.box.max.z,p=Math.abs(m-w),x=Ke(o,t.start.x,t.start.y),b=Math.max(0,w-x),z=d<=0&&c>=1,M=t.start.z+h*(t.end.z-t.start.z);return{p:{x:g,y,z:M},width:a,full:z,height:p,groundClearance:b,wallTMin:Math.max(0,Math.min(1,d)),wallTMax:Math.max(0,Math.min(1,c))}}function Zo(t,e,n){let o=e.map(d=>n[d]),r=[],s=[],i=[],l=[],u,f;for(let d of o){if(d.originalPoints?.length)for(let c of d.originalPoints)r.push(c);if(d.doorAndBeamData?.length)for(let c of d.doorAndBeamData)s.push(c);if(d.insetionArr?.length)for(let c of d.insetionArr)i.push(c);if(d.DrawDoor?.length)for(let c of d.DrawDoor)l.push(c);d.boxData&&!u&&(u=d.boxData),d.rooftopPz!==void 0&&(f===void 0||d.rooftopPz>f)&&(f=d.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),f!==void 0&&(t.rooftopPz=f)}function fn(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,f=l.end.y-l.start.y,d=Math.sqrt(u*u+f*f)||1,c=u/d,a=f/d,h=i.x-l.start.x,g=i.y-l.start.y,y=(h*c+g*a)/d;for(let w of e){if(w===l)continue;let m=w.end.x-w.start.x,p=w.end.y-w.start.y,x=Math.sqrt(m*m+p*p)||1,b=m/x,z=p/x,M=Math.abs(c*b+a*z),E=Math.acos(Math.min(M,1))*(180/Math.PI);if(Math.abs(E-90)>n)continue;let S=[w.start,w.end];for(let I of S){let H=I.x-l.start.x,D=I.y-l.start.y,T=(H*c+D*a)/d,R=l.start.x+T*d*c,v=l.start.y+T*d*a;if(Math.sqrt((I.x-R)**2+(I.y-v)**2)>r)continue;let V=Math.abs((T-y)*d);if(V<=o){s.push({seg:w,distAlongWall:V,angle:E,endPoint:I});break}}}return s}function Dn(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)),f={x:n.x+u*r,y:n.y+u*s,z:n.z+(o.z-n.z)*u||0};function d(x){if(!x||!x.length)return[[],[]];let b=[],z=[];for(let M of x){let P=((M.x-n.x)*r+(M.y-n.y)*s)/(i*i);P<=u+1e-8&&b.push(M),P>=u-1e-8&&z.push(M)}return(b.length===0||c(b[b.length-1],f)>1e-6)&&b.push({...f}),(z.length===0||c(z[0],f)>1e-6)&&z.unshift({...f}),[b,z]}function c(x,b){return Math.sqrt((x.x-b.x)**2+(x.y-b.y)**2)}let[a,h]=d(t.originalPoints),g=Math.max(u*i,1e-6),y=Math.max((1-u)*i,1e-6),w=t.direction||{x:r/i,y:s/i,z:(o.z-n.z)/i||0},m={...t,start:{...n},end:{...f},length:g,direction:{...w},originalPoints:a.length?a:void 0},p={...t,start:{...f},end:{...o},length:y,direction:{...w},originalPoints:h.length?h:void 0};if("isRebuild"in t&&(m.isRebuild=t.isRebuild,p.isRebuild=t.isRebuild),t.DrawDoor&&t.DrawDoor.length>0){let x=[],b=[];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&&x.push(z),M>=u-1e-8&&b.push(z)}m.DrawDoor=x.length?x:void 0,p.DrawDoor=b.length?b:void 0}else m.DrawDoor=void 0,p.DrawDoor=void 0;if(t.boxData){let x=b=>{if(!b.length)return;let z=1/0,M=1/0,P=1/0,E=-1/0,S=-1/0,I=-1/0;for(let H of b)H.x<z&&(z=H.x),H.y<M&&(M=H.y),H.z!==void 0&&H.z<P&&(P=H.z),H.x>E&&(E=H.x),H.y>S&&(S=H.y),H.z!==void 0&&H.z>I&&(I=H.z);return{isBox3:!0,min:{x:z,y:M,z:P},max:{x:E,y:S,z:I}}};m.boxData=x(a),p.boxData=x(h)}return[m,p]}function vn(t,e,n,o){let r=Pl(n),s=[],{segments:i,sourceMap:l}=o??Qe(e),u=i,f=Cs(u);for(let d of t){let c=d.coordinatesByArea?.coordinates;if(!c||c.length<4)continue;let a=c.slice(0,4),h=$o(d.nline),g=no(a),y,w,m,p,x;if(h?(y=h.midX,w=h.midY,m=h.length,p=h.dirX,x=h.dirY):(y=a.reduce((L,O)=>L+O.x,0)/4,w=a.reduce((L,O)=>L+O.y,0)/4,m=g.longSide,p=g.dirX,x=g.dirY),m<.01)continue;let b=a.reduce((L,O)=>L+O.z,0)/4,z=Ke(e,y,w);if(b<z-.3)continue;let M=Rs(a),P=[...a].sort((L,O)=>L.z-O.z),E=P[0].x-P[1].x,S=P[0].y-P[1].y,I=Math.sqrt(E*E+S*S),H=Tl(a,y,w);Sl(d.name,u,y,w,H,m,p,x,r);let D=Rl(u,I,p,x,H,r,d.name,M,d.nline);if(D.length>0)for(let L=0;L<D.length;L++){let O=D[L],$=O.seg,G=!!O.hingeInfo?.hingePoint,Q=O.hingeInfo?.isClosed,j=O.hingeInfo?.hingeDist??-1,Z=jt(H[0].x,H[0].y,$.start.x,$.start.y,$.end.x,$.end.y)}if(D=Dl(D,H,e,d.name),D.length===0){for(let O of u){let $=O.start.x+(O.end.x-O.start.x)/2-y,G=O.start.y+(O.end.y-O.start.y)/2-w;if(Math.sqrt($*$+G*G)>2)continue;let j=O.end.x-O.start.x,Z=O.end.y-O.start.y,Y=Math.sqrt(j*j+Z*Z),it=j/Y,ht=Z/Y,Tt=Math.abs(it*p+ht*x),nt=Math.acos(Math.min(1,Math.abs(Tt)))*180/Math.PI,wt=jt(y,w,O.start.x,O.start.y,O.end.x,O.end.y)}let L=0;for(let O of u)jt(y,w,O.start.x,O.start.y,O.end.x,O.end.y).dist<2&&L++}let T=I;for(let L of D){let O=L.seg;if(O.originalPoints&&O.originalPoints.length>100&&O.length>.5)try{let $=oo(O,.1),G=Hs(O,$,O.length,.5,.5,3,.35),Q,j=!1;if(d.nline){let ht=_s(d.nline,O.start,O.end);if(ht)Q=ht.hingeT,j=ht.hingeDist>.05;else{let Tt=jt(y,w,O.start.x,O.start.y,O.end.x,O.end.y);Q=Math.max(0,Math.min(1,Tt.t))}}else{let ht=jt(y,w,O.start.x,O.start.y,O.end.x,O.end.y);Q=Math.max(0,Math.min(1,ht.t))}let Z=Is($),Y,it=Z<=.3;it?Y={score:Xo($.avgDensity,f),bestRegion:null,bestOverlap:0,bestOpeningStartT:0,bestOpeningEndT:1}:(Y=As({hingeT:Q,doorWidth:T,isOpenDoor:j},G,O.length,f.medianDensity),Y.score<0&&(Y={score:Xo($.avgDensity,f),bestRegion:null,bestOverlap:0,bestOpeningStartT:0,bestOpeningEndT:1})),d.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=Z,L.densityUsedGlobalRank=it}catch{L.densityScore=-1}else L.densityScore=-1}if(d.name.includes("door_002"))for(let L=0;L<D.length;L++){let $=D[L].seg,G=u.findIndex(j=>Math.abs(j.start.x-$.start.x)<.001&&Math.abs(j.start.y-$.start.y)<.001&&Math.abs(j.end.x-$.end.x)<.001&&Math.abs(j.end.y-$.end.y)<.001),Q=G>=0?l[G]||[]:[];for(let j of Q){let Z=e[j]}}if(D.sort((L,O)=>{let $=L.densityScore>=0?L.densityScore:-1/0,G=O.densityScore>=0?O.densityScore:-1/0;if($!==G)return G-$;if(Math.abs($-G)<.3){let Z=L.ratio||0,Y=O.ratio||0,it=Math.abs(Z-1),ht=Math.abs(Y-1);if(it!==ht)return it-ht}let Q=L.hingeScore||0,j=O.hingeScore||0;return Q!==j?j-Q:L.minDist-O.minDist}),D.length>0)for(let L=0;L<D.length;L++){let O=D[L],$=O.seg,G=O.ratio||$.length/T,Q=Math.abs(G-1)}let R=null,v=1/0,W=0,V=0,C=null,_=-1,A=0,B=0,k=0;if(D.length>0){let L=D[0];R=L.seg,v=L.minDist,W=L.ratio,V=L.embedRatio,C=L.hingeInfo,_=L.densityScore??-1,A=L.densityOverlap??0,B=L.densityOpeningStartT??0,k=L.densityOpeningEndT??0}let F;if(R&&(F=vl(R,a,d,i),F&&k>B&&(F.wallTMin=Math.max(0,Math.min(1,B)),F.wallTMax=Math.max(0,Math.min(1,k))),!r.printOnly)){let L=R;L.DrawDoor||(L.DrawDoor=[]),L.DrawDoor.push(F),L.isDoor=!0}if(R){let L=D.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}}),O={doorName:d.name,doorCategory:d.category,doorCenter:d.center,wallSegment:R,distance:v,wallLengthRatio:W,DrawDoor:F,densityScore:_,densityOverlap:A,candidates:L,hingePoint:C?.hingePoint,otherPoint:C?.otherPoint,isClosed:C?.isClosed,doorWidth:F?.width,wallTMin:F?.wallTMin,wallTMax:F?.wallTMax};if(s.push(O),(d.name==="1527727501200_window_001"||d.name==="1527727427200_window_001")&&F){let $=R.end.x-R.start.x,G=R.end.y-R.start.y,Q=Math.sqrt($*$+G*G),j=$/Q,Z=G/Q,Y=F.p.x-R.start.x,it=F.p.y-R.start.y,ht=(Y*j+it*Z)/Q,Tt=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(j*Pt+Z*Mt),ot=Math.acos(Math.min(It,1))*(180/Math.PI);if(Math.abs(ot-90)>10)continue;Tt++;let ft=[nt.start,nt.end],rt="";for(let tt of ft){let ae=tt.x-R.start.x,bt=tt.y-R.start.y,Jt=(ae*j+bt*Z)/Q,he=R.start.x+Jt*Q*j,St=R.start.y+Jt*Q*Z,ee=Math.sqrt((tt.x-he)**2+(tt.y-St)**2),et=Math.abs((Jt-ht)*Q);rt+=`\u7AEF(${tt.x.toFixed(2)},${tt.y.toFixed(2)})\u22A5=${ee.toFixed(3)}m \u6CBF\u5899=${et.toFixed(3)}m `}}}if(F&&F.width>1){let $=fn(O,i);$.length>0&&$.forEach((G,Q)=>{})}}}for(let d of s){let c=d.wallSegment,a=i.indexOf(c);if(a===-1)continue;let h=l[a];!h||h.length<=1||Zo(c,h,e)}return s}function ro(t){return[t.wallTMin??0,t.wallTMax??1]}function Vl(t,e){let[n,o]=ro(t),[r,s]=ro(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 Il(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 Bs(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 ks(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 d=0;d<t.length;d++){let a=t[d].wallSegment;i.has(a)||i.set(a,[]),i.get(a).push(d)}let l=0;for(let[d,c]of i){l++;let a=c.map(y=>t[y].doorName).join(", "),h=d.start,g=d.end}for(let[,d]of i){if(d.length<2)continue;let c=[...d].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 y=a+1;y<c.length;y++){let w=c[y];if(s.has(w))continue;let m=t[w],p=!1,x="",b=Vl(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 V of M){let C=Math.sqrt((W.x-V.x)**2+(W.y-V.y)**2);if(C>.25)continue;let _=Bs(W,g.wallSegment),A=Bs(V,m.wallSegment),B=Math.abs(_-A);(!P||C<P.dist)&&(P={dist:C,tDiff:B})}P&&P.tDiff<=.08&&(p=!0,x=`\u6700\u77ED\u8FB9\u8DDD=${P.dist.toFixed(3)}m t\u5DEE=${P.tDiff.toFixed(3)}`);let[E,S]=ro(g),[I,H]=ro(m),D=Il(g,m);g.doorName.includes("door_002")||g.doorName.includes("door_004")||m.doorName.includes("door_002")||m.doorName.includes("door_004");let T=[g.hingePoint,g.otherPoint].filter(Boolean),R=[m.hingePoint,m.otherPoint].filter(Boolean),v=1/0;for(let W of T)for(let V of R){let C=Math.sqrt((W.x-V.x)**2+(W.y-V.y)**2);C<v&&(v=C)}p&&s.add(w)}}}let u=t.filter((d,c)=>!s.has(c)),f=t.filter((d,c)=>s.has(c)).map(d=>d.doorName);return{matches:u,removed:f}}function Go(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,p)=>[p]);else{let m=Qe(t);s=m.segments,i=m.sourceMap}for(let m=0;m<s.length;m++){let p=i[m];p&&!s[m].originalPoints&&Zo(s[m],p,t)}let l=vn(r,t,o,{segments:s,sourceMap:i}),f=ks(l,{minTOverlapRatio:.5}).matches,d=new Set(f.map(m=>m.doorName));for(let m of s){let p=m;if(p.DrawDoor&&p.DrawDoor.length>0){let x=l.filter(z=>z.wallSegment===m).length;f.filter(z=>z.wallSegment===m).length===0&&(p.DrawDoor=[],p.isDoor=!1)}}let c=new Map;for(let m=0;m<f.length;m++){let p=f[m],x=s.indexOf(p.wallSegment);x>=0&&c.set(x,m)}let a=[],h=new Set,g=new Map;for(let m of e)m&&m.name&&g.set(m.name,m);for(let[m,p]of c){let x=i[m];if(!x)continue;let b=s[m],z=b.DrawDoor,M=b.isDoor,P=b.end.x-b.start.x,E=b.end.y-b.start.y,S=P*P+E*E,I=0,H=1,D=f[p],R=(D?g.get(D.doorName):void 0)?.coordinatesByArea?.coordinates;if(R&&R.length>=4&&S>0){let C=R.slice(0,4).map(_=>{let A=_.x-b.start.x,B=_.y-b.start.y;return(A*P+B*E)/S});I=Math.max(0,Math.min(1,Math.min(...C))),H=Math.max(0,Math.min(1,Math.max(...C)))}let v,W;S>0&&H>I&&(v={x:b.start.x+I*P,y:b.start.y+I*E,z:b.start.z+I*(b.end.z-b.start.z)},W={x:b.start.x+H*P,y:b.start.y+H*E,z:b.start.z+H*(b.end.z-b.start.z)});let V=!1;for(let C of x){let _=t[C];if(!_)continue;let A=_.end.x-_.start.x,B=_.end.y-_.start.y,k=A*A+B*B,F=Math.sqrt(k);if(k<1e-10||!v||!W){h.add(C),a.push(_);continue}let L=((v.x-_.start.x)*A+(v.y-_.start.y)*B)/k,O=((W.x-_.start.x)*A+(W.y-_.start.y)*B)/k,$=Math.max(0,Math.min(1,Math.min(L,O))),G=Math.max(0,Math.min(1,Math.max(L,O)));if(G-$<.001)continue;h.add(C);let Q=nt=>({x:_.start.x+nt*A,y:_.start.y+nt*B,z:_.start.z+nt*(_.end.z-_.start.z)}),j=Q($),Z=Q(G),Y=_.direction||{x:A/F,y:B/F,z:0},it,ht,Tt;if(_.originalPoints&&_.originalPoints.length>0){it=[],ht=[],Tt=[];for(let nt of _.originalPoints){let wt=((nt.x-_.start.x)*A+(nt.y-_.start.y)*B)/k;wt<$-1e-8?it.push(nt):wt>G+1e-8?Tt.push(nt):ht.push(nt)}it.length===0&&(it=void 0),ht.length===0&&(ht=void 0),Tt.length===0&&(Tt=void 0)}if($>.001){let nt={..._,start:{..._.start},end:{...j},length:$*F,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={..._,start:{...j},end:{...Z},length:(G-$)*F,direction:{...Y}};if(z&&(nt.DrawDoor=z),M&&(nt.isDoor=!0),nt.__matchIdx=p,nt.length<.01?(nt.isRebuild=!0,nt.originalPoints=[]):nt.originalPoints=ht,!V&&z&&z.length>0){V=!0;let wt=Math.sqrt(S),zt=wt>0?-E/wt:0,Dt=wt>0?P/wt:0,Pt={pointNum:2,start:v,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={..._,start:{...Z},end:{..._.end},length:(1-G)*F,direction:{...Y}};nt.DrawDoor=void 0,nt.isDoor=!1,nt.drawDoorData=void 0,nt.length<.01?(nt.isRebuild=!0,nt.originalPoints=[]):nt.originalPoints=Tt,a.push(nt)}}}for(let m=0;m<t.length;m++)h.has(m)||a.push(t[m]);let y=new Set(f.map(m=>m.doorName));for(let m of e)m&&m.category==="door"&&(y.has(m.name)?delete m.AbnormalDoor:m.AbnormalDoor=!0);let w=new Map;for(let m of f){if(!m.DrawDoor||m.DrawDoor.width<=1)continue;let p=g.get(m.doorName);if(!p||!p.positionArr||!p.positionArr.length)continue;let x=fn(m,s);if(x.length<=1)continue;let b=p.positionArr[0],z=m.DrawDoor.p,M=b.x-z.x,P=b.y-z.y,E=Math.sqrt(M*M+P*P);if(E<.001)continue;let S=M/E,I=P/E,H=x.filter(C=>{let _=(C.seg.start.x+C.seg.end.x)/2,A=(C.seg.start.y+C.seg.end.y)/2,B=_-z.x,k=A-z.y;return B*S+k*I>0});if(!H.length)continue;let D=H[0].endPoint,T=m.wallSegment;if(w.has(T))continue;let[R,v]=Dn(T,D);w.set(T,[R,v]);let W=((z.x-T.start.x)*(T.end.x-T.start.x)+(z.y-T.start.y)*(T.end.y-T.start.y))/(T.length*T.length),V=((D.x-T.start.x)*(T.end.x-T.start.x)+(D.y-T.start.y)*(T.end.y-T.start.y))/(T.length*T.length);W<=V?m.wallSegment=R:m.wallSegment=v}if(w.size>0){let m=[];for(let p of a)w.has(p)?m.push(...w.get(p)):m.push(p);for(let p of m)p.isDoor=!!(p.DrawDoor&&p.DrawDoor.length>0);return{segments:m,matches:f}}for(let m of a)m.isDoor=!!(m.DrawDoor&&m.DrawDoor.length>0);return{segments:a,matches:f}}var Cl={findWalls:Rn,mergeSegments:Ye,computeFloorZ:Ge,analyzeQuadrangle:Ze,detectPerpWalls:Tn,splitSegment:Sn,process:qo},Wl={findWalls:vn,mergeSegments:Qe,computeFloorZ:Ke,analyzeQuadrangle:Ze,detectPerpWalls:fn,splitSegment:Dn,process:Go};function dn(t){return t==="window"?Cl:Wl}function Hl(t,e,n,o,r){return dn(t).findWalls(e,n,o,r)}function _l(t,e,n,o){return dn(t).process(e,n,o)}function Al(t,e){return dn(t).mergeSegments(e)}function Ll(t,e,n){return dn(t).detectPerpWalls(e,n)}function Bl(t,e,n){return dn(t).splitSegment(e,n)}function Je(t,e){let n=Math.atan2(e,t);return n<0&&(n+=Math.PI),n>=Math.PI&&(n-=Math.PI),n}function Ce(t,e,n){let o=Math.cos(n),r=Math.sin(n);return{x:t*o-e*r,z:t*r+e*o}}function so(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,y=e-o;return Math.sqrt(g*g+y*y)}let f=((t-n)*i+(e-o)*l)/u;f=Math.max(0,Math.min(1,f));let d=n+f*i,c=o+f*l,a=t-d,h=e-c;return Math.sqrt(a*a+h*h)}function Os(t){if(t.length<3)return 0;let e=0,n=t.length;for(let o=0;o<n;o++){let 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 d of t){let c=d.x2-d.x1,a=d.z2-d.z1,h=Math.sqrt(c*c+a*a);if(h<.01)continue;let g=Je(c,a),y=Math.floor(g/o);y>=e&&(y=e-1),n[y]+=h}let r=new Array(e).fill(0),s=5;for(let d=0;d<e;d++){let c=0;for(let a=-s;a<=s;a++){let h=d+a;h<0&&(h+=e),h>=e&&(h-=e),c+=n[h]}r[d]=c}let i=0,l=0;for(let d=0;d<e;d++)r[d]>i&&(i=r[d],l=d);let u=(l+.5)*o;return{rotated:t.map(d=>{let c=Ce(d.x1,d.z1,-u),a=Ce(d.x2,d.z2,-u);return{...d,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 d of t){let c=d.x2-d.x1,a=d.z2-d.z1,h=Math.sqrt(c*c+a*a);if(h<.01)continue;let g=Je(c,a),y;if(e==="X"?y=g<Uo||g>Math.PI-Uo:y=Math.abs(g-Math.PI/2)<Uo,!y)continue;let w,m,p;e==="X"?(w=(d.z1+d.z2)/2,m=Math.min(d.x1,d.x2),p=Math.max(d.x1,d.x2)):(w=(d.x1+d.x2)/2,m=Math.min(d.z1,d.z2),p=Math.max(d.z1,d.z2)),r.push({line:d,offset:w,pStart:m,pEnd:p,length:h})}if(r.length===0)return{groups:[],lineToGroup:new Map};r.sort((d,c)=>d.offset-c.offset);let s=[],i=[r[0]],l=r[0].offset;for(let d=1;d<r.length;d++){let c=r[d];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=[],f=new Map;for(let d of s){d.sort((a,h)=>a.pStart-h.pStart);let c=[];for(let a of d){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(y=>y.line),g=u.length;u.push(h);for(let y of h)f.set(y.id,g)}}return{groups:u,lineToGroup:f}}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=so(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 hn=.15;function kl(t,e){return Math.round(t/hn)+"_"+Math.round(e/hn)}function Fs(t,e=5){if(t.length<3)return new Set;let n=new Map,o=0,r=0;function s(u,f){let d=kl(u,f),c=n.get(d);if(c)return c;let a=Math.round(u/hn),h=Math.round(f/hn),g=null,y=hn*hn;for(let w=-1;w<=1;w++)for(let m=-1;m<=1;m++){let p=a+w+"_"+(h+m),x=n.get(p);if(!x)continue;let b=x.x-u,z=x.z-f,M=b*b+z*z;M<y&&(y=M,g=x)}return g?(n.set(d,g),g):(c={id:o++,x:u,z:f,edges:[]},n.set(d,c),c)}let i=[];for(let u of t){let f=s(u.x1,u.z1),d=s(u.x2,u.z2);if(f.id===d.id)continue;let c=Math.atan2(d.z-f.z,d.x-f.x),a=Math.atan2(f.z-d.z,f.x-d.x),h={id:r++,wallId:u.id,from:f,to:d,twin:null,angle:c,visited:!1},g={id:r++,wallId:u.id,from:d,to:f,twin:h,angle:a,visited:!1};h.twin=g,f.edges.push(h),d.edges.push(g),i.push(h,g)}if(i.length<6)return new Set;for(let u of n.values())u.edges.sort((f,d)=>f.angle-d.angle);let l=new Set;for(let u of i){if(u.visited)continue;let f=[],d=u,c=i.length+10;for(;!d.visited&&f.length<c;){d.visited=!0,f.push(d);let a=d.to,h=d.twin,g=a.edges.indexOf(h);if(g<0)break;let y=(g+1)%a.edges.length;d=a.edges[y]}if(f.length>=3){let a=f[0];if(f[f.length-1].to.id===a.from.id){let g=[],y=new Set;for(let m of f)y.add(m.wallId),g.length===0&&g.push({x:m.from.x,z:m.from.z}),g.push({x:m.to.x,z:m.to.z});if(Os(g)>=e)for(let m of y)l.add(m)}}}return l}var cp=12*(Math.PI/180);function Ns(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 Ol=0;function qs(){return++Ol}function js(t,e,n=.15,o=.5){if(!t.length)return[];let r=10*Math.PI/180,s=[];for(let d of t){let c=d.x2-d.x1,a=d.z2-d.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=(d.z1+d.z2)/2,y=Math.min(d.x1,d.x2),w=Math.max(d.x1,d.x2);s.push({line:d,pStart:y,pEnd:w,offset:g,yMin:Math.min(d.y1,d.y2),yMax:Math.max(d.y1,d.y2)})}else{if(Math.abs(c)>h*Math.sin(r))continue;let g=(d.x1+d.x2)/2,y=Math.min(d.z1,d.z2),w=Math.max(d.z1,d.z2);s.push({line:d,pStart:y,pEnd:w,offset:g,yMin:Math.min(d.y1,d.y2),yMax:Math.max(d.y1,d.y2)})}}if(!s.length)return[];s.sort((d,c)=>d.offset-c.offset);let i=[],l=[s[0]],u=s[0].offset;for(let d=1;d<s.length;d++){let c=s[d];Math.abs(c.offset-u)<n?l.push(c):(i.push(l),l=[c],u=c.offset)}i.push(l);let f=[];for(let d of i){d.sort((a,h)=>a.pStart-h.pStart);let c=[];for(let a of d){if(c.length===0){c.push({pStart:a.pStart,pEnd:a.pEnd,offset:a.offset,count:1,yMin:a.yMin,yMax:a.yMax});continue}let h=c[c.length-1];a.pStart<=h.pEnd+o?(h.pEnd=Math.max(h.pEnd,a.pEnd),h.count+=1,h.yMin=Math.min(h.yMin,a.yMin),h.yMax=Math.max(h.yMax,a.yMax),h.offset=(h.offset*(h.count-1)+a.offset)/h.count):c.push({pStart:a.pStart,pEnd:a.pEnd,offset:a.offset,count:1,yMin:a.yMin,yMax:a.yMax})}for(let a of c){let h=a.pEnd-a.pStart;if(h<.01)continue;let g;e==="X"?g={id:qs(),x1:a.pStart,y1:a.yMin,z1:a.offset,x2:a.pEnd,y2:a.yMax,z2:a.offset,length:h,pointCount:a.count,isMain:!1}:g={id:qs(),x1:a.offset,y1:a.yMin,z1:a.pStart,x2:a.offset,y2:a.yMax,z2:a.pEnd,length:h,pointCount:a.count,isMain:!1},f.push(g)}}return f}function $s(t,e=.8,n=3){return t.filter(o=>o.length>=e&&o.pointCount>=n)}function Xs(t,e=1,n=3){return t.filter(o=>o.length>=e&&o.pointCount>=n)}function Fl(t,e,n={}){let{distTol:o=.15,gapTol:r=.5,minLen:s=.2,minGroupLen:i=1,minArea:l=3,maxWinDist:u=.3,minLongWall:f=2}=n,d=performance.now(),{rotated:c,mainAngle:a}=io(t),h=performance.now(),g=e.map(v=>{let W=Ce(v.x,v.z,-a);return{...v,x:W.x,z:W.z}}),{groups:y}=ao(c,"X",o,r),{groups:w}=ao(c,"Z",o,r),m=[...y,...w],p=performance.now(),x=new Map,b=[];for(let v=0;v<m.length;v++){let W=m[v];if(W.length===0){b.push(0);continue}let V=0;for(let C of W)V+=Yo(C),x.set(C.id,v);b.push(V)}let z=performance.now(),M=new Set;for(let v=0;v<m.length;v++)b[v]>=f&&M.add(v);if(M.size>0){let v=[...M];for(;v.length>0;){let W=v.shift(),V=m[W];for(let C=0;C<m.length;C++){if(M.has(C)||b[C]<i)continue;let _=m[C],A=!1;t:for(let B of V)for(let k of _)if(Math.hypot(B.x1-k.x1,B.z1-k.z1)<=co||Math.hypot(B.x1-k.x2,B.z1-k.z2)<=co||Math.hypot(B.x2-k.x1,B.z2-k.z1)<=co||Math.hypot(B.x2-k.x2,B.z2-k.z2)<=co){A=!0;break t}A&&(M.add(C),v.push(C))}}}let P=c.map((v,W)=>{let V=Yo(v),C=x.get(v.id),_=C!==void 0&&M.has(C),A=V>=f;return{id:W,x1:v.x1,y1:v.y1,z1:v.z1,x2:v.x2,y2:v.y2,z2:v.z2,length:V,pointCount:1,isMain:_||A}}),E=P.filter(v=>v.isMain),S=P.filter(v=>!v.isMain),I=performance.now(),H=lo(g,E,u),D=performance.now(),T=v=>v.map(W=>{let V=Ce(W.x1,W.z1,a),C=Ce(W.x2,W.z2,a);return{...W,x1:V.x,z1:V.z,x2:C.x,z2:C.z}}),R=performance.now();return console.log(`[\u4E3B\u4F53\u67B6\u6784] \u89D2\u5EA6\u5F52\u4E00\u5316: ${(h-d).toFixed(0)}ms`),console.log(`[\u4E3B\u4F53\u67B6\u6784] \u5171\u7EBF\u5206\u7EC4: ${(p-h).toFixed(0)}ms (\u6C34\u5E73${y.length}\u7EC4 \u5782\u76F4${w.length}\u7EC4)`),console.log(`[\u4E3B\u4F53\u67B6\u6784] \u7EC4\u5206\u6790+\u4E3B\u4F53\u5224\u5B9A: ${(R-p).toFixed(0)}ms (\u4E3B\u4F53\u7EC4${M.size} / \u603B\u7EC4${m.length})`),console.log(`[\u4E3B\u4F53\u67B6\u6784] \u6807\u8BB0\u539F\u59CB\u7EBF\u6BB5: ${(I-R).toFixed(0)}ms (\u4E3B\u4F53${E.length} / \u6742\u7EBF${S.length})`),console.log(`[\u4E3B\u4F53\u67B6\u6784] \u7A97\u6237\u6302\u63A5: ${(D-I).toFixed(0)}ms`),console.log(`[\u4E3B\u4F53\u67B6\u6784] \u603B\u8BA1: ${(D-d).toFixed(0)}ms`),{mainWalls:T(E),noiseWalls:T(S),windowToWall:H}}var co=.2;function Te(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 In(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 we(t,e,n,o){let r=n-t,s=o-e;return Math.sqrt(r*r+s*s)}function Cn(t,e,n,o,r,s){let i=r-n,l=s-o,u=i*i+l*l;if(u<1e-6)return we(t,e,n,o);let f=((t-n)*i+(e-o)*l)/u;return f=Math.max(0,Math.min(1,f)),we(t,e,n+f*i,o+f*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 Zs(t,e){let n=1/0;for(let o of t)for(let r=0;r<e.length-1;r++){let s=Cn(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),f=Math.floor(l.z/e),d=u+","+f;n.set(d,(n.get(d)||0)+1),u<o&&(o=u),u>r&&(r=u),f<s&&(s=f),f>i&&(i=f)}return{cells:n,minX:o,maxX:r,minZ:s,maxZ:i}}function Gs(t,e){let n=new Set,o=1/0,r=-1/0,s=1/0,i=-1/0,l=(u,f)=>{let d=u+","+f;n.add(d),u<o&&(o=u),u>r&&(r=u),f<s&&(s=f),f>i&&(i=f)};for(let u of t){let f=u.x1,d=u.z1,c=u.x2,a=u.z2,h=Math.floor(f/e),g=Math.floor(d/e),y=Math.floor(c/e),w=Math.floor(a/e),m=Math.abs(y-h),p=Math.abs(w-g),x=h<y?1:-1,b=g<w?1:-1,z=m-p,M=Math.max(m,p)*2+5,P=0;for(;P++<M&&(l(h,g),!(h===y&&g===w));){let E=2*z;E>-p&&(z-=p,h+=x),E<m&&(z+=m,g+=b)}}return{active:n,minX:o,maxX:r,minZ:s,maxZ:i}}function Hn(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 f=-1;f<=1;f++)for(let d=-1;d<=1;d++)f===0&&d===0||r.add(l+f+","+(u+d))}let s=new Set(r);for(let i of r){let[l,u]=i.split(",").map(Number),f=!0;for(let d=-1;d<=1;d++){for(let c=-1;c<=1;c++)if(!r.has(l+d+","+(u+c))){f=!1;break}if(!f)break}f||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 f=-1;f<=1;f++)for(let d=-1;d<=1;d++){if(f===0&&d===0)continue;let c=l+f+","+(u+d);t.has(c)&&!n.has(c)&&(n.add(c),s.push(c))}}r.size>=4&&e.push(r)}return e}function tr(t,e){if(t.size<3)return[];let n=new Set,o=(g,y)=>t.has(g+","+y);for(let g of t){let[y,w]=g.split(",").map(Number);(!o(y+1,w)||!o(y-1,w)||!o(y,w+1)||!o(y,w-1))&&n.add(g)}if(n.size<3)return[];let r="",s=1/0,i=1/0;for(let g of n){let[y,w]=g.split(",").map(Number);(w<s||w===s&&y<i)&&(s=w,i=y,r=g)}if(!r)return[];let l=[[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1]],u=[],[f,d]=r.split(",").map(Number),c=0,a=new Set,h=n.size*8;for(let g=0;g<h;g++){let w=f+","+d+"|"+c;if(a.has(w))break;a.add(w),u.push({x:(f+.5)*e,z:(d+.5)*e});let m=(c+3)%8,p=!1;for(let x=0;x<8;x++){let b=(m+x)%8,z=f+l[b][0],M=d+l[b][1];if(n.has(z+","+M)){c=(b+4)%8,f=z,d=M,p=!0;break}}if(!p||f+","+d===r&&u.length>2)break}return u}function Wn(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=Cn(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=Wn(t.slice(0,o+1),e),l=Wn(t.slice(o),e);return[...i.slice(0,-1),...l]}return[r,s]}var er={cellSize:.1,densityThreshold:1,minComponentCells:20,simplifyEpsilon:.01,heightMin:.3,heightMax:2.8,closeIterations:5,sparseRadius:.3,sparseMinNeighbors:5,lineDensityMin:0,lineDensityMinLen:1,densityRatio:.12};function mn(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,f=0,d=0;for(let m of t){let p=m.x,x=m.z;n+=p,o+=x,r+=p*p,s+=x*x,i+=p*x,l+=p*p*p,u+=x*x*x,f+=p*p*x,d+=p*x*x}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+d)-n*(r+s))/c,h=(e*(f+u)-o*(r+s))/c,g=Math.sqrt(Math.abs((r+s-2*a*n-2*h*o)/e+a*a+h*h)),y=0;for(let m of t){let x=Math.hypot(m.x-a,m.z-h)-g;y+=x*x}let w=Math.sqrt(y/e);return{cx:a,cz:h,r:g,rmsResidual:w}}function Nl(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 b of t)n+=b.x,o+=b.z;n/=e,o/=e;let r=0,s=0,i=0;for(let b of t){let z=b.x-n,M=b.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),f=Math.sqrt(u),d=(l+f)/2,c=(l-f)/2,a=Math.sqrt(d),h=Math.sqrt(c),g=h,y=1,w=0,m=0,p=1;if(Math.abs(i)>1e-12||Math.abs(r-s)>1e-12){let b=i,z=d-r,M=Math.sqrt(b*b+z*z);M>1e-12&&(y=b/M,w=z/M);let P=i,E=c-r,S=Math.sqrt(P*P+E*E);S>1e-12&&(m=P/S,p=E/S)}let x=d>1e-10?c/d:0;return{eigenRatio:x,isLinear:x<.05,spread:g,mx:n,mz:o,v1x:y,v1z:w,v2x:m,v2z:p,s1:a,s2:h}}function Ys(t,e,n){if(t.length<6)return{type:"straight",eigenRatio:.5,spread:0,cloudUsed:t.length,mx:0,mz:0,v1x:1,v1z:0,v2x:0,v2z:1,s1:0,s2:0};let{eigenRatio:o,isLinear:r,spread:s,mx:i,mz:l,v1x:u,v1z:f,v2x:d,v2z:c,s1:a,s2:h}=Nl(t),g=0;for(let b=1;b<t.length;b++){let z=t[b].x-t[b-1].x,M=t[b].z-t[b-1].z;g+=Math.sqrt(z*z+M*M)}let y=ql(t),w=mn(y);if(w.r>.1&&w.r<Math.max(g*5,2)&&w.rmsResidual<.07)return{type:"curved",eigenRatio:o,spread:s,cloudUsed:t.length,mx:i,mz:l,v1x:u,v1z:f,v2x:d,v2z:c,s1:a,s2:h};let p=g>.01?s/g:1;return{type:r&&(s<.05||p<.1)?"straight":"curved",eigenRatio:o,spread:s,cloudUsed:t.length,mx:i,mz:l,v1x:u,v1z:f,v2x:d,v2z:c,s1:a,s2:h}}function ql(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 jl(t,e,n=1.57){if(e<10)return[];let o=[];for(let y=0;y<e;y++){let w=(y+1)%e;o.push(Math.atan2(t[w].z-t[y].z,t[w].x-t[y].x))}let r=[o[0]];for(let y=1;y<e;y++){let w=o[y]-o[y-1];w>Math.PI?w-=2*Math.PI:w<-Math.PI&&(w+=2*Math.PI),r.push(r[y-1]+w)}let s=0;{let y=o[0]-o[e-1];y>Math.PI?y-=2*Math.PI:y<-Math.PI&&(y+=2*Math.PI),s=y}Math.abs(s)<.1;let i=[],l=5;for(let y=0;y<e;y++){let w=0;for(let m=-l;m<=l;m++)w+=r[(y+m+e)%e];i.push(w/(l*2+1))}let u=5,f=[];for(let y=0;y<e;y++){let w=i[(y+u)%e]-i[y];w>Math.PI?w-=2*Math.PI:w<-Math.PI&&(w+=2*Math.PI),f.push(w)}let d=10,c=.003,a=10,h=.05,g=[];for(let y=0;y<e;y++){let w=y,m=y,p=0,x=0,b=y,z=e+10;for(;z-- >0;){let P=f[b],E=Math.abs(P),S=P>0?1:P<0?-1:0;if(E<c){b=(b+1)%e;continue}if(x===0){x=S,p=E,m=b,b=(b+1)%e;continue}if(S!==x){let I=E,H=S,D=(b+1)%e,T=1;for(let R=0;R<a&&T<a*2;R++){let v=f[D],W=Math.abs(v);if(W<c){D=(D+1)%e;continue}(v>0?1:-1)===H?I+=W:(I-=W,I<0&&(H=-H,I=-I)),D=(D+1)%e,T++}if(H===x&&I>h){b=(b+1)%e;continue}break}if(p+=E,m=b,b=(b+1)%e,b===y)break}if((m>w?m-w+1:e-w+m+1)>=d&&p>=n){let P=w,E=(w+u)%e,S=(m-u+e)%e,I=m,H=t[P],D=t[E],T=t[S],R=t[I],v=Math.atan2(D.z-H.z,D.x-H.x),V=Math.atan2(R.z-T.z,R.x-T.x)-v;V>Math.PI?V-=2*Math.PI:V<-Math.PI&&(V+=2*Math.PI);let C=Math.abs(V);if(!g.some(A=>{function B(L,O,$){return L<=O?$>=L&&$<=O:$>=L||$<=O}let k=0,F=0;for(let L=w;F++,B(A.start,A.end,L)&&k++,L!==m;L=(L+1)%e);return F>0&&k/F>.7})){let A=g.findIndex(B=>{function k(O,$,G){return O<=$?G>=O&&G<=$:G>=O||G<=$}let F=0,L=0;for(let O=B.start;L++,k(w,m,O)&&F++,O!==B.end;O=(O+1)%e);return L>0&&F/L>.7});A>=0?p>g[A].cumAngle&&(g[A]={start:w,end:m,cumAngle:p,actualAngle:C}):g.push({start:w,end:m,cumAngle:p,actualAngle:C})}}}return g}function $l(t,e){let s=new Array(e).fill(!1);for(let f=0;f<e;f++){let d=t[f],c=t[(f+15)%e],a=t[(f+30)%e],h=Math.atan2(c.z-d.z,c.x-d.x),g=Math.atan2(a.z-c.z,a.x-c.x),y=Math.abs(g-h);y>Math.PI&&(y=2*Math.PI-y),y>.07&&(s[(f+15)%e]=!0)}let i=new Set,l=[],u=-1;for(let f=0;f<e*2;f++){let d=f%e;if(s[d])u<0&&(u=d);else if(u>=0){let c=(d-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 f=l[0],d=l[l.length-1];d.end>e-3&&f.start<3&&(l[0]={start:d.start,end:f.end},l.pop())}return l}function Xl(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 b=a;b<=h;b++)g.push(t[b]);if(g.length<c-1)continue;let{cx:y,cz:w,r:m,rmsResidual:p}=mn(g);if(m<.1||p>o||m<s)continue;let x=0;for(let b=1;b<g.length;b++){let z=g[b-1].x-y,M=g[b-1].z-w,P=g[b].x-y,E=g[b].z-w;x+=Math.abs(Math.atan2(z*E-M*P,z*P+M*E))}if(!(x<r))for(let b=a;b<=h;b++)u[b]++}let f=[],d=-1;for(let c=0;c<e*2;c++){let a=c%e;if(u[a]>=2)d<0&&(d=a);else if(d>=0){let h=(a-1+e)%e,g=0;for(let y=d;g++,y!==h;y=(y+1)%e);g>=l&&f.push({start:d,end:h}),d=-1}}if(f.length>1){let c=f[0],a=f[f.length-1];a.end>e-3&&c.start<3&&(f[0]={start:a.start,end:c.end},f.pop())}return f}function Zl(t,e,n){function o(h,g){return h<=g?g-h+1:n-h+(g+1)}function r(h,g,y){return h<=g?y>=h&&y<=g:y>=h||y<=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,f=s<=i?e.start:t.start,d=s<=i?e.end:t.end,c=0;for(let h=l;r(f,d,h)&&c++,h!==u;h=(h+1)%n);let a=s+i-c;return a>0?c/a:0}function Gl(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 f=l+1;f<t.length;f++){let d=t[f],c=u.bx-u.ax,a=u.bz-u.az,h=d.bx-d.ax,g=d.bz-d.az,y=Math.sqrt(c*c+a*a),w=Math.sqrt(h*h+g*g);if(y<.01||w<.01)continue;let m=Math.abs(Math.atan2(c*g-a*h,c*h+a*g));if(m<o||m>r)continue;let p=[{x:u.ax,z:u.az},{x:u.bx,z:u.bz}],x=[{x:d.ax,z:d.az},{x:d.bx,z:d.bz}];for(let b of p)for(let z of x){let M=b.x-z.x,P=b.z-z.z;Math.sqrt(M*M+P*P)<n&&e.push({x:(b.x+z.x)/2,z:(b.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,f=e[l].z,d=1;i[l]=!0;for(let c=l+1;c<e.length;c++){if(i[c])continue;let a=e[c].x-u/d,h=e[c].z-f/d;Math.sqrt(a*a+h*h)<.3&&(u+=e[c].x,f+=e[c].z,d++,i[c]=!0)}s.push({x:u/d,z:f/d})}return s}function Us(t,e){if(t.length<6)return[];let n={minCurveAngle:.05,minCurvePoints:5,smoothWindow:3,...e},o=t.length,r=[];for(let T=0;T<o;T++){let R=t[(T-1+o)%o],v=t[T],W=t[(T+1)%o],V=v.x-R.x,C=v.z-R.z,_=W.x-v.x,A=W.z-v.z,B=Math.sqrt(V*V+C*C),k=Math.sqrt(_*_+A*A);if(B<.001||k<.001){r.push(0);continue}r.push(Math.atan2((V*A-C*_)/(B*k),(V*_+C*A)/(B*k)))}let s=[],i=n.smoothWindow;for(let T=0;T<o;T++){let R=0;for(let v=-i;v<=i;v++)R+=r[(T+v+o)%o];s.push(R/(i*2+1))}let l=.008,u=[],f=-1,d=0,c=new Set;for(let T=0;T<o*2;T++){let R=T%o,v=s[R],W=v>=0?1:-1;if(Math.abs(v)>l&&(d===0||d===W))f<0&&(f=R,d=W);else if(f>=0){let V=(R-1+o)%o,C=0,_=0;for(let A=f;C+=Math.abs(s[A]),_++,A!==V;A=(A+1)%o);if(_>=n.minCurvePoints&&C>n.minCurveAngle){let A=`${f},${V}`;c.has(A)||(c.add(A),u.push({start:f,end:V,sign:d}))}f=-1,d=0}}if(u.length>1){let T=u[0],R=u[u.length-1];T.sign===R.sign&&R.end>o-3&&T.start<3&&(u[0]={start:R.start,end:T.end,sign:T.sign},u.pop())}{let T=s.filter(V=>Math.abs(V)>.001).map(V=>Math.abs(V)),R=T.length>0?Math.max(...T):0,v=T.length>0?T.reduce((V,C)=>V+C,0)/T.length:0,W=u.reduce((V,C)=>{let _=0;for(let A=C.start;_++,A!==C.end;A=(A+1)%o);return V+_},0)}let a=$l(t,o),h=Xl(t,o),g=[...u,...a.map(T=>({start:T.start,end:T.end,sign:1})),...h.map(T=>({start:T.start,end:T.end,sign:1}))],y=u.length,m=g.map((T,R)=>{let v=[];for(let G=T.start;v.push({...t[G]}),G!==T.end;G=(G+1)%o);let W=0;for(let G=1;G<v.length;G++)s[(T.start+G-1)%o]*s[(T.start+G)%o]<-1e-8&&W++;let{cx:V,cz:C,r:_,rmsResidual:A}=mn(v),B=0,k=0;for(let G=1;G<v.length;G++){let Q=v[G-1].x-V,j=v[G-1].z-C,Z=v[G].x-V,Y=v[G].z-C,it=Math.atan2(Q*Y-j*Z,Q*Z+j*Y);B+=Math.abs(it),k+=it}let F=Se(v),L=W===0?.12:.08;if(_>.1&&A>L||_>.1&&_>Math.max(F*15,8)||Math.abs(k)<.05)return null;let O=R<y?"turning":"sliding",$=O!=="turning"?Math.abs(k)>.35?"C_curve":"S_curve":W>0?"S_curve":"C_curve";return{seg:{points:v,type:$,radius:_,centerX:V,centerZ:C,arcAngle:B,arcLength:F},start:T.start,end:T.end,source:O}}).filter(T=>T!==null),p=new Set;function x(T,R){return T<=R?R-T+1:o-T+(R+1)}function b(T,R,v,W){for(let V=T;;V=(V+1)%o){let C;if(v<=W?C=V>=v&&V<=W:C=V>=v||V<=W,!C)return!1;if(V===R)break}return!0}for(let T=0;T<m.length;T++)if(!p.has(T))for(let R=T+1;R<m.length;R++){if(p.has(R))continue;if(Zl({start:m[T].start,end:m[T].end},{start:m[R].start,end:m[R].end},o)>.6){let V=(m[T].seg.arcAngle>=m[R].seg.arcAngle?T:R)===T?R:T;if(m[T].seg.arcAngle>=m[R].seg.arcAngle)p.add(R);else{p.add(T);break}}else{let W=x(m[T].start,m[T].end),V=x(m[R].start,m[R].end),C=W<=V?T:R,_=W<=V?R:T;b(m[C].start,m[C].end,m[_].start,m[_].end)&&x(m[C].start,m[C].end)/x(m[_].start,m[_].end)<.7&&p.add(C)}}let z=m.filter((T,R)=>!p.has(R)),M=10,P=10,E=30,S=15,I=[],H=0;if(z.length>0){for(let v of z)v.start=(v.start-S+o)%o,v.end=(v.end+S)%o;let T=[...z].sort((v,W)=>v.start-W.start),R=T[0];for(let v=1;v<T.length;v++){let W=T[v],V=W.start-R.end;V<0&&(R.end>o*.5&&W.start<o*.5?V=W.start+o-R.end:V=0);let C=V===0,_=V<=E&&C;if(!_&&V<=E){let A=Math.sqrt((R.seg.centerX-W.seg.centerX)**2+(R.seg.centerZ-W.seg.centerZ)**2),B=Math.max(R.seg.radius,W.seg.radius),k=Math.min(R.seg.radius,W.seg.radius),F=k>0?B/k:99;_=A<P&&F<M}if(_){let A=Math.min(R.start,W.start),B=Math.max(R.end,W.end),k=[];for(let G=A;k.push({...t[G]}),G!==B;G=(G+1)%o);let{cx:F,cz:L,r:O}=mn(k),$=0;for(let G=1;G<k.length;G++){let Q=k[G-1].x-F,j=k[G-1].z-L,Z=k[G].x-F,Y=k[G].z-L;$+=Math.abs(Math.atan2(Q*Y-j*Z,Q*Z+j*Y))}R={seg:{points:k,type:"C_curve",radius:O,centerX:F,centerZ:L,arcAngle:$,arcLength:Se(k)},start:R.start,end:W.end,source:R.source},H++}else I.push(R),R=W}I.push(R)}{if(I.length>1){let R=I.map((v,W)=>{if(W===0)return 0;let V=v.start-I[W-1].end;return V<0&&(V=v.start+o-I[W-1].end),V})}let T=[];for(let R=0;R<I.length;R++){if(T.length===0){T.push(I[R]);continue}let v=T[T.length-1],W=I[R].start-v.end;if(W<0&&(W=I[R].start+o-v.end),W<=30){let V=[...v.seg.points];for(let k=(v.end+1)%o;V.push({...t[k]}),k!==I[R].end;k=(k+1)%o);let{cx:C,cz:_,r:A}=mn(V),B=0;for(let k=1;k<V.length;k++){let F=V[k-1].x-C,L=V[k-1].z-_,O=V[k].x-C,$=V[k].z-_;B+=Math.abs(Math.atan2(F*$-L*O,F*O+L*$))}T[T.length-1]={seg:{points:V,type:"C_curve",radius:A,centerX:C,centerZ:_,arcAngle:B,arcLength:Se(V)},start:v.start,end:I[R].end,source:v.source}}else T.push(I[R])}I=T}return I.map((T,R)=>{let v=T.seg;return v.candidateId=R,v})}function Yl(t){let e=t.length;if(e<6)return null;let n=jl(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:f}=mn(s);if(u>.1&&f>.1)return null;let d=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&&d>.17?{points:s,type:"C_curve",radius:u,centerX:i,centerZ:l,arcAngle:d,arcLength:c}:null}function ho(t,e,n){let o={...er,...n},r=Date.now(),s=t,i=Array.isArray(e)?e:[],l=[];if(i.length>10)try{for(let T of i){let R=T.x1,v=T.z1,W=T.x2,V=T.z2;if(R==null||v==null||W==null||V==null){let C=T.start?.x,_=T.start?.y,A=T.end?.x,B=T.end?.y;if(C==null||_==null||A==null||B==null)continue;l.push({ax:C,az:_,bx:A,bz:B})}else l.push({ax:R,az:v,bx:W,bz:V})}let D=.1*.1;if(l.length>5){let T=[],R=[],v=new Array(l.length).fill(0);for(let V of t){let C=1/0,_=-1;for(let A=0;A<l.length;A++){let B=l[A],k=B.bx-B.ax,F=B.bz-B.az,L=k*k+F*F,O;if(L<1e-8)O=(V.x-B.ax)**2+(V.y-B.az)**2;else{let $=((V.x-B.ax)*k+(V.y-B.az)*F)/L;$=Math.max(0,Math.min(1,$));let G=B.ax+$*k,Q=B.az+$*F;O=(V.x-G)**2+(V.y-Q)**2}if(O<C&&(C=O,_=A),C<=D)break}C<=D&&(R.push(V),T.push(_),v[_]++)}let W=R;if(o.lineDensityMin>0&&o.lineDensityMinLen>0){let V=new Set;for(let C=0;C<l.length;C++){let _=l[C],A=Math.hypot(_.bx-_.ax,_.bz-_.az);if(A>=o.lineDensityMinLen)continue;(A>.01?v[C]/A:0)<o.lineDensityMin&&V.add(C)}if(V.size>0){let C=[];for(let _=0;_<R.length;_++)V.has(T[_])||C.push(R[_]);W=C}}s=W}}catch(D){console.warn("[\u70B9\u4E91\u8F6E\u5ED3] \u7EBF\u6BB5\u8FC7\u6EE4\u5931\u8D25:",D)}let u=Gl(l),f=[];for(let D of s){let T=D.z;T<o.heightMin||T>o.heightMax||f.push({x:D.x,z:D.y})}if(f.length<50)return tn(e,r);if(o.sparseRadius>0){let D=new Map,T=o.cellSize;for(let V of f){let C=`${Math.round(V.x/T)},${Math.round(V.z/T)}`;D.has(C)||D.set(C,[]),D.get(C).push(V)}let R=[],v=Math.ceil(o.sparseRadius/T);for(let V=-v;V<=v;V++)for(let C=-v;C<=v;C++)R.push(`${V},${C}`);let W=[];for(let V of f){let C=Math.round(V.x/T),_=Math.round(V.z/T),A=0;for(let B of R){let[k,F]=B.split(",").map(Number),L=D.get(`${C+k},${_+F}`);if(L&&(A+=L.length),A>=o.sparseMinNeighbors)break}A>=o.sparseMinNeighbors&&W.push(V)}f.length=0;for(let V=0;V<W.length;V++)f.push(W[V])}if(f.length<50)return tn(e,r);let d=Date.now(),{cells:c}=fo(f,o.cellSize),a=new Set;if(o.densityRatio>0&&c.size>10){let D=Array.from(c.values()).sort((v,W)=>v-W),T=D[Math.floor(D.length/2)],R=Math.max(o.densityThreshold,Math.ceil(T*o.densityRatio));for(let[v,W]of c)W>=R&&a.add(v);if(a.size<o.minComponentCells){a.clear();for(let[v,W]of c)W>=o.densityThreshold&&a.add(v)}}else for(let[D,T]of c)T>=o.densityThreshold&&a.add(D);if(a.size<o.minComponentCells)return tn(e,r);let h=a;o.closeIterations>0&&(h=Hn(a,o.closeIterations));let g=Date.now(),y=Jo(h).filter(D=>D.size>=o.minComponentCells);y.sort((D,T)=>T.size-D.size);let w=20;y.length>w&&(y=y.slice(0,w));let m=Date.now(),p=[];for(let D of y){let T=tr(D,o.cellSize);T.length>=4&&p.push(T)}let x=Date.now(),b=p.map(D=>{let T=Wn(D,o.simplifyEpsilon);if(T.length>=7)for(let R=0;R<2;R++){let v=T.length,W=T.map(V=>({x:V.x,z:V.z}));for(let V=0;V<v;V++){let C=T[(V-1+v)%v],_=T[V],A=T[(V+1)%v],B=_.x-C.x,k=_.z-C.z,F=A.x-_.x,L=A.z-_.z,O=Math.sqrt(B*B+k*k),$=Math.sqrt(F*F+L*L);if(O<.001||$<.001)continue;if(Math.abs(Math.atan2(B*L-k*F,B*F+k*L))>1.8){let Q=[-2,-1,0,1,2].map(Y=>T[(V+Y+v)%v]),j=Q.map(Y=>Y.x).sort((Y,it)=>Y-it),Z=Q.map(Y=>Y.z).sort((Y,it)=>Y-it);W[V]={x:j[2],z:Z[2]}}}T=W}if(T=Qo(T),u.length>0&&T.length>=5)for(let R of u){let v=1/0,W=-1;for(let V=0;V<T.length;V++){let C=T[V].x-R.x,_=T[V].z-R.z,A=C*C+_*_;A<v&&(v=A,W=V)}W>=0&&v<.3*.3&&(T[W]={x:R.x,z:R.z})}if(T.length>2){let R=T[0],v=T[T.length-1];(Math.abs(R.x-v.x)>.001||Math.abs(R.z-v.z)>.001)&&T.push({...R})}return T}),z=o.cellSize/2;function M(D){let T=0;for(let R=0;R<D.length;R++){let v=(R+1)%D.length;T+=D[R].x*D[v].z-D[v].x*D[R].z}return T/2}let P=b.map(D=>{if(D.length<3)return D;let T=M(D)>=0;return D.map((R,v)=>{let W=D[(v-1+D.length)%D.length],V=D[(v+1)%D.length],C=V.x-W.x,_=V.z-W.z;if(Math.sqrt(C*C+_*_)<.001)return{...R};let B=T?_:-_,k=T?-C:C,F=Math.sqrt(B*B+k*k);return F<.001?{...R}:{x:R.x+B/F*z,z:R.z+k/F*z}})}),E=Date.now(),S=[];for(let D=0;D<P.length;D++){let T=P[D];T.length<3||S.push({id:-D-1,points:T,length:Se(T),pointCount:T.length,type:"straight",isMain:!1})}let I=Date.now()-r,H=[];for(let D of b){let T=Us(D);for(let v of T)H.push(v);let R=Yl(D);R&&H.push(R)}return{mainWalls:[],noiseWalls:[],contours:S,curvedSegments:H,filteredPoints:s,stats:{totalRawLines:e?.length??t.length,totalWalls:0,mainCount:0,noiseCount:S.length,elapsedMs:I}}}function Ks(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 tn(t,i);let l=t.map(S=>({x1:S.x1,z1:S.z1,x2:S.x2,z2:S.z2})),{active:u}=Gs(l,n);if(u.size<r)return tn(t,i);let f=Date.now(),d=Hn(u,o),c=Date.now(),a=Jo(d).filter(S=>S.size>=r);if(a.length===0)return tn(t,i);let h=a.reduce((S,I)=>S.size>=I.size?S:I),g=Date.now(),y=tr(h,n);if(y.length<4)return tn(t,i);let w=Date.now(),m=Wn(y,s);if(m=Qo(m),m.length>2){let S=m[0],I=m[m.length-1];(Math.abs(S.x-I.x)>.001||Math.abs(S.z-I.z)>.001)&&m.push({...S})}let p=n/2;function x(S){let I=0;for(let H=0;H<S.length;H++){let D=(H+1)%S.length;I+=S[H].x*S[D].z-S[D].x*S[H].z}return I/2}let b=x(m)>=0,z=m.map((S,I)=>{let H=m[(I-1+m.length)%m.length],D=m[(I+1)%m.length],T=D.x-H.x,R=D.z-H.z;if(Math.sqrt(T*T+R*R)<.001)return{...S};let W=b?R:-R,V=b?-T:T,C=Math.sqrt(W*W+V*V);return C<.001?{...S}:{x:S.x+W/C*p,z:S.z+V/C*p}}),M=Date.now(),P=[];z.length>=3&&P.push({id:-1,points:z,length:Se(z),pointCount:z.length,type:"straight",isMain:!0});let E=Date.now()-i;return{mainWalls:[],noiseWalls:[],contours:P,stats:{totalRawLines:t.length,totalWalls:0,mainCount:0,noiseCount:P.length,elapsedMs:E}}}function tn(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),f=Math.floor(l.y/e),d=`${u},${f}`;o.has(d)||o.set(d,[]),o.get(d).push(l)}let r=new Map;for(let[l,u]of o){let[f,d]=l.split(","),c=parseInt(f),a=parseInt(d),h=0;for(let g=-2;g<=2;g++)for(let y=-2;y<=2;y++){let w=`${c+g},${a+y}`;h+=o.get(w)?.length??0}r.set(l,h)}let s=[],i=0;for(let l of t){let u=Math.floor(l.x/e),f=Math.floor(l.y/e),d=`${u},${f}`;(r.get(d)??0)>=n?s.push(l):i++}return s}function po(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),f=`${i},${l},${u}`;o.has(f)||o.set(f,[]),o.get(f).push(s)}let r=[];for(let s of o.values())if(s.length>=n){let i=s.reduce((f,d)=>f+d.x,0)/s.length,l=s.reduce((f,d)=>f+d.y,0)/s.length,u=s.reduce((f,d)=>f+d.z,0)/s.length;r.push({x:i,y:l,z:u})}return r}function Qs(t,e,n){let o=po(t,e,n),r=t.length-o.length;return o}function Js(t){let e=[];for(let f of t){let d=f.originalPoints??f.points??[];if(!Array.isArray(d)||d.length<2)continue;let c=Math.min(d.length,200);for(let a=1;a<c;a++){let h=Math.hypot(d[a].x-d[a-1].x,d[a].y-d[a-1].y,d[a].z-d[a-1].z);h>.001&&e.push(h)}}let n={voxelSize:.08,minPoints:3,minCentroids:3};if(e.length<10)return n;e.sort((f,d)=>f-d);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 f=t[u],d=f.originalPoints??f.points??[];if(!Array.isArray(d)||d.length===0){s.push(f),i.push(e[u]);continue}let c=po(d,n,o);c.length>=r?(f.originalPoints&&(f.originalPoints=c),f.points&&(f.points=c),s.push(f),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],f=u.originalPoints??u.points??[],c=(Array.isArray(f)?f.filter(w=>w&&w.x!==void 0&&w.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 en(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 f=((t-n)*i+(e-o)*l)/u;return f=Math.max(0,Math.min(1,f)),Math.hypot(t-(n+f*i),e-(o+f*l))}function nr(t,e,n=.2){for(let o of e)if(en(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=en(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(x,b,z,M){let P=z.points[0],E=z.points[z.points.length-1];return Math.hypot(x-P.x,b-P.z)<=M||Math.hypot(x-E.x,b-E.z)<=M}function y(x,b,z,M){for(let P=0;P<z.points.length-1;P++)if(en(x,b,z.points[P].x,z.points[P].z,z.points[P+1].x,z.points[P+1].z)<=M)return!0;return!1}function w(x,b,z){let M=0,P=x[0],E=x[x.length-1];for(let S of b)if(g(P.x,P.z,S,z)||y(P.x,P.z,S,z)){M++;break}for(let S of b)if(g(E.x,E.z,S,z)||y(E.x,E.z,S,z)){M++;break}return M}function m(x){if(x.length<2)return 0;if(x.length<=30){let P=0;for(let E=0;E<x.length;E++)for(let S=E+1;S<x.length;S++){let I=Math.hypot(x[E].x-x[S].x,x[E].z-x[S].z);I>P&&(P=I)}return P}let b=Math.max(1,Math.floor(x.length/15)),z=[];for(let P=0;P<x.length;P+=b)z.push(x[P]);z[z.length-1]!==x[x.length-1]&&z.push(x[x.length-1]);let M=0;for(let P=0;P<z.length;P++)for(let E=P+1;E<z.length;E++){let S=Math.hypot(z[P].x-z[E].x,z[P].z-z[E].z);S>M&&(M=S)}return M}let p=[];for(let x of t){let b=x.points,z=b.length>=2?m(b):0,M=x.candidateId!==void 0?`#${x.candidateId}`:"#?";if(o&&console.log(`[\u5F27\u6BB5\u5206\u6790] ${M} r=${x.radius.toFixed(3)}m \u5F27\u89D2=${(x.arcAngle*180/Math.PI).toFixed(1)}\xB0 \u5F26\u957F=${z.toFixed(3)}m pts=${b.length}`),x.radius<.2){o&&console.log(` \u2192 \u534A\u5F84<${.2}m \u8FC7\u6EE4`);continue}if(b.length<3){o&&console.log(" \u2192 \u70B9\u6570<3 \u8FC7\u6EE4");continue}let P=z/x.radius,E=z/2,S=0;E<=x.radius?S=x.radius-Math.sqrt(x.radius*x.radius-E*E):S=z;let I=z>.01?S/z:0,H=w(b,e,.8),D=x.arcAngle>1.745&&x.radius<5,T=x.radius>15&&P>.15&&b.length>=10,R=P>.12&&x.radius>1&&x.radius<4&&x.arcAngle>=.35&&b.length>=3;if(o&&console.log(` \u7279\u5F81: \u5F26\u957F/\u534A\u5F84=${P.toFixed(3)} \u5F13\u9AD8/\u5F26\u957F=${I.toFixed(4)} \u8FDE\u63A5=${H}/2${D?" \u5927\u5F27\u89D2\u8C41\u514D":""}${T?" \u5927\u534A\u5F84\u7ED3\u6784\u5F27":""}${R?" \u5408\u7406\u77ED\u5F27\u8C41\u514D":""}`),b.length>20&&x.arcAngle>5.2&&x.radius>.2){o&&console.log(` \u2192 \u8FD1\u95ED\u5408\u5706\u8C41\u514D(\u5F27\u89D2=${(x.arcAngle*180/Math.PI).toFixed(1)}\xB0, ${b.length}pts)`),p.push(x);continue}if(P<.15)if(H>=2&&x.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 v=H>=2?.025:.035;if(I<v&&!D&&!R&&!T){o&&console.log(` \u2192 \u5F13\u9AD8/\u5F26\u957F=${I.toFixed(4)} < ${v}(${H>=2?"\u5BBD\u677E":"\u6807\u51C6"})\uFF0C\u6781\u6241\u5F27(\u76F4\u7EBF\u6BB5\u566A\u58F0) \u8FC7\u6EE4`);continue}if(!D&&!R&&!T){if(x.arcAngle<.17){o&&console.log(` \u2192 \u5F27\u89D2<${(.17*180/Math.PI).toFixed(0)}\xB0 \u8FC7\u6EE4`);continue}if(x.arcAngle<.35&&H<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(!D&&!T){let W=H>=2?2.5:1.5,V=Math.floor(b.length/2),C=b[V].x-b[0].x,_=b[V].z-b[0].z,A=b[b.length-1].x-b[V].x,B=b[b.length-1].z-b[V].z,k=Math.atan2(_,C),F=Math.atan2(B,A),L=Math.abs(F-k);if(L>Math.PI&&(L=2*Math.PI-L),L>60*Math.PI/180&&L>x.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)}=${(x.arcAngle*180/Math.PI*W).toFixed(1)}\xB0`);continue}}if(n&&n.length>5&&!(x.radius>15&&x.arcAngle>.26)){let W=b[0],V=b[b.length-1],C=.3,_=null,A=1/0,B=null,k=1/0;for(let F of n){let L=en(W.x,W.z,F.x1,F.z1,F.x2,F.z2),O=en(V.x,V.z,F.x1,F.z1,F.x2,F.z2);L<C&&L<A&&(_=F,A=L),O<C&&O<k&&(B=F,k=O)}if(!_||!B)console.log(` [\u7EBF\u6BB5\u8F6C\u89D2\u8C03\u8BD5 #${M}] \u672A\u627E\u5230\u5B8C\u6574\u7EBF\u6BB5: \u8D77\u7AEF=${!!_}(d=${A.toFixed(3)}) \u672B\u7AEF=${!!B}(d=${k.toFixed(3)})`);else if(_===B){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 F=_.x2-_.x1,L=_.z2-_.z1,O=B.x2-B.x1,$=B.z2-B.z1,G=Math.sqrt(F*F+L*L),Q=Math.sqrt(O*O+$*$);if(G>.01&&Q>.01){let j=Math.abs(Math.atan2(F*$-L*O,F*O+L*$)),Z=j*180/Math.PI;if(console.log(` [\u7EBF\u6BB5\u8F6C\u89D2\u8C03\u8BD5 #${M}] \u5F27\u4E24\u7AEF\u6BB5\u5939\u89D2=${Z.toFixed(1)}\xB0 \u5F27\u89D2=${(x.arcAngle*180/Math.PI).toFixed(1)}\xB0`),j>.35&&j<3.05){let Y=j>2.09;if(!Y||x.arcAngle<.44){console.log(` \u2192 \u7EBF\u6BB5\u8F6C\u89D2\u9A8C\u8BC1: \u5F27\u4E24\u7AEF\u6BB5\u5939\u89D2=${Z.toFixed(1)}\xB0\uFF0C${Y?"\u659C\u5899":"\u6298\u5899"}\u78E8\u5706\u5047\u5F27 \u8FC7\u6EE4`);continue}}}}}o&&console.log(" \u2192 \u2713 \u4FDD\u7559"),p.push(x)}return o&&console.log(`[\u56DE\u52A0\u5224\u65AD] ${t.length} \u2192 ${p.length} \u4E2A\u5F27\u6BB5`),p}function ri(t,e){for(let n=0;n<t.length;n++){let o=t[n],r=[];for(let i of e)nr(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 rr={gridSize:2,connectDist:.8,angleTol:25,minLength:.8,minPointCount:3,hardCornerThreshold:30,minArea:5,minCurvePoints:6,curveStraightDist:.25,longWallMinLength:5};function si(t){if(!t.length)return{rotated:[],mainAngle:0};let e=180,n=new Array(e).fill(0),o=Math.PI/e;for(let d of t){let c=d.x2-d.x1,a=d.z2-d.z1,h=Math.sqrt(c*c+a*a);if(h<.01)continue;let g=Te(c,a),y=Math.floor(g/o);y>=e&&(y=e-1),n[y]+=h}let r=new Array(e).fill(0),s=5;for(let d=0;d<e;d++){let c=0;for(let a=-s;a<=s;a++){let h=d+a;h<0&&(h+=e),h>=e&&(h-=e),c+=n[h]}r[d]=c}let i=0,l=0;for(let d=0;d<e;d++)r[d]>i&&(i=r[d],l=d);let u=(l+.5)*o;return{rotated:t.map(d=>{let c=In(d.x1,d.z1,-u),a=In(d.x2,d.z2,-u);return{...d,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 f=!0;for(;f;){f=!1;let a=i[i.length-1],h=a.x2,g=a.z2,y=Te(a.x2-a.x1,a.z2-a.z1),w=null,m=e;for(let p of t){if(o.has(p.id))continue;let x=we(h,g,p.x1,p.z1),b=we(h,g,p.x2,p.z2),z=b<x,M=Math.min(x,b);if(M>m)continue;let P=z?Te(p.x1-p.x2,p.z1-p.z2):Te(p.x2-p.x1,p.z2-p.z1);Math.abs(Vn(P-y))>n||(w=p,m=M)}if(w){o.add(w.id),u.add(w.id);let p=i[i.length-1],x=we(p.x2,p.z2,w.x1,w.z1),b=we(p.x2,p.z2,w.x2,w.z2);x<=b?i.push(w):i.push({id:w.id,x1:w.x2,z1:w.z2,x2:w.x1,z2:w.z1}),f=!0}}for(f=!0;f;){f=!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,y=l.length>0?Te(a.x2-a.x1,a.z2-a.z1):Te(a.x2-a.x1,a.z2-a.z1),w=null,m=e;for(let p of t){if(o.has(p.id))continue;let x=we(h,g,p.x1,p.z1),b=we(h,g,p.x2,p.z2),z=b<x,M=Math.min(x,b);if(M>m)continue;let P=z?Te(p.x1-p.x2,p.z1-p.z2):Te(p.x2-p.x1,p.z2-p.z1);Math.abs(Vn(P-y))>n||(w=p,m=M)}if(w){o.add(w.id),u.add(w.id);let p=we(h,g,w.x1,w.z1),x=we(h,g,w.x2,w.z2);p<=x?l.push({id:w.id,x1:w.x2,z1:w.z2,x2:w.x1,z2:w.z1}):l.push({...w}),f=!0}}let d=[];for(let a=l.length-1;a>=0;a--){let h=l[a];a===l.length-1&&d.push({x:h.x1,z:h.z1}),d.push({x:h.x2,z:h.z2})}for(let a=0;a<i.length;a++){let h=i[a];a===0&&d.length===0&&d.push({x:h.x1,z:h.z1}),d.push({x:h.x2,z:h.z2})}let c=[];for(let a of d){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),f=Vn(u-l);e.push(f)}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 d=0;for(let c of t){let a=Cn(c.x,c.z,n.x,n.z,o.x,o.z);a>d&&(d=a)}if(d<.05)return"straight"}let l=li(t);if(l.reduce((d,c)=>d+Math.abs(c),0)<.1||t.length<e)return"straight";let f=0;for(let d=0;d<l.length-1;d++)l[d]*l[d+1]<0&&f++;return f>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),f=Se(l),d=f/(s.length||1),c=Math.max(1,Math.round(s.pointCount*d));o.push({id:r++,points:l,length:f,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(f,d){return Math.round(f/n)+"_"+Math.round(d/n)}let r=new Map,s=0;function i(f,d){let c=o(f,d),a=r.get(c);if(a)return a;let h=Math.round(f/n),g=Math.round(d/n),y=null,w=n*n;for(let m=-1;m<=1;m++)for(let p=-1;p<=1;p++){let x=h+m+"_"+(g+p),b=r.get(x);if(!b)continue;let z=b.x-f,M=b.z-d,P=z*z+M*M;P<w&&(w=P,y=b)}return y?(r.set(c,y),y):(a={id:s++,x:f,z:d,edges:[]},r.set(c,a),a)}for(let f of t){if(f.points.length<2)continue;let d=f.points[0],c=f.points[f.points.length-1],a=i(d.x,d.z),h=i(c.x,c.z);if(a.id===h.id)continue;let g={to:h,wallId:f.id,visited:!1,twin:null},y={to:a,wallId:f.id,visited:!1,twin:g};g.twin=y,a.edges.push(g),h.edges.push(y)}for(let f of r.values())f.edges.sort((d,c)=>{let a=Math.atan2(d.to.z-f.z,d.to.x-f.x),h=Math.atan2(c.to.z-f.z,c.to.x-f.x);return a-h});let l=new Set,u=new Set;for(let f of r.values())for(let d of f.edges)u.add(d);for(let f of u){if(f.visited)continue;let d=[],c=f,a=u.size+10;for(;!c.visited&&d.length<a;){c.visited=!0,d.push(c);let h=c.to,g=c.twin,y=h.edges.indexOf(g);if(y<0)break;let w=(y+1)%h.edges.length;c=h.edges[w]}if(d.length>=3){let h=d[0];if(d[d.length-1].to.id===h.from?.id){let y=[],w=new Set,m=null;for(let p of r.values())if(p.edges.includes(d[0])){m=p;break}if(!m)continue;y.push({x:m.x,z:m.z});for(let p of d)w.add(p.wallId),y.push({x:p.to.x,z:p.to.z});if(d[d.length-1].to.id===m.id&&Ko(y)>=e)for(let x of w)l.add(x)}}}return l}function pn(t,e){let n={...rr,...e},o=Date.now(),{rotated:r,mainAngle:s}=si(t),i=Date.now(),l=ii(r,n.gridSize),u=Date.now(),f=uo(n.angleTol),d=[];for(let D of l.values()){let T=D.map(v=>({id:v.id,x1:v.x1,z1:v.z1,x2:v.x2,z2:v.z2})),R=ai(T,n.connectDist,f);d.push(...R)}let c=Date.now(),a=new Set,h=d.filter(D=>{let T=D.length>=n.minLength||D.pointCount>=n.minPointCount;return T&&a.add(D),T}),g=d.filter(D=>!a.has(D)),y=Date.now(),w=fi(h,n.hardCornerThreshold,n.minCurvePoints),m=Date.now(),p=di(w,n.minArea);w.forEach(D=>{D.isMain=p.has(D.id),D.length>=n.longWallMinLength&&(D.isMain=!0)});let x=Date.now();function b(D,T,R=.1){let v=D[0],W=D[D.length-1],V=T[0],C=T[T.length-1];return Math.hypot(v.x-V.x,v.z-V.z)<R||Math.hypot(v.x-C.x,v.z-C.z)<R||Math.hypot(W.x-V.x,W.z-V.z)<R||Math.hypot(W.x-C.x,W.z-C.z)<R}let z=[],M=[];for(let D of w){if(D.type==="straight"&&D.points.length>=2){let T=!1;for(let R of w){if(R.id===D.id||R.type==="straight"||b(D.points,R.points))continue;if(Zs(D.points,R.points)<n.curveStraightDist){T=!0;break}}if(T){z.push({...D,id:-z.length-1});continue}}M.push(D)}let P=Date.now(),E=M,S=[];for(let D=0;D<g.length;D++){let T=g[D];S.push({id:-D-1,points:T.points,length:T.length,pointCount:T.pointCount,lineIds:T.lineIds,type:"straight",isMain:!1})}for(let D of z)S.push(D);let I=D=>D.map(T=>({...T,points:T.points.map(R=>In(R.x,R.z,s))})),H=Date.now()-o;return{mainWalls:I(E),noiseWalls:I(S),stats:{totalRawLines:t.length,totalWalls:w.length,mainCount:E.length,noiseCount:S.length,elapsedMs:H}}}function sr(t,e,n){let o={...er,...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 pn(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=Hn(l,o.morphIterations),f=[],d={total:0,lowDensity:0};for(let h of e){let g=h.x1,y=h.z1,w=h.x2,m=h.z2;if(Math.sqrt((w-g)**2+(m-y)**2)<.3){f.push(h);continue}let x=0,b=9;for(let z=0;z<b;z++){let M=z/(b-1),P=g+(w-g)*M,E=y+(m-y)*M,S=Math.floor(P/o.cellSize),I=Math.floor(E/o.cellSize);u.has(S+","+I)&&x++}x>=Math.ceil(b*.5)?f.push(h):d.lowDensity++,d.total++}if(f.length<5)return pn(e);let c=pn(f),a=Date.now()-r;return c}function or(t){return{id:t.id,points:[{x:t.x1,z:t.z1},{x:t.x2,z:t.z2}],length:Math.hypot(t.x2-t.x1,t.z2-t.z1),pointCount:1,type:"straight",isMain:!1}}function ir(t,e,n){let o={outlierEnabled:!0,outlierCellSize:.1,outlierMinNeighbors:3,densityFilterEnabled:!1,...n},r=Date.now(),s=pn(t),i=s.mainWalls,l=s.noiseWalls,u=new Set(i.map(M=>M.id)),f=[];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&&f.push({x:E.x,y:E.y,z:E.z})}let d=f.length,c=f;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 S=1/0,I=-1/0,H=1/0,D=-1/0;for(let v of E)v.x<S&&(S=v.x),v.x>I&&(I=v.x),v.z<H&&(H=v.z),v.z>D&&(D=v.z);let T=[];for(let v of t)ni(v,E,.2)&&T.push(v.id);let R=E.map(v=>({x:v.x,y:v.z,z:0}));g.push({id:M,originalPoints:R,rawLineIds:T})}let y;if(o.densityFilterEnabled&&c.length>0&&i.length>0){let M=new Set(s.mainWalls.map(S=>S.id)),P=t.filter(S=>M.has(S.id));y=sr(c,P).mainWalls}let w=new Set;for(let M of s.mainWalls)if(M.lineIds)for(let P of M.lineIds)w.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 p=t.filter(M=>w.has(M.id)).map(or),x=t.filter(M=>m.has(M.id)).map(or),b;if(y&&y.length>0){let M=new Set;for(let P of y)if(P.lineIds)for(let E of P.lineIds)M.add(E);b=t.filter(P=>M.has(P.id)).map(or)}let z=Date.now()-r;return{mainWalls:p,noiseWalls:x,contours:a,curvedSegments:h,lineCurves:g.length>0?g:void 0,filteredPoints:c,secondMainWalls:b,stats:{totalRawLines:t.length,firstMainCount:p.length,firstNoiseCount:x.length,contourCount:a.length,curvedCount:h.length,secondMainCount:y?.length,mainWallPointCount:d,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],f=u.start??u,d=u.end??u;o.push({id:l,x1:f.x??0,y1:f.z??0,z1:f.y??0,x2:d.x??0,y2:d.z??0,z2:d.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=ir(o,r,e),i=Array.isArray(t)?{data:t}:{...t};return i.lineCurves=s.lineCurves??[],i.lineCurveNum=s.curvedSegments?.length??0,i}export{rr as CONFIG,no as analyzeDoorQuad,Ze as analyzeQuad,po as applyVoxelFilter,lo as attachWindows,Je as calcAngle,qi as checkBeamIsReasonable,Ys as classifyWallByPointCloudPCA,pn as classifyWallShapes,Ka as computeContour,Ke as computeDoorLocalFloorZ,Ge as computeLocalFloorZ,Js as computeVoxelParams,ei as densityPreFilter,fn as detectDoorPerpendicularWalls,Ll as detectPerpWalls,Tn as detectPerpendicularWalls,Aa as drawStaircase,oi as filterFalseArcCurves,$s as filterWalls,Xs as filterWallsHard,vn as findDoorWalls,Fs as findMainByLoops,Rn as findWindowWalls,Ni as getBeamLine,Gi as getColLine,Pi as getLineCheckResults,dn as getMatcherAPI,Ba as getMergeFloorMeaning,La as getMergeMeaning,Ei as getOneLineCheckResults,Si as getOneLineClusterResults,ka as getStaircase,nr as isRawLineNearArc,ri as logArcRawSegments,Hl as matchWalls,js as mergeCollinear,Ye as mergeCollinearSegments,Qe as mergeDoorCollinearSegments,Al as mergeWallSegments,io as normalizeAngles,jt as pointToDoorSegmentDist,so as pointToSegDist,en as pointToSegDist2D,Ie as pointToSegmentDist,qo as processData,Go as processDoorData,sr as processFilteredByPointCloud,ho as processFromPointCloud,Ks as processFromSegments,Fl as processPipeline,hi as processSegments,_l as processWallData,mo as removeOutlierPoints,Ce as rotateXZ,ir as runMainWallPipeline,Ns as spatialGrid,Dn as splitDoorWallSegment,Bl as splitWallSeg,Sn as splitWallSegment,Hi as updateStEdPoint,Qs as voxelFilter,ti as voxelFilterLines};
|
|
1
|
+
var mi=Object.create;var ar=Object.defineProperty;var pi=Object.getOwnPropertyDescriptor;var gi=Object.getOwnPropertyNames;var xi=Object.getPrototypeOf,yi=Object.prototype.hasOwnProperty;var Oe=(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 gi(e))!yi.call(t,r)&&r!==n&&ar(t,r,{get:()=>e[r],enumerable:!(o=pi(e,r))||o.enumerable});return t};var wi=(t,e,n)=>(n=t!=null?mi(xi(t)):{},bi(e||!t||!t.__esModule?ar(n,"default",{value:t,enumerable:!0}):n,t));var _r=Oe((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(x,b,z,M,P){e(x,b,z||0,M||x.length-1,P||o)}function e(x,b,z,M,P){for(;M>z;){if(M-z>600){var E=M-z+1,S=b-z+1,I=Math.log(E),H=.5*Math.exp(2*I/3),D=.5*Math.sqrt(I*H*(E-H)/E)*(S-E/2<0?-1:1),T=Math.max(z,Math.floor(b-S*H/E+D)),R=Math.min(M,Math.floor(b+(E-S)*H/E+D));e(x,b,T,R,P)}var v=x[b],W=z,V=M;for(n(x,z,b),P(x[M],v)>0&&n(x,z,M);W<V;){for(n(x,W,V),W++,V--;P(x[W],v)<0;)W++;for(;P(x[V],v)>0;)V--}P(x[z],v)===0?n(x,z,V):(V++,n(x,V,M)),V<=b&&(z=V+1),b<=V&&(M=V-1)}}function n(x,b,z){var M=x[b];x[b]=x[z],x[z]=M}function o(x,b){return x<b?-1:x>b?1:0}var r=function(b){b===void 0&&(b=9),this._maxEntries=Math.max(4,b),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(b){var z=this.data,M=[];if(!w(b,z))return M;for(var P=this.toBBox,E=[];z;){for(var S=0;S<z.children.length;S++){var I=z.children[S],H=z.leaf?P(I):I;w(b,H)&&(z.leaf?M.push(I):y(b,H)?this._all(I,M):E.push(I))}z=E.pop()}return M},r.prototype.collides=function(b){var z=this.data;if(!w(b,z))return!1;for(var M=[];z;){for(var P=0;P<z.children.length;P++){var E=z.children[P],S=z.leaf?this.toBBox(E):E;if(w(b,S)){if(z.leaf||y(b,S))return!0;M.push(E)}}z=M.pop()}return!1},r.prototype.load=function(b){if(!(b&&b.length))return this;if(b.length<this._minEntries){for(var z=0;z<b.length;z++)this.insert(b[z]);return this}var M=this._build(b.slice(),0,b.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(b){return b&&this._insert(b,this.data.height-1),this},r.prototype.clear=function(){return this.data=m([]),this},r.prototype.remove=function(b,z){if(!b)return this;for(var M=this.data,P=this.toBBox(b),E=[],S=[],I,H,D;M||E.length;){if(M||(M=E.pop(),H=E[E.length-1],I=S.pop(),D=!0),M.leaf){var T=s(b,M.children,z);if(T!==-1)return M.children.splice(T,1),E.push(M),this._condense(E),this}!D&&!M.leaf&&y(M,P)?(E.push(M),S.push(I),I=0,H=M,M=M.children[0]):H?(I++,M=H.children[I],D=!1):M=null}return this},r.prototype.toBBox=function(b){return b},r.prototype.compareMinX=function(b,z){return b.minX-z.minX},r.prototype.compareMinY=function(b,z){return b.minY-z.minY},r.prototype.toJSON=function(){return this.data},r.prototype.fromJSON=function(b){return this.data=b,this},r.prototype._all=function(b,z){for(var M=[];b;)b.leaf?z.push.apply(z,b.children):M.push.apply(M,b.children),b=M.pop();return z},r.prototype._build=function(b,z,M,P){var E=M-z+1,S=this._maxEntries,I;if(E<=S)return I=m(b.slice(z,M+1)),i(I,this.toBBox),I;P||(P=Math.ceil(Math.log(E)/Math.log(S)),S=Math.ceil(E/Math.pow(S,P-1))),I=m([]),I.leaf=!1,I.height=P;var H=Math.ceil(E/S),D=H*Math.ceil(Math.sqrt(S));p(b,z,M,D,this.compareMinX);for(var T=z;T<=M;T+=D){var R=Math.min(T+D-1,M);p(b,T,R,H,this.compareMinY);for(var v=T;v<=R;v+=H){var W=Math.min(v+H-1,R);I.children.push(this._build(b,v,W,P-1))}}return i(I,this.toBBox),I},r.prototype._chooseSubtree=function(b,z,M,P){for(;P.push(z),!(z.leaf||P.length-1===M);){for(var E=1/0,S=1/0,I=void 0,H=0;H<z.children.length;H++){var D=z.children[H],T=c(D),R=h(b,D)-T;R<S?(S=R,E=T<E?T:E,I=D):R===S&&T<E&&(E=T,I=D)}z=I||z.children[0]}return z},r.prototype._insert=function(b,z,M){var P=M?b:this.toBBox(b),E=[],S=this._chooseSubtree(P,this.data,z,E);for(S.children.push(b),u(S,P);z>=0&&E[z].children.length>this._maxEntries;)this._split(E,z),z--;this._adjustParentBBoxes(P,E,z)},r.prototype._split=function(b,z){var M=b[z],P=M.children.length,E=this._minEntries;this._chooseSplitAxis(M,E,P);var S=this._chooseSplitIndex(M,E,P),I=m(M.children.splice(S,M.children.length-S));I.height=M.height,I.leaf=M.leaf,i(M,this.toBBox),i(I,this.toBBox),z?b[z-1].children.push(I):this._splitRoot(M,I)},r.prototype._splitRoot=function(b,z){this.data=m([b,z]),this.data.height=b.height+1,this.data.leaf=!1,i(this.data,this.toBBox)},r.prototype._chooseSplitIndex=function(b,z,M){for(var P,E=1/0,S=1/0,I=z;I<=M-z;I++){var H=l(b,0,I,this.toBBox),D=l(b,I,M,this.toBBox),T=g(H,D),R=c(H)+c(D);T<E?(E=T,P=I,S=R<S?R:S):T===E&&R<S&&(S=R,P=I)}return P||M-z},r.prototype._chooseSplitAxis=function(b,z,M){var P=b.leaf?this.compareMinX:f,E=b.leaf?this.compareMinY:d,S=this._allDistMargin(b,z,M,P),I=this._allDistMargin(b,z,M,E);S<I&&b.children.sort(P)},r.prototype._allDistMargin=function(b,z,M,P){b.children.sort(P);for(var E=this.toBBox,S=l(b,0,z,E),I=l(b,M-z,M,E),H=a(S)+a(I),D=z;D<M-z;D++){var T=b.children[D];u(S,b.leaf?E(T):T),H+=a(S)}for(var R=M-z-1;R>=z;R--){var v=b.children[R];u(I,b.leaf?E(v):v),H+=a(I)}return H},r.prototype._adjustParentBBoxes=function(b,z,M){for(var P=M;P>=0;P--)u(z[P],b)},r.prototype._condense=function(b){for(var z=b.length-1,M=void 0;z>=0;z--)b[z].children.length===0?z>0?(M=b[z-1].children,M.splice(M.indexOf(b[z]),1)):this.clear():i(b[z],this.toBBox)};function s(x,b,z){if(!z)return b.indexOf(x);for(var M=0;M<b.length;M++)if(z(x,b[M]))return M;return-1}function i(x,b){l(x,0,x.children.length,b,x)}function l(x,b,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=b;E<z;E++){var S=x.children[E];u(P,x.leaf?M(S):S)}return P}function u(x,b){return x.minX=Math.min(x.minX,b.minX),x.minY=Math.min(x.minY,b.minY),x.maxX=Math.max(x.maxX,b.maxX),x.maxY=Math.max(x.maxY,b.maxY),x}function f(x,b){return x.minX-b.minX}function d(x,b){return x.minY-b.minY}function c(x){return(x.maxX-x.minX)*(x.maxY-x.minY)}function a(x){return x.maxX-x.minX+(x.maxY-x.minY)}function h(x,b){return(Math.max(b.maxX,x.maxX)-Math.min(b.minX,x.minX))*(Math.max(b.maxY,x.maxY)-Math.min(b.minY,x.minY))}function g(x,b){var z=Math.max(x.minX,b.minX),M=Math.max(x.minY,b.minY),P=Math.min(x.maxX,b.maxX),E=Math.min(x.maxY,b.maxY);return Math.max(0,P-z)*Math.max(0,E-M)}function y(x,b){return x.minX<=b.minX&&x.minY<=b.minY&&b.maxX<=x.maxX&&b.maxY<=x.maxY}function w(x,b){return b.minX<=x.maxX&&b.minY<=x.maxY&&b.maxX>=x.minX&&b.maxY>=x.minY}function m(x){return{children:x,height:1,leaf:!0,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0}}function p(x,b,z,M,P){for(var E=[b,z];E.length;)if(z=E.pop(),b=E.pop(),!(z-b<=M)){var S=b+Math.ceil((z-b)/M/2)*M;t(x,S,b,z,P),E.push(b,S,S,z)}}return r})});var Ar=Oe((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,f=s[u];if(i(l,f)>=0)break;s[o]=f,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 f=(o<<1)+1,d=s[f],c=f+1;if(c<this.length&&i(s[c],d)<0&&(f=c,d=s[c]),i(d,u)>=0)break;s[o]=d,o=f}s[o]=u};function e(n,o){return n<o?-1:n>o?1:0}return t})});var Br=Oe((th,Lr)=>{Lr.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,f=0,d=u-1;f<u;d=f++){var c=n[o+f*2+0],a=n[o+f*2+1],h=n[o+d*2+0],g=n[o+d*2+1],y=a>i!=g>i&&s<(h-c)*(i-a)/(g-a)+c;y&&(l=!l)}return l}});var Or=Oe((eh,kr)=>{kr.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,f=0,d=u-1;f<u;d=f++){var c=n[f+o][0],a=n[f+o][1],h=n[d+o][0],g=n[d+o][1],y=a>i!=g>i&&s<(h-c)*(i-a)/(g-a)+c;y&&(l=!l)}return l}});var qr=Oe((nh,Gn)=>{var Fr=Br(),Nr=Or();Gn.exports=function(e,n,o,r){return n.length>0&&Array.isArray(n[0])?Nr(e,n,o,r):Fr(e,n,o,r)};Gn.exports.nested=Nr;Gn.exports.flat=Fr});var $r=Oe((Yn,jr)=>{(function(t,e){typeof Yn=="object"&&typeof jr<"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,y,w,m){let p,x,b,z,M=g[0],P=w[0],E=0,S=0;P>M==P>-M?(p=M,M=g[++E]):(p=P,P=w[++S]);let I=0;if(E<h&&S<y)for(P>M==P>-M?(b=p-((x=M+p)-M),M=g[++E]):(b=p-((x=P+p)-P),P=w[++S]),p=x,b!==0&&(m[I++]=b);E<h&&S<y;)P>M==P>-M?(b=p-((x=p+M)-(z=x-p))+(M-z),M=g[++E]):(b=p-((x=p+P)-(z=x-p))+(P-z),P=w[++S]),p=x,b!==0&&(m[I++]=b);for(;E<h;)b=p-((x=p+M)-(z=x-p))+(M-z),M=g[++E],p=x,b!==0&&(m[I++]=b);for(;S<y;)b=p-((x=p+P)-(z=x-p))+(P-z),P=w[++S],p=x,b!==0&&(m[I++]=b);return p===0&&I!==0||(m[I++]=p),I}function r(h){return new Float64Array(h)}let s=33306690738754716e-32,i=22204460492503146e-32,l=11093356479670487e-47,u=r(4),f=r(8),d=r(12),c=r(16),a=r(4);t.orient2d=function(h,g,y,w,m,p){let x=(g-p)*(y-m),b=(h-m)*(w-p),z=x-b;if(x===0||b===0||x>0!=b>0)return z;let M=Math.abs(x+b);return Math.abs(z)>=s*M?z:-(function(P,E,S,I,H,D,T){let R,v,W,V,C,_,A,B,k,F,L,O,$,G,Q,j,Z,Y,it=P-H,ht=S-H,Tt=E-D,nt=I-D;C=(Q=(B=it-(A=(_=134217729*it)-(_-it)))*(F=nt-(k=(_=134217729*nt)-(_-nt)))-((G=it*nt)-A*k-B*k-A*F))-(L=Q-(Z=(B=Tt-(A=(_=134217729*Tt)-(_-Tt)))*(F=ht-(k=(_=134217729*ht)-(_-ht)))-((j=Tt*ht)-A*k-B*k-A*F))),u[0]=Q-(L+C)+(C-Z),C=($=G-((O=G+L)-(C=O-G))+(L-C))-(L=$-j),u[1]=$-(L+C)+(C-j),C=(Y=O+L)-O,u[2]=O-(Y-C)+(L-C),u[3]=Y;let wt=(function(It,ot){let ft=ot[0];for(let rt=1;rt<It;rt++)ft+=ot[rt];return ft})(4,u),zt=i*T;if(wt>=zt||-wt>=zt||(R=P-(it+(C=P-it))+(C-H),W=S-(ht+(C=S-ht))+(C-H),v=E-(Tt+(C=E-Tt))+(C-D),V=I-(nt+(C=I-nt))+(C-D),R===0&&v===0&&W===0&&V===0)||(zt=l*T+n*Math.abs(wt),(wt+=it*V+nt*R-(Tt*W+ht*v))>=zt||-wt>=zt))return wt;C=(Q=(B=R-(A=(_=134217729*R)-(_-R)))*(F=nt-(k=(_=134217729*nt)-(_-nt)))-((G=R*nt)-A*k-B*k-A*F))-(L=Q-(Z=(B=v-(A=(_=134217729*v)-(_-v)))*(F=ht-(k=(_=134217729*ht)-(_-ht)))-((j=v*ht)-A*k-B*k-A*F))),a[0]=Q-(L+C)+(C-Z),C=($=G-((O=G+L)-(C=O-G))+(L-C))-(L=$-j),a[1]=$-(L+C)+(C-j),C=(Y=O+L)-O,a[2]=O-(Y-C)+(L-C),a[3]=Y;let Dt=o(4,u,4,a,f);C=(Q=(B=it-(A=(_=134217729*it)-(_-it)))*(F=V-(k=(_=134217729*V)-(_-V)))-((G=it*V)-A*k-B*k-A*F))-(L=Q-(Z=(B=Tt-(A=(_=134217729*Tt)-(_-Tt)))*(F=W-(k=(_=134217729*W)-(_-W)))-((j=Tt*W)-A*k-B*k-A*F))),a[0]=Q-(L+C)+(C-Z),C=($=G-((O=G+L)-(C=O-G))+(L-C))-(L=$-j),a[1]=$-(L+C)+(C-j),C=(Y=O+L)-O,a[2]=O-(Y-C)+(L-C),a[3]=Y;let Pt=o(Dt,f,4,a,d);C=(Q=(B=R-(A=(_=134217729*R)-(_-R)))*(F=V-(k=(_=134217729*V)-(_-V)))-((G=R*V)-A*k-B*k-A*F))-(L=Q-(Z=(B=v-(A=(_=134217729*v)-(_-v)))*(F=W-(k=(_=134217729*W)-(_-W)))-((j=v*W)-A*k-B*k-A*F))),a[0]=Q-(L+C)+(C-Z),C=($=G-((O=G+L)-(C=O-G))+(L-C))-(L=$-j),a[1]=$-(L+C)+(C-j),C=(Y=O+L)-O,a[2]=O-(Y-C)+(L-C),a[3]=Y;let Mt=o(Pt,d,4,a,c);return c[Mt-1]})(h,g,y,w,m,p,M)},t.orient2dfast=function(h,g,y,w,m,p){return(g-p)*(y-m)-(h-m)*(w-p)},Object.defineProperty(t,"__esModule",{value:!0})})});var Kr=Oe((oh,Ho)=>{"use strict";var Xr=_r(),Kn=Ar(),ga=qr(),xa=$r().orient2d;Kn.default&&(Kn=Kn.default);Ho.exports=Ur;Ho.exports.default=Ur;function Ur(t,e,n){e=Math.max(0,e===void 0?2:e),n=n||0;var o=Ma(t),r=new Xr(16);r.toBBox=function(p){return{minX:p[0],minY:p[1],maxX:p[0],maxY:p[1]}},r.compareMinX=function(p,x){return p[0]-x[0]},r.compareMinY=function(p,x){return p[1]-x[1]},r.load(t);for(var s=[],i=0,l;i<o.length;i++){var u=o[i];r.remove(u),l=Yr(u,l),s.push(l)}var f=new Xr(16);for(i=0;i<s.length;i++)f.insert(Io(s[i]));for(var d=e*e,c=n*n;s.length;){var a=s.shift(),h=a.p,g=a.next.p,y=Co(h,g);if(!(y<c)){var w=y/d;u=ya(r,a.prev.p,h,g,a.next.next.p,w,f),u&&Math.min(Co(u,h),Co(u,g))<=w&&(s.push(a),s.push(Yr(u,a)),r.remove(u),f.remove(a),f.insert(Io(a)),f.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 f=0;f<u.children.length;f++){var d=u.children[f],c=u.leaf?Wo(d,n,o):wa(n,o,d);c>s||l.push({node:d,dist:c})}for(;l.length&&!l.peek().node.children;){var a=l.pop(),h=a.node,g=Wo(h,e,n),y=Wo(h,o,r);if(a.dist<g&&a.dist<y&&Gr(n,h,i)&&Gr(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(Zr(t,n)||Zr(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 Zr(t,e){return t[0]>=e.minX&&t[0]<=e.maxX&&t[1]>=e.minY&&t[1]<=e.maxY}function Gr(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 un(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&&un(t,e,n)>0!=un(t,e,o)>0&&un(n,o,t)>0!=un(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++)ga(t[s],l)||u.push(t[s]);return Pa(u)}function Yr(t,e){var n={p:t,prev:null,next:null,minX:0,minY:0,maxX:0,maxY:0};return e?(n.next=e.next,n.prev=e,e.next.prev=n,e.next=n):(n.prev=n,n.next=n),n}function Co(t,e){var n=t[0]-e[0],o=t[1]-e[1];return n*n+o*o}function Wo(t,e,n){var o=e[0],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,f=o-e,d=i-r,c=l-s,a=t-r,h=e-s,g=u*u+f*f,y=u*d+f*c,w=d*d+c*c,m=u*a+f*h,p=d*a+c*h,x=g*w-y*y,b,z,M,P,E=x,S=x;x===0?(z=0,E=1,P=p,S=w):(z=y*p-w*m,P=g*p-y*m,z<0?(z=0,P=p,S=w):z>E&&(z=E,P=p+y,S=w)),P<0?(P=0,-m<0?z=0:-m>g?z=E:(z=-m,E=g)):P>S&&(P=S,-m+y<0?z=0:-m+y>g?z=E:(z=-m+y,E=g)),b=z===0?0:z/E,M=P===0?0:P/S;var I=(1-b)*t+b*n,H=(1-b)*e+b*o,D=(1-M)*r+M*i,T=(1-M)*s+M*l,R=D-I,v=T-H;return R*R+v*v}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&&un(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&&un(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 Ne from"three";import*as Fe from"three";var _t=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,f=Math.cos(n),d=Math.sin(n),c=i*o+l*r+u*s;return this.x=i*c*(1-f)+o*f+(-u*r+l*s)*d,this.y=l*c*(1-f)+r*f+(u*o-i*s)*d,this.z=u*c*(1-f)+s*f+(-l*o+i*r)*d,this}},An=class{constructor(e=new _t(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 _t().subVectors(n,e),s=new _t().subVectors(o,e),i=new _t().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 _t){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 _t(e.start.x,e.start.y,e.start.z),l=new _t(e.end.x,e.end.y,e.end.z),u=new _t(e.end.x,e.end.y,e.rooftopPz),f=new _t(e.start.x,e.start.y,e.rooftopPz),d=[i,l,u,f];for(let P=0;P<d.length;P++)if(!this.isValidVector3(d[P]))return console.error(`\u5899\u4F53\u57FA\u7840\u70B9${P}\u65E0\u6548:`,d[P]),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,y=new _t().subVectors(l,i).normalize(),w=i.x,m=i.y,p=i.z,x=y.x,b=y.y,z=y.z,M=(P,E)=>new _t(w+x*P,m+b*P,p+z*P+E);for(let P=0;P<n;P++){let E=P*g,S=(P+1)*g;for(let I=0;I<o;I++){let H=I*h,D=(I+1)*h;s.push({points:[M(H,E),M(D,E),M(D,S),M(H,S)],userData:{type:"wallSegment",row:P,col:I,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,f=1/0,d=-1/0,c=1/0,a=-1/0;for(let H=0;H<e.length;H++){let D=e[H];if(D.userData&&D.userData.type==="wallSegment"){let T=this.getWorldVerticesNew(D.points);if(T.length<4)continue;let R=new _t().add(T[0]).add(T[1]).add(T[2]).add(T[3]).multiplyScalar(.25);D.userData.center=R,D.vertices=T;let v=D.userData.row,W=D.userData.col,V=`row${v}_col${W}`;l.push(D),u.set(V,D),v<f&&(f=v),v>d&&(d=v),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${f}_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 y=g.vertices[0],w=g.vertices[1],m=g.vertices[3],p=new _t().subVectors(w,y).normalize(),x=new _t().subVectors(m,y).normalize(),b=g.userData.width,z=g.userData.height,M=d-f+1,P=a-c+1,E=new An;E.setFromCoplanarPoints(y,w,m);let S=new _t,I=new _t;for(let H=0;H<n.length;H+=3){let D=new _t(n[H],n[H+1],n[H+2]),T=s?s.projectPoint(D,I):D;if(Math.abs(E.distanceToPoint(T))>o)continue;S.subVectors(T,y);let v=S.dot(p),W=S.dot(x),V=Math.ceil((v-o)/b-1),C=Math.floor((v+o)/b),_=Math.ceil((W-o)/z-1),A=Math.floor((W+o)/z);if(C<0||V>P-1||A<0||_>M-1)continue;let B=Math.max(0,V),k=Math.min(P-1,C),F=Math.max(0,_),L=Math.min(M-1,A);for(let O=F;O<=L;O++){let $=f+O;for(let G=B;G<=k;G++){let Q=c+G,j=`row${$}_col${Q}`;u.has(j)&&(this.results.pointsInSegments.has(j)||this.results.pointsInSegments.set(j,[H]))}}}for(let H of l){let D=`row${H.userData.row}_col${H.userData.col}`,T=this.results.pointsInSegments.has(D)?this.results.pointsInSegments.get(D).length:0,R=T>=1,v={row:H.userData.row,col:H.userData.col,width:H.userData.width,height:H.userData.height,segmentKey:D,vertices:H.vertices,center:H.userData.center,mesh:H,pointCount:T,hasPointsButNotEnough:T>0&&T<1};R?(this.results.segmentsWithPoints++,this.results.existSegments.push(v)):(this.results.segmentsWithoutPoints++,this.results.missingSegments.push(v))}return this.results.analysisTime=_n()-i,this.printAnalysisResults(),this.results}isPointInWallSegmentOptimized(e,n,o,r,s,i,l,u,f,d,c){if(Math.abs(o.distanceToPoint(e))>c)return!1;let h=new _t().subVectors(e,n),g=Math.abs(h.dot(s)),y=Math.abs(h.dot(i));if(g>f&&y>d)return!1;let w=new _t().subVectors(e,r),m=w.dot(s),p=w.dot(i),x=m>=-c&&m<=l+c,b=p>=-c&&p<=u+c;return x&&b}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 f of this.results.missingSegments)s.set(f.segmentKey,f),i.has(f.row)||i.set(f.row,new Map),i.get(f.row).set(f.col,{segmentKey:f.segmentKey,isEmpty:!0,visited:!1});for(let f of e)if(f.userData&&f.userData.type==="wallSegment"){let d=`row${f.userData.row}_col${f.userData.col}`,c=s.has(d);i.has(f.userData.row)||i.set(f.userData.row,new Map),i.get(f.userData.row).has(f.userData.col)||i.get(f.userData.row).set(f.userData.col,{segmentKey:d,isEmpty:c,visited:!1})}let l=[],u=[[0,1],[1,0],[0,-1],[-1,0]];for(let[f,d]of s){let c=i.get(d.row)?.get(d.col);if(c&&!c.visited){let a=[],h=[[d.row,d.col]],g=0;for(c.visited=!0;g<h.length;){let y=h[g++],w=y[0],m=y[1],p=`row${w}_col${m}`;s.has(p)&&a.push(s.get(p));for(let x of u){let b=w+x[0],z=m+x[1];if(i.has(b)&&i.get(b).has(z)){let M=i.get(b).get(z);!M.visited&&M.isEmpty&&(M.visited=!0,h.push([b,z]))}}}a.length>=r&&l.push(a)}}return this.clusterResults={clusters:l.sort((f,d)=>d.length-f.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)}},lr=(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},zi=(t,e)=>{let n=new _t().copy(t.start).add(t.end).multiplyScalar(.5),o=new _t().subVectors(new _t(n.x,n.y,n.z+1),n).normalize(),r=new _t(t.direction.x,t.direction.y,0);r.applyAxisAngle(o,Math.PI/2);let s=new _t().copy(n).add(r.clone().multiplyScalar(t.length)),i=new _t().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]}},cr=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 An().setFromCoplanarPoints(new _t(t.start.x,t.start.y,t.start.z),new _t(t.end.x,t.end.y,t.end.z),new _t(t.start.x,t.start.y,t.rooftopPz)),r=new _t(t.start.x,t.start.y,t.start.z).distanceTo(new _t(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),f=i.createSubdividedWallPlane(t,u,l,null);i.analyzePointDistribution(f,t.originalPoints,.01,{projectPlane:o});let d=i.highlightEmptySegments(f,null,null),c=[];if(d&&d.clusters)for(let g of d.clusters){let y=lr(g,n);y&&c.push(y)}let h=zi(t,n).direction;if(t.checkResults=c,t.verticalDirection=h,t.saveExistSegments){let g=[],y=lr(i.results.existSegments,n);y&&g.push(y),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,f=Math.cos(n),d=Math.sin(n),c=i*o+l*r+u*s;return this.x=i*c*(1-f)+o*f+(-u*r+l*s)*d,this.y=l*c*(1-f)+r*f+(u*o-i*s)*d,this.z=u*c*(1-f)+s*f+(-l*o+i*r)*d,this}},bn=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}},Ln=()=>typeof performance<"u"&&performance.now?performance.now():Date.now(),Bn=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),f=new Rt(e.start.x,e.start.y,e.rooftopPz),d=[i,l,u,f];for(let P=0;P<d.length;P++)if(!this.isValidVector3(d[P]))return console.error(`\u5899\u4F53\u57FA\u7840\u70B9${P}\u65E0\u6548:`,d[P]),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,y=new Rt().subVectors(l,i).normalize(),w=i.x,m=i.y,p=i.z,x=y.x,b=y.y,z=y.z,M=(P,E)=>new Rt(w+x*P,m+b*P,p+z*P+E);for(let P=0;P<n;P++){let E=P*g,S=(P+1)*g;for(let I=0;I<o;I++){let H=I*h,D=(I+1)*h;s.push({points:[M(H,E),M(D,E),M(D,S),M(H,S)],userData:{type:"wallSegment",row:P,col:I,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=Ln(),l=[],u=new Map,f=1/0,d=-1/0,c=1/0,a=-1/0;for(let H=0;H<e.length;H++){let D=e[H];if(D.userData&&D.userData.type==="wallSegment"){let T=this.getWorldVerticesNew(D.points);if(T.length<4)continue;let R=new Rt().add(T[0]).add(T[1]).add(T[2]).add(T[3]).multiplyScalar(.25);D.userData.center=R,D.vertices=T;let v=D.userData.row,W=D.userData.col,V=`row${v}_col${W}`;l.push(D),u.set(V,D),v<f&&(f=v),v>d&&(d=v),W<c&&(c=W),W>a&&(a=W)}}if(this.results.totalSegments=l.length,l.length===0)return this.results.analysisTime=Ln()-i,this.printAnalysisResults(),this.results;let h=`row${f}_col${c}`,g=u.get(h)||l[0];if(!g||!g.vertices||g.vertices.length<4)return this.results.analysisTime=Ln()-i,this.printAnalysisResults(),this.results;let y=g.vertices[0],w=g.vertices[1],m=g.vertices[3],p=new Rt().subVectors(w,y).normalize(),x=new Rt().subVectors(m,y).normalize(),b=g.userData.width,z=g.userData.height,M=d-f+1,P=a-c+1,E=new bn;E.setFromCoplanarPoints(y,w,m);let S=new Rt,I=new Rt;for(let H=0;H<n.length;H++){let D=n[H],T=s?s.projectPoint(D,I):D;if(Math.abs(E.distanceToPoint(T))>o)continue;S.subVectors(T,y);let v=S.dot(p),W=S.dot(x),V=Math.ceil((v-o)/b-1),C=Math.floor((v+o)/b),_=Math.ceil((W-o)/z-1),A=Math.floor((W+o)/z);if(C<0||V>P-1||A<0||_>M-1)continue;let B=Math.max(0,V),k=Math.min(P-1,C),F=Math.max(0,_),L=Math.min(M-1,A);for(let O=F;O<=L;O++){let $=f+O;for(let G=B;G<=k;G++){let Q=c+G,j=`row${$}_col${Q}`;u.has(j)&&(this.results.pointsInSegments.has(j)||this.results.pointsInSegments.set(j,[H]))}}}for(let H of l){let D=`row${H.userData.row}_col${H.userData.col}`,T=this.results.pointsInSegments.has(D)?this.results.pointsInSegments.get(D).length:0,R=T>=1,v={row:H.userData.row,col:H.userData.col,width:H.userData.width,height:H.userData.height,segmentKey:D,vertices:H.vertices,center:H.userData.center,mesh:H,pointCount:T,hasPointsButNotEnough:T>0&&T<1};R?(this.results.segmentsWithPoints++,this.results.existSegments.push(v)):(this.results.segmentsWithoutPoints++,this.results.missingSegments.push(v))}return this.results.analysisTime=Ln()-i,this.printAnalysisResults(),this.results}isPointInWallSegmentOptimized(e,n,o,r,s,i,l,u,f,d,c){if(Math.abs(o.distanceToPoint(e))>c)return!1;let h=new Rt().subVectors(e,n),g=Math.abs(h.dot(s)),y=Math.abs(h.dot(i));if(g>f&&y>d)return!1;let w=new Rt().subVectors(e,r),m=w.dot(s),p=w.dot(i),x=m>=-c&&m<=l+c,b=p>=-c&&p<=u+c;return x&&b}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 f of this.results.missingSegments)s.set(f.segmentKey,f),i.has(f.row)||i.set(f.row,new Map),i.get(f.row).set(f.col,{segmentKey:f.segmentKey,isEmpty:!0,visited:!1});for(let f of e)if(f.userData&&f.userData.type==="wallSegment"){let d=`row${f.userData.row}_col${f.userData.col}`,c=s.has(d);i.has(f.userData.row)||i.set(f.userData.row,new Map),i.get(f.userData.row).has(f.userData.col)||i.get(f.userData.row).set(f.userData.col,{segmentKey:d,isEmpty:c,visited:!1})}let l=[],u=[[0,1],[1,0],[0,-1],[-1,0]];for(let[f,d]of s){let c=i.get(d.row)?.get(d.col);if(c&&!c.visited){let a=[],h=[[d.row,d.col]],g=0;for(c.visited=!0;g<h.length;){let y=h[g++],w=y[0],m=y[1],p=`row${w}_col${m}`;s.has(p)&&a.push(s.get(p));for(let x of u){let b=w+x[0],z=m+x[1];if(i.has(b)&&i.get(b).has(z)){let M=i.get(b).get(z);!M.visited&&M.isEmpty&&(M.visited=!0,h.push([b,z]))}}}a.length>=r&&l.push(a)}}return this.clusterResults={clusters:l.sort((f,d)=>d.length-f.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)}},ur=(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 Ne.Vector3(s.center.x,s.center.y,s.center.z));let i=[];for(let l=0;l<s.vertices.length;l++)i.push(new Ne.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 Ne.Vector3(s.x,s.y,s.z),end:new Ne.Vector3(i.x,i.y,i.z),center:new Ne.Vector3(n.x,n.y,n.z),direction:new Ne.Vector3(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"?fr(t,e,n):o=="array"&&bo(t,e,n)},Pi=(t,e=!0,n="three",o="xyz")=>{o=="xyz"?Ti(t,e,n):o=="array"&&cr(t,e,n)},Ti=(t,e=!0,n="three")=>{for(let o=0;o<t.length;o++){let r=t[o];fr(r,e,n)}},fr=(t,e=!0,n="three")=>{if((t.isBayWindow||t.isWindow||t.isBalconyRailing)&&e)return;let o=new bn().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 Bn,{horizontalSubdivisions:l,verticalSubdivisions:u}=i.initLimits4(r,s),f=i.createSubdividedWallPlane(t,u,l,null);i.analyzePointDistribution(f,t.originalPoints,.01,{projectPlane:o});let d=i.highlightEmptySegments(f,null,null),c=[];if(d&&d.clusters)for(let g of d.clusters){let y=ur(g,n);y&&c.push(y)}let h=Mi(t,n).direction;if(t.checkResults=c,t.verticalDirection=h,t.saveExistSegments){let g=[],y=ur(i.results.existSegments,n);y&&g.push(y),t.existSegments=g}},Si=t=>{if((t.isBayWindow||t.isWindow||t.isBalconyRailing)&&limit)return;let e=new bn().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 Bn,{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 N from"three";import"three/examples/jsm/utils/BufferGeometryUtils.js";import*as U from"three";import{CSS2DObject as Tc}from"three/examples/jsm/renderers/CSS2DRenderer.js";import"three/examples/jsm/utils/BufferGeometryUtils.js";import ze from"path";import{fileURLToPath as vi}from"url";import kn from"path";import{fileURLToPath as Ri}from"url";import{Vector3 as oc}from"three";var Di=Ri(import.meta.url),wo=kn.dirname(Di),rc=kn.resolve(wo,"./data/lines.meta.json"),sc=kn.resolve(wo,"./data/lines.bin"),ic=kn.resolve(wo,"./data/checks.bin");var Vi=vi(import.meta.url),ve=ze.dirname(Vi),dc=ze.resolve(ve,"./data/lines.tmp.bin"),hc=ze.resolve(ve,"./data/checks.tmp.bin"),mc=ze.resolve(ve,"./data/lines.new_points.tmp.bin"),pc=ze.resolve(ve,"./data/lines.new_points.bin"),gc=ze.resolve(ve,"./data/lines.meta.json"),xc=ze.resolve(ve,"./data/lines.bin"),yc=ze.resolve(ve,"./data/checks.bin"),bc=ze.resolve(ve,"./data/lines.exist_segments.bin"),wc=ze.resolve(ve,"./data/lines.exist_segments.tmp.bin");import{Vector3 as Ii}from"three";var On=class{points=[];_tempArr=[0,0,0];constructor(e){}initPoints(e){this.points=e}getPointByIndex(e,n){let o=e*3;return n.x=this.points[o],n.y=this.points[o+1],n.z=this.points[o+2],n}getPointArrByIndex(e){let n=e*3;return[this.points[n],this.points[n+1],this.points[n+2]]}getPoint2ArrByIndex(e){let n=e*3;return[this.points[n],this.points[n+1]]}getIndexsByIndex(e,n){n.length=0,n.push(e*3),n.push(e*3+1),n.push(e*3+2)}pointsToVector3Arr(e){let n=[];for(let o=0;o<e.length/3;o++)n.push(new Ii(e[o*3],e[o*3+1],e[o*3+2]));return n}vector3ArrToPoints(e){let n=[];for(let o=0;o<e.length;o++)n.push(e[o].x,e[o].y,e[o].z);return n}vector3ArrToFloat32Array(e){return new Float32Array(e.flatMap(o=>[o.x,o.y,o.z]))}clsoe(){this.points=[]}};var hr=(t,e,n)=>{let o=new U.LineBasicMaterial({color:"#0011ff"}),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))},Me=(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,f=s*u-i*l;if(Math.abs(f)<r)return null;let d=((n.x-t.x)*u-(n.y-t.y)*l)/f,c=((n.x-t.x)*i-(n.y-t.y)*s)/f;return d<-r||d>1+r||c<-r||c>1+r?null:{point:new U.Vector3(t.x+d*s,t.y+d*i,t.z)}},mr=(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,d=document.createElement("canvas").getContext("2d");d.font=`bold ${o}px ${r}`;let a=d.measureText(t).width,h=Math.min(a+l*2,u),g=o+l*2,y=document.createElement("canvas");y.width=h,y.height=g;let w=y.getContext("2d");w.fillStyle=s,w.fillRect(0,0,h,g),w.fillStyle=i,w.font=`bold ${o}px ${r}`,w.textAlign="center",w.textBaseline="middle",a>u-l*2?Ci(w,t,h/2,g/2,u,o):w.fillText(t,h/2,g/2);let m=new U.CanvasTexture(y),p=new U.SpriteMaterial({map:m,depthTest:!1,transparent:!0}),x=new U.Sprite(p);x.position.set(e.x,e.y,e.z);let b=.005;return x.scale.set(h*b,g*b,1),x};function Ci(t,e,n,o,r,s){let i=e.split(""),l="",u=s*1.2,f=o;for(let d=0;d<i.length;d++){let c=l+i[d];t.measureText(c).width>r&&d>0?(t.fillText(l,n,f),l=i[d],f+=u):l=c}t.fillText(l,n,f)}var $t=(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)),f=u<=n;return{parallel:f,sameDirection:f?l>0:null,angle:u}};var pr=(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(),f=1/0,d=-1/0,c=1/0,a=-1/0;for(let M of r){let P=M.dot(i),E=M.dot(l);P<f&&(f=P),P>d&&(d=P),E<c&&(c=E),E>a&&(a=E)}let h=r[0].dot(u),g=i.clone().multiplyScalar(f).add(l.clone().multiplyScalar(c)).add(u.clone().multiplyScalar(h)),y=i.clone().multiplyScalar(d).add(l.clone().multiplyScalar(c)).add(u.clone().multiplyScalar(h)),w=i.clone().multiplyScalar(d).add(l.clone().multiplyScalar(a)).add(u.clone().multiplyScalar(h)),m=i.clone().multiplyScalar(f).add(l.clone().multiplyScalar(a)).add(u.clone().multiplyScalar(h)),p=[g,y,w,m],x=$t(new U.Vector3().subVectors(g,y),new U.Vector3(0,0,1));x&&x.parallel&&(p=[g,m,w,y]);let b=0;if(o.length>0){let M=new U.Vector3().subVectors(p[1],p[0]).normalize(),P=M.clone().negate(),E=new U.Vector3().subVectors(p[3],p[0]).normalize(),S=E.clone().negate(),I=p[0].distanceTo(p[1]),H=p[0].distanceTo(p[3]),D=I/e,T=H/n,R=.001;for(let v=0;v<D;v++){let W=p[0],V=0;for(let C=0;C<T;C++){let _=W.clone().addScaledVector(M,e),A=_.clone().addScaledVector(E,n),B=W.clone().addScaledVector(E,n),k=new U.Vector3().add(W).add(_).add(A).add(B).multiplyScalar(.25);for(let F=0;F<s.length;F++)if(s[F].distanceTo(k)<R){V++;break}W=B}if(V>=T/2)break;b+=V,p[0]=p[0].addScaledVector(M,e),p[3]=p[3].addScaledVector(M,e)}I=p[0].distanceTo(p[1]),D=I/e;for(let v=0;v<D;v++){let W=p[1],V=0;for(let C=0;C<T;C++){let _=W.clone().addScaledVector(P,e),A=_.clone().addScaledVector(E,n),B=W.clone().addScaledVector(E,n),k=new U.Vector3().add(W).add(_).add(A).add(B).multiplyScalar(.25);for(let F=0;F<s.length;F++)if(s[F].distanceTo(k)<R){V++;break}W=B}if(V>=T/2)break;b+=V,p[1]=p[1].addScaledVector(P,e),p[2]=p[2].addScaledVector(P,e)}I=p[0].distanceTo(p[1]),D=I/e;for(let v=0;v<T;v++){let W=p[3],V=0;for(let C=0;C<D;C++){let _=W.clone().addScaledVector(M,e),A=_.clone().addScaledVector(S,n),B=W.clone().addScaledVector(S,n),k=new U.Vector3().add(W).add(_).add(A).add(B).multiplyScalar(.25);for(let F=0;F<s.length;F++)if(s[F].distanceTo(k)<R){V++;break}W=_}if(V>=D/2)break;b+=V,p[2]=p[2].addScaledVector(S,n),p[3]=p[3].addScaledVector(S,n)}}let z=p[0].distanceTo(p[1])*p[0].distanceTo(p[3]);return{facePoints:p,boxArea:z,totalInPlaneNum:b}},Xt=(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)),f=1-Math.min(u/r,1),d=l>0?"same":"opposite";return{parallelism:f,angle:u,angleDeg:U.MathUtils.radToDeg(u),isParallel:u<r,direction:d,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)),f=Math.min(1,Math.max(0,u)),d=Math.acos(f),c=U.MathUtils.radToDeg(d),a=1-f,h=1e-6;return{rate:a,percent:`${(a*100).toFixed(2)}%`,angle:c,isPerpendicular:Math.abs(c-90)<.01,isParallel:c<.01}},At=(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,f=new U.Vector3().subVectors(e,t),d=new U.Vector3().subVectors(o,n),c=f.clone().normalize(),a=d.clone().normalize(),h=U.MathUtils.clamp(c.dot(a),-1,1),g=Math.acos(Math.abs(h)),y=U.MathUtils.radToDeg(g);if(g>s)return{type:"not_parallel",angleDeg:y,avgPerpendicularDistance:null,maxPerpendicularDistance:null,gap:null,overlap:null,closestDistance:null};h<0&&a.negate();let w=new U.Vector3().addVectors(c,a).normalize(),m=new U.Vector3().addVectors(t,e).multiplyScalar(.5),p=dr(n,m,c),x=dr(o,m,c),b=(p+x)/2,z=Math.max(p,x),M=t.dot(w),P=e.dot(w),E=n.dot(w),S=o.dot(w),I=Math.min(M,P),H=Math.max(M,P),D=Math.min(E,S),T=Math.max(E,S),R=H-I,v=T-D,W=Math.min(R,v),V=Math.min(H,T)-Math.max(I,D),C=V<0?-V:0,_=V>0?V:0,A=W>0?_/W:0,B=Wi(t,e,n,o),k=g<=i&&b<l,F;return k?F=A>.5?"collinear_overlap":"collinear_gap":g<=s&&(F="parallel_offset"),{type:F,angleDeg:y,avgPerpendicularDistance:b,maxPerpendicularDistance:z,gap:C,overlap:_,closestDistance:B}};function dr(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),f=s.dot(s),d=r.dot(i),c=s.dot(i),a=l*f-u*u,h,g;a<1e-10?(h=0,g=f!==0?c/f:0):(h=(u*c-f*d)/a,g=(l*c-u*d)/a),h=U.MathUtils.clamp(h,0,1),g=f!==0?U.MathUtils.clamp((u*h+c)/f,0,1):0,h=l!==0?U.MathUtils.clamp((u*g-d)/l,0,1):0;let y=t.clone().add(r.clone().multiplyScalar(h)),w=n.clone().add(s.clone().multiplyScalar(g));return y.distanceTo(w)}var qe=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}},wn=(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(w=>{let m=new U.Vector3;o.projectPoint(w,m),u.push(m.clone()),m.z=r.z,l.push(m)});let f=new U.Vector3,d=new U.Vector3;o.projectPoint(r,f),o.projectPoint(s,d);let c=new U.Line3(f,d),a=[],h=[],g=[],y=new U.Vector3;return l.forEach((w,m)=>{c.closestPointToPoint(w,!0,y).distanceTo(w)<.001?(a.push(n[m]),h.push(u[m])):g.push(w)}),{newOriginalPoints:a,newProjectPoints:g,newOnLinePoints:h}},gr=(t,e,n)=>{function o(r,s,i,l,u,f,d,c,a){let h=new U.Line3(r,s),g=new Map,y=new U.Vector3,w=r.clone(),m=s.clone(),p=0;for(;;){let x=new Map,b=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 S=h.closestPointToPoint(E,!0,y),I=E.distanceTo(S);Math.abs(I-u)<.01&&(b++,x.has(z)?x.get(z).removePtsIndex.push(P):x.set(z,{index:z,removePtsIndex:[P]}))}if(p==d){r=w,s=m;break}if(b<f/20*19||b==0){x.clear(),d-p<5&&(r=w,s=m,g.clear());break}else{p++;for(let[z,M]of x)g.has(z)?g.get(z).removePtsIndex.push(...M.removePtsIndex):g.set(z,M);x.clear(),r=r.addScaledVector(i,l),s=s.addScaledVector(i,l),h.set(r,s)}}if(g.size>0&&p!=d)for(let[x,b]of g){let z=[],M=[];for(let P=0;P<a.checkResults[x].allCenterPoints.length;P++)b.removePtsIndex.includes(P)||(z.push(a.checkResults[x].allCenterPoints[P]),M.push(a.checkResults[x].originalVertices[P]));a.checkResults[x].allCenterPoints=z,a.checkResults[x].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 v=0;v<s.checkResults.length;v++)for(let W=0;W<s.checkResults[v].originalVertices.length;W++){let V=Fn(s.checkResults[v].originalVertices[W]);s.checkResults.allCenterPoints.push(V)}if(!s.checkResults||s.checkResults.length<=0)continue;if(s.checkResults[0].originalVertices&&s.checkResults[0].originalVertices.length>0){let v=s.checkResults[0].originalVertices[0],[W,V,C,_]=v;W=new U.Vector3(W.x,W.y,W.z),V=new U.Vector3(V.x,V.y,V.z),C=new U.Vector3(C.x,C.y,C.z),_=new U.Vector3(_.x,_.y,_.z),i=W.distanceTo(V),l=W.distanceTo(_);let A=new U.Vector3().subVectors(W,V).normalize(),B=$t(A,new U.Vector3(0,0,1));B&&B.parallel&&([l,i]=[i,l])}if(i<0||l<0)continue;let f=new U.Vector3(s.start.x,s.start.y,s.start.z),d=new U.Vector3(s.end.x,s.end.y,s.end.z),c=f.distanceTo(d),a=s.rooftopPz-s.start.z,h=Math.ceil(c/i),g=Math.ceil(a/l),y=f.clone(),w=d.clone(),m=w.clone().add(new U.Vector3(0,0,a)),p=y.clone().add(new U.Vector3(0,0,a)),x=new U.Vector3().subVectors(w,y).normalize(),b=x.clone().negate(),M=new U.Vector3().subVectors(m,y).normalize().clone().negate(),P=i/2,E=l/2,S=c*a,I=i*l,H=S/I;o(y,p,x,i,P,g,h,H,s),o(w,m,b,i,P,g,h,H,s),s.start=y,s.end=w;let{newOriginalPoints:D}=wn(y,w,s.originalPoints);s.originalPoints=D,n.stageReplaceCheckResults(s.id,s.checkResults);let R=new On().vector3ArrToFloat32Array(s.originalPoints);n.stageReplacePoints(s.id,R),s.checkResults=null,s.originalPoints=null}n.commit()},Zt=(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},We=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 xr=()=>{let t=Math.floor(Math.random()*75+180).toString(16).padStart(2,"0"),e=Math.floor(Math.random()*75+180).toString(16).padStart(2,"0"),n=Math.floor(Math.random()*75+180).toString(16).padStart(2,"0");return`#${t}${e}${n}`};var Mo=(t,e=.001)=>{let n=new Map,o=[];for(let 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},yr=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(d,c,a){return e.clone().addScaledVector(s,d).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(),f=l.length();i.normalize(),l.normalize();let d=new U.Vector3(0,0,1),a=new U.Vector3().add(n).add(o).add(r).add(s).multiplyScalar(.25).clone().addScaledVector(d,e/2),h=new U.BoxGeometry(u,f,e),g=new U.Matrix4;return g.makeBasis(i,l,d),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 Gt from"three";var Hi=(t,e)=>{console.log("lines",t);for(let n=0;n<t.length;n++){let o=t[n],r=[];o.originalPoints.forEach(x=>{let b=new Gt.Vector3(x.x,x.y,0),z=!1;for(let M=0;M<r.length;M++)if(ct(b,r[M],.01)){z=!0;break}z||r.push(b)});let s=Math.round(Math.max(5,Math.min(350,20*Math.sqrt(o.length)))),i=1,l=new Gt.Vector3(o.start.x,o.start.y,o.start.z),u=new Gt.Vector3(o.end.x,o.end.y,o.end.z),f=new Gt.Vector3().subVectors(u,l).normalize(),d=f.clone().cross(new Gt.Vector3(0,0,1)).normalize(),c=d.clone().negate(),a=[],h=[],g=o.length/s;console.log(g);for(let x=0;x<s;x++){let b=[];b.push(l.clone().addScaledVector(d,i)),b.push(b[0].clone().addScaledVector(f,g)),b.push(b[1].clone().addScaledVector(c,i*2)),b.push(l.clone().addScaledVector(c,g));let z=[];for(let M=0;M<r.length;M++)a.includes(M)||Ai(r[M],b)&&(a.push(M),z.push(r[M]));z.length>0&&h.push(Li(z)),l=l.addScaledVector(f,g)}let y=new Float32Array(r.length*3);r.forEach((x,b)=>{y[b*3]=x.x,y[b*3+1]=x.y,y[b*3+2]=x.z});let w=new Gt.BufferGeometry;w.setAttribute("position",new Gt.BufferAttribute(y,3)),w.rotateX(-Math.PI/2),e.add(new Gt.Points(w,new Gt.PointsMaterial({color:xr(),size:.02})));let[m,p]=Fi(h,{plane:"xy",trimRatio:0});hr(m,p,e)}};function br(t,e="xy"){if(e==="xy")return{x:t.x,y:t.y};if(e==="xz")return{x:t.x,y:t.z};if(e==="yz")return{x:t.y,y:t.z};throw new Error(`Unsupported plane: ${e}`)}function _i(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=br(t,n),r=e.map(l=>br(l,n)),s=!1,i=!1;for(let l=0;l<4;l++){let u=r[l],f=r[(l+1)%4],d=_i(u,f,o);if(d>1e-9&&(s=!0),d<-1e-9&&(i=!0),s&&i)return!1}return!0}function Li(t){if(!t||t.length===0)return null;let e=new Gt.Vector3(0,0,0);for(let n of t)Array.isArray(n)?(e.x+=n[0],e.y+=n[1],e.z+=n[2]):(e.x+=n.x,e.y+=n.y,e.z+=n.z);return e.divideScalar(t.length),e}function Bi(t){return t instanceof Gt.Vector3?t.clone():Array.isArray(t)?new Gt.Vector3(t[0],t[1],t[2]):new Gt.Vector3(t.x,t.y,t.z)}function ki(t,e="xy"){let n=Bi(t);if(e==="xy")return{x:n.x,y:n.y,up:n.z};if(e==="xz")return{x:n.x,y:n.z,up:n.y};if(e==="yz")return{x:n.y,y:n.z,up:n.x};throw new Error(`Unsupported plane: ${e}`)}function wr(t,e,n,o="xy"){if(o==="xy")return new Gt.Vector3(t,e,n);if(o==="xz")return new Gt.Vector3(t,n,e);if(o==="yz")return new Gt.Vector3(n,t,e);throw new Error(`Unsupported plane: ${o}`)}function 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,f=l-t,d=Math.hypot(u,f);return d<1e-12?{x:1,y:0}:{x:u/d,y:f/d}}function Fi(t,e={}){let{plane:n="xy",trimRatio:o=0}=e;if(!t||t.length<2)return null;let r=t.map(V=>ki(V,n)),s=0,i=0,l=0;for(let V of r)s+=V.x,i+=V.y,l+=V.up;s/=r.length,i/=r.length,l/=r.length;let u=0,f=0,d=0;for(let V of r){let C=V.x-s,_=V.y-i;u+=C*C,f+=C*_,d+=_*_}u/=r.length,f/=r.length,d/=r.length;let c=Oi(u,f,d),a={x:-c.y,y:c.x},h=[];for(let V of r){let C=V.x-s,_=V.y-i,A=C*c.x+_*c.y,B=C*a.x+_*a.y;h.push({s:A,t:B,up:V.up})}h.sort((V,C)=>V.s-C.s);let g=h.length,y=Math.floor(g*o),w=Math.ceil(g*(1-o))-1;y=Math.max(0,Math.min(g-1,y)),w=Math.max(0,Math.min(g-1,w));let m=h[y],p=h[w],x=(()=>{let V=h.map(_=>_.t).sort((_,A)=>_-A),C=Math.floor(V.length/2);return V.length%2===0?(V[C-1]+V[C])*.5:V[C]})(),b=(()=>{let V=h.map(_=>_.up).sort((_,A)=>_-A),C=Math.floor(V.length/2);return V.length%2===0?(V[C-1]+V[C])*.5:V[C]})(),z=m.s,M=p.s,P=x,E=x,S=b,I=b,H=s+c.x*z+a.x*P,D=i+c.y*z+a.y*P,T=s+c.x*M+a.x*E,R=i+c.y*M+a.y*E,v=wr(H,D,S,n),W=wr(T,R,I,n);return[v,W]}var Ni=async(t,e,n,o,r)=>{if(gr(t,o,r),t.length<=0||e.length<=0)return t;n||(n=[]);for(let m of t){let p=[],x=o.readLineById(m.id);if(x.checkResults=o.getLineCheckReultsById(m.id),m.checkResults=x.checkResults,!(!m.checkResults||m.checkResults.length<=0)){for(let b=0;b<m.checkResults.length;b++){let S=function(R){for(;E[R]!==R;)E[R]=E[E[R]],R=E[R];return R},z=m.checkResults[b];if(!z.originalVertices||z.originalVertices.length==0)continue;let M=[];z.originalVertices.forEach(R=>{let v=[];R.forEach(W=>{v.push(new N.Vector3(W.x,W.y,W.z))}),M.push(v)});let P=M.length,E=Array.from({length:P},(R,v)=>v);for(let R=0;R<P;R++)for(let v=R+1;v<P;v++){let W=M[R],V=M[v];if(W.some(_=>V.some(A=>_.equals(A)))){let _=S(R),A=S(v);_!==A&&(E[_]=A)}}let I=new Map,H=-1,D=-1;for(let R=0;R<P;R++){let v=S(R);I.has(v)||I.set(v,{points:[],area:0,index:-1,gridWidth:-1,gridHeight:-1,centerPts:[],facePoints:[],boxArea:-1,totalInPlaneNum:-1});let W=I.get(v),[V,C,_,A]=M[R],B=new N.Vector3().add(V).add(C).add(_).add(A).multiplyScalar(.25);if(W.points.push(...M[R]),W.area+=V.distanceTo(C)*V.distanceTo(A),W.index=b,W.centerPts.push(B),H==-1||D==-1){let k=new N.Vector3().subVectors(V,C).normalize();D=V.distanceTo(A),H=V.distanceTo(C);let F=$t(k,new N.Vector3(0,0,1));F&&F.parallel&&([D,H]=[H,D])}W.gridWidth=H,W.gridHeight=D}let T=I.values();for(let R of I.values()){let{facePoints:v,boxArea:W,totalInPlaneNum:V}=pr(R.points,R.gridWidth,R.gridHeight,R.centerPts);R.centerPts=null,R.facePoints=v,R.boxArea=W,R.totalInPlaneNum=V}p.push(...T)}m.checkResults=null,m.mergeCheckRegion=p}}let s=[];for(let m=0;m<n.length;m++){let p=n[m];if(p.isFindBeam=!1,p.category=="door"){let x=[];p.coordinatesByArea.coordinates.forEach(E=>{x.push(new N.Vector3(E.x,E.y,E.z))}),x[0].equals(x[x.length-1])&&x.pop();let b=x[0].distanceTo(x[1]),z=x[0].distanceTo(x[3]);z>b&&([b,z]=[z,b],x=[x[0],x[3],x[2],x[1]]);let M=At(x[0],x[3],!0),P=At(x[1],x[2],!0);s.push({doorStartPt:M,doorEndPt:P,boxPoints:x,minZ:p.coordinatesByArea.heightData.minZ,maxZ:p.coordinatesByArea.heightData.maxZ,index:m,isFind:!1,inWall:!1})}}for(let m=0;m<s.length;m++){let p=s[m];for(let x=0;x<t.length;x++){if(t[x].length<.5)continue;let b=[],z=At(t[x].start,t[x].end,!0);b.push(z),b.push(At(z,t[x].start,!0)),b.push(At(z,t[x].end,!0));let M=!1,P=p.boxPoints.length;for(let E=0;E<b.length;E++){let S=b[E].x,I=b[E].y;for(let H=0,D=P-1;H<P;D=H++){let T=p.boxPoints[H].x,R=p.boxPoints[H].y,v=p.boxPoints[D].x,W=p.boxPoints[D].y;R>I!=W>I&&S<(v-T)*(I-R)/(W-R)+T&&(M=!M)}if(M)break}if(M){let E=new N.Vector3(t[x].start.x,t[x].start.y,0),S=new N.Vector3(t[x].end.x,t[x].end.y,0),I=p.doorStartPt.distanceTo(p.doorEndPt),H=E.distanceTo(S),D=Xt(p.doorStartPt,p.doorEndPt,E,S);if(Math.abs(H-I)<.5&&D&&D.angleDeg<15){p.doorStartPt=new N.Vector3(t[x].start.x,t[x].start.y,0),p.doorEndPt=new N.Vector3(t[x].end.x,t[x].end.y,0);break}else if(Math.abs(H-I)>1.3&&D&&D.angleDeg<15){let T=ye(p.doorStartPt,p.doorEndPt,E,S,{parallelAngleMax:N.MathUtils.degToRad(15)}),R=p.doorStartPt.distanceTo(E),v=p.doorStartPt.distanceTo(S),W=p.doorEndPt.distanceTo(E),V=p.doorEndPt.distanceTo(S),C=R<.2||v<.2||W<.2||V<.2;if(T&&T.type=="collinear_overlap"&&T.maxPerpendicularDistance<.1&&!C){p.inWall=!0;break}else{let _=new N.Line3(E,S),A=_.closestPointToPoint(p.doorStartPt,!0,new N.Vector3),B=_.closestPointToPoint(p.doorEndPt,!0,new N.Vector3),k=A.distanceTo(p.doorStartPt),F=B.distanceTo(p.doorEndPt);if(k<.1||F<.1){p.inWall=!0;break}}}}else continue}}let i=0,l=[],u=[],f=[],d=[],c=.15;for(let m=0;m<t.length;m++){let p=t[m];if(p.noDetection)continue;let x=o.readLineById(p.id);if(x.originalPoints=o.getOriginalPointsById(p.id),x.checkResults=o.getLineCheckReultsById(p.id),p.originalPoints=x.originalPoints,p.checkResults=x.checkResults,x=null,p.doorAndBeamData=[],p.doorAndBeamIdToCheckResults=[],!p.mergeCheckRegion||p.mergeCheckRegion.length==0)continue;p.completePointAreaPercentage=-1;let b=new N.Box3;b.setFromPoints(p.originalPoints);let z=b.max.z,M=b.min.z,P=new N.Vector3(p.start.x,p.start.y,p.start.z),E=new N.Vector3(p.end.x,p.end.y,p.end.z),S=p.rooftopPz-p.start.z,I=0;for(let D of p.mergeCheckRegion){let T=D.facePoints,R=D.boxArea,v=D.totalInPlaneNum;if(!T||T.length<=0)continue;let W=T[0].distanceTo(T[1]),V=T[0].distanceTo(T[3]),C=D.gridHeight*(V/D.gridHeight/3*2)+D.gridHeight/2,_=new N.Vector3(T[0].x,T[0].y,T[0].z+C),A=new N.Vector3(T[1].x,T[1].y,T[1].z+C),B=new N.Line3(_,A),k=[],F=new N.Vector3;D.points.forEach(j=>{B.closestPointToPoint(j,!0,F).distanceTo(j)<D.gridHeight+.01&&k.push(j)});let L=[],O=[];for(;;){let j=[];for(let Z=0;Z<k.length;Z++)O.includes(Z)||j.length==0&&(j.push(k[Z]),O.push(Z));for(let Z=0;Z<k.length;Z++)if(!O.includes(Z)){for(let Y=0;Y<j.length;Y++)if(k[Z].distanceTo(j[Y])<D.gridWidth+.01){j.push(k[Z]),O.push(Z),Z=-1;break}}if(j.length==0)break;L.push(j)}let $=[];for(let j=0;j<L.length;j++){let Z={lineSt:new N.Vector3,lineEd:new N.Vector3,facePoints:[]},Y=We(L[j]);Array.isArray(Y)&&Y.length==2&&(Z.lineSt=Y[0],Z.lineEd=Y[1],Z.facePoints.push(new N.Vector3(Y[0].x,Y[0].y,T[0].z)),Z.facePoints.push(new N.Vector3(Y[1].x,Y[1].y,T[0].z)),Z.facePoints.push(new N.Vector3(Y[1].x,Y[1].y,T[2].z)),Z.facePoints.push(new N.Vector3(Y[0].x,Y[0].y,T[2].z)),$.push(Z))}I+=D.area;let G=0;if(v!=0&&(G=D.gridHeight*D.gridWidth*v),(D.area-G)/R*100>70&&$.length==1||$.length>1)for(let j=0;j<$.length;j++){let Z=$[j],Y=Z.facePoints[0].distanceTo(Z.facePoints[1]),it=Z.facePoints[0].distanceTo(Z.facePoints[3]),ht=Y/p.length*100,Tt=p.rooftopPz-Z.facePoints[2].z;if(it<1.5||z<Z.facePoints[2].z||Tt>S/3*2)continue;let nt=!1,wt=!1,zt=!1,Dt=new N.Vector3(0,0,0),Pt=new N.Vector3(0,0,0),Mt=!1,It=[],ot=Z.facePoints[2].clone(),ft=Z.facePoints[3].clone(),rt=Z.facePoints[0].clone(),tt=Z.facePoints[1].clone(),ae=!1,bt=-1;if(Math.abs(Z.facePoints[0].z-p.start.z)<.25){let Jt=!1;for(let st=0;st<e.length;st++){let Ct=st+1;if(Ct>=e.length)continue;let Nt=new N.Vector3(e[st].x,e[st].y,e[st].z),at=new N.Vector3(e[Ct].x,e[Ct].y,e[Ct].z);if(Me(new N.Vector3(Nt.x,Nt.y,0),new N.Vector3(at.x,at.y,0),new N.Vector3(Z.facePoints[0].x,Z.facePoints[0].y,0),new N.Vector3(Z.facePoints[1].x,Z.facePoints[1].y,0),.1)!=null){Jt=!0;break}}let{newOriginalPoints:he}=wn(rt,tt,p.originalPoints),St=[],ee=[];if(he.forEach(st=>{st.z>=ot.z?St.push(st):st.z<=rt.z&&ee.push(st)}),St.length<20)continue;let et=p.rooftopPz-ot.z,me=ot.clone();me.z+=et;let Le=ot.distanceTo(ft),Be=new N.Vector3().subVectors(ft,ot).normalize(),gn=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(Le)))),ke=Le/gn,pe=[],nn=[];for(let st=0;st<gn;st++)pe.push(new N.Vector3(ot.x,ot.y,ot.z+et/5).addScaledVector(Be,ke*st)),pe.push(new N.Vector3(me.x,me.y,me.z-et/5).addScaledVector(Be,ke*st));let on=pe.length;for(let st=0;st<St.length;st++)for(let Ct=0;Ct<pe.length;Ct++)if(new N.Vector3(St[st].x,St[st].y,St[st].z).distanceTo(pe[Ct])<.05){nn.push(pe[Ct]),pe.splice(Ct,1);break}if(nn.length/on<.5)continue;if(Y>.17&&p.length>.5){let st=Zt(P,rt),Ct=Zt(P,tt),Nt=Zt(E,rt),at=Zt(E,tt),X=.15,Et=10;if(st<X||Ct<X)if(St.length>10){let yt=new N.Vector3(p.start.x,p.start.y,0),ut=new N.Vector3(p.end.x,p.end.y,0),pt=new N.Vector3().subVectors(yt,ut).normalize(),kt=new N.Vector3,gt=1/0,Ft=-1,xt=!1,dt=!1;for(let J=0;J<t.length;J++){if(J==m)continue;let mt=new N.Vector3(t[J].start.x,t[J].start.y,0),lt=new N.Vector3(t[J].end.x,t[J].end.y,0),vt=Me(yt,ut,mt,lt,.1),Wt=ie(yt,ut,mt,lt);if(vt!=null){if(Wt&&Wt.angle>85){let Ht=vt.point.distanceTo(yt),Lt=vt.point.distanceTo(ut);if(Ht<.3){dt=!0,gt=1/0,Ft=-1;break}}continue}if(Wt&&Wt.angle>85){let Lt=new N.Line3(mt,lt).closestPointToPoint(yt,!0,kt),Ot=Xt(yt,ut,Lt,yt);if(!Ot||Ot.direction!="same")continue;let re=yt.clone().addScaledVector(pt,Et),Kt=ut.clone().addScaledVector(pt.clone().negate(),Et),se=new N.Vector3().subVectors(lt,mt).normalize(),te=mt.clone().addScaledVector(se.clone().negate(),.03),Re=lt.clone().addScaledVector(se,.03),le=Me(re,Kt,te,Re);if(le==null)continue;let ne=yt.distanceTo(le.point);ne<gt&&(gt=ne,Ft=J)}else if(Wt&&Wt.angle<5){let Ht=new N.Vector3(rt.x,rt.y,0),Lt=new N.Vector3(tt.x,tt.y,0),Ot=Zt(Ht,mt),re=Zt(Ht,lt),Kt=Zt(Lt,mt),se=Zt(Lt,lt),te=Xt(yt,ut,mt,Ht),Re=!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 yn=[];for(let xe=0;xe<t[J].checkResults[ne].originalVertices.length;xe++){let De=Fn(t[J].checkResults[ne].originalVertices[xe]);De.z=0,yn.push(De)}let ge=We(yn);if(ge.length==2){let xe=Zt(Ht,ge[0]),De=Zt(Ht,ge[1]),go=Zt(Lt,ge[0]),xo=Zt(Lt,ge[1]);if(xe<.2||De<.2||go<.2||xo<.2){Re=!0;break}}}t[J].checkResults=null}if(te&&te.direction=="same"&&!Re&&(Ot<.1||re<.1||Kt<.1||se<.1)){xt=!0,gt=1/0,Ft=-1;break}}}if(gt!=1/0&><2&&(p.length-Y>.2||p.length-Y<.02)&><Y*2)t[Ft].length>.25&&Y+gt>.5&&(ae=!0,st<X?(ft=ft.addScaledVector(pt,gt),rt=rt.addScaledVector(pt,gt)):(ot=ot.addScaledVector(pt,gt),tt=tt.addScaledVector(pt,gt)));else{if(!xt&&!dt&&p.length-Y>.1)continue;if(!xt&&!dt&&p.length-Y<.1&&p.length<1.8)continue}}else continue;if(Nt<X||at<X)if(St.length>10){let yt=new N.Vector3(p.start.x,p.start.y,0),ut=new N.Vector3(p.end.x,p.end.y,0),pt=new N.Vector3().subVectors(ut,yt).normalize(),kt=new N.Vector3,gt=1/0,Ft=-1,xt=!1,dt=!1;for(let J=0;J<t.length;J++){if(J==m)continue;let mt=new N.Vector3(t[J].start.x,t[J].start.y,0),lt=new N.Vector3(t[J].end.x,t[J].end.y,0),vt=Me(yt,ut,mt,lt,.03),Wt=ie(yt,ut,mt,lt);if(vt!=null){if(Wt&&Wt.angle>85){let Ht=vt.point.distanceTo(yt);if(vt.point.distanceTo(ut)<.3){dt=!0,gt=1/0,Ft=-1;break}}continue}if(Wt&&Wt.angle>85){let Lt=new N.Line3(mt,lt).closestPointToPoint(ut,!0,kt),Ot=Xt(ut,yt,Lt,ut);if(!Ot||Ot.direction!="same")continue;let re=yt.clone().addScaledVector(pt.clone().negate(),Et),Kt=ut.clone().addScaledVector(pt,Et),se=new N.Vector3().subVectors(lt,mt).normalize(),te=mt.clone().addScaledVector(se.clone().negate(),.03),Re=lt.clone().addScaledVector(se,.03),le=Me(re,Kt,te,Re);if(le==null)continue;let ne=ut.distanceTo(le.point);ne<gt&&(gt=ne,Ft=J)}else if(Wt&&Wt.angle<5){let Ht=new N.Vector3(rt.x,rt.y,0),Lt=new N.Vector3(tt.x,tt.y,0),Ot=Zt(Ht,mt),re=Zt(Ht,lt),Kt=Zt(Lt,mt),se=Zt(Lt,lt),te=Xt(ut,yt,mt,Ht),Re=!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 yn=[];for(let xe=0;xe<t[J].checkResults[ne].originalVertices.length;xe++){let De=Fn(t[J].checkResults[ne].originalVertices[xe]);De.z=0,yn.push(De)}let ge=We(yn);if(ge.length==2){let xe=Zt(Ht,ge[0]),De=Zt(Ht,ge[1]),go=Zt(Lt,ge[0]),xo=Zt(Lt,ge[1]);if(xe<.2||De<.2||go<.2||xo<.2){Re=!0;break}}}t[J].checkResults=null}if(te&&te.direction=="same"&&!Re&&(Ot<.1||re<.1||Kt<.1||se<.1)){xt=!0,gt=1/0,Ft=-1;break}}}if(gt!=1/0&><2&&(p.length-Y>.2||p.length-Y<.02)&><Y*2)t[Ft].length>.25&&Y+gt>.5&&(ae=!0,Nt<X?(ft=ft.addScaledVector(pt,gt),rt=rt.addScaledVector(pt,gt)):(ot=ot.addScaledVector(pt,gt),tt=tt.addScaledVector(pt,gt)));else{if(!xt&&!dt&&p.length-Y>.1)continue;if(!xt&&!dt&&p.length-Y<.1&&p.length<1.8)continue}}else continue;Y=ft.distanceTo(ot)}if(ht<85&&Y>.3||Y>.7&&it>S-S/2){if(!p.isLine2){if(Y<3.5)for(let st=0;st<s.length;st++){let Ct=new N.Vector3(s[st].doorStartPt.x,s[st].doorStartPt.y,0),Nt=new N.Vector3(s[st].doorEndPt.x,s[st].doorEndPt.y,0),at=new N.Vector3(Z.facePoints[0].x,Z.facePoints[0].y,0),X=new N.Vector3(Z.facePoints[1].x,Z.facePoints[1].y,0),Et=Z.facePoints[2].z<s[st].maxZ||Math.abs(Z.facePoints[2].z-s[st].maxZ)<.3,yt=Math.abs(Z.facePoints[2].z-s[st].maxZ)>.2;if(Et){let ut=ye(Ct.clone(),Nt.clone(),at.clone(),X.clone(),{distanceThreshold:2});if(ut&&ut.type=="collinear_gap"){let pt=At(Ct,Nt),kt=new N.Line3(new N.Vector3(p.start.x,p.start.y,0),new N.Vector3(p.end.x,p.end.y,0)),gt=new N.Vector3,Ft=kt.closestPointToPoint(pt,!0,gt);if(pt.distanceTo(Ft)<.15){let dt=at.distanceTo(Ct),J=X.distanceTo(Ct);if(dt>.25&&J>.25){let vt=at.distanceTo(Nt),Wt=X.distanceTo(Nt);if(vt>.2&&Wt>.2)continue}wt=!0,Mt=!0,It.push(s[st].index),s[st].isFind=!0,bt=st,zt=n[s[st].index].isFindBeam,n[s[st].index].isFindBeam=!0;let mt=new N.Vector3().subVectors(at,X).normalize(),lt=Ct.distanceTo(Nt)-ut.overlap;J<dt&&mt.negate(),dt>J?(ot=Z.facePoints[2].clone().addScaledVector(mt,lt),ft=Z.facePoints[3].clone(),rt=ft.clone(),tt=ot.clone(),rt.z=tt.z=Z.facePoints[0].z):(ot=Z.facePoints[2].clone(),ft=Z.facePoints[3].clone().addScaledVector(mt,lt),rt=ft.clone(),tt=ot.clone(),rt.z=tt.z=Z.facePoints[0].z)}}else if(ut&&ut.type=="collinear_overlap"&&ut.maxPerpendicularDistance<.35){let pt=at.distanceTo(X),kt=Nt.distanceTo(Ct);if(Math.abs(pt-ut.overlap)<.25||Math.abs(kt-ut.overlap)<.25){if(kt>pt&&Math.abs(kt-ut.overlap)>1){let gt=at.distanceTo(Ct),Ft=at.distanceTo(Nt),xt=X.distanceTo(Ct),dt=X.distanceTo(Nt),J=gt<Ft?gt:Ft,mt=xt<dt?xt:dt,lt=new N.Vector3().subVectors(at,X).normalize(),vt=kt-ut.overlap;J<mt?(lt.negate(),ot=Z.facePoints[2].clone().addScaledVector(lt,vt),ft=Z.facePoints[3].clone(),rt=ft.clone(),tt=ot.clone(),rt.z=tt.z=Z.facePoints[0].z):(ot=Z.facePoints[2].clone(),ft=Z.facePoints[3].clone().addScaledVector(lt,vt),rt=ft.clone(),tt=ot.clone(),rt.z=tt.z=Z.facePoints[0].z)}Y>1.5&&(wt=!0,Mt=!0,It.push(s[st].index),s[st].isFind=!0,zt=n[s[st].index].isFindBeam,n[s[st].index].isFindBeam=!0,bt=st)}}}}if(!Mt&&Y<1.5)for(let st=0;st<s.length;st++){if(s[st].inWall)continue;let Ct=new N.Vector3(s[st].doorStartPt.x,s[st].doorStartPt.y,0),Nt=new N.Vector3(s[st].doorEndPt.x,s[st].doorEndPt.y,0),at=new N.Vector3(ft.x,ft.y,0),X=new N.Vector3(ot.x,ot.y,0),Et=new N.Vector3().subVectors(Ct,Nt).normalize(),yt=new N.Vector3().subVectors(at,X).normalize(),ut=.25,pt=Ct.clone().addScaledVector(Et,ut),kt=Nt.clone().addScaledVector(Et.clone().negate(),ut),gt=at.clone().addScaledVector(yt,ut),Ft=X.clone().addScaledVector(yt.clone().negate(),ut);if(Xt(pt,kt,gt,Ft).isParallel)continue;let dt=Me(pt,kt,gt,Ft),J=!0,mt=Ct.distanceTo(at),lt=Ct.distanceTo(X),vt=Nt.distanceTo(at),Wt=Nt.distanceTo(X);if((mt<c||lt<c||vt<c||Wt<c||dt)&&J){let Lt=new N.Line3(at,X);if(mt<c||vt<c)if(Dt=at.clone(),mt<c){let Ot=Lt.closestPointToPoint(Nt,!1,new N.Vector3);Pt=new N.Vector3().subVectors(Nt,Ot).normalize()}else{let Ot=Lt.closestPointToPoint(Ct,!1,new N.Vector3);Pt=new N.Vector3().subVectors(Ct,Ot).normalize()}else if(lt<c||Wt<c)if(Dt=X.clone(),lt<c){let Ot=Lt.closestPointToPoint(Nt,!1,new N.Vector3);Pt=new N.Vector3().subVectors(Nt,Ot).normalize()}else{let Ot=Lt.closestPointToPoint(Ct,!1,new N.Vector3);Pt=new N.Vector3().subVectors(Ct,Ot).normalize()}else if(dt){let Ot=dt.point.distanceTo(at),re=dt.point.distanceTo(X),Kt=dt.point.distanceTo(pt),se=dt.point.distanceTo(kt);if(Ot<re?Dt=at.clone():Dt=X.clone(),Kt<se){let te=Lt.closestPointToPoint(kt,!1,new N.Vector3);Pt=new N.Vector3().subVectors(kt,te).normalize()}else{let te=Lt.closestPointToPoint(pt,!1,new N.Vector3);Pt=new N.Vector3().subVectors(pt,te).normalize()}}zt=n[s[st].index].isFindBeam,n[s[st].index].isFindBeam=!0,wt=!0,s[st].isFind=!0,bt=st}}}(wt||Jt||Math.abs(it-S)>.1&&it>S/3&&Y>.3)&&(nt=!0)}}if(nt){{let at=new N.Vector3().subVectors(rt,tt),X=new N.Vector3().subVectors(tt,rt),Et=1/0,yt=1/0,ut=rt.clone(),pt=tt.clone(),kt=[],gt=[],Ft=new N.Line3(ot,ft),xt=new N.Vector3,dt=999999;if(p.originalPoints.forEach(J=>{if(J.z-rt.z<it/2+.1&&J.z-rt.z>it/2-.1&&kt.push(J),J.z>ot.z){let mt=Ft.closestPointToPoint(J,!0,xt),lt=new N.Vector3().subVectors(mt,ot),vt=new N.Vector3().subVectors(mt,ft),Wt=$t(at,vt),Ht=$t(X,lt);Wt&&Wt.parallel&&!Wt.sameDirection&&Ht&&Ht.parallel&&!Ht.sameDirection&>.push(J)}}),kt.length>0){let{newProjectPoints:J}=wn(rt,tt,kt);for(let mt of J)mt.z=rt.z;J.forEach(mt=>{let lt=new N.Vector3(mt.x,mt.y,rt.z),vt=new N.Vector3().subVectors(lt,tt),Wt=new N.Vector3().subVectors(lt,rt),Ht=$t(at,Wt),Lt=$t(X,vt);if(Ht&&Ht.parallel&&Ht.sameDirection){let Ot=lt.distanceTo(rt);Ot<Et&&(Et=Ot,ut=lt)}else if(Lt&&Lt.parallel&&Lt.sameDirection){let Ot=lt.distanceTo(tt);Ot<yt&&(yt=Ot,pt=lt)}})}if(ut.equals(rt)||(rt=ut,ft=new N.Vector3(rt.x,rt.y,ft.z)),pt.equals(tt)||(tt=pt,ot=new N.Vector3(tt.x,tt.y,ot.z)),gt.length>10){let{newOnLinePoints:J}=wn(ft,ot,gt);for(let mt=0;mt<J.length;mt++){let vt=Ft.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<f.length;at++){let X=ye(f[at].start,f[at].end,rt,tt);X&&X.type=="collinear_overlap"&&X.maxPerpendicularDistance<.07&&(Jt=!0)}if(Jt){bt!=-1&&(zt||(n[s[bt].index].isFindBeam=!1,s[bt].isFind=!1));continue}let he=tt.distanceTo(rt);if(he<.4&&!wt||he<.3&&wt)continue;u.includes(m)||u.push(m);let St="",ee=wt?"singleDoor":"";ee=Mt?"pullOutDoor":ee;let et={id:i,beamStart:ot,beamEnd:ft,beamHeight:p.rooftopPz-ot.z,doorStart:rt,doorEnd:tt,doorHeight:it,nearId:-1,type:St,isExtend:ae,isDoor:wt,isPullOutDoor:Mt,pcbDoorIndexs:It,beamNearWallVec:new N.Vector3(0,0,0),doorType:ee,doorOpenEndPoint:Dt,doorOpenVector:Pt,lineIsOnlyBeam:!1};if(et.beamHeight<.1)continue;let me=1/0,Le=!1,Be=new N.Vector3,gn=new N.Vector3,ke=-1,pe=-1,nn=-1,on=!1,xn=!1;if(!Le){let at=new N.Line3(rt.clone(),tt.clone()),X=-1;for(let Et=0;Et<t.length;Et++){if(t[Et].length<.5||Et==m)continue;let yt=new N.Vector3(t[Et].start.x,t[Et].start.y,t[Et].start.z),ut=new N.Vector3(t[Et].end.x,t[Et].end.y,t[Et].end.z),pt=ye(yt,ut,rt,tt),kt=Xt(yt,ut,rt,tt);if(pt&&pt.maxPerpendicularDistance<.5){if(kt&&kt.isParallel){let lt=new N.Line3(yt,ut),vt=new N.Vector3(rt.x,rt.y,yt.z),Wt=lt.closestPointToPoint(vt,!0,new N.Vector3),Ht=ie(Wt,vt,rt,tt);Ht&&Ht.angle>85&&(et.beamNearWallVec=new N.Vector3().subVectors(Wt,vt).normalize(),et.beamStart.z>t[Et].rooftopPz-.03&&Y>1?xn=!0:xn=!1)}let gt=[],Ft=o.readLineById(t[Et].id);Ft.originalPoints=o.getOriginalPointsById(t[Et].id),t[Et].originalPoints=Ft.originalPoints,Ft=null,t[Et].originalPoints.forEach(lt=>{lt.z>rt.z+.2&<.z<rt.z+it/2&>.push(new N.Vector3(lt.x,lt.y,rt.z))}),t[Et].originalPoints=null;let xt=new N.Vector3,dt=[],J=[];for(let lt=0;lt<gt.length;lt++){let vt=at.closestPointToPoint(gt[lt],!0,xt);vt.distanceTo(gt[lt])<.15&&(dt.push(gt[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=We(dt);if(mt.length==2){let lt=mt[0].distanceTo(mt[1]);if(Math.abs(lt-at.distance())<.3){X=pt.maxPerpendicularDistance;let vt=new N.Line3(yt,ut),Wt=new N.Vector3(rt.x,rt.y,yt.z),Ht=vt.closestPointToPoint(Wt,!0,new N.Vector3);if(et.beamNearWallVec=new N.Vector3().subVectors(Ht,Wt).normalize(),et.beamStart.z>t[Et].rooftopPz-.03&&Y>.8)xn=!0,on=!0;else if(Jt=!0,bt!=-1&&(zt||(n[s[bt].index].isFindBeam=!1,s[bt].isFind=!1)),pe!=-1&&nn!=-1){let Lt=t[pe].doorAndBeamData[nn];Lt.nearId=-1}break}}if(Jt)break}else pt&&pt.type=="collinear_overlap"&&pt.maxPerpendicularDistance>.3&&pt.maxPerpendicularDistance<.7&&(on=!0)}if(Jt){if(Y<1.5||X<.08)continue;on=!0}}let st=!1;if(ke!=-1)for(let at=0;at<d.length&&!(d[at].length==1&&(d[at][0].id==i?(d[at].push({id:ke,beamStart:Be,beamEnd:gn}),st=!0):d[at][0].id==ke&&(d[at].push({id:i,beamStart:ot,beamEnd:ft}),st=!0),st));at++);st||d.push([{id:i,beamStart:ot,beamEnd:ft}]);let Ct=et.doorStart.distanceTo(et.doorEnd),Nt=qe(p.originalPoints);if(et.lineIsOnlyBeam=Nt.minZ>p.start.z&&Nt.minZ-p.start.z>1,wt?St="door":Ct>1.5||ae?St="beam":St=on&&Ct>.8?"beam":"hole",St!="beam"&&t[m].isLine2)continue;et.type=St,et.wallBelowBeam=xn;for(let at=0;at<l.length;at++){let X=t[l[at].linesIndex].doorAndBeamData[l[at].doorIndex];if(X.nearId!=-1||et.type=="beam"&&X.type!="beam"||et.type!="beam"&&X.type=="beam")continue;let Et=Xt(ot.clone(),ft.clone(),X.beamStart.clone(),X.beamEnd.clone());if(Et&&Et.isParallel){let yt=ot.distanceTo(ft),ut=X.beamStart.distanceTo(X.beamEnd),pt=new N.Line3(ot.clone(),ft.clone());pt.start.z=0,pt.end.z=0;let kt=At(X.beamStart,X.beamEnd,!0);ut>yt&&(pt.start=new N.Vector3(X.beamStart.x,X.beamStart.y,0),pt.end=new N.Vector3(X.beamEnd.x,X.beamEnd.y,0),kt=At(ot,ft,!0));let gt=new N.Vector3,Ft=pt.closestPointToPoint(kt,!0,gt),xt=Ft.distanceTo(kt),dt=new N.Vector3().subVectors(kt,Ft).normalize(),J=dt.clone().negate(),mt=kt.clone().addScaledVector(J,xt+.1),lt=Me(pt.start,pt.end,kt,mt),vt=!wt&&!X.isDoor&&(yt>ut*2||ut>yt*2);if(xt<.4&<!=null&&!vt){let Wt=!1;for(let Kt=0;Kt<p.doorAndBeamData.length;Kt++)if(p.doorAndBeamData[Kt].id==X.id){Wt=!0;break}if(Wt)continue;X.nearId=i,et.nearId=X.id;let Ht=.8;(X.isDoor||et.isDoor)&&(X.isDoor=!0,et.isDoor=!0),X.doorType!=""?et.doorType=X.doorType:et.doorType!=""&&(X.doorType=et.doorType),X.isPullOutDoor?et.isPullOutDoor=!0:et.isPullOutDoor&&(X.isPullOutDoor=!0);let Lt=It.some(Kt=>X.pcbDoorIndexs.includes(Kt)),Ot=!1,re=!1;if(et.type=="beam"&&X.type=="beam"){let Kt=o.readLineById(t[l[at].linesIndex].id);Kt.originalPoints=o.getOriginalPointsById(t[l[at].linesIndex].id),t[l[at].linesIndex].originalPoints=Kt.originalPoints,Kt=null;let se=qe(t[l[at].linesIndex].originalPoints),te=qe(p.originalPoints);t[l[at].linesIndex].originalPoints=null,se.minZ>t[l[at].linesIndex].start.z&&se.minZ-t[l[at].linesIndex].start.z>1&&te.minZ>p.start.z&&te.minZ-p.start.z>1&&(Ot=yt>ut,re=yt<ut,ut>yt&&(et.isExtend=!0),yt>ut&&(t[l[at].linesIndex].isExtend=!0))}yt<ut&&!re||Ot?(Ot&&(J=J.negate(),dt=dt.negate()),yt>Ht&&!X.isPullOutDoor?(X.beamStart=ot.clone().addScaledVector(J,xt),X.beamEnd=ft.clone().addScaledVector(J,xt),X.doorStart=rt.clone().addScaledVector(J,xt),X.doorEnd=tt.clone().addScaledVector(J,xt),X.doorHeight=et.doorHeight,X.beamStart.z=X.beamEnd.z=X.doorStart.z+X.doorHeight,X.doorOpenEndPoint=et.doorOpenEndPoint.clone(),X.doorOpenVector=et.doorOpenVector.clone()):!Mt||Mt&&X.isPullOutDoor&&Lt?(et.beamStart=X.beamStart.clone().addScaledVector(dt,xt),et.beamEnd=X.beamEnd.clone().addScaledVector(dt,xt),et.doorStart=X.doorStart.clone().addScaledVector(dt,xt),et.doorEnd=X.doorEnd.clone().addScaledVector(dt,xt),et.doorHeight=X.doorHeight,et.beamStart.z=et.beamEnd.z=et.doorStart.z+et.doorHeight,et.doorOpenEndPoint=X.doorOpenEndPoint.clone(),et.doorOpenVector=X.doorOpenVector.clone()):(X.beamStart=ot.clone().addScaledVector(J,xt),X.beamEnd=ft.clone().addScaledVector(J,xt),X.doorStart=rt.clone().addScaledVector(J,xt),X.doorEnd=tt.clone().addScaledVector(J,xt),X.doorHeight=et.doorHeight,X.beamStart.z=X.beamEnd.z=X.doorStart.z+X.doorHeight,X.doorOpenEndPoint=et.doorOpenEndPoint.clone(),X.doorOpenVector=et.doorOpenVector.clone())):(yt>ut&&!Ot||re)&&(re&&(J=J.negate(),dt=dt.negate()),ut>Ht&&!Mt?(et.beamStart=X.beamStart.clone().addScaledVector(J,xt),et.beamEnd=X.beamEnd.clone().addScaledVector(J,xt),et.doorStart=X.doorStart.clone().addScaledVector(J,xt),et.doorEnd=X.doorEnd.clone().addScaledVector(J,xt),et.doorHeight=X.doorHeight,et.beamStart.z=et.beamEnd.z=et.doorStart.z+et.doorHeight,et.doorOpenEndPoint=X.doorOpenEndPoint.clone(),et.doorOpenVector=X.doorOpenVector.clone()):!X.isPullOutDoor||Mt&&X.isPullOutDoor&&Lt?(X.beamStart=ot.clone().addScaledVector(dt,xt),X.beamEnd=ft.clone().addScaledVector(dt,xt),X.doorStart=rt.clone().addScaledVector(dt,xt),X.doorEnd=tt.clone().addScaledVector(dt,xt),X.doorHeight=et.doorHeight,X.beamStart.z=X.beamEnd.z=X.doorStart.z+X.doorHeight,X.doorOpenEndPoint=et.doorOpenEndPoint.clone(),X.doorOpenVector=et.doorOpenVector.clone()):(et.beamStart=X.beamStart.clone().addScaledVector(J,xt),et.beamEnd=X.beamEnd.clone().addScaledVector(J,xt),et.doorStart=X.doorStart.clone().addScaledVector(J,xt),et.doorEnd=X.doorEnd.clone().addScaledVector(J,xt),et.doorHeight=X.doorHeight,et.beamStart.z=et.beamEnd.z=et.doorStart.z+et.doorHeight,et.doorOpenEndPoint=X.doorOpenEndPoint.clone(),et.doorOpenVector=X.doorOpenVector.clone())),ke=et.nearId,Be=X.beamStart.clone(),gn=X.beamEnd.clone(),Le=!0,pe=l[at].linesIndex,nn=l[at].doorIndex;break}}}if(et.nearId!=-1&&St=="hole"){let at=!1;for(let X=0;X<t.length;X++)if(t[X].doorAndBeamData){for(let Et=0;Et<t[X].doorAndBeamData.length;Et++)if(t[X].doorAndBeamData[Et].nearId==i&&t[X].doorAndBeamData[Et].type=="beam"){t[X].doorAndBeamData[Et].type=St,at=!0;break}if(at)break}}if(p.doorAndBeamIdToCheckResults.push([D.index,i]),p.doorAndBeamData.push(et),l.push({linesIndex:m,doorIndex:p.doorAndBeamData.length-1}),f.push({start:rt,end:tt}),i++,Mt&&Y<2)break}}}let H=p.length*(p.rooftopPz-p.start.z);p.completePointAreaPercentage=I/H*100,p.checkResults=null,p.originalPoints=null,p.mergeCheckRegion=null}if(u.length>1)for(let m=0;m<u.length;m++){let p=[];for(let x=0;x<t[u[m]].doorAndBeamData.length;x++){let b=!1;if(t[u[m]].doorAndBeamData[x].type==="beam"&&(t[u[m]].doorAndBeamData[x].beamNearWallVec.x==0&&t[u[m]].doorAndBeamData[x].beamNearWallVec.y==0&&t[u[m]].doorAndBeamData[x].beamNearWallVec.z==0&&t[u[m]].doorAndBeamData[x].nearId==-1||!t[u[m]].doorAndBeamData[x].wallBelowBeam&&t[u[m]].doorAndBeamData[x].nearId==-1)&&(t[u[m]].doorAndBeamData[x].lineIsOnlyBeam?b=!0:t[u[m]].doorAndBeamData[x].type="hole"),!b){let z=t[u[m]].doorAndBeamData[x].doorStart.clone(),M=t[u[m]].doorAndBeamData[x].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 S=0;S<t[u[E]].doorAndBeamData.length;S++){let I=t[u[E]].doorAndBeamData[S].doorStart.clone(),H=t[u[E]].doorAndBeamData[S].doorEnd.clone();I.z=H.z=0;let D=I.distanceTo(H),T=ye(z,M,I,H);if(T.type=="collinear_overlap"&&T.maxPerpendicularDistance<.2){let R=new N.Line3(I,H),v=At(z,M),W=R.closestPointToPoint(v,!0,new N.Vector3),V=v.distanceTo(W);if(Math.abs(P-T.overlap)<.1&&V<.04){t[u[E]].doorAndBeamData[S].nearId==t[u[m]].doorAndBeamData[x].id&&(t[u[E]].doorAndBeamData[S].nearId=-1),b=!0;break}}}}if(b){for(let z=0;z<t[u[m]].doorAndBeamIdToCheckResults.length;z++)if(t[u[m]].doorAndBeamIdToCheckResults[1]==t[u[m]].doorAndBeamData[x].id){t[u[m]].doorAndBeamIdToCheckResults.splice(z,1);break}}b||p.push(t[u[m]].doorAndBeamData[x])}p.length!=t[u[m]].doorAndBeamData.length&&(t[u[m]].doorAndBeamData=p)}let a=.65,h=2,g=[],y=[];for(let m=0;m<s.length;m++){if(s[m].isFind||s[m].inWall)continue;let p=new N.Vector3(s[m].doorStartPt.x,s[m].doorStartPt.y,0),x=new N.Vector3(s[m].doorEndPt.x,s[m].doorEndPt.y,0),b=new N.Vector3().subVectors(p,x).normalize();for(let z=0;z<t.length;z++){if(t[z].length<.7||t[z].completePointAreaPercentage>60)continue;let M=new N.Vector3(t[z].start.x,t[z].start.y,0),P=new N.Vector3(t[z].end.x,t[z].end.y,0),E=new N.Vector3().subVectors(M,P).normalize(),S=.3,I=p.clone().addScaledVector(b,S),H=x.clone().addScaledVector(b.clone().negate(),S),D=M.clone().addScaledVector(E,S),T=P.clone().addScaledVector(E.clone().negate(),S),R=Me(I,H,D,T),v=Xt(I,H,D,T),W=p.distanceTo(M)>x.distanceTo(M)?x:p,V=W.distanceTo(M),C=W.distanceTo(P);if((V<c||C<c)&&v&&!v.isParallel){let A=p.distanceTo(M),B=p.distanceTo(P),k=A<B?M:P,F=!1;for(let L=0;L<t.length;L++){if(L==z||g.includes(L)||t[L].length<.7)continue;let O=new N.Vector3(t[L].start.x,t[L].start.y,0),$=new N.Vector3(t[L].end.x,t[L].end.y,0),G=new N.Vector3().subVectors(O,$).normalize(),Q=G.clone().negate(),j=O.clone().addScaledVector(G,5),Z=$.clone().addScaledVector(Q,5),Y=ie(M,P,O,$),it=ye(M,P,O,$),ht=Me(M,P,j,Z),Tt=!0;if(ht!=null&&(Tt=ht.point.distanceTo(M)<c||ht.point.distanceTo(P)<c),(Y&&Y.angle>85||it&&it.type=="collinear_gap")&&Tt){let nt=new N.Line3(M,P),wt=new N.Vector3,zt=nt.closestPointToPoint(O,!0,wt),Dt=nt.closestPointToPoint($,!0,wt),Pt=zt.distanceTo(O),Mt=Dt.distanceTo($),It,ot;if(Pt>Mt&&Mt>a)It=$,ot=Dt;else if(Pt<Mt&&Pt>a)It=O,ot=zt;else continue;if(Pt=k.distanceTo(O),Mt=k.distanceTo($),Pt>h&&Mt>h)continue;let ft=Xt(It,ot,O,$),rt=Xt(It,ot,I,H);if(rt&&rt.isParallel||!ft||!ft.isParallel)continue;let tt=ye(p,x,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 St=0;St<y.length;St++){let ee=ye(y[St].start,y[St].end,It,ot);if(ee&&ee.type=="collinear_overlap"&&ee.maxPerpendicularDistance<.2){ae=!0;break}}if(ae)continue;for(let St=0;St<t.length;St++){if(t[St].length<.5)continue;let ee=new N.Vector3(t[St].start.x,t[St].start.y,t[St].start.z),et=new N.Vector3(t[St].end.x,t[St].end.y,t[St].end.z),me=ye(ee,et,It,ot);if(me&&me.type=="collinear_overlap"&&me.maxPerpendicularDistance<.1){ae=!0;break}}if(ae)continue;y.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 N.Vector3(0,0,0)}),n[s[m].index].isFindBeam=!0,n[s[m].index].isFindOnlyDoor=!0,d.push([{id:i,beamStart:It,beamEnd:ot}]),i++,F=!0;break}}if(F)break}}}let w=[];for(let m=0;m<t.length;m++)t[m].isLine2||w.push(t[m]),t[m].isLine2&&t[m].doorAndBeamData.length!=0&&w.push(t[m]);return t.length=0,t.push(...w),{lines:t,beamGroup:d}},qi=async(t,e)=>{for(let n=0;n<t.length;n++){let o=t[n],r=new N.Vector3(o.start.x,o.start.y,o.start.z),s=new N.Vector3(o.end.x,o.end.y,o.end.z),i=new N.Line3(r.clone(),s.clone()),l=-1;for(let u=0;u<o.doorAndBeamData.length;u++){let f=o.doorAndBeamData[u],d=f.doorHeight;f.isRebuild=!1;let c=!1,a=!1;if(!(f.nearId!=-1||f.type!="beam")){for(let h=0;h<t.length;h++){if(t[h].length<.5||h==n)continue;let g=new N.Vector3(t[h].start.x,t[h].start.y,t[h].start.z),y=new N.Vector3(t[h].end.x,t[h].end.y,t[h].end.z),w=ye(g,y,r,s),m=Xt(g,y,r,s);if(w&&w.maxPerpendicularDistance<.5){if(m&&m.isParallel){let E=new N.Line3(g,y),S=new N.Vector3(r.x,r.y,g.z),I=E.closestPointToPoint(S,!0,new N.Vector3),H=ie(I,S,r,s);H&&H.angle>85&&(f.beamNearWallVec=new N.Vector3().subVectors(I,S).normalize())}let p=[],x=e.readLineById(t[h].id);x.originalPoints=e.getOriginalPointsById(t[h].id),t[h].originalPoints=x.originalPoints,x=null,t[h].originalPoints.forEach(E=>{E.z>r.z+.2&&E.z<r.z+d/2&&p.push(new N.Vector3(E.x,E.y,r.z))}),t[h].originalPoints=null;let b=new N.Vector3,z=[],M=[];for(let E=0;E<p.length;E++){let S=i.closestPointToPoint(p[E],!0,b);S.distanceTo(p[E])<.15&&(z.push(p[E]),M.push(S.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=We(z);if(P.length==2){let E=P[0].distanceTo(P[1]);if(Math.abs(E-i.distance())<.3){l=w.maxPerpendicularDistance;let S=new N.Line3(g,y),I=new N.Vector3(r.x,r.y,g.z),H=S.closestPointToPoint(I,!0,new N.Vector3);f.beamNearWallVec=new N.Vector3().subVectors(H,I).normalize(),f.beamStart.z>t[h].rooftopPz-.03&&length>1?a=!0:c=!0;break}}if(c)break}else w&&w.type=="collinear_overlap"&&w.maxPerpendicularDistance>.3&&w.maxPerpendicularDistance<.7&&(a=!0)}if(c){if(length<1.8||l<.2)continue;a=!0}a||(f.isRebuild=!0)}}}};import*as Bt from"three";import"three/examples/jsm/utils/BufferGeometryUtils.js";var zr=(t,e={})=>{let n=e.eps??1e-6,o=e.project??(m=>({x:m.x,y:m.z})),r=e.skipSplit??!1,s=e.insideAreaSign??"positive",i=r?t.map((m,p)=>({start:Nn(m.start),end:Nn(m.end),uuid:m.uuid,sourceIndex:p,sourceSegment:m})):ji(t,o,n),l=[],u=new Map;function f(m){let p=Math.round(m.x/n),x=Math.round(m.y/n);return`${p},${x}`}function d(m){let p=f(m);if(u.has(p))return u.get(p);let x=l.length;return l.push({id:x,x:m.x,y:m.y}),u.set(p,x),x}let c=[],a=new Map;for(let m of i){let p=o(m.start),x=o(m.end);if(Mr(p,x)<n*n)continue;let b=d(p),z=d(x);if(b===z)continue;let M=b<z?`${b}_${z}`:`${z}_${b}`;if(a.has(M))continue;let P=c.length;c.push({id:P,a:b,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 y(m,p,x,b,z){let M=l[m],P=l[p],E=h.length,S=Math.atan2(P.y-M.y,P.x-M.x),I={id:E,from:m,to:p,twin:null,next:null,angle:S,edgeId:x,uuid:b,sourceIndex:z,visited:!1};return h.push(I),g[m].push(E),E}for(let m of c){let p=y(m.a,m.b,m.id,m.uuid,m.sourceIndex),x=y(m.b,m.a,m.id,m.uuid,m.sourceIndex);h[p].twin=x,h[x].twin=p}for(let m of g)m.sort((p,x)=>h[p].angle-h[x].angle);for(let m of h){let p=g[m.to],x=m.twin,b=p.indexOf(x);if(b===-1)continue;let z=(b-1+p.length)%p.length;m.next=p[z]}let w=[];for(let m of h){if(m.visited)continue;let p=[],x=[],b=m.id,z=0,M=h.length+10;for(;;){let D=h[b];if(!D||D.visited)break;if(D.visited=!0,p.push(b),x.push(D.from),b=D.next,z++,z>M){console.warn("\u534A\u8FB9\u904D\u5386\u5F02\u5E38\uFF0C\u53EF\u80FD\u5B58\u5728\u975E\u5E73\u9762\u56FE\u3001\u91CD\u590D\u7EBF\u3001\u60AC\u6302\u7EBF\u6216\u810F\u6570\u636E");break}}if(p.length<3)continue;let P=x.map(D=>l[D]),E=Xi(P),S=!1;if(s==="positive"?S=E>n:S=E<-n,!S)continue;let I=p.map(D=>h[D].uuid),H=p.map(D=>h[D].sourceIndex);w.push({uuids:I,area:Math.abs(E),lineIndexes:H})}return w};function ji(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 d=0;d<t.length;d++){if(r===d)continue;let c=t[d],a=e(c.start),h=e(c.end),g=$i(i,l,a,h,n);g&&g.t>n&&g.t<1-n&&u.push({t:g.t,point:Zi(s.start,s.end,g.t)})}u.sort((d,c)=>d.t-c.t);let f=[];for(let d of u)(f.length===0||Math.abs(d.t-f[f.length-1].t)>n)&&f.push(d);for(let d=0;d<f.length-1;d++){let c=f[d].point,a=f[d+1].point,h=e(c),g=e(a);Mr(h,g)<n*n||o.push({start:c,end:a,uuid:s.uuid,sourceIndex:r,sourceSegment:s})}}return o}function $i(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 f=Po(l,i)/u,d=Po(l,s)/u;return f>=-r&&f<=1+r&&d>=-r&&d<=1+r?{t:f,u:d,point:{x:t.x+f*s.x,y:t.y+f*s.y}}:null}function Po(t,e){return t.x*e.y-t.y*e.x}function Mr(t,e){let n=t.x-e.x,o=t.y-e.y;return n*n+o*o}function Xi(t){let e=0;for(let n=0;n<t.length;n++){let o=t[n],r=t[(n+1)%t.length];e+=o.x*r.y-r.x*o.y}return e/2}function Zi(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 Gi=(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,f=95;if(!t[0].uuid){let a=1e4;for(let h=0;h<t.length;h++)t[h].uuid=a++}let d=[];for(let a=0;a<t.length;a++)d.push({start:t[a].start,end:t[a].end,uuid:t[a].uuid});let c=zr(d,{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 y=t[c[a].lineIndexes[g]].length;if(y<r||y>s)break;let w=new Bt.Vector3(t[c[a].lineIndexes[g]].start.x,t[c[a].lineIndexes[g]].start.y,t[c[a].lineIndexes[g]].start.z),m=new Bt.Vector3(t[c[a].lineIndexes[g]].end.x,t[c[a].lineIndexes[g]].end.y,t[c[a].lineIndexes[g]].end.z),p=!1,x=new Bt.Vector3(0,0,0);for(let b=g+1;b<c[a].lineIndexes.length;b++){let z=t[c[a].lineIndexes[b]].length;if(z<r||z>s)break;let M=new Bt.Vector3(t[c[a].lineIndexes[b]].start.x,t[c[a].lineIndexes[b]].start.y,t[c[a].lineIndexes[b]].start.z),P=new Bt.Vector3(t[c[a].lineIndexes[b]].end.x,t[c[a].lineIndexes[b]].end.y,t[c[a].lineIndexes[b]].end.z),E=Xt(w,m,M,P);if(E&&E.isParallel){if(y+z>s){p=!0;break}y+=z;let I=ct(w,M),H=ct(w,P),D=ct(m,M),T=ct(m,P);I?(w=m.clone(),m=P.clone()):H?(w=m.clone(),m=M.clone()):D?m=P.clone():T&&(m=M.clone());continue}let S=ie(w,m,M,P);if(!S||S.angle<u||S.angle>f){p=!0;break}for(let I=b+1;I<c[a].lineIndexes.length;I++){let H=t[c[a].lineIndexes[I]].length;if(H<r||H>s)break;let D=new Bt.Vector3(t[c[a].lineIndexes[I]].start.x,t[c[a].lineIndexes[I]].start.y,t[c[a].lineIndexes[I]].start.z),T=new Bt.Vector3(t[c[a].lineIndexes[I]].end.x,t[c[a].lineIndexes[I]].end.y,t[c[a].lineIndexes[I]].end.z),R=Xt(M,P,D,T);if(R&&R.isParallel){if(z+H>s){p=!0;break}z+=H;let W=ct(M,D),V=ct(M,T),C=ct(P,D),_=ct(P,T);W?(M=P.clone(),P=T.clone()):V?(M=P.clone(),P=D.clone()):C?P=T.clone():_&&(P=D.clone());continue}let v=ie(M,P,D,T);if(!v||v.angle<u||v.angle>f){p=!0;break}for(let W=I+1;W<c[a].lineIndexes.length;W++){let V=t[c[a].lineIndexes[W]].length;if(V<r||V>s)break;let C=new Bt.Vector3(t[c[a].lineIndexes[W]].start.x,t[c[a].lineIndexes[W]].start.y,t[c[a].lineIndexes[W]].start.z),_=new Bt.Vector3(t[c[a].lineIndexes[W]].end.x,t[c[a].lineIndexes[W]].end.y,t[c[a].lineIndexes[W]].end.z),A=Xt(D,T,C,_);if(A&&A.isParallel){if(H+V>s){p=!0;break}H+=V;let $=ct(D,C),G=ct(D,_),Q=ct(T,C),j=ct(T,_);$?(D=T.clone(),T=_.clone()):G?(D=T.clone(),T=C.clone()):Q?T=_.clone():j&&(T=C.clone());continue}let B=ie(D,T,C,_);if(!B||B.angle<u||B.angle>f){p=!0;break}let k=ct(C,w),F=ct(C,m),L=ct(_,w),O=ct(_,m);if(k||F||L||O)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 Bt.Vector3(t[c[a].lineIndexes[$]].start.x,t[c[a].lineIndexes[$]].start.y,t[c[a].lineIndexes[$]].start.z),j=new Bt.Vector3(t[c[a].lineIndexes[$]].end.x,t[c[a].lineIndexes[$]].end.y,t[c[a].lineIndexes[$]].end.z),Z=Xt(C,_,Q,j);if(Z&&Z.isParallel){if(V+G>s){p=!0;break}V+=G;let Y=ct(C,Q),it=ct(C,j),ht=ct(_,Q),Tt=ct(_,j);if(Y)C=_.clone(),_=j.clone();else if(it)C=_.clone(),_=Q.clone();else if(ht)_=j.clone();else if(Tt)_=Q.clone();else continue;if(k=ct(C,w),F=ct(C,m),L=ct(_,w),O=ct(_,m),k||F||L||O){h=!0;break}}}break}if(p)break}if(p)break}if(p)break}h&&n.rectangles.push(c[a].uuids)}for(let a=0;a<t.length;a++){let h=t[a].length;if(o.has(t[a].uuid)||h<r||h>s)continue;let g={uuids:[],missingEdge:{start:new Bt.Vector3,end:new Bt.Vector3}},y=new Bt.Vector3(t[a].start.x,t[a].start.y,t[a].start.z),w=new Bt.Vector3(t[a].end.x,t[a].end.y,t[a].end.z),m=!0,p=!0;for(let z=0;z<t.length;z++){if(z==a)continue;let M=new Bt.Vector3(t[z].start.x,t[z].start.y,t[z].start.z),P=new Bt.Vector3(t[z].end.x,t[z].end.y,t[z].end.z),E=ct(M,y),S=ct(P,y),I=ct(M,w),H=ct(P,w);if(E||S?m=!1:(I||H)&&(p=!1),!m&&!p)break}if(!m&&!p)continue;let x=new Bt.Vector3;m||([y,w]=[w,y]),x=new Bt.Vector3().subVectors(w,y).normalize();let b=x.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 Bt.Vector3(t[z].start.x,t[z].start.y,t[z].start.z),E=new Bt.Vector3(t[z].end.x,t[z].end.y,t[z].end.z),S=ie(y,w,P,E);if(!S||S.angle<85)continue;let I=ct(P,w),H=ct(E,w);if(!I&&!H)continue;let D=new Bt.Vector3,T=new Bt.Vector3;I?(D=P.clone(),T=E.clone()):(D=E.clone(),T=P.clone());for(let R=0;R<t.length;R++){let v=t[R].length;if(R==a||R==z||o.has(R)||v<r||v>s)continue;let W=new Bt.Vector3(t[R].start.x,t[R].start.y,t[R].start.z),V=new Bt.Vector3(t[R].end.x,t[R].end.y,t[R].end.z),C=ie(P,E,W,V);if(!C||C.angle<85)continue;let _=ct(W,T),A=ct(V,T);if(!_&&!A)continue;let B=new Bt.Vector3,k=new Bt.Vector3;_?(B=W.clone(),k=V.clone()):(B=V.clone(),k=W.clone());let F=new Bt.Vector3().subVectors(k,B).normalize(),L=$t(b,F,.1);if(!L||!L.parallel||!L.sameDirection)continue;let O=!0,$=!0;for(let Q=0;Q<t.length;Q++){if(Q==R)continue;let j=new Bt.Vector3(t[Q].start.x,t[Q].start.y,t[Q].start.z),Z=new Bt.Vector3(t[Q].end.x,t[Q].end.y,t[Q].end.z),Y=ct(j,W),it=ct(Z,W),ht=ct(j,V),Tt=ct(Z,V);if(Y||it?O=!1:(ht||Tt)&&($=!1),!O&&!$)break}if(!O&&!$)continue;let G=h*M;if(!(G<i||G>l)){g.uuids=[t[a].uuid,t[z].uuid,t[R].uuid],g.missingEdge.start=k,g.missingEdge.end=y;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 q from"three";import"three/examples/jsm/utils/BufferGeometryUtils.js";var Vt=11102230246251565e-32,Yt=134217729,zn=(3+8*Vt)*Vt;function je(t,e,n,o,r){let s,i,l,u,f=e[0],d=o[0],c=0,a=0;d>f==d>-f?(s=f,f=e[++c]):(s=d,d=o[++a]);let h=0;if(c<t&&a<n)for(d>f==d>-f?(i=f+s,l=s-(i-f),f=e[++c]):(i=d+s,l=s-(i-d),d=o[++a]),s=i,l!==0&&(r[h++]=l);c<t&&a<n;)d>f==d>-f?(i=s+f,u=i-s,l=s-(i-u)+(f-u),f=e[++c]):(i=s+d,u=i-s,l=s-(i-u)+(d-u),d=o[++a]),s=i,l!==0&&(r[h++]=l);for(;c<t;)i=s+f,u=i-s,l=s-(i-u)+(f-u),f=e[++c],s=i,l!==0&&(r[h++]=l);for(;a<n;)i=s+d,u=i-s,l=s-(i-u)+(d-u),d=o[++a],s=i,l!==0&&(r[h++]=l);return(s!==0||h===0)&&(r[h++]=s),h}function Mn(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,rn=K(4),Er=K(8),Pr=K(12),Tr=K(16),oe=K(4);function Qi(t,e,n,o,r,s,i){let l,u,f,d,c,a,h,g,y,w,m,p,x,b,z,M,P,E,S=t-r,I=n-r,H=e-s,D=o-s;b=S*D,a=Yt*S,h=a-(a-S),g=S-h,a=Yt*D,y=a-(a-D),w=D-y,z=g*w-(b-h*y-g*y-h*w),M=H*I,a=Yt*H,h=a-(a-H),g=H-h,a=Yt*I,y=a-(a-I),w=I-y,P=g*w-(M-h*y-g*y-h*w),m=z-P,c=z-m,rn[0]=z-(m+c)+(c-P),p=b+m,c=p-b,x=b-(p-c)+(m-c),m=x-M,c=x-m,rn[1]=x-(m+c)+(c-M),E=p+m,c=E-p,rn[2]=p-(E-c)+(m-c),rn[3]=E;let T=Mn(4,rn),R=Ui*i;if(T>=R||-T>=R||(c=t-S,l=t-(S+c)+(c-r),c=n-I,f=n-(I+c)+(c-r),c=e-H,u=e-(H+c)+(c-s),c=o-D,d=o-(D+c)+(c-s),l===0&&u===0&&f===0&&d===0)||(R=Ki*i+zn*Math.abs(T),T+=S*d+D*l-(H*f+I*u),T>=R||-T>=R))return T;b=l*D,a=Yt*l,h=a-(a-l),g=l-h,a=Yt*D,y=a-(a-D),w=D-y,z=g*w-(b-h*y-g*y-h*w),M=u*I,a=Yt*u,h=a-(a-u),g=u-h,a=Yt*I,y=a-(a-I),w=I-y,P=g*w-(M-h*y-g*y-h*w),m=z-P,c=z-m,oe[0]=z-(m+c)+(c-P),p=b+m,c=p-b,x=b-(p-c)+(m-c),m=x-M,c=x-m,oe[1]=x-(m+c)+(c-M),E=p+m,c=E-p,oe[2]=p-(E-c)+(m-c),oe[3]=E;let v=je(4,rn,4,oe,Er);b=S*d,a=Yt*S,h=a-(a-S),g=S-h,a=Yt*d,y=a-(a-d),w=d-y,z=g*w-(b-h*y-g*y-h*w),M=H*f,a=Yt*H,h=a-(a-H),g=H-h,a=Yt*f,y=a-(a-f),w=f-y,P=g*w-(M-h*y-g*y-h*w),m=z-P,c=z-m,oe[0]=z-(m+c)+(c-P),p=b+m,c=p-b,x=b-(p-c)+(m-c),m=x-M,c=x-m,oe[1]=x-(m+c)+(c-M),E=p+m,c=E-p,oe[2]=p-(E-c)+(m-c),oe[3]=E;let W=je(v,Er,4,oe,Pr);b=l*d,a=Yt*l,h=a-(a-l),g=l-h,a=Yt*d,y=a-(a-d),w=d-y,z=g*w-(b-h*y-g*y-h*w),M=u*f,a=Yt*u,h=a-(a-u),g=u-h,a=Yt*f,y=a-(a-f),w=f-y,P=g*w-(M-h*y-g*y-h*w),m=z-P,c=z-m,oe[0]=z-(m+c)+(c-P),p=b+m,c=p-b,x=b-(p-c)+(m-c),m=x-M,c=x-m,oe[1]=x-(m+c)+(c-M),E=p+m,c=E-p,oe[2]=p-(E-c)+(m-c),oe[3]=E;let V=je(W,Pr,4,oe,Tr);return Tr[V-1]}function sn(t,e,n,o,r,s){let i=(e-s)*(n-r),l=(t-r)*(o-s),u=i-l,f=Math.abs(i+l);return Math.abs(u)>=Yi*f?u:-Qi(t,e,n,o,r,s,f)}var zu=(7+56*Vt)*Vt,Mu=(3+28*Vt)*Vt,Eu=(26+288*Vt)*Vt*Vt,Pu=K(4),Tu=K(4),Su=K(4),Ru=K(4),Du=K(4),vu=K(4),Vu=K(4),Iu=K(4),Cu=K(4),Wu=K(8),Hu=K(8),_u=K(8),Au=K(4),Lu=K(8),Bu=K(8),ku=K(16),Ou=K(12),Fu=K(192),Nu=K(192);var $u=(10+96*Vt)*Vt,Xu=(4+48*Vt)*Vt,Zu=(44+576*Vt)*Vt*Vt,Gu=K(4),Yu=K(4),Uu=K(4),Ku=K(4),Qu=K(4),Ju=K(4),tf=K(4),ef=K(4),nf=K(8),of=K(8),rf=K(8),sf=K(8),af=K(8),lf=K(8),cf=K(8),uf=K(8),ff=K(8),df=K(4),hf=K(4),mf=K(4),pf=K(8),gf=K(16),xf=K(16),yf=K(16),bf=K(32),wf=K(32),zf=K(48),Mf=K(64),Ef=K(1152),Pf=K(1152);var Df=(16+224*Vt)*Vt,vf=(5+72*Vt)*Vt,Vf=(71+1408*Vt)*Vt*Vt,If=K(4),Cf=K(4),Wf=K(4),Hf=K(4),_f=K(4),Af=K(4),Lf=K(4),Bf=K(4),kf=K(4),Of=K(4),Ff=K(24),Nf=K(24),qf=K(24),jf=K(24),$f=K(24),Xf=K(24),Zf=K(24),Gf=K(24),Yf=K(24),Uf=K(24),Kf=K(1152),Qf=K(1152),Jf=K(1152),td=K(1152),ed=K(1152),nd=K(2304),od=K(2304),rd=K(3456),sd=K(5760),id=K(8),ad=K(8),ld=K(8),cd=K(16),ud=K(24),fd=K(48),dd=K(48),hd=K(96),md=K(192),pd=K(384),gd=K(384),xd=K(384),yd=K(768);var bd=K(96),wd=K(96),zd=K(96),Md=K(1152);var Rr=Math.pow(2,-52),qn=new Uint32Array(512),ln=class t{static from(e,n=ra,o=sa){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,f=-1/0,d=-1/0;for(let S=0;S<i;S++){let I=e[2*S],H=e[2*S+1];I<l&&(l=I),H<u&&(u=H),I>f&&(f=I),H>d&&(d=H),this._ids[S]=S}let c=(l+f)/2,a=(u+d)/2,h=0,g=0,y=0;for(let S=0,I=1/0;S<i;S++){let H=To(c,a,e[2*S],e[2*S+1]);H<I&&(h=S,I=H)}let w=e[2*h],m=e[2*h+1];for(let S=0,I=1/0;S<i;S++){if(S===h)continue;let H=To(w,m,e[2*S],e[2*S+1]);H<I&&H>0&&(g=S,I=H)}let p=e[2*g],x=e[2*g+1],b=1/0;for(let S=0;S<i;S++){if(S===h||S===g)continue;let I=na(w,m,p,x,e[2*S],e[2*S+1]);I<b&&(y=S,b=I)}let z=e[2*y],M=e[2*y+1];if(b===1/0){for(let H=0;H<i;H++)this._dists[H]=e[2*H]-e[0]||e[2*H+1]-e[1];an(this._ids,this._dists,0,i-1);let S=new Uint32Array(i),I=0;for(let H=0,D=-1/0;H<i;H++){let T=this._ids[H],R=this._dists[T];R>D&&(S[I++]=T,D=R)}this.hull=S.subarray(0,I),this.triangles=new Uint32Array(0),this.halfedges=new Int32Array(0);return}if(sn(w,m,p,x,z,M)<0){let S=g,I=p,H=x;g=y,p=z,x=M,y=S,z=I,M=H}let P=oa(w,m,p,x,z,M);this._cx=P.x,this._cy=P.y;for(let S=0;S<i;S++)this._dists[S]=To(e[2*S],e[2*S+1],P.x,P.y);an(this._ids,this._dists,0,i-1),this._hullStart=h;let E=3;o[h]=n[y]=g,o[g]=n[h]=y,o[y]=n[g]=h,r[h]=0,r[g]=1,r[y]=2,s.fill(-1),s[this._hashKey(w,m)]=h,s[this._hashKey(p,x)]=g,s[this._hashKey(z,M)]=y,this.trianglesLen=0,this._addTriangle(h,g,y,-1,-1,-1);for(let S=0,I=0,H=0;S<this._ids.length;S++){let D=this._ids[S],T=e[2*D],R=e[2*D+1];if(S>0&&Math.abs(T-I)<=Rr&&Math.abs(R-H)<=Rr||(I=T,H=R,D===h||D===g||D===y))continue;let v=0;for(let A=0,B=this._hashKey(T,R);A<this._hashSize&&(v=s[(B+A)%this._hashSize],!(v!==-1&&v!==o[v]));A++);v=n[v];let W=v,V;for(;V=o[W],sn(T,R,e[2*W],e[2*W+1],e[2*V],e[2*V+1])>=0;)if(W=V,W===v){W=-1;break}if(W===-1)continue;let C=this._addTriangle(W,D,o[W],-1,-1,r[W]);r[D]=this._legalize(C+2),r[W]=C,E++;let _=o[W];for(;V=o[_],sn(T,R,e[2*_],e[2*_+1],e[2*V],e[2*V+1])<0;)C=this._addTriangle(_,D,V,r[D],-1,r[_]),r[D]=this._legalize(C+2),o[_]=_,E--,_=V;if(W===v)for(;V=n[W],sn(T,R,e[2*V],e[2*V+1],e[2*W],e[2*W+1])<0;)C=this._addTriangle(V,D,W,-1,r[W],r[V]),this._legalize(C+2),r[V]=C,o[W]=W,E--,W=V;this._hullStart=n[D]=W,o[W]=n[_]=D,o[D]=_,s[this._hashKey(T,R)]=D,s[this._hashKey(e[2*W],e[2*W+1])]=W}this.hull=new Uint32Array(E);for(let S=0,I=this._hullStart;S<E;S++)this.hull[S]=I,I=o[I];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 f=l-l%3,d=u+(e+1)%3,c=f+(l+2)%3,a=n[i],h=n[e],g=n[d],y=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*y],r[2*y+1])){n[e]=y,n[l]=a;let m=o[c];if(m===-1){let x=this._hullStart;do{if(this._hullTri[x]===c){this._hullTri[x]=e;break}x=this._hullPrev[x]}while(x!==this._hullStart)}this._link(e,m),this._link(l,o[i]),this._link(i,c);let p=f+(l+1)%3;s<qn.length&&(qn[s++]=p)}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 To(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,f=e-l,d=n-i,c=o-l,a=r-i,h=s-l,g=u*u+f*f,y=d*d+c*c,w=a*a+h*h;return u*(c*w-y*h)-f*(d*w-y*a)+g*(d*h-c*a)<0}function na(t,e,n,o,r,s){let i=n-t,l=o-e,u=r-t,f=s-e,d=i*i+l*l,c=u*u+f*f,a=.5/(i*f-l*u),h=(f*d-l*c)*a,g=(i*c-u*d)*a;return h*h+g*g}function oa(t,e,n,o,r,s){let i=n-t,l=o-e,u=r-t,f=s-e,d=i*i+l*l,c=u*u+f*f,a=.5/(i*f-l*u),h=t+(f*d-l*c)*a,g=e+(i*c-u*d)*a;return{x:h,y:g}}function an(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;En(t,r,s),e[t[n]]>e[t[o]]&&En(t,n,o),e[t[s]]>e[t[o]]&&En(t,s,o),e[t[n]]>e[t[s]]&&En(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;En(t,s,i)}t[n+1]=t[i],t[i]=l,o-s+1>=i-n?(an(t,e,s,o),an(t,e,n,i-1)):(an(t,e,n,i-1),an(t,e,s,o))}}function En(t,e,n){let o=t[e];t[e]=t[n],t[n]=o}function ra(t){return t[0]}function sa(t){return t[1]}var fe=class{constructor(){this._x0=this._y0=this._x1=this._y1=null,this._=""}moveTo(e,n){this._+=`M${this._x0=this._x1=+e},${this._y0=this._y1=+n}`}closePath(){this._x1!==null&&(this._x1=this._x0,this._y1=this._y0,this._+="Z")}lineTo(e,n){this._+=`L${this._x1=+e},${this._y1=+n}`}arc(e,n,o){e=+e,n=+n,o=+o;let 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 He=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 Pn=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 y=0,w=0,m=o.length,p,x;y<m;y+=3,w+=2){let b=o[y]*2,z=o[y+1]*2,M=o[y+2]*2,P=e[b],E=e[b+1],S=e[z],I=e[z+1],H=e[M],D=e[M+1],T=S-P,R=I-E,v=H-P,W=D-E,V=(T*W-R*v)*2;if(Math.abs(V)<1e-9){if(s===void 0){s=i=0;for(let _ of n)s+=e[_*2],i+=e[_*2+1];s/=n.length,i/=n.length}let C=1e9*Math.sign((s-P)*W-(i-E)*v);p=(P+H)/2-C*W,x=(E+D)/2+C*v}else{let C=1/V,_=T*T+R*R,A=v*v+W*W;p=P+(W*_-R*A)*C,x=E+(T*A-v*_)*C}l[w]=p,l[w+1]=x}let u=n[n.length-1],f,d=u*4,c,a=e[2*u],h,g=e[2*u+1];r.fill(0);for(let y=0;y<n.length;++y)u=n[y],f=d,c=a,h=g,d=u*4,a=e[2*u],g=e[2*u+1],r[f+2]=r[d]=h-g,r[f+3]=r[d+1]=a-c}render(e){let n=e==null?e=new fe:void 0,{delaunay:{halfedges:o,inedges:r,hull:s},circumcenters:i,vectors:l}=this;if(s.length<=1)return null;for(let d=0,c=o.length;d<c;++d){let a=o[d];if(a<d)continue;let h=Math.floor(d/3)*2,g=Math.floor(a/3)*2,y=i[h],w=i[h+1],m=i[g],p=i[g+1];this._renderSegment(y,w,m,p,e)}let u,f=s[s.length-1];for(let d=0;d<s.length;++d){u=f,f=s[d];let c=Math.floor(r[f]/3)*2,a=i[c],h=i[c+1],g=u*4,y=this._project(a,h,l[g+2],l[g+3]);y&&this._renderSegment(a,h,y[0],y[1],e)}return n&&n.value()}renderBounds(e){let n=e==null?e=new fe:void 0;return e.rect(this.xmin,this.ymin,this.xmax-this.xmin,this.ymax-this.ymin),n&&n.value()}renderCell(e,n){let o=n==null?n=new fe:void 0,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 He;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 f=Math.floor(u/3);if(l.push(n[f*2],n[f*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],f,d=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],f=d,d=this._regioncode(l,u),f===0&&d===0)c=a,a=0,r?r.push(l,u):r=[l,u];else{let g,y,w,m,p;if(f===0){if((g=this._clipSegment(s,i,l,u,f,d))===null)continue;[y,w,m,p]=g}else{if((g=this._clipSegment(l,u,s,i,d,f))===null)continue;[m,p,y,w]=g,c=a,a=this._edgecode(y,w),c&&a&&this._edge(e,c,a,r,r.length),r?r.push(y,w):r=[y,w]}c=a,a=this._edgecode(m,p),c&&a&&this._edge(e,c,a,r,r.length),r?r.push(m,p):r=[m,p]}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,f,d=s||i;d&8?(u=e+(o-e)*(this.ymax-n)/(r-n),f=this.ymax):d&4?(u=e+(o-e)*(this.ymin-n)/(r-n),f=this.ymin):d&2?(f=n+(r-n)*(this.xmax-e)/(o-e),u=this.xmax):(f=n+(r-n)*(this.xmin-e)/(o-e),u=this.xmin),s?(e=u,n=f,s=this._regioncode(e,n)):(o=u,r=f,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 f=0,d=l.length,c,a=this._edgecode(l[d-2],l[d-1]);f<d;f+=2)c=a,a=this._edgecode(l[f],l[f+1]),c&&a&&(f=this._edge(e,c,a,l,f),d=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,cn=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 _e=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 ln(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],f=this.collinear[this.collinear.length-1],d=[n[2*u],n[2*u+1],n[2*f],n[2*f+1]],c=1e-8*Math.hypot(d[3]-d[1],d[2]-d[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 ln(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,f=o.length;u<f;++u){let d=s[u%3===2?u-2:u+1];(o[u]===-1||i[d]===-1)&&(i[d]=u)}for(let u=0,f=r.length;u<f;++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 Pn(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 f=u,d=-1;do{if(yield d=i[f],f=f%3===2?f-2:f+1,i[f]!==e)return;if(f=s[f],f===-1){let c=o[(r[e]+1)%o.length];c!==d&&(yield c);return}}while(f!==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:f}=this;if(r[e]===-1||!f.length)return(e+1)%(f.length>>1);let d=e,c=cn(n-f[e*2],2)+cn(o-f[e*2+1],2),a=r[e],h=a;do{let g=u[h],y=cn(n-f[g*2],2)+cn(o-f[g*2+1],2);if(y<c&&(c=y,d=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&&cn(n-f[h*2],2)+cn(o-f[h*2+1],2)<c)return h;break}}while(h!==a);return d}render(e){let n=e==null?e=new fe: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 f=s[i]*2,d=s[u]*2;e.moveTo(o[f],o[f+1]),e.lineTo(o[d],o[d+1])}return this.renderHull(e),n&&n.value()}renderPoints(e,n){n===void 0&&(!e||typeof e.moveTo!="function")&&(n=e,e=null),n=n==null?2:+n;let o=e==null?e=new fe:void 0,{points: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 fe: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 He;return this.renderHull(e),e.value()}renderTriangle(e,n){let o=n==null?n=new fe: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 He;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 So(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 Dr(t,e,n){let o=t.get(e);o===void 0&&(o=[],t.set(e,o)),o.push(n)}function Ee(t){if(!t||t.length<3)return[];let e=new Set,n=[];for(let y=0;y<t.length;y++){let w=t[y],m=`${w[0]}_${w[1]}`;e.has(m)||(e.add(m),n.push(w))}let o=n.length;if(o<3)return[];let r=new Float64Array(o*2);for(let y=0,w=0;y<o;y++){let m=n[y];r[w++]=m[0],r[w++]=m[1]}let s=new _e(r),{triangles:i}=s;if(!i.length)return[];let l=new Map;for(let y=0;y<i.length;y+=3){let w=i[y],m=i[y+1],p=i[y+2],x=w*2,b=m*2,z=p*2,M=r[x],P=r[x+1],E=r[b],S=r[b+1],I=r[z],H=r[z+1],D=M-E,T=P-S,R=M-I,v=P-H,W=E-I,V=S-H,C=W*W+V*V,_=R*R+v*v,A=D*D+T*T,B=(E-M)*(H-P)-(I-M)*(S-P);if(B===0)continue;let k=B*B,L=M===0||E===0||I===0?k:4*k;C*_*A<=L&&(So(l,o,w,m),So(l,o,m,p),So(l,o,p,w))}if(!l.size)return[];let u=new Map,f=0,d=-1;for(let[y,w]of l){if(w!==1)continue;let m=Math.floor(y/o),p=y-m*o;d===-1&&(d=m),Dr(u,m,p),Dr(u,p,m),f++}if(f===0)return[];let c=[],a=new Uint8Array(o),h=d,g=-1;do{c.push(n[h]),a[h]=1;let y=u.get(h)||[],w=-1;for(let m=0;m<y.length;m++){let p=y[m];if(p!==g&&!a[p]){w=p;break}}if(w===-1)for(let m=0;m<y.length;m++){let p=y[m];if(p!==g){w=p;break}}if(w===-1)break;g=h,h=w}while(h!==d&&c.length<=f+1);return c.length>0&&c.push(c[0]),c}import*as qt from"three";import{OBB as Ia}from"three/examples/jsm/math/OBB.js";var Ut=63710088e-1,Vr={centimeters:Ut*100,centimetres:Ut*100,degrees:360/(2*Math.PI),feet:Ut*3.28084,inches:Ut*39.37,kilometers:Ut/1e3,kilometres:Ut/1e3,meters:Ut,metres:Ut,miles:Ut/1609.344,millimeters:Ut*1e3,millimetres:Ut*1e3,nauticalmiles:Ut/1852,radians:1,yards:Ut*1.0936};function Ir(t,e,n={}){let o={type:"Feature"};return(n.id===0||n.id)&&(o.id=n.id),n.bbox&&(o.bbox=n.bbox),o.properties=e||{},o.geometry=t,o}function jn(t,e,n={}){if(!t)throw new Error("coordinates is required");if(!Array.isArray(t))throw new Error("coordinates must be an Array");if(t.length<2)throw new Error("coordinates must be at least 2 numbers long");if(!vr(t[0])||!vr(t[1]))throw new Error("coordinates must contain numbers");return Ir({type:"Point",coordinates:t},e,n)}function $n(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 Ir({type:"Polygon",coordinates:t},e,n)}function ha(t,e="kilometers"){let n=Vr[e];if(!n)throw new Error(e+" units is invalid");return t*n}function ma(t,e="kilometers"){let n=Vr[e];if(!n)throw new Error(e+" units is invalid");return t/n}function Xn(t){return t%(2*Math.PI)*180/Math.PI}function de(t){return t%360*Math.PI/180}function Zn(t,e="kilometers",n="kilometers"){if(!(t>=0))throw new Error("length must be a positive number");return ha(ma(t,e),n)}function vr(t){return!isNaN(t)&&t!==null&&!Array.isArray(t)}function Cr(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Pe(t,e,n){if(t!==null)for(var o,r,s,i,l,u,f,d=0,c=0,a,h=t.type,g=h==="FeatureCollection",y=h==="Feature",w=g?t.features.length:1,m=0;m<w;m++){f=g?t.features[m].geometry:y?t.geometry:t,a=f?f.type==="GeometryCollection":!1,l=a?f.geometries.length:1;for(var p=0;p<l;p++){var x=0,b=0;if(i=a?f.geometries[p]:f,i!==null){u=i.coordinates;var z=i.type;switch(d=n&&(z==="Polygon"||z==="MultiPolygon")?1:0,z){case null:break;case"Point":if(e(u,c,m,x,b)===!1)return!1;c++,x++;break;case"LineString":case"MultiPoint":for(o=0;o<u.length;o++){if(e(u[o],c,m,x,b)===!1)return!1;c++,z==="MultiPoint"&&x++}z==="LineString"&&x++;break;case"Polygon":case"MultiLineString":for(o=0;o<u.length;o++){for(r=0;r<u[o].length-d;r++){if(e(u[o][r],c,m,x,b)===!1)return!1;c++}z==="MultiLineString"&&x++,z==="Polygon"&&b++}z==="Polygon"&&x++;break;case"MultiPolygon":for(o=0;o<u.length;o++){for(b=0,r=0;r<u[o].length;r++){for(s=0;s<u[o][r].length-d;s++){if(e(u[o][r][s],c,m,x,b)===!1)return!1;c++}b++}x++}break;case"GeometryCollection":for(o=0;o<i.geometries.length;o++)if(Pe(i.geometries[o],e,n)===!1)return!1;break;default:throw new Error("Unknown Geometry Type")}}}}}function Wr(t){var e=[];return Pe(t,function(n){e.push(n)}),e}function pa(t,e){var n,o,r,s,i,l,u,f,d,c,a=0,h=t.type==="FeatureCollection",g=t.type==="Feature",y=h?t.features.length:1;for(n=0;n<y;n++){for(l=h?t.features[n].geometry:g?t.geometry:t,f=h?t.features[n].properties:g?t.properties:{},d=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,f,d,c)===!1)return!1;continue}switch(s.type){case"Point":case"LineString":case"MultiPoint":case"Polygon":case"MultiLineString":case"MultiPolygon":{if(e(s,a,f,d,c)===!1)return!1;break}case"GeometryCollection":{for(o=0;o<s.geometries.length;o++)if(e(s.geometries[o],a,f,d,c)===!1)return!1;break}default:throw new Error("Unknown Geometry Type")}}a++}}function Hr(t,e,n){var o=n;return pa(t,function(r,s,i,l,u){s===0&&n===void 0?o=r:o=e(o,r,s,i,l,u)}),o}var Qr=wi(Kr(),1);function Jr(t,e={}){e.concavity=e.concavity||1/0;let n=[];if(Pe(t,r=>{n.push([r[0],r[1]])}),!n.length)return null;let o=(0,Qr.default)(n,e.concavity);return o.length>3?$n([o]):null}function Qn(t,e={}){let n=0,o=0,r=0;return Pe(t,function(s){n+=s[0],o+=s[1],r++},!0),jn([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 ts(t){if(Array.isArray(t))return t;if(t.type==="Feature"){if(t.geometry!==null)return t.geometry.coordinates}else if(t.coordinates)return t.coordinates;throw new Error("coords must be GeoJSON Feature, Geometry Object or an Array")}function ns(t,e,n={}){let o;return n.final?o=es(ce(e),ce(t)):o=es(ce(t),ce(e)),o>180?-(360-o):o}function es(t,e){let n=de(t[1]),o=de(e[1]),r=de(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 os(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=Ta(o,r);return Zn(s,"meters",n.units)}function Ta(t,e,n){n=n===void 0?Ut: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)),f=Math.abs(u)>1e-11?i/u:Math.cos(r);return Math.sqrt(i*i+f*f*l*l)*o}function rs(t,e,n,o={}){let r=e<0,s=Zn(Math.abs(e),o.units,"meters");r&&(s=-Math.abs(s));let i=ce(t),l=Sa(i,s,n);return l[0]+=l[0]-i[0]>180?-360:i[0]-l[0]>180?360:0,jn(l,o.properties)}function Sa(t,e,n,o){o=o===void 0?Ut:Number(o);let r=e/o,s=t[0]*Math.PI/180,i=de(t[1]),l=de(n),u=r*Math.cos(l),f=i+u;Math.abs(f)>Math.PI/2&&(f=f>0?Math.PI-f:-Math.PI-f);let d=Math.log(Math.tan(f/2+Math.PI/4)/Math.tan(i/2+Math.PI/4)),c=Math.abs(d)>1e-11?u/d:Math.cos(i),a=r*Math.sin(l)/c;return[((s+a)*180/Math.PI+540)%360-180,f*180/Math.PI]}function ss(t){if(!t)throw new Error("geojson is required");switch(t.type){case"Feature":return is(t);case"FeatureCollection":return Ra(t);case"Point":case"LineString":case"Polygon":case"MultiPoint":case"MultiLineString":case"MultiPolygon":case"GeometryCollection":return _o(t);default:throw new Error("unknown GeoJSON type")}}function is(t){let e={type:"Feature"};return Object.keys(t).forEach(n=>{switch(n){case"type":case"properties":case"geometry":return;default:e[n]=t[n]}}),e.properties=as(t.properties),t.geometry==null?e.geometry=null:e.geometry=_o(t.geometry),e}function as(t){let e={};return t&&Object.keys(t).forEach(n=>{let o=t[n];typeof o=="object"?o===null?e[n]=null:Array.isArray(o)?e[n]=o.map(r=>r):e[n]=as(o):e[n]=o}),e}function Ra(t){let e={type:"FeatureCollection"};return Object.keys(t).forEach(n=>{switch(n){case"type":case"features":return;default:e[n]=t[n]}}),e.features=t.features.map(n=>is(n)),e}function _o(t){let e={type:t.type};return t.bbox&&(e.bbox=t.bbox),t.type==="GeometryCollection"?(e.geometries=t.geometries.map(n=>_o(n)),e):(e.coordinates=ls(t.coordinates),e)}function ls(t){let e=t;return typeof e[0]!="object"?e.slice():e.map(n=>ls(n))}function Ao(t,e,n){if(n=n||{},!Cr(n))throw new Error("options is invalid");let o=n.pivot,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=ss(t)),Pe(t,function(i){let u=ns(s,i)+e,f=os(s,i),d=ts(rs(s,f,u));i[0]=d[0],i[1]=d[1]}),t}function Lo(t,e,n={}){if(n.final===!0)return Da(t,e);let o=ce(t),r=ce(e),s=de(o[0]),i=de(r[0]),l=de(o[1]),u=de(r[1]),f=Math.sin(i-s)*Math.cos(u),d=Math.cos(l)*Math.sin(u)-Math.sin(l)*Math.cos(u)*Math.cos(i-s);return Xn(Math.atan2(f,d))}function Da(t,e){let n=Lo(e,t);return n=(n+180)%360,n}function cs(t,e={}){if(t.bbox!=null&&e.recompute!==!0)return t.bbox;let n=[1/0,1/0,-1/0,-1/0];return Pe(t,o=>{n[0]>o[0]&&(n[0]=o[0]),n[1]>o[1]&&(n[1]=o[1]),n[2]<o[0]&&(n[2]=o[0]),n[3]<o[1]&&(n[3]=o[1])}),n}function us(t,e={}){let n=Number(t[0]),o=Number(t[1]),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 $n([[i,[r,o],[r,s],[n,s],i]],e.properties,{bbox:t,id:e.id})}function fs(t){return us(cs(t))}function ms(t){return Hr(t,(e,n)=>e+va(n),0)}function va(t){let e=0,n;switch(t.type){case"Polygon":return ds(t.coordinates);case"MultiPolygon":for(n=0;n<t.coordinates.length;n++)e+=ds(t.coordinates[n]);return e;case"Point":case"MultiPoint":case"LineString":case"MultiLineString":return 0}return 0}function ds(t){let e=0;if(t&&t.length>0){e+=Math.abs(hs(t[0]));for(let n=1;n<t.length;n++)e-=Math.abs(hs(t[n]))}return e}var Va=Ut*Ut/2,Bo=Math.PI/180;function hs(t){let e=t.length-1;if(e<=2)return 0;let n=0,o=0;for(;o<e;){let r=t[o],s=t[o+1===e?0:o+1],i=t[o+2>=e?(o+2)%e:o+2],l=r[0]*Bo,u=s[1]*Bo,f=i[0]*Bo;n+=(f-l)*Math.sin(u),o++}return n*Va}function ps(t){let e=Jr(t);if(!e)throw new Error("Can't calculate smallestSurroundingRectangleByArea for given geometry");let n=Qn(e),o=Wr(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}),f=fs(u),d=ms(f);d<r&&(r=d,s=Ao(f,l,{pivot:n}))}return s}function gs(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(){Ae.identity(),Ae.setFromMatrix3(this.rotation),Ae.decompose(Jn,$e,new qt.Vector3);let e=this.halfSize.clone().multiplyScalar(2),n=new qt.Mesh(new qt.BoxGeometry(e.x,e.y,e.z));return n.position.copy(this.center),n.rotation.setFromQuaternion($e),n}getBoxEdge(e=16776960){let n=this.getBoxMesh();Ha.setFromObject(n);let o=new qt.EdgesGeometry(n.geometry.clone().applyMatrix4(n.matrixWorld));return new qt.LineSegments(o,new qt.LineBasicMaterial({color:e,toneMapped:!1}))}toJson(){return Ae.identity(),Ae.setFromMatrix3(this.rotation),Ae.decompose(Jn,$e,new qt.Vector3),{size:this.halfSize.toArray(),center:this.center.toArray(),quaternion:$e.toArray()}}static from(e,n,o,r=new t){if(o instanceof qt.Euler)$e.setFromEuler(o);else if(o instanceof qt.Quaternion)$e.copy(o);else throw new Error("\u4F20\u5165\u7684\u65CB\u8F6C\u4E0D\u662F\u6B27\u62C9\u89D2\u6216\u8005\u56DB\u5143\u6570");return Ae.compose(n,$e,Wa),r.center.copy(n),r.halfSize.copy(e.multiplyScalar(.5)),r.rotation.setFromMatrix4(Ae),r}static fromByPath2D(e,n,o,r=new t){let s=ps({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=gs(i[0],i[1]),u=gs(i[1],i[2]),f=Math.atan2(i[1][1]-i[0][1],i[1][0]-i[0][0]);Jn.set(l,u,o),xs.set(0,0,f);let[d,c]=Ca(i);return n.x=d,n.y=c,this.from(Jn,n,xs,r)}},Ae=new qt.Matrix4,$e=new qt.Quaternion,xs=new qt.Euler,Wa=new qt.Vector3(1,1,1),Jn=new qt.Vector3,Ha=new qt.Box3;import"three";function _a(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,f=Math.ceil(n/r)+1,d=[];for(let c=-f;c<=f;c++)for(let a=-f;a<=f;a++)for(let h=-f;h<=f;h++)c*c+a*a+h*h<=f*f&&d.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),y=!1;for(let[w,m,p]of d){let x=`${a+w},${h+m},${g+p}`;if(i.has(x)){for(let b of i.get(x))if(c.distanceToSquared(b)<s){y=!0;break}if(y)break}}if(y&&(u++,u/t.length>o))return u/t.length}return u/t.length}function Ve(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 ko(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 q.Vector3,o=new q.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 ue(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 be(t,e,n,o){let r=[];for(let i=0;i<t.length;i++)r.push(new q.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 q.Group,o=new q.MeshStandardMaterial({color:16737792,side:q.DoubleSide});for(let r=0;r<t.length;r++){let s=[];for(let y=0;y<t[r].path.length;y++)s.push(new q.Vector3(t[r].path[y][0],t[r].path[y][1],0));if(s.length==0)continue;n.add(t[r].obb.getBoxEdge());let i=new q.BufferGeometry;i.setFromPoints(s);let l="green",u=new q.LineBasicMaterial({color:l,depthTest:!1,depthWrite:!1}),f=new q.Line(i,u);f.position.z=t[r].maxz,n.add(f);let d=t[r].obb.center.clone(),c=mr(t[r].type,d),a=t[r].stairBottomPt1.clone(),h=t[r].stairBottomPt2.clone();for(let y=0;y<t[r].stairStepNum;y++){let w=[a,h];w.push(h.clone().addScaledVector(t[r].vecStepWidth,t[r].stairStepWidth)),w.push(a.clone().addScaledVector(t[r].vecStepWidth,t[r].stairStepWidth));let m=Eo(w,t[r].stairStepHeight),p=new q.Mesh(m,o);n.add(p),a=a.addScaledVector(t[r].vecStepWidth,t[r].stairStepWidth),a=a.addScaledVector(new q.Vector3(0,0,1),t[r].stairStepHeight),h=h.addScaledVector(t[r].vecStepWidth,t[r].stairStepWidth),h=h.addScaledVector(new q.Vector3(0,0,1),t[r].stairStepHeight)}if(t[r].rectPt1.x!=0&&t[r].rectPt1.y!=0){let y=[t[r].stairBottomPt1,t[r].stairBottomPt2,t[r].rectPt2,t[r].rectPt1],w=Eo(y,t[r].stairStepHeight),m=new q.Mesh(w,o);n.add(m)}let g=new q.MeshBasicMaterial({color:16776960});for(let y=0;y<t[r].stairBottom1BalconyRailing.length;y++){let w=new q.CylinderGeometry(.03,.03,t[r].balconyRailingHeight,32),m=new q.Mesh(w,g);m.position.set(t[r].stairBottom1BalconyRailing[y].x,t[r].stairBottom1BalconyRailing[y].z+t[r].balconyRailingHeight/2,-t[r].stairBottom1BalconyRailing[y].y),e.add(m)}for(let y=0;y<t[r].stairBottom2BalconyRailing.length;y++){let w=new q.CylinderGeometry(.03,.03,t[r].balconyRailingHeight,32),m=new q.Mesh(w,g);m.position.set(t[r].stairBottom2BalconyRailing[y].x,t[r].stairBottom2BalconyRailing[y].z+t[r].balconyRailingHeight/2,-t[r].stairBottom2BalconyRailing[y].y),e.add(m)}}return n},La=(t,e,n=null)=>{if(t.length==0)return[];e||(e=t[0].averagePz);let o=[],r=new Map;for(let i=0;i<t.length;i++){let l=t[i].points.map(p=>[p.x,p.y]),u=t[i].obj_id;u=u.replace(/calcony railing/g,"balcony railing").replace(/glass balcony railing/g,"balcony railing").replace(/metal balcony railing/g,"balcony railing").replace(/temporary construction guardrail/g,"balcony railing").replace(/the floor of the house/g,"floor").replace(/the outdoor floor/g,"floor").replace(/roof/g,"Ceiling");let f=u.split("_").slice(1,3).join("_").split(".")[0].split("_")[0],d=u.indexOf("_")+1,c=u.lastIndexOf("_"),a=u.substring(d,c);if(a.includes("top")&&(d=a.indexOf("top")+4,a=a.substring(d,c)),a.includes("left")&&(d=a.indexOf("left")+5,a=a.substring(d,c)),a.includes("right")&&(d=a.indexOf("right")+6,a=a.substring(d,c)),a.includes("front")&&(d=a.indexOf("front")+6,a=a.substring(d,c)),a==="wall"||a==="stair guardrail")continue;let h=[];for(let p=0;p<t[i].points.length;p++)h.push(new q.Vector3(t[i].points[p].x,t[i].points[p].y,t[i].points[p].z));let g=-99999;if(a==="floor"){let p=new Map;for(let b=0;b<t[i].points.length;b++){let z=t[i].points[b].z;if(z=Math.floor(z*10)/10,p.has(z)){let M=p.get(z);M.num+=1,M.points.push(t[i].points[b]),p.set(z,M)}else p.set(z,{num:1,points:[t[i].points[b]]})}let x=[...p.entries()].reduce((b,z)=>z[1].num>b[1].num?z:b);l=[],l=x[1].points.map(b=>[b.x,b.y]),h=[],h=x[1].points.map(b=>new q.Vector3(b.x,b.y,b.z)),g=x[0]}let y=ue(h),w={points:h,path:Ee(l),h:y.h,minz:y.minz,maxz:y.maxz,center:{x:y.x,y:y.y,z:y.z},obj_id:t[i].obj_id,type:a,averagePz:e,obb:null,isDel:!1,obj_id:u,positionArr:[t[i].position],isStaircaseBalconyRailing:!1};if(w.obb=be(w.path,w.center,w.h,(w.maxz+w.minz)/2),w.obb==null)continue;let m=-1;for(let p=0;p<o.length;p++)if(o[p].type==a){m=p;break}if(m!=-1?o[m].array.push(w):o.push({type:a,array:[w]}),a=="floor"&&g!=-99999)if(r.has(g)){let p=r.get(g);p.num+=w.points.length,p.datas.push(w),r.set(g,p)}else r.set(g,{num:w.points.length,datas:[w]})}if(r.size>0){let i=[];for(let[l,u]of r.entries()){let{num:f,datas:d}=u;f>3e3&&i.push(...d)}for(let l=0;l<o.length;l++)if(o[l].type=="floor"){o[l].array=i;break}}for(let i=0;i<o.length;i++){let l=o[i].array,u=new Set,f=[];for(let c=0;c<l.length;c++){if(l[c].obb==null||u.has(c))continue;let a={...l[c],obb:l[c].obb.clone()},h=0,g=0;if(a.type=="pipe"){let w=qe(a.points);h=w.minZ,g=w.maxZ}let y=!0;h!=0&&g!=0&&Math.abs(g-h)<.3&&(y=!1);for(let w=c+1;w<l.length;w++){if(l[w].obb==null||u.has(w))continue;let m=0,p=0;if(l[w].type=="pipe"){let z=qe(l[w].points);m=z.minZ,p=z.maxZ}let x=!0;if(m!=0&&p!=0&&Math.abs(p-m)<.3&&(x=!1),a.type=="pipe"&&l[w].type=="pipe"&&y!=x)continue;let b=!1;if(a.type=="pipe"&&!y?b=Ve(l[w].points,a.obb)>.3:(b=a.obb.intersectsOBB(l[w].obb,.01),b||(b=$a(a.obb,l[w].obb))),b){u.add(w);for(let P=0;P<l[w].points.length;P++)(l[w].points[P].z>e&&l[w].points[P].z-e>.1||a.type=="floor"||a.type=="Staircase")&&a.points.push(l[w].points[P]);let z=a.points.map(P=>[P.x,P.y]);a.type=="floor"&&(z=Ga(z,.1)),a.path=Ee(z);let M=ue(a.points);a.h=M.h,a.minz=M.minz,a.maxz=M.maxz,a.center={x:M.x,y:M.y,z:M.z},a.obb=be(a.path,a.center,a.h,(a.maxz+a.minz)/2),a.positionArr.push(...l[w].positionArr),w=c}}a.path.length>l[c].path.length&&(u.add(c),f.push(a))}let d=[];for(let c=0;c<l.length;c++)u.has(c)||d.push(l[c]);d.push(...f),o[i].array=d}for(let i=0;i<o.length;i++){let l=o[i].type;if(l==="people"||l==="floor")continue;let u=o[i].array;for(let f=0;f<u.length;f++){let d=u[f].obb,c=u[f].minz,a=u[f].maxz,h=u[f].averagePz;if(l==="window"||l==="door"||l==="tv"||l==="chair"||l==="cabinet"||l==="table"){let g=new q.Vector3;d.getSize(g);let y=[g.x,g.y,g.z],w=0;for(let m of y)if(m<.2&&(w++,w===2)){u[f].isDel=!0;break}}if(!u[f].isDel)for(let g=i+1;g<o.length;g++){let y=o[g].type;if(y==="people")continue;let w=o[g].array;for(let m=0;m<w.length;m++){if(w[m].isDel)continue;let p=w[m].obb,x=w[m].minz,b=w[m].maxz;if(d.intersectsOBB(p)){let z=Ve(w[m].points,d),M=Ve(u[f].points,p),P=Oo(d,p);if(M>=.5&&P==-1&&l!=="Staircase"&&y!=="Staircase"){u[f].isDel=!0;break}if(l!=="wall"&&l!=="floor"&&l!=="roof"){if(l==="window"){if(y==="balcony railing"&&Qt(d,w[m].points)){w[m].isDel=!0;continue}if(y==="balcony railing"&&Qt(p,u[f].points)){u[f].isDel=!0;break}if(y==="balcony railing"&&ko(d,p,u[f].points,w[m].points)&&(Math.abs(c-x)<.1||Math.abs(x-h)>.3)){w[m].isDel=!0;continue}if(y==="door"&&Qt(d,w[m].points)){w[m].isDel=!0;continue}if(y==="door"&&Qt(p,u[f].points)){w[m].isDel=!0;continue}if(y==="window sill")continue}else if(l==="balcony railing"){if(y==="window"&&Qt(d,w[m].points)){w[m].isDel=!0;continue}if(y==="window"&&Qt(p,u[f].points)){u[f].isDel=!0;break}if(y==="window"&&ko(d,p,u[f].points,w[m].points)&&(Math.abs(c-x)<.1||Math.abs(c-h)>.3)){u[f].isDel=!0;break}if(y==="Staircase"&&Qt(d,w[m].points)){u[f].isStaircaseBalconyRailing=!0;break}if(y==="Staircase"&&Qt(p,u[f].points)){u[f].isStaircaseBalconyRailing=!0;break}if(y==="Staircase"&&d.intersectsOBB(p)){u[f].isStaircaseBalconyRailing=!0;break}}else if(l==="door"){if(y==="window"&&Qt(d,w[m].points)){u[f].isDel=!0;break}if(y==="window"&&Qt(p,u[f].points)){u[f].isDel=!0;break}if(y==="window sill"&&Qt(d,w[m].points)){u[f].isDel=!0;break}if(y==="window sill"&&Qt(p,u[f].points)){u[f].isDel=!0;break}}else if(l==="window sill"){if(y==="window")continue;if(y==="floor"&&Qt(d,w[m].points)){w[m].isDel=!0;continue}if(y==="door"&&Qt(d,w[m].points)){w[m].isDel=!0;continue}if(y==="door"&&Qt(p,u[f].points)){w[m].isDel=!0;continue}}else if(l==="Staircase"){if(y==="balcony railing"&&Qt(d,w[m].points)){w[m].isStaircaseBalconyRailing=!0;continue}if(y==="balcony railing"&&Qt(p,u[f].points)){w[m].isStaircaseBalconyRailing=!0;continue}if(y==="balcony railing"&&d.intersectsOBB(p)){w[m].isStaircaseBalconyRailing=!0;continue}}let E=!1,S=[],I=[],H=u[f].points,D=w[m].points;if(H.length>D.length?(E=!0,S=H,I=D):(S=D,I=H),_a(I,S,.03,.5)>.5)if(E)w[m].isDel=!0;else{u[f].isDel=!0;break}else if(ko(d,p,u[f].points,w[m].points)){let R=Oo(d,p);if(R===1||R===0){if(y==="switch"||y==="Staircase")continue;H.length>D.length?Ve(I,d)>=.5&&(w[m].isDel=!0):Ve(S,d)>=.5&&(w[m].isDel=!0)}else{if(l==="switch"||l==="Staircase")continue;if(H.length>D.length){if(Ve(S,p)>=.5){u[f].isDel=!0;break}}else if(Ve(I,p)>=.5){u[f].isDel=!0;break}}}}}}if(u[f].isDel)break}}}for(let i=0;i<o.length;i++){let l=o[i].type,u=o[i].array;for(let f=0;f<u.length;f++){let d=u[f].maxz,c=u[f].minz,a=l==="switch"?.1:.3;if(Math.abs(d-e)<a&&l!="floor"){u[f].isDel=!0;continue}if(l==="window"||l==="door"||l==="tv"){let h=Math.abs(d-e),g=Math.abs(c-e);(l==="tv"&&g<1.6||l!=="window"&&h<1.6)&&(u[f].isDel=!0),l==="window"&&h<1&&(u[f].isDel=!0),l==="door"&&g>1&&(u[f].isDel=!0)}if(l==="chair"){let h=new q.Vector3;u[f].obb.getSize(h),(h.x<.1||h.y<.1||h.z<.2)&&(u[f].isDel=!0)}if(l==="balcony railing"&&(Math.abs(d-c)<.4&&(u[f].isDel=!0),(c<e&&Math.abs(c-e)>1||c>e&&Math.abs(c-e)>1)&&(u[f].isDel=!0),d<e&&(u[f].isDel=!0)),l==="people"&&(Math.abs(d-c)<1&&(u[f].isDel=!0),c>e&&c-e>.3&&(u[f].isDel=!0),d<e&&(u[f].isDel=!0)),l==="floor"){let h=new q.Vector3;u[f].obb.getSize(h),(h.x<.1||h.y<.1)&&(u[f].isDel=!0)}l==="stair guardrail"&&u[f].points.length<100&&(u[f].isDel=!0)}}for(let i=0;i<o.length;i++)o[i].array=o[i].array.filter(l=>!l.isDel);if(n!=null)for(let i=0;i<o.length;i++){if(o[i].type=="floor")continue;let u=o[i].array,f=new Set,d=[];for(let c=0;c<u.length;c++){if(f.has(c))continue;let a=u[c].points,h=u[c].obj_id,g=u[c].type,y=u[c].averagePz,w=u[c].positionArr,m=u[c].isStaircaseBalconyRailing;if(a.length<50)continue;let p=n([a],{tolerance:.2,minClusterSize:50,maxClusterSize:1e7,threadCount:1}),x=d.length;if(p.length>0&&p[0].length>1)for(let b of p[0]){if(b.length<50)continue;let z=b.map(S=>a[S]),M=ue(z),P=z.map(S=>[S.x,S.y]),E={points:z,path:Ee(P),h:M.h,minz:M.minz,maxz:M.maxz,center:{x:M.x,y:M.y,z:M.z},type:g,averagePz:y,obb:null,obj_id:h,positionArr:w,isStaircaseBalconyRailing:m};E.obb=be(E.path,E.center,E.h,(E.maxz+E.minz)/2),E.obb!=null&&d.push(E)}d.length!=x&&f.add(c)}if(f.size>0){for(let c=0;c<u.length;c++)f.has(c)||d.push(u[c]);o[i].array=d}}let s=[];for(let i=0;i<o.length;i++){let l=o[i].array;for(let u=0;u<l.length;u++)s.push({obbBox:l[u].obb,box:new q.Box3().setFromPoints(l[u].points),category:l[u].type,center:{x:l[u].center.x,y:l[u].center.y,z:(l[u].minz+l[u].maxz)/2},name:l[u].obj_id,obj_id:l[u].obj_id,pcdPoints:l[u].points,positionArr:l[u].positionArr,isStaircaseBalconyRailing:l[u].isStaircaseBalconyRailing})}return s},Ba=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(w=>[w.x,w.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,f=i.lastIndexOf("_"),d=i.substring(u,f);if(d!=="floor")continue;let c=[];for(let w=0;w<t[r].points.length;w++)c.push(new q.Vector3(t[r].points[w].x,t[r].points[w].y,t[r].points[w].z));let a=-99999;if(d==="floor"){let w=new Map;for(let p=0;p<t[r].points.length;p++){let x=t[r].points[p].z;if(x=Math.floor(x*10)/10,w.has(x)){let b=w.get(x);b.num+=1,b.points.push(t[r].points[p]),w.set(x,b)}else w.set(x,{num:1,points:[t[r].points[p]]})}let m=[...w.entries()].reduce((p,x)=>x[1].num>p[1].num?x:p);s=[],s=m[1].points.map(p=>[p.x,p.y]),c=[],c=m[1].points.map(p=>new q.Vector3(p.x,p.y,p.z)),a=m[0]}let h=ue(c),g={points:c,path:Ee(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:d,obb:null,isDel:!1,obj_id:i,positionArr:[t[r].position]};if(g.obb=be(g.path,g.center,g.h,(g.maxz+g.minz)/2),g.obb==null)continue;let y=-1;for(let w=0;w<e.length;w++)if(e[w].type==d){y=w;break}if(y!=-1?e[y].array.push(g):e.push({type:d,array:[g]}),d=="floor"&&a!=-99999)if(n.has(a)){let w=n.get(a);w.num+=g.points.length,w.datas.push(g),n.set(a,w)}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 f=0;f<s.length;f++){if(s[f].obb==null||i.includes(f))continue;let d={...s[f],obb:s[f].obb.clone()};for(let c=f+1;c<s.length;c++){if(s[c].obb==null||i.includes(c))continue;if(d.obb.intersectsOBB(s[c].obb)){i.push(c);for(let y=0;y<s[c].points.length;y++)d.points.push(s[c].points[y]);let h=d.points.map(y=>[y.x,y.y]);d.path=Ee(h);let g=ue(d.points);d.h=g.h,d.minz=g.minz,d.maxz=g.maxz,d.center={x:g.x,y:g.y,z:g.z},d.obb=be(d.path,d.center,d.h,(d.maxz+d.minz)/2),d.positionArr.push(...s[c].positionArr),c=f}}d.path.length>s[f].path.length&&(i.push(f),l.push(d))}let u=[];for(let f=0;f<s.length;f++)i.includes(f)||u.push(s[f]);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 q.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},ka=(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 y=0;y<g.length;y++){let w=g[y].points.map(S=>[S.x,S.y]),m=g[y].obj_id;m=m.replace(/the floor of the house/g,"floor").replace(/the outdoor floor/g,"floor").replace(/calcony railing/g,"balcony railing").replace(/glass balcony railing/g,"balcony railing").replace(/metal balcony railing/g,"balcony railing").replace(/temporary construction guardrail/g,"balcony railing");let p=m.split("_").slice(1,3).join("_").split(".")[0].split("_")[0],x=m.indexOf("_")+1,b=m.lastIndexOf("_"),z=m.substring(x,b);if(z.includes("top")&&(x=z.indexOf("top")+4,z=z.substring(x,b)),z.includes("left")&&(x=z.indexOf("left")+5,z=z.substring(x,b)),z.includes("right")&&(x=z.indexOf("right")+6,z=z.substring(x,b)),z.includes("front")&&(x=z.indexOf("front")+6,z=z.substring(x,b)),z!=="Staircase"&&z!=="balcony railing")continue;let M=[];for(let S=0;S<g[y].points.length;S++)M.push(new q.Vector3(g[y].points[S].x,g[y].points[S].y,g[y].points[S].z));let P=ue(M),E={points:M,path:Ee(w),h:P.h,minz:P.minz,maxz:P.maxz,center:{x:P.x,y:P.y,z:P.z},obj_id:g[y].obj_id,type:z,averagePz:0,obb:null,isDel:!1,obj_id:m,positionArr:[g[y].position],aabbBox:new q.Box3().setFromPoints(M)};E.obb=be(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:[]},y=r.get(a);if(!y){g.otherTrajectoryResults=h,l.push(g);continue}let w=[],m=[],p=[];for(let x=0;x<y.length;x++){let b=[];for(let M=0;M<y[x].points.length;M++){let P=[new q.Vector3(y[x].points[M].x,y[x].points[M].y,y[x].points[M].z)];P.push(P[0].clone().addScaledVector(new q.Vector3(0,0,-1),2));let E=new q.Box3().setFromPoints(P);b.push(E)}let z=[];for(let M=0;M<h.length;M++)for(let P=0;P<b.length;P++)!p.includes(M)&&h[M].aabbBox.intersectsBox(b[P])&&(p.push(M),z.push(h[M]));z.length>0&&m.push(z)}for(let x=0;x<h.length;x++)p.includes(x)||w.push(h[x]);g.findTrajectoryResults=m,g.otherTrajectoryResults=w,l.push(g)}function u(a,h){let g=a,y=[],w=[];for(let p=0;p<a.length;p++){if(a[p].obb==null||y.includes(p))continue;let x={...a[p],obb:a[p].obb.clone()};for(let b=p+1;b<a.length;b++){if(a[b].obb==null||y.includes(b))continue;if(x.obb.intersectsOBB(a[b].obb)||h){y.push(b);for(let E=0;E<a[b].points.length;E++)x.points.push(a[b].points[E]);let M=x.points.map(E=>[E.x,E.y]);x.path=Ee(M);let P=ue(x.points);x.h=P.h,x.minz=P.minz,x.maxz=P.maxz,x.center={x:P.x,y:P.y,z:P.z},x.obb=be(x.path,x.center,x.h,(x.maxz+x.minz)/2),x.positionArr.push(...a[b].positionArr),b=p}}x.path.length>a[p].path.length&&(y.push(p),w.push(x))}let m=[];for(let p=0;p<a.length;p++)y.includes(p)||m.push(a[p]);return m.push(...w),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 y=ys(l[a].findTrajectoryResults[h][g].points,{binCount:100,minBinPoints:5,sideK:2.2,zK:2.2,minSideRange:.2,minZRange:.2,lowerZScale:.4,upperZScale:1.8}),w=bs(y.keep,{radius:.1,minClusterSize:50,lowPercent:.45});if(w.keep.length==0){l[a].findTrajectoryResults[h][g].isDel=!0;continue}l[a].findTrajectoryResults[h][g].points=w.keep;let m=l[a].findTrajectoryResults[h][g].points.map(x=>[x.x,x.y]);l[a].findTrajectoryResults[h][g].path=Ee(m);let p=ue(l[a].findTrajectoryResults[h][g].points);l[a].findTrajectoryResults[h][g].h=p.h,l[a].findTrajectoryResults[h][g].minz=p.minz,l[a].findTrajectoryResults[h][g].maxz=p.maxz,l[a].findTrajectoryResults[h][g].center={x:p.x,y:p.y,z:p.z},l[a].findTrajectoryResults[h][g].obb=be(l[a].findTrajectoryResults[h][g].path,l[a].findTrajectoryResults[h][g].center,l[a].findTrajectoryResults[h][g].h,(l[a].findTrajectoryResults[h][g].maxz+l[a].findTrajectoryResults[h][g].minz)/2)}l[a].findTrajectoryResults[h]=l[a].findTrajectoryResults[h].filter(g=>!g.isDel)}for(let h=0;h<l[a].otherTrajectoryResults.length;h++){let g=ys(l[a].otherTrajectoryResults[h].points,{binCount:100,minBinPoints:5,sideK:2.2,zK:2.2,minSideRange:.2,minZRange:.2,lowerZScale:.4,upperZScale:1.8}),y=bs(g.keep,{radius:.1,minClusterSize:50,lowPercent:.45});if(y.keep.length==0){l[a].otherTrajectoryResults[h].isDel=!0;continue}l[a].otherTrajectoryResults[h].points=y.keep;let w=l[a].otherTrajectoryResults[h].points.map(p=>[p.x,p.y]);l[a].otherTrajectoryResults[h].path=Ee(w);let m=ue(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=be(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 f(a){for(let h=0;h<a.length;h++){let g=a[h].obb;for(let y=h+1;y<a.length;y++){let w=a[y].obb;if(!a[y].isDel){if(g.intersectsOBB(w)){let m=Ve(a[y].points,g),p=Ve(a[h].points,w),x=Oo(g,w);if(m>=.5&&(x==1||x==0)&&(a[y].isDel=!0),p>=.5&&x==-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=f(h)}function d(a){let h=[];if(a.length>0){let g=.3,y=.5,w=.5,m=.2;for(let p=0;p<a.length;p++){let x=a[p].obb.halfSize.clone().multiplyScalar(2),b=a[p].points,z=x.x,M=x.y,P=x.z;if(z>M&&([z,M]=[M,z]),z<y||M<g||P<w)continue;let E=yr(a[p].obb);if(E.length!=8)continue;let S=new q.Line3(E[0],E[1]),I=new q.Line3(E[1],E[2]),H=new q.Line3(E[2],E[3]),D=new q.Line3(E[3],E[0]),T=new q.Line3(E[4],E[5]),R=new q.Line3(E[5],E[6]),v=new q.Line3(E[6],E[7]),W=new q.Line3(E[7],E[4]),V=[],C=[],_=[],A=[],B=[],k=[],F=[],L=[];for(let bt=0;bt<b.length;bt++){let Jt=S.closestPointToPoint(b[bt],!0,new q.Vector3),he=I.closestPointToPoint(b[bt],!0,new q.Vector3),St=H.closestPointToPoint(b[bt],!0,new q.Vector3),ee=D.closestPointToPoint(b[bt],!0,new q.Vector3),et=T.closestPointToPoint(b[bt],!0,new q.Vector3),me=R.closestPointToPoint(b[bt],!0,new q.Vector3),Le=v.closestPointToPoint(b[bt],!0,new q.Vector3),Be=W.closestPointToPoint(b[bt],!0,new q.Vector3);Jt.distanceTo(b[bt])<m&&V.push(b[bt]),he.distanceTo(b[bt])<m&&C.push(b[bt]),St.distanceTo(b[bt])<m&&_.push(b[bt]),ee.distanceTo(b[bt])<m&&A.push(b[bt]),et.distanceTo(b[bt])<m&&B.push(b[bt]),me.distanceTo(b[bt])<m&&k.push(b[bt]),Le.distanceTo(b[bt])<m&&F.push(b[bt]),Be.distanceTo(b[bt])<m&&L.push(b[bt])}let O=E[0].distanceTo(E[1]),$=E[1].distanceTo(E[2]),G=E[2].distanceTo(E[3]),Q=E[3].distanceTo(E[0]),j=new q.Vector3,Z=new q.Vector3,Y=new q.Vector3,it=new q.Vector3;Math.abs(O-z)<.01?V.length>_.length?(j=E[0].clone(),Z=E[1].clone(),Y=new q.Vector3().subVectors(Z,j).normalize(),it=new q.Vector3().subVectors(E[2],E[1]).normalize()):(j=E[2].clone(),Z=E[3].clone(),Y=new q.Vector3().subVectors(Z,j).normalize(),it=new q.Vector3().subVectors(E[0],E[3]).normalize()):C.length>A.length?(j=E[1].clone(),Z=E[2].clone(),Y=new q.Vector3().subVectors(Z,j).normalize(),it=new q.Vector3().subVectors(E[3],E[2]).normalize()):(j=E[3].clone(),Z=E[0].clone(),Y=new q.Vector3().subVectors(Z,j).normalize(),it=new q.Vector3().subVectors(E[1],E[0]).normalize());let ht=E[4].distanceTo(E[5]),Tt=E[5].distanceTo(E[6]),nt=E[6].distanceTo(E[7]),wt=E[7].distanceTo(E[4]),zt=new q.Vector3,Dt=new q.Vector3,Pt=new q.Vector3(j.x,j.y,E[4].z),Mt=new q.Vector3(Z.x,Z.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=j.distanceTo(Z),ot=zt.distanceTo(Dt),ft=new q.Vector3().subVectors(new q.Vector3(j.x,j.y,zt.z),j).normalize();if(Math.abs(It-ot)>.01||Math.abs(It-z)>.01){console.log("\u4E0A\u4E0B\u957F\u5EA6\u4E0D\u4E00\u81F4,\u6216\u4E0E\u5BBD\u4E0D\u4E00\u81F4",It,ot,z);continue}let rt=Math.sqrt(It*It+ot*ot),tt=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(rt)))),ae={stairStepHeight:P/tt,stairStepWidth:M/tt,staitWidth:z,stairLength:M,stairHeigth:P,stairStepNum:tt,stairBottomPt1:j,stairBottomPt2:Z,stairTopPt1:zt,stairTopPt2:Dt,vecStepLength:Y,vecStepWidth:it,vecStepHeight:ft,path:a[p].path,obb:a[p].obb,maxz:a[p].maxz,points:a[p].points,rectPt1:new q.Vector3(0,0,0),rectPt2:new q.Vector3(0,0,0)};h.push(ae)}}return h}let c=[];for(let a=0;a<l.length;a++)c.push(...d(l[a].lastTrajectoryResults));for(let a=0;a<c.length;a++){let h=c[a].stairTopPt1.clone(),g=c[a].stairTopPt2.clone(),y=c[a].stairBottomPt1.clone(),w=c[a].stairBottomPt2.clone(),m=h.clone(),p=g.clone(),x=y.clone(),b=w.clone();m.z=p.z=x.z=b.z=0;let z=At(h,g,!0),M=At(y,w,!0),P=At(z,M),E=new q.Vector3().subVectors(z,P).normalize(),S=new q.Vector3().subVectors(M,P).normalize(),I=z.distanceTo(M),H=!1,D=!1;for(let T=0;T<c.length;T++){if(a==T)continue;let R=c[T].stairTopPt1.clone(),v=c[T].stairTopPt2.clone(),W=c[T].stairBottomPt1.clone(),V=c[T].stairBottomPt2.clone(),C=new q.Vector3().subVectors(R,v).normalize(),_=new q.Vector3().subVectors(W,V).normalize(),A=R.clone(),B=v.clone(),k=W.clone(),F=V.clone();A.z=B.z=k.z=F.z=0;let L=At(R,v,!0),O=At(W,V,!0),$=L.distanceTo(O),G=Xt(z,M,L,O),Q=!1;if(G&&G.isParallel&&R.z<=y.z&&y.z-R.z<.3){Q=!0,D=!0;let j=A.addScaledVector(C.clone().negate(),100),Z=B.addScaledVector(C,100),Y=k.addScaledVector(_.clone().negate(),100),it=F.addScaledVector(_,100),ht=new q.Line3(j,Z),Tt=new q.Line3(Y,it),nt=ht.closestPointToPoint(P,!0,new q.Vector3),wt=Tt.closestPointToPoint(P,!0,new q.Vector3),zt=new q.Vector3().subVectors(nt,P),Dt=new q.Vector3().subVectors(wt,P),Pt=zt.length(),Mt=Dt.length();Dt=Dt.normalize(),zt=zt.normalize();let It=$t(E,zt,.1),ot=$t(S,zt,.1),ft=$t(S,Dt,.1),rt=$t(E,Dt,.1);if(It&&It.sameDirection&&Pt>I/2){let tt=Pt-I/2;c[a].stairBottomPt1=c[a].stairBottomPt1.addScaledVector(S,tt),c[a].stairBottomPt2=c[a].stairBottomPt2.addScaledVector(S,tt)}else if(ot&&ot.sameDirection&&Pt>I/2){let tt=Pt-I/2;c[a].stairBottomPt1=c[a].stairBottomPt1.addScaledVector(S,tt),c[a].stairBottomPt2=c[a].stairBottomPt2.addScaledVector(S,tt)}if(ft&&ft.sameDirection&&Mt>I/2){let tt=Mt-I/2;c[a].stairTopPt1=c[a].stairTopPt1.addScaledVector(E,tt),c[a].stairTopPt2=c[a].stairTopPt2.addScaledVector(E,tt)}else if(rt&&rt.sameDirection&&Mt>I/2){let tt=Mt-I/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,H=!0;let j=A.addScaledVector(C.clone().negate(),100),Z=B.addScaledVector(C,100),Y=k.addScaledVector(_.clone().negate(),100),it=F.addScaledVector(_,100),ht=new q.Line3(j,Z),Tt=new q.Line3(Y,it),nt=ht.closestPointToPoint(P,!1,new q.Vector3),wt=Tt.closestPointToPoint(P,!1,new q.Vector3),zt=new q.Vector3().subVectors(nt,P),Dt=new q.Vector3().subVectors(wt,P),Pt=zt.length(),Mt=Dt.length();Dt=Dt.normalize(),zt=zt.normalize();let It=$t(E,zt,.1),ot=$t(S,zt,.1),ft=$t(S,Dt,.1),rt=$t(E,Dt,.1);if(It&&It.sameDirection&&Pt>I/2){let tt=Pt-I/2;c[a].stairBottomPt1=c[a].stairBottomPt1.addScaledVector(S,tt),c[a].stairBottomPt2=c[a].stairBottomPt2.addScaledVector(S,tt)}else if(ot&&ot.sameDirection&&Pt>I/2){let tt=Pt-I/2;c[a].stairBottomPt1=c[a].stairBottomPt1.addScaledVector(S,tt),c[a].stairBottomPt2=c[a].stairBottomPt2.addScaledVector(S,tt)}if(ft&&ft.sameDirection&&Mt>I/2){let tt=Mt-I/2;c[a].stairTopPt1=c[a].stairTopPt1.addScaledVector(E,tt),c[a].stairTopPt2=c[a].stairTopPt2.addScaledVector(E,tt)}else if(rt&&rt.sameDirection&&Mt>I/2){let tt=Mt-I/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(),y=c[a].stairBottomPt1.clone(),w=c[a].stairBottomPt2.clone(),m=h.clone(),p=g.clone(),x=y.clone(),b=w.clone(),m.z=p.z=x.z=b.z=0,z=At(h,g,!0),M=At(y,w,!0),P=At(z,M),E=new q.Vector3().subVectors(z,P).normalize(),S=new q.Vector3().subVectors(M,P).normalize(),I=z.distanceTo(M)),D&&H)break}if(D||H){let T=c[a].stairTopPt1.clone(),R=c[a].stairTopPt2.clone(),v=c[a].stairBottomPt1.clone(),W=c[a].stairBottomPt2.clone(),V=At(T,R,!0),C=At(v,W,!0),_=V.distanceTo(C),A=c[a].stairTopPt1.distanceTo(c[a].stairTopPt2),B=c[a].stairBottomPt1.distanceTo(c[a].stairBottomPt2),k=Math.sqrt(A*A+B*B),F=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(k))));c[a].stairStepNum=F,c[a].stairHeigth=c[a].stairTopPt1.z-c[a].stairBottomPt1.z,c[a].stairStepHeight=c[a].stairHeigth/c[a].stairStepNum,c[a].stairStepWidth=_/c[a].stairStepNum}}for(let a=0;a<c.length;a++){let h=c[a].stairTopPt1,g=c[a].stairTopPt2,y=c[a].stairBottomPt1.clone(),w=c[a].stairBottomPt2.clone(),m=new q.Vector3(h.x,h.y,y.z),p=c[a].vecStepWidth;for(let x=0;x<c.length;x++){if(a==x)continue;let b=c[x].stairTopPt1,z=c[x].stairTopPt2,M=c[x].stairBottomPt1.clone(),P=c[x].stairBottomPt2.clone(),E=new q.Vector3(b.x,b.y,M.z),S=c[x].vecStepWidth;if(Math.abs(h.z-M.z)<.3&&M.z>y.z&&c[a].obb.intersectsOBB(c[x].obb)){let I=ie(m,y,E,M);if(I&&I.angle>75){let H=M.distanceTo(h),D=M.distanceTo(g),T=P.distanceTo(h),R=P.distanceTo(g),v=h.clone(),W=v.clone().addScaledVector(p,c[x].staitWidth),V=new q.Vector3().subVectors(g,h).normalize(),C=h.distanceTo(g),_=v.clone().addScaledVector(V,C),A=W.clone().addScaledVector(V,C),B=v.clone().addScaledVector(V,c[x].stairLength),k=W.clone().addScaledVector(V,c[x].stairLength),F=H;(F>D||F>R)&&(F=D,v=g.clone(),W=v.clone().addScaledVector(p,c[x].staitWidth),V=new q.Vector3().subVectors(h,g).normalize(),C=h.distanceTo(g),_=v.clone().addScaledVector(V,C),A=W.clone().addScaledVector(V,C),B=v.clone().addScaledVector(V,c[x].stairLength),k=W.clone().addScaledVector(V,c[x].stairLength));let L=new q.Vector3().subVectors(B,_).normalize(),O=B.distanceTo(_);B.z=k.z=c[x].maxz,c[x].stairBottomPt1=_,c[x].stairBottomPt2=A,c[x].stairTopPt1=B,c[x].stairTopPt2=k,c[x].rectPt1=v,c[x].rectPt2=W;let $=_.distanceTo(A),G=B.distanceTo(k),Q=Math.sqrt(O*O+c[x].stairHeigth*c[x].stairHeigth),j=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(Q))));c[x].stairStepNum=j,c[x].stairHeigth=B.z-_.z,c[x].stairStepHeight=c[x].stairHeigth/c[x].stairStepNum,c[x].stairStepWidth=O/c[x].stairStepNum,c[x].vecStepLength=V.clone().negate(),c[x].vecStepWidth=L;break}}}}return t.finalFloorMap&&Fa(c,t.finalFloorMap),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(),f=t[s].stairBottomPt2.clone(),d=new q.Vector3().subVectors(l,i).normalize();i=i.addScaledVector(d,.05),l=l.addScaledVector(d.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 y=g.map(z=>[z.x,z.y]);g.push(new q.Vector3(g[3].x,g[3].y,g[3].z+o)),g.push(new q.Vector3(g[2].x,g[2].y,g[2].z+o)),g.push(new q.Vector3(g[1].x,g[1].y,g[1].z+o)),g.push(new q.Vector3(g[0].x,g[0].y,g[0].z+o));let w=ue(g),m=be(y,{x:w.x,y:w.y,z:w.z},w.h,(w.maxz+w.minz)/2),p=[],x=!1,b=0;for(let z=0;z<e.length;z++)if(m.intersectsOBB(e[z].obb)){for(let M=0;M<e[z].points.length&&!(m.containsPoint(e[z].points[M])&&(h==0&&p.push(e[z].points[M]),e[z].points[M].z>i.z&&e[z].points[M].z-i.z<1&&(b++,b>10&&h!=0)));M++);if(b>10&&(x=!0),h!=0&&x)break}if(r==0&&(r=ue(p).maxz),x){let z=At(g[1],g[2]);z.z+=t[s].stairStepHeight,c.push(z)}g=[],g=[l,f],g.push(g[1].clone().addScaledVector(t[s].vecStepWidth,t[s].stairStepWidth)),g.push(g[0].clone().addScaledVector(t[s].vecStepWidth,t[s].stairStepWidth)),y=g.map(z=>[z.x,z.y]),g.push(new q.Vector3(g[3].x,g[3].y,g[3].z+o)),g.push(new q.Vector3(g[2].x,g[2].y,g[2].z+o)),g.push(new q.Vector3(g[1].x,g[1].y,g[1].z+o)),g.push(new q.Vector3(g[0].x,g[0].y,g[0].z+o)),w=ue(g),m=be(y,{x:w.x,y:w.y,z:w.z},w.h,(w.maxz+w.minz)/2),p=[],x=!1;for(let z=0;z<e.length;z++)if(m.intersectsOBB(e[z].obb)){let M=0;for(let P=0;P<e[z].points.length&&!(m.containsPoint(e[z].points[P])&&(h==0&&p.push(e[z].points[P]),e[z].points[P].z>i.z&&e[z].points[P].z-i.z<1&&(M++,M>10&&h!=0)));P++);if(M>10&&(x=!0),h!=0&&x)break}if(r==0&&(r=ue(p).maxz),x){let z=At(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),f=f.addScaledVector(t[s].vecStepWidth,t[s].stairStepWidth),f=f.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 Fa(t,e){if(!t||!e)return;let n=[];for(let o=0;o<t.length;o++){let r=t[o].stairTopPt1.clone(),s=t[o].stairTopPt2.clone(),i=t[o].stairBottomPt1.clone(),l=t[o].stairBottomPt2.clone(),u=r.clone(),f=s.clone(),d=i.clone(),c=l.clone();u.z=f.z=d.z=c.z=0;let a=At(r,s,!0),h=At(i,l,!0),g=At(a,h),y=new q.Vector3().subVectors(a,g).normalize(),w=new q.Vector3().subVectors(h,g).normalize(),m=a.distanceTo(h),p=-1,x=-1;for(let b=0;b<t.length;b++){if(o==b)continue;let z=t[b].stairTopPt1.clone(),M=t[b].stairTopPt2.clone(),P=t[b].stairBottomPt1.clone(),E=t[b].stairBottomPt2.clone(),S=new q.Vector3().subVectors(z,M).normalize(),I=new q.Vector3().subVectors(P,E).normalize(),H=z.clone(),D=M.clone(),T=P.clone(),R=E.clone();H.z=D.z=T.z=R.z=0;let v=At(z,M,!0),W=At(P,E,!0),V=v.distanceTo(W),C=Xt(a,h,v,W);if(C&&C.isParallel&&r.z<=P.z&&P.z-r.z<=.2?p=b:C&&C.isParallel&&z.z<=i.z&&i.z-z.z<=.3&&(x=b),p!=-1&&x!=-1)break}for(let b=0;b<e.length;b++){let z=e[b][1];for(let M=0;M<z.length;M++){let P=`${b}+${M}`;if(n.includes(P))continue;let E=z[M].points;if(o==0&&Math.abs(E[0].z-i.z)<.2){let S=i.clone().addScaledVector(t[o].vecStepWidth.clone().negate(),5),I=l.clone().addScaledVector(t[o].vecStepWidth.clone().negate(),5),H=new q.Line3(S,I),D=new q.Line3(i,l),T=999999,R=0,v=new q.Vector3,W=0;for(let V=0;V<E.length;V++){let C=new q.Vector3(E[V].x,E[V].y,S.z),A=H.closestPointToPoint(C,!1,new q.Vector3).distanceTo(C),B=D.closestPointToPoint(C,!1,new q.Vector3),k=new q.Vector3().subVectors(C,B).normalize(),F=$t(k,t[o].vecStepWidth.clone().negate(),.1);A<T&&F.sameDirection&&(T=A,R=C.distanceTo(B),v=C.clone(),W=E[V].z)}T!=-999999&&(n.push(P),t[o].stairBottomPt1.z=t[o].stairBottomPt2.z=W)}else if(Math.abs(E[0].z-r.z)<.2){let S=r.clone().addScaledVector(t[o].vecStepWidth,5),I=s.clone().addScaledVector(t[o].vecStepWidth,5),H=new q.Line3(S,I),D=new q.Line3(r,s),T=0,R=999999,v=new q.Vector3,W=0;for(let V=0;V<E.length;V++){let C=new q.Vector3(E[V].x,E[V].y,S.z),_=H.closestPointToPoint(C,!1,new q.Vector3),A=D.closestPointToPoint(C,!1,new q.Vector3),B=new q.Vector3().subVectors(C,A).normalize(),k=_.distanceTo(C),F=$t(B,t[o].vecStepWidth);k<R&&F.sameDirection&&(R=k,T=C.distanceTo(A),v=C,W=E[V].z)}if(R!=-999999){if(n.push(P),t[o].stairTopPt1.z=t[o].stairTopPt2.z=W,p!=-1){t[p].stairBottomPt1.z=t[p].stairBottomPt2.z=W;let V=[t[o].stairTopPt1.clone(),t[o].stairTopPt2.clone(),t[p].stairBottomPt1.clone(),t[p].stairBottomPt2.clone()],C=We(V);C.length==2&&(t[o].stairTopFloorPts=C,t[o].stairTopFloorPts.push(t[o].stairTopFloorPts[1].clone().addScaledVector(t[o].vecStepWidth,T)),t[o].stairTopFloorPts.push(t[o].stairTopFloorPts[0].clone().addScaledVector(t[o].vecStepWidth,T)))}else t[o].stairTopFloorPts=[t[o].stairTopPt1.clone(),t[o].stairTopPt2.clone()],t[o].stairTopFloorPts.push(t[o].stairTopPt2.clone().addScaledVector(t[o].vecStepWidth,T)),t[o].stairTopFloorPts.push(t[o].stairTopPt1.clone().addScaledVector(t[o].vecStepWidth,T));if(t[o].stairTopFloorPts)for(let V=0;V<t[o].stairTopFloorPts.length;V++)t[o].stairTopFloorPts[V].z-=t[o].stairStepHeight;break}}}}if(p!=-1){let b=t[o].stairTopPt1.clone(),z=t[o].stairTopPt2.clone(),M=t[o].stairBottomPt1.clone(),P=t[o].stairBottomPt2.clone(),E=At(b,z,!0),S=At(M,P,!0),I=E.distanceTo(S),H=t[o].stairTopPt1.distanceTo(t[o].stairTopPt2),D=t[o].stairBottomPt1.distanceTo(t[o].stairBottomPt2),T=Math.sqrt(H*H+D*D),R=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(T))));t[o].stairStepNum=R,t[o].stairHeigth=t[o].stairTopPt1.z-t[o].stairBottomPt1.z,t[o].stairStepHeight=t[o].stairHeigth/t[o].stairStepNum,t[o].stairStepWidth=I/t[o].stairStepNum;let v=t[p].stairTopPt1.clone(),W=t[p].stairTopPt2.clone(),V=t[p].stairBottomPt1.clone(),C=t[p].stairBottomPt2.clone(),_=At(v,W,!0),A=At(V,C,!0),B=_.distanceTo(A),k=t[p].stairTopPt1.distanceTo(t[p].stairTopPt2),F=t[p].stairBottomPt1.distanceTo(t[p].stairBottomPt2),L=Math.sqrt(k*k+F*F),O=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(L))));t[p].stairStepNum=O,t[p].stairHeigth=t[p].stairTopPt1.z-t[p].stairBottomPt1.z,t[p].stairStepHeight=t[p].stairHeigth/t[p].stairStepNum,t[p].stairStepWidth=B/t[p].stairStepNum}}}function ys(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:f=1,upperZScale:d=1}=e;if(!t||t.length===0)return[];let c=t.map((_,A)=>({index:A,x:_.x,y:_.y,z:_.z,raw:_})),a=0,h=0;for(let _ of c)a+=_.x,h+=_.y;a/=c.length,h/=c.length;let g=0,y=0,w=0;for(let _ of c){let A=_.x-a,B=_.y-h;g+=A*A,y+=A*B,w+=B*B}g/=c.length,y/=c.length,w/=c.length;let m=g+w,p=Math.sqrt((g-w)*(g-w)+4*y*y),x=(m+p)/2,b,z;Math.abs(y)>1e-8?(b=x-w,z=y):g>=w?(b=1,z=0):(b=0,z=1);let M=Math.sqrt(b*b+z*z)||1;b/=M,z/=M;let P=-z,E=b,S=1/0,I=-1/0,H=c.map(_=>{let A=_.x-a,B=_.y-h,k=A*b+B*z,F=A*P+B*E;return S=Math.min(S,k),I=Math.max(I,k),{..._,t:k,side:F}}),T=(I-S||1)/n,R=new Map;for(let _ of H){let A=Math.floor((_.t-S)/T);A<0&&(A=0),A>=n&&(A=n-1),R.has(A)||R.set(A,[]),R.get(A).push(_)}let v=new Map;for(let[_,A]of R){if(A.length<o)continue;let B=A.map(j=>j.side).sort((j,Z)=>j-Z),k=A.map(j=>j.z).sort((j,Z)=>j-Z),F=eo(B),L=eo(k),O=eo(B.map(j=>Math.abs(j-F)).sort((j,Z)=>j-Z)),$=eo(k.map(j=>Math.abs(j-L)).sort((j,Z)=>j-Z)),G=Math.max(i,O*1.4826*r),Q=Math.max(l,$*1.4826*s);v.set(_,{sideMedian:F,zMedian:L,sideRange:G,zRange:Q})}function W(_){if(v.has(_))return v.get(_);for(let A=1;A<=u;A++){if(v.has(_-A))return v.get(_-A);if(v.has(_+A))return v.get(_+A)}return null}let V=[],C=[];for(let _ of H){let A=Math.floor((_.t-S)/T);A<0&&(A=0),A>=n&&(A=n-1);let B=W(A);if(!B){C.push(_.raw);continue}let k=Math.abs(_.side-B.sideMedian)<=B.sideRange,F=B.zMedian-B.zRange*f,L=B.zMedian+B.zRange*d,O=_.z>=F&&_.z<=L;k&&O?V.push(_.raw):C.push(_.raw)}return{keep:V,removed:C,debug:{meanX:a,meanY:h,dirX:b,dirY:z,sideX:P,sideY:E,minT:S,maxT:I,binSize:T,stats:v}}}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 Na(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 qa(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),f=[];for(let d=-1;d<=1;d++)for(let c=-1;c<=1;c++)for(let a=-1;a<=1;a++){let h=`${i+d},${l+c},${u+a}`,g=e.get(h);if(g)for(let y of g){if(y===n)continue;let w=t[y],m=s.x-w.x,p=s.y-w.y,x=s.z-w.z;m*m+p*p+x*x<=r&&f.push(y)}}return f}function bs(t,e={}){let{radius:n=.35,minClusterSize:o=20,lowPercent:r=.35}=e,s=ja(t,{radius:n}),i=t.map(d=>d.z).sort((d,c)=>d-c),l=i[Math.floor(i.length*r)],u=[],f=[];for(let d of s.clusters){let c=d.map(g=>s.points[g]),a=c.reduce((g,y)=>g+y.z,0)/c.length;c.length<o&&a<=l?f.push(...c.map(g=>g.raw)):u.push(...c.map(g=>g.raw))}return{keep:u,removed:f}}function ja(t,e={}){let{radius:n=.35}=e,o=t.map((u,f)=>({index:f,x:u.x,y:u.y,z:u.z,raw:u})),r=Na(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 f=[],d=[u];for(i[u]=!0;d.length>0;){let c=d.shift();f.push(c);let a=qa(o,r,c,n,s);for(let h of a)i[h]||(i[h]=!0,d.push(h))}l.push(f)}return{points:o,clusters:l}}function $a(t,e,n=1e-6){let o=Xa(e);for(let r of o)if(!Za(t,r,n))return!1;return!0}function Xa(t){let e=t.center,n=t.halfSize,o=t.rotation.elements,r=new q.Vector3(o[0],o[1],o[2]).multiplyScalar(n.x),s=new q.Vector3(o[3],o[4],o[5]).multiplyScalar(n.y),i=new q.Vector3(o[6],o[7],o[8]).multiplyScalar(n.z),l=[];for(let u of[-1,1])for(let f of[-1,1])for(let d of[-1,1]){let c=e.clone().addScaledVector(r,u).addScaledVector(s,f).addScaledVector(i,d);l.push(c)}return l}function Za(t,e,n=1e-6){let o=new q.Vector3().subVectors(e,t.center),r=t.rotation.elements,s=t.halfSize,i=new q.Vector3(r[0],r[1],r[2]),l=new q.Vector3(r[3],r[4],r[5]),u=new q.Vector3(r[6],r[7],r[8]),f=o.dot(i),d=o.dot(l),c=o.dot(u);return Math.abs(f)<=s.x+n&&Math.abs(d)<=s.y+n&&Math.abs(c)<=s.z+n}function Ga(t,e){if(!t||t.length===0)return[];let n=new Map;for(let i=0;i<t.length;i++){let l=t[i],u=l[0],f=l[1],d=Math.floor(u/e),c=Math.floor(f/e),a=`${d}_${c}`,h=n.get(a);if(!h){let m=(d+.5)*e,p=(c+.5)*e,x=u-m,b=f-p;h={minX:l,maxX:l,minY:l,maxY:l,center:l,centerDist2:x*x+b*b,cx:m,cy:p},n.set(a,h);continue}u<h.minX[0]&&(h.minX=l),u>h.maxX[0]&&(h.maxX=l),f<h.minY[1]&&(h.minY=l),f>h.maxY[1]&&(h.maxY=l);let g=u-h.cx,y=f-h.cy,w=g*g+y*y;w<h.centerDist2&&(h.center=l,h.centerDist2=w)}let o=new Set,r=[];function s(i){let l=`${i[0]}_${i[1]}`;o.has(l)||(o.add(l),r.push(i))}for(let i of n.values())s(i.minX),s(i.maxX),s(i.minY),s(i.maxY),s(i.center);return r}function Ya(t,e,n,o){return 1+(t[e][0]===0||t[n][0]===0||t[o][0]===0?1:0)}function Ua(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),f=Math.abs((n-t)*(s-e)-(r-t)*(o-e))/2;return f===0?1/0:i*l*u/(4*f)}function Ka(t){if(!t||t.length<3)return[];let e=new Set,n=[];for(let g of t){let y=`${g[0]}_${g[1]}`;e.has(y)||(e.add(y),n.push(g))}if(n.length<3)return[];let o=new _e(Float64Array.from(n.flat())),{triangles:r}=o;if(!r.length)return[];let s=new Map,i=(g,y)=>g<y?`${g}_${y}`:`${y}_${g}`;for(let g=0;g<r.length;g+=3){let y=r[g],w=r[g+1],m=r[g+2],[p,x]=n[y],[b,z]=n[w],[M,P]=n[m],E=Ua(p,x,b,z,M,P),S=Ya(n,y,w,m);if(E<=1/S)for(let[I,H]of[[y,w],[w,m],[m,y]]){let D=i(I,H);s.set(D,(s.get(D)||0)+1)}}let l=[];for(let[g,y]of s)y===1&&l.push(g.split("_").map(Number));if(!l.length)return[];let u=new Map;for(let[g,y]of l)(u.get(g)||u.set(g,[]).get(g)).push(y),(u.get(y)||u.set(y,[]).get(y)).push(g);let f=l[0][0],d=[],c=new Set,a=f,h=-1;do{d.push(n[a]),c.add(a);let g=u.get(a)||[],y=g.find(w=>w!==h&&!c.has(w));if(y===void 0&&(y=g.find(w=>w!==h)),y===void 0)break;h=a,a=y}while(a!==f&&d.length<=l.length+1);return d.length>0&&d.push(d[0]),d}function Xe(t,e){let n=t.x-e.x,o=t.y-e.y;return Math.sqrt(n*n+o*o)}function Ze(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,f=Math.sqrt(l*l+u*u);f>e&&(e=f,n=l/f,o=u/f)}return{longSide:e,dirX:n,dirY:o}}function Ge(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,f=l-n;u*u+f*f<=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 Ie(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 f=t-n,d=e-o,c=(f*i+d*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 ws(t,e,n,o,r,s,i,l){let u=n-t,f=o-e,d=i-r,c=l-s,a=u*c-f*d;if(Math.abs(a)<1e-12)return null;let h=((r-t)*c-(s-e)*d)/a,g=((r-t)*f-(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 zs(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 f=r[u],d=r[(u+1)%4],c=ws(t,e,n,o,f.x,f.y,d.x,d.y);c!==null&&s.push(c)}if(s.length<2)return 0;s.sort((u,f)=>u-f);let i=Math.sqrt((n-t)**2+(o-e)**2),l=0;for(let u=0;u<s.length-1;u++){let f=s[u],d=s[u+1],c=(f+d)/2,a=t+c*(n-t),h=e+c*(o-e);Fo(a,h,r)&&(l+=(d-f)*i)}return l}function Ms(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 d of e){if(d===t)continue;let c=ws(r,s,i,l,d.start.x,d.start.y,d.end.x,d.end.y);c!==null&&c>n&&c<1-n&&o.push(c)}o.sort((d,c)=>d-c);let u=[],f=-1/0;for(let d of o)d-f>n&&(u.push(d),f=d);return u}function Es(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),f=o===0?{...t.start}:{x:t.start.x+o*(t.end.x-t.start.x),y:t.start.y+o*(t.end.y-t.start.y),z:t.start.z+o*(t.end.z-t.start.z)},d={...t,start:f,end:{x:i,y:l,z:u},length:t.length*(s-o)};d.drawWindow=void 0,d.isWindow=!1,n.push(d),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 Qa(t,e,n=.15){let o=0,r=0;for(let i of e)i!==t&&((Xe(t.start,i.start)<=n||Xe(t.start,i.end)<=n)&&o++,(Xe(t.end,i.start)<=n||Xe(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 Ja(t,e){let n=[],{start:o,end:r}=t;for(let l of e){let{dist:u}=Ie(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 tl(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=Xe(a,h.start),y=Xe(a,h.end),w=null;if(g<=n?w=h.end:y<=n&&(w=h.start),!w)continue;let m=h.end.x-h.start.x,p=h.end.y-h.start.y,x=Math.sqrt(m*m+p*p);if(x<1e-12||Math.abs(o*m+r*p)/(s*x)>=.342)continue;let z=(w.x-a.x)*i+(w.y-a.y)*l;u[c].push(z>0?1:-1)}}if(u[0].length===0||u[1].length===0)return 0;let f=[...u[0],...u[1]];return f.every(c=>c===f[0])?2:1}function Ps(t,e,n){let o=Qa(t,n),r=Ja(t,e),s=tl(t,n);return{score:o.score*3+r*2+s*2,details:{conn:o.score,variance:r,sameSide:s}}}function el(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 nl(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 ol(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 rl(t,e,n,o,r){let s=[];for(let f of t){let d=f.seg,c=(d.start.x-e.start.x)*n+(d.start.y-e.start.y)*o,a=(d.end.x-e.start.x)*n+(d.end.y-e.start.y)*o;c<=a?s.push({l:c,r:a,idx:f.idx,startPt:d.start,endPt:d.end}):s.push({l:a,r:c,idx:f.idx,startPt:d.end,endPt:d.start})}s.sort((f,d)=>f.l-d.l);let i=[],l=.2,u=.5;for(let{l:f,r:d,idx:c,startPt:a,endPt:h}of s){if(i.length===0){i.push({l:f,r:d,srcIdxs:[c],startPt:a,endPt:h});continue}let g=i[i.length-1];if(f<=g.r+r){let y=Math.min(g.r,d)-Math.max(g.l,f),w=Math.hypot(g.endPt.x-a.x,g.endPt.y-a.y);y>=u||w<=l?(f<g.l&&(g.l=f,g.startPt=a),d>g.r&&(g.r=d,g.endPt=h),g.srcIdxs.includes(c)||g.srcIdxs.push(c)):i.push({l:f,r:d,srcIdxs:[c],startPt:a,endPt:h})}else i.push({l:f,r:d,srcIdxs:[c],startPt:a,endPt:h})}return i}function sl(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 il(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,f=Math.abs(s.end.x-i.end.x)<.001&&Math.abs(s.end.y-i.end.y)<.001,d=Math.abs(s.start.x-i.start.x)<.001&&Math.abs(s.start.y-i.start.y)<.001;if(!(l||u||f||d)||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:f?h=i.start:d&&(a=i.end);let g=Math.hypot(h.x-a.x,h.y-a.y),y={...s};y.start=a,y.end=h,y.length=g,y.direction={x:(h.x-a.x)/g,y:(h.y-a.y)/g,z:0},s.rooftopPz!==void 0&&i.rooftopPz!==void 0?y.rooftopPz=Math.max(s.rooftopPz,i.rooftopPz):y.rooftopPz=s.rooftopPz!==void 0?s.rooftopPz:i.rooftopPz,y.buildRosource=s.buildRosource||i.buildRosource,y.isRebuild=!1,y.doorAndBeamData||(y.doorAndBeamData=[]),y.insetionArr||(y.insetionArr=[]),t[o]=y,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 Ye(t,e=5,n=.05){if(t.length<=1)return{segments:t,sourceMap:t.map((u,f)=>[f])};let o=t.map((u,f)=>({seg:u,angle:el(u),idx:f}));o.sort((u,f)=>u.angle-f.angle);let r=nl(o,e),s=[],i=[],l=[];for(let u of r){let f=u[0].seg;for(let m of u)m.seg.length>f.length&&(f=m.seg);let d=f.end.x-f.start.x,c=f.end.y-f.start.y,a=Math.sqrt(d*d+c*c);if(a<1e-12)continue;let h=-c/a,g=d/a,y=u.map(m=>{let p=m.seg.start.x-f.start.x,x=m.seg.start.y-f.start.y;return{seg:m.seg,offset:Math.abs(p*h+x*g),idx:m.idx}});y.sort((m,p)=>m.offset-p.offset);let w=ol(y);for(let m of w){let p=m[0].seg;for(let T of m)T.seg.length>p.length&&(p=T.seg);let x=p.end.x-p.start.x,b=p.end.y-p.start.y,z=Math.sqrt(x*x+b*b);if(z<1e-12)continue;let M=x/z,P=b/z,E=m.map(T=>T.seg.rooftopPz).filter(T=>T!==void 0),S=E.length>0?Math.max(...E):void 0,I=[...new Set(E.map(T=>T.toFixed(3)))];if(I.length>1){let T=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:[...I],segments:T})}let H=[...new Set(m.map(T=>String(T.seg.buildRosource)))],D=rl(m,p,M,P,n);for(let{l:T,r:R,srcIdxs:v,startPt:W,endPt:V}of D){if(R-T<.01)continue;let C=sl(p,W,V,M,P,S,p.buildRosource);s.push(C),i.push(v)}}}return{...il(s,i),debugRPZGroups:l}}function al(t){return{minLengthRatio:.95,maxDistance:.5,angleThreshold:45,projectionMargin:.1,printOnly:!0,minEmbedRatioThreshold:.3,noWallSurroundDistance:.3,minEmbedRatio:.05,...t}}function ll(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 cl(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=Ie(n,o,a.x,a.y,h.x,h.y),y=r.map(z=>{let M=Ie(z.x,z.y,a.x,a.y,h.x,h.y);return`t=${M.t.toFixed(3)},d=${M.dist.toFixed(3)}`}),w=h.x-a.x,m=h.y-a.y,p=Math.sqrt(w*w+m*m)||1,x=Math.abs(i*(w/p)+l*(m/p)),b=Math.acos(Math.min(x,1))*(180/Math.PI);return{seg:c,lineDist:g.dist,t:g.t,pts:y,angle:b,length:c.length}}).sort((c,a)=>c.lineDist-a.lineDist)}function ul(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 f of l){if(u.length>0)break;for(let d of t){let c=!1,a=!1,h=!1,g=e*s.minLengthRatio;if(d.length<g){continue}c=!0;let{start:y,end:w}=d,m=!1,p=1/0;for(let D of r){let{dist:T,t:R}=Ie(D.x,D.y,y.x,y.y,w.x,w.y);R>=-f.margin&&R<=1+f.margin&&T<=f.maxDist&&(m=!0,p=Math.min(p,T))}if(!m){`${f.maxDist}${(-f.margin).toFixed(1)}${(1+f.margin).toFixed(1)}`;continue}a=!0;let x=Ie(r[0].x,r[0].y,y.x,y.y,w.x,w.y);if(x.t<0||x.t>1){`${x.t.toFixed(3)}`;continue}let b=Math.sqrt((w.x-y.x)**2+(w.y-y.y)**2);if(b<1e-12)continue;let z=(w.x-y.x)/b,M=(w.y-y.y)/b,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 S=[r[1],r[2],r[3],r[4]],I=zs(y.x,y.y,w.x,w.y,S),H=e>0?I/e:0;u.push({seg:d,minDist:p,embedRatio:H,ratio:d.length/e,score:0,details:{conn:0,variance:0,sameSide:0}})}}return u}function fl(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}=Ps(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 dl(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,f=e.map(P=>{let E=P.x-t.start.x,S=P.y-t.start.y;return(E*l+S*u)/i}),d=Math.min(...f),c=Math.max(...f),a=(c-d)*i,h=(d+c)/2,g=t.start.x+h*r,y=t.start.y+h*s,w=n.box.min.z,m=n.box.max.z,p=Math.abs(m-w),x=Ge(o,t.start.x,t.start.y),b=Math.max(0,w-x),z=d<=0&&c>=1,M=t.start.z+h*(t.end.z-t.start.z);return{p:{x:g,y,z:M},width:a,full:z,height:p,groundClearance:b}}function No(t,e,n){let o=e.map(d=>n[d]),r=[],s=[],i=[],l=[],u,f;for(let d of o){if(d.originalPoints?.length)for(let c of d.originalPoints)r.push(c);if(d.doorAndBeamData?.length)for(let c of d.doorAndBeamData)s.push(c);if(d.insetionArr?.length)for(let c of d.insetionArr)i.push(c);if(d.drawWindow?.length)for(let c of d.drawWindow)l.push(c);d.boxData&&!u&&(u=d.boxData),d.rooftopPz!==void 0&&(f===void 0||d.rooftopPz>f)&&(f=d.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),f!==void 0&&(t.rooftopPz=f)}function Tn(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,f=l.end.y-l.start.y,d=Math.sqrt(u*u+f*f)||1,c=u/d,a=f/d,h=i.x-l.start.x,g=i.y-l.start.y,y=(h*c+g*a)/d;for(let w of e){if(w===l)continue;let m=w.end.x-w.start.x,p=w.end.y-w.start.y,x=Math.sqrt(m*m+p*p)||1,b=m/x,z=p/x,M=Math.abs(c*b+a*z),E=Math.acos(Math.min(M,1))*(180/Math.PI);if(Math.abs(E-90)>n)continue;let S=[w.start,w.end];for(let I of S){let H=I.x-l.start.x,D=I.y-l.start.y,T=(H*c+D*a)/d,R=l.start.x+T*d*c,v=l.start.y+T*d*a;if(Math.sqrt((I.x-R)**2+(I.y-v)**2)>r)continue;let V=Math.abs((T-y)*d);if(V<=o){s.push({seg:w,distAlongWall:V,angle:E,endPoint:I});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)),f={x:n.x+u*r,y:n.y+u*s,z:n.z+(o.z-n.z)*u||0};function d(x){if(!x||!x.length)return[[],[]];let b=[],z=[];for(let M of x){let P=((M.x-n.x)*r+(M.y-n.y)*s)/(i*i);P<=u+1e-8&&b.push(M),P>=u-1e-8&&z.push(M)}return(b.length===0||c(b[b.length-1],f)>1e-6)&&b.push({...f}),(z.length===0||c(z[0],f)>1e-6)&&z.unshift({...f}),[b,z]}function c(x,b){return Math.sqrt((x.x-b.x)**2+(x.y-b.y)**2)}let[a,h]=d(t.originalPoints),g=Math.max(u*i,1e-6),y=Math.max((1-u)*i,1e-6),w=t.direction||{x:r/i,y:s/i,z:(o.z-n.z)/i||0},m={...t,start:{...n},end:{...f},length:g,direction:{...w},originalPoints:a.length?a:void 0},p={...t,start:{...f},end:{...o},length:y,direction:{...w},originalPoints:h.length?h:void 0};if(t.drawWindow&&t.drawWindow.length>0){let x=[],b=[];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&&x.push(z),M>=u-1e-8&&b.push(z)}m.drawWindow=x.length?x:void 0,p.drawWindow=b.length?b:void 0}else m.drawWindow=void 0,p.drawWindow=void 0;if(t.boxData){let x=b=>{if(!b.length)return;let z=1/0,M=1/0,P=1/0,E=-1/0,S=-1/0,I=-1/0;for(let H of b)H.x<z&&(z=H.x),H.y<M&&(M=H.y),H.z!==void 0&&H.z<P&&(P=H.z),H.x>E&&(E=H.x),H.y>S&&(S=H.y),H.z!==void 0&&H.z>I&&(I=H.z);return{isBox3:!0,min:{x:z,y:M,z:P},max:{x:E,y:S,z:I}}};m.boxData=x(a),p.boxData=x(h)}return[m,p]}function Rn(t,e,n,o){let r=al(n),s=[],{segments:i,sourceMap:l}=o??Ye(e),u=i;for(let f of t){let d=f.coordinatesByArea?.coordinates;if(!d||d.length<4)continue;let c=d.slice(0,4),a=c.reduce((I,H)=>I+H.x,0)/4,h=c.reduce((I,H)=>I+H.y,0)/4,{longSide:g,dirX:y,dirY:w}=Ze(c);if(g<.01)continue;let m=c.reduce((I,H)=>I+H.z,0)/4,p=Ge(e,a,h);if(m<p-.3)continue;let x=ll(c,a,h);cl(f.name,u,a,h,x,g,y,w,r);let b=ul(u,g,y,w,x,r,f.name);if(b.length>1&&r.minEmbedRatioThreshold>0){let I=Math.max(...b.map(H=>H.embedRatio));if(I>0){let H=b.length;b=b.filter(D=>D.embedRatio>=I*r.minEmbedRatioThreshold)}}if(b.length>0&&r.minEmbedRatio>0){let I=b.length;b=b.filter(H=>H.embedRatio>=r.minEmbedRatio)}b=fl(b,x,e,f.name);let z=null,M=1/0,P=0,E=0;if(b.length>0){let I=b[0];z=I.seg,M=I.minDist,P=I.ratio,E=I.embedRatio}if(z&&E<=0&&r.noWallSurroundDistance>0){let I=r.noWallSurroundDistance,H=c.map(C=>C.x),D=c.map(C=>C.y),T=Math.min(...H)-I,R=Math.max(...H)+I,v=Math.min(...D)-I,W=Math.max(...D)+I,V=!1;for(let C of u){let _=Math.min(C.start.x,C.end.x),A=Math.max(C.start.x,C.end.x),B=Math.min(C.start.y,C.end.y),k=Math.max(C.start.y,C.end.y);if(!(A<T||_>R)&&!(k<v||B>W)){V=!0;break}}V||(z=null)}let S;if(z&&(S=dl(z,c,f,i),!r.printOnly)){let I=z;I.drawWindow||(I.drawWindow=[]),I.drawWindow.push(S),I.isWindow=!0}if(z){let I={windowName:f.name,windowCategory:f.category,windowCenter:f.center,wallSegment:z,distance:M,wallLengthRatio:P,drawWindow:S};s.push(I)}}for(let f of s){let d=f.wallSegment,c=i.indexOf(d);if(c===-1)continue;let a=l[c];!a||a.length<=1||No(d,a,e)}return s}function qo(t,e,n){let o={printOnly:!1,skipMerge:!1,...n};for(let w of t)w.drawWindow&&(w.drawWindow=void 0),w.isWindow&&(w.isWindow=void 0);let r=Array.isArray(e)?e.filter(w=>w&&w.category==="window"&&!w.isBayWindowObj):[],s,i;if(o.skipMerge)s=t,i=t.map((w,m)=>[m]);else{let w=Ye(t);s=w.segments,i=w.sourceMap}let l=Rn(r,t,o,{segments:s,sourceMap:i}),u=new Set;for(let w of l){let m=s.indexOf(w.wallSegment);m>=0&&u.add(m)}let f=[],d=new Set;for(let w of u){let m=i[w];if(m){No(s[w],m,t);for(let p of m)d.add(p)}f.push(s[w])}for(let w=0;w<t.length;w++)d.has(w)||f.push(t[w]);let c=new Set(l.map(w=>w.windowName));for(let w of e)w&&w.category==="window"&&!w.isBayWindowObj&&(c.has(w.name)?delete w.AbnormalWindow:w.AbnormalWindow=!0);let a=new Map;for(let w of e)w&&w.name&&a.set(w.name,w);let h=new Map;for(let w of l){let m=w.wallSegment;h.has(m)||h.set(m,[]),h.get(m).push(w)}let g=new Map,y=f;for(let[w,m]of h){if(!w.drawWindow||!w.drawWindow.length||g.has(w))continue;let p=w.length,x=w.end.x-w.start.x,b=w.end.y-w.start.y,z=[];for(let T of m){if(!T.drawWindow)continue;let R=T.drawWindow.width/2,v=((T.drawWindow.p.x-w.start.x)*x+(T.drawWindow.p.y-w.start.y)*b)/(p*p),W=R/p;z.push({left:v-W,right:v+W,match:T})}if(z.length===0)continue;let M=Ms(w,y),P=1e-6,E=new Set,S=!1;for(let T of z){let R=!1,v=!1,W=null;for(let C of M)C<T.left-P&&((W===null||C>W)&&(W=C),R=!0);let V=null;for(let C of M)C>T.right+P&&((V===null||C<V)&&(V=C),v=!0);W!==null&&(E.add(W),S=!0),V!==null&&(E.add(V),S=!0)}if(!S)continue;let I=!1,H=null,D=null;for(let T of z){let R=T.match;if(!R.drawWindow||R.drawWindow.width<=1)continue;let v=a.get(R.windowName);if(!v||!v.positionArr||!v.positionArr.length)continue;let W=Tn(R,s);if(W.length<=1)continue;let V=v.positionArr[0],C=R.drawWindow.p,_=V.x-C.x,A=V.y-C.y,B=Math.sqrt(_*_+A*A);if(B<.001)continue;let k=_/B,F=A/B,L=W.filter(O=>{let $=(O.seg.start.x+O.seg.end.x)/2,G=(O.seg.start.y+O.seg.end.y)/2,Q=$-C.x,j=G-C.y;return Q*k+j*F>0});if(L.length){I=!0,H=L[0].endPoint,D=R;break}}if(I&&H&&D){let[T,R]=Sn(w,H);g.set(w,[T,R]);let v=((D.drawWindow.p.x-w.start.x)*x+(D.drawWindow.p.y-w.start.y)*b)/(p*p),W=((H.x-w.start.x)*x+(H.y-w.start.y)*b)/(p*p);v<=W?D.wallSegment=T:D.wallSegment=R}else{let T=Array.from(E).sort((v,W)=>v-W),R=Es(w,T);for(let v of z){let W=(v.left+v.right)/2,V=0;for(let C of R){let _=C.length/p;if(W>=V-P&&W<=V+_+P){let A=v.match.drawWindow;A&&(C.drawWindow||(C.drawWindow=[]),C.drawWindow.push(A),C.isWindow=!0),v.match.wallSegment=C;break}V+=_}}g.set(w,R)}}if(g.size>0){let w=[];for(let m of f)g.has(m)?w.push(...g.get(m)):w.push(m);for(let m of w)m.isWindow===void 0&&(m.isWindow=!!(m.drawWindow&&m.drawWindow.length>0));return{segments:w,matches:l}}for(let w of f)w.isWindow=!!(w.drawWindow&&w.drawWindow.length>0);return{segments:f,matches:l}}function Ue(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,f=l.y-i.y,d=Math.sqrt(u*u+f*f);d>e&&(e=d,o=u/d,r=f/d),d<n&&(n=d)}return{longSide:e,shortSide:n===1/0?e:n,dirX:o,dirY:r}}function Ke(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,f=l-n;u*u+f*f<=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 jt(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 f=t-n,d=e-o,c=(f*i+d*l)/u,a=n+c*i,h=o+c*l;return{dist:Math.sqrt((t-a)**2+(e-h)**2),t:c}}function jo(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 hl(t,e,n,o,r,s,i,l){let u=n-t,f=o-e,d=i-r,c=l-s,a=u*c-f*d;if(Math.abs(a)<1e-12)return null;let h=((r-t)*c-(s-e)*d)/a,g=((r-t)*f-(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 Ss(t,e,n,o,r){let s=[];jo(t,e,r)&&s.push(0),jo(n,o,r)&&s.push(1);for(let u=0;u<4;u++){let f=r[u],d=r[(u+1)%4],c=hl(t,e,n,o,f.x,f.y,d.x,d.y);c!==null&&s.push(c)}if(s.length<2)return 0;s.sort((u,f)=>u-f);let i=Math.sqrt((n-t)**2+(o-e)**2),l=0;for(let u=0;u<s.length-1;u++){let f=s[u],d=s[u+1],c=(f+d)/2,a=t+c*(n-t),h=e+c*(o-e);jo(a,h,r)&&(l+=(d-f)*i)}return l}function Rs(t){if(!t||t.length<4)return[];let e=[...t].sort((i,l)=>i.z-l.z),n=e.slice(0,2),o=e.slice(2,4),r=[],s=new Set;for(let i of n){let l=-1,u=1/0;for(let f=0;f<o.length;f++){if(s.has(f))continue;let d=o[f].x-i.x,c=o[f].y-i.y,a=Math.sqrt(d*d+c*c);a<u&&(u=a,l=f)}if(l>=0){s.add(l);let f=o[l];r.push({bottom:i,top:f,midX:(i.x+f.x)/2,midY:(i.y+f.y)/2,height:Math.abs(f.z-i.z)})}}return r}function Ts(t,e,n){return jt(t.midX,t.midY,e.x,e.y,n.x,n.y)}function Ds(t,e,n,o=.08){if(!t||t.length<2)return null;let r=Ts(t[0],e,n),s=Ts(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 vs(t){if(!t||t.length<2)return 0;let e=t[0].midX-t[1].midX,n=t[0].midY-t[1].midY;return Math.sqrt(e*e+n*n)}function $o(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 Vs(t,e,n,o=.08){let r=$o(t);if(!r)return null;let s=jt(r.p1.x,r.p1.y,e.x,e.y,n.x,n.y),i=jt(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 w of n){let m=w.x-t.start.x,p=w.y-t.start.y,x=(m*o+p*r)/(s*s);i.push(Math.max(0,Math.min(1,x)))}let l=Math.max(1,Math.ceil(s/e)),u=s/l,f=new Array(l).fill(0);for(let w of i){let m=Math.min(l-1,Math.floor(w*l));f[m]++}let d=f.map(w=>w/u),c=f.map((w,m)=>m/l),a=f.map((w,m)=>(m+1)/l),h=d.reduce((w,m)=>w+m,0)/l,g=Math.max(...d),y=Math.min(...d);return{densityProfile:d,binStartT:c,binEndT:a,avgDensity:h,maxDensity:g,minDensity:y,binSize:u}}function Is(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 Cs(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 Ws(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,f=[],d=!1,c=0,a=0,h=0;for(let g=0;g<u;g++){let y=s[g]<l;if(y&&!d)d=!0,c=g,a=s[g],h=1;else if(y&&d)a+=s[g],h++;else if(!y&&d){d=!1;let w=g-1,m=c/u,p=(w+1)/u,x=(p-m)*e;x>=o&&x<=r&&f.push({startT:m,endT:p,startLen:m*e,endLen:p*e,avgDensity:a/h}),a=0,h=0}}if(d){let g=u-1,y=c/u,w=(g+1)/u,m=(w-y)*e;m>=o&&m<=r&&f.push({startT:y,endT:w,startLen:y*e,endLen:w*e,avgDensity:a/h})}return f}function ml(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 p=m.x-t.start.x,x=m.y-t.start.y,b=(p*r+x*s)/i;b>=e&&b<=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,f=-1/0;for(let m of o)m.z!==void 0&&isFinite(m.z)&&(m.z<u&&(u=m.z),m.z>f&&(f=m.z));let d=f-u;if(d<.5)return{verticalGapRatio:0,isDoorSized:!1};let c=15,a=new Array(c).fill(!1);for(let m of l){let p=Math.min(c-1,Math.max(0,Math.floor((m-u)/d*c)));a[p]=!0}let h=0,g=0;for(let m=0;m<c;m++)a[m]?(h=Math.max(h,g),g=0):g++;h=Math.max(h,g);let y=h/c,w=y>=.35;return{verticalGapRatio:y,isDoorSized:w}}function Hs(t,e,n,o=.5,r=.5,s=3,i=.35){let l=Ws(e,n,o,r,s),u=[];for(let f of l){let{verticalGapRatio:d,isDoorSized:c}=ml(t,f.startT,f.endT);u.push({...f,verticalGapRatio:d,isRectangular:c})}return u}function _s(t,e,n){if(!t||!t.start||!t.end)return null;let o=t.start,r=t.end,s=jt(o.x,o.y,e.x,e.y,n.x,n.y),i=jt(r.x,r.y,e.x,e.y,n.x,n.y),l=s.dist<=i.dist,u=l?o:r,f=l?s.dist:i.dist,d=jt(u.x,u.y,e.x,e.y,n.x,n.y);return{hingeT:Math.max(0,Math.min(1,d.t)),hingeDist:f}}function As(t,e,n,o=2e3){let{hingeT:r}=t,s=.25,i=0,l=null,u=0;for(let f of e){let d=(f.startT+f.endT)/2,c=Math.abs(d-r),a=Math.max(0,1-c/s),h=f.isRectangular?1:.3,g=Math.max(0,1-f.avgDensity/o),y=a*.5+h*.3+g*.2;y>i&&(i=y,l=f,u=a)}return{score:i>.5?i:-1,bestRegion:l,bestOverlap:u,bestOpeningStartT:l?.startT??0,bestOpeningEndT:l?.endT??0}}function pl(t,e,n=.15){let o=0,r=0;for(let i of e)i!==t&&((Ue(t.start,i.start)<=n||Ue(t.start,i.end)<=n)&&o++,(Ue(t.end,i.start)<=n||Ue(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 gl(t,e){let n=[],{start:o,end:r}=t;for(let l of e){let{dist:u}=jt(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 xl(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=Ue(a,h.start),y=Ue(a,h.end),w=null;if(g<=n?w=h.end:y<=n&&(w=h.start),!w)continue;let m=h.end.x-h.start.x,p=h.end.y-h.start.y,x=Math.sqrt(m*m+p*p);if(x<1e-12||Math.abs(o*m+r*p)/(s*x)>=.342)continue;let z=(w.x-a.x)*i+(w.y-a.y)*l;u[c].push(z>0?1:-1)}}if(u[0].length===0||u[1].length===0)return 0;let f=[...u[0],...u[1]];return f.every(c=>c===f[0])?2:1}function Ls(t,e,n){let o=pl(t,n),r=gl(t,e),s=xl(t,n);return{score:o.score*3+r*2+s*2,details:{conn:o.score,variance:r,sameSide:s}}}function yl(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 bl(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 wl(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 zl(t,e,n,o,r){let s=[];for(let f of t){let d=f.seg,c=(d.start.x-e.start.x)*n+(d.start.y-e.start.y)*o,a=(d.end.x-e.start.x)*n+(d.end.y-e.start.y)*o;c<=a?s.push({l:c,r:a,idx:f.idx,startPt:d.start,endPt:d.end}):s.push({l:a,r:c,idx:f.idx,startPt:d.end,endPt:d.start})}s.sort((f,d)=>f.l-d.l);let i=[],l=.01,u=.5;for(let{l:f,r:d,idx:c,startPt:a,endPt:h}of s){if(i.length===0){i.push({l:f,r:d,srcIdxs:[c],startPt:a,endPt:h});continue}let g=i[i.length-1];if(f<=g.r+r){let y=Math.min(g.r,d)-Math.max(g.l,f),w=Math.hypot(g.endPt.x-a.x,g.endPt.y-a.y);y>=u||w<=l?(f<g.l&&(g.l=f,g.startPt=a),d>g.r&&(g.r=d,g.endPt=h),g.srcIdxs.includes(c)||g.srcIdxs.push(c)):i.push({l:f,r:d,srcIdxs:[c],startPt:a,endPt:h})}else i.push({l:f,r:d,srcIdxs:[c],startPt:a,endPt:h})}return i}function Ml(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 El(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,f=Math.abs(s.end.x-i.end.x)<.001&&Math.abs(s.end.y-i.end.y)<.001,d=Math.abs(s.start.x-i.start.x)<.001&&Math.abs(s.start.y-i.start.y)<.001;if(!(l||u||f||d)||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:f?h=i.start:d&&(a=i.end);let g=Math.hypot(h.x-a.x,h.y-a.y),y={...s};y.start=a,y.end=h,y.length=g,y.direction={x:(h.x-a.x)/g,y:(h.y-a.y)/g,z:0},s.rooftopPz!==void 0&&i.rooftopPz!==void 0?y.rooftopPz=Math.max(s.rooftopPz,i.rooftopPz):y.rooftopPz=s.rooftopPz!==void 0?s.rooftopPz:i.rooftopPz,y.buildRosource=s.buildRosource||i.buildRosource,y.isRebuild=!1,y.doorAndBeamData||(y.doorAndBeamData=[]),y.insetionArr||(y.insetionArr=[]),t[o]=y,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 Qe(t,e=5,n=.05){if(t.length<=1)return{segments:t,sourceMap:t.map((u,f)=>[f])};let o=t.map((u,f)=>({seg:u,angle:yl(u),idx:f}));o.sort((u,f)=>u.angle-f.angle);let r=bl(o,e),s=[],i=[],l=[];for(let u of r){let f=u[0].seg;for(let m of u)m.seg.length>f.length&&(f=m.seg);let d=f.end.x-f.start.x,c=f.end.y-f.start.y,a=Math.sqrt(d*d+c*c);if(a<1e-12)continue;let h=-c/a,g=d/a,y=u.map(m=>{let p=m.seg.start.x-f.start.x,x=m.seg.start.y-f.start.y;return{seg:m.seg,offset:Math.abs(p*h+x*g),idx:m.idx}});y.sort((m,p)=>m.offset-p.offset);let w=wl(y);for(let m of w){let p=m[0].seg;for(let T of m)T.seg.length>p.length&&(p=T.seg);let x=p.end.x-p.start.x,b=p.end.y-p.start.y,z=Math.sqrt(x*x+b*b);if(z<1e-12)continue;let M=x/z,P=b/z,E=m.map(T=>T.seg.rooftopPz).filter(T=>T!==void 0),S=E.length>0?Math.max(...E):void 0,I=[...new Set(E.map(T=>T.toFixed(3)))];if(I.length>1){let T=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:[...I],segments:T})}let H=[...new Set(m.map(T=>String(T.seg.buildRosource)))],D=zl(m,p,M,P,n);for(let{l:T,r:R,srcIdxs:v,startPt:W,endPt:V}of D){if(R-T<.01)continue;let C=Ml(p,W,V,M,P,S,p.buildRosource);s.push(C),i.push(v)}}}return{...El(s,i),debugRPZGroups:l}}function Pl(t){return{minLengthRatio:0,maxDistance:.5,angleThreshold:45,projectionMargin:.1,printOnly:!0,minEmbedRatioThreshold:.3,noWallSurroundDistance:.3,minEmbedRatio:.05,...t}}function Tl(t,e,n){return[{x:e,y:n,z:0},{x:t[0].x,y:t[0].y,z:0},{x:t[1].x,y:t[1].y,z:0},{x:t[2].x,y:t[2].y,z:0},{x:t[3].x,y:t[3].y,z:0}]}function Sl(t,e,n,o,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=jt(n,o,a.x,a.y,h.x,h.y),y=r.map(z=>{let M=jt(z.x,z.y,a.x,a.y,h.x,h.y);return`t=${M.t.toFixed(3)},d=${M.dist.toFixed(3)}`}),w=h.x-a.x,m=h.y-a.y,p=Math.sqrt(w*w+m*m)||1,x=Math.abs(i*(w/p)+l*(m/p)),b=Math.acos(Math.min(x,1))*(180/Math.PI);return{seg:c,lineDist:g.dist,t:g.t,pts:y,angle:b,length:c.length}}).sort((c,a)=>c.lineDist-a.lineDist)}function Rl(t,e,n,o,r,s,i,l,u){let f=[{margin:s.projectionMargin,maxDist:s.maxDistance,label:"\u4E25\u683C"},{margin:.4,maxDist:.65,label:"\u5BBD\u677E"}],d=[],c=vs(l)||e;for(let a of f){if(d.length>0)break;for(let h of t){let{start:g,end:y}=h,w=!1,m=1/0;for(let E of r){let{dist:S,t:I}=jt(E.x,E.y,g.x,g.y,y.x,y.y);I>=-a.margin&&I<=1+a.margin&&S<=a.maxDist&&(w=!0,S<m&&(m=S))}if(!w)continue;let p=null;if(u&&(p=Vs(u,g,y,.3)),!p||!p.hingePoint){let E=Ds(l,g,y,.1);E&&E.hingeEdge&&(p={...E,hingePoint:E.hingeEdge?{x:E.hingeEdge.midX,y:E.hingeEdge.midY,z:0}:null,otherPoint:E.otherEdge?{x:E.otherEdge.midX,y:E.otherEdge.midY,z:0}:null})}p&&p.hingePoint&&jt(r[0].x,r[0].y,g.x,g.y,y.x,y.y).dist>.3&&(p=null);let x=!1;if(!p||!p.hingePoint){let E=jt(r[0].x,r[0].y,g.x,g.y,y.x,y.y);if(m<.15&&E.dist<.3&&h.originalPoints&&h.originalPoints.length>=50&&h.length>=.5)x=!0;else continue}if(!x&&(p.hingeT<-a.margin||p.hingeT>1+a.margin)){let E=jt(r[0].x,r[0].y,g.x,g.y,y.x,y.y);if(m<.15&&E.dist<.3&&h.originalPoints&&h.originalPoints.length>=50&&h.length>=.5)x=!0,h.__candidatesDebug="hingeT\u8D85\u8303\u56F4-\u5BC6\u5EA6\u515C\u5E95";else continue}let b=x?0:p.isClosed?1:.5,z=[r[1],r[2],r[3],r[4]],M=Ss(g.x,g.y,y.x,y.y,z),P=c>0?M/c:0;d.push({seg:h,minDist:m,embedRatio:P,ratio:h.length/c,score:0,details:{conn:0,variance:0,sameSide:0},hingeInfo:p,hingeScore:b})}}return d}function Dl(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}=Ls(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 vl(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,f=e.map(P=>{let E=P.x-t.start.x,S=P.y-t.start.y;return(E*l+S*u)/i}),d=Math.min(...f),c=Math.max(...f),a=(c-d)*i,h=(d+c)/2,g=t.start.x+h*r,y=t.start.y+h*s,w=n.box.min.z,m=n.box.max.z,p=Math.abs(m-w),x=Ke(o,t.start.x,t.start.y),b=Math.max(0,w-x),z=d<=0&&c>=1,M=t.start.z+h*(t.end.z-t.start.z);return{p:{x:g,y,z:M},width:a,full:z,height:p,groundClearance:b,wallTMin:Math.max(0,Math.min(1,d)),wallTMax:Math.max(0,Math.min(1,c))}}function Zo(t,e,n){let o=e.map(d=>n[d]),r=[],s=[],i=[],l=[],u,f;for(let d of o){if(d.originalPoints?.length)for(let c of d.originalPoints)r.push(c);if(d.doorAndBeamData?.length)for(let c of d.doorAndBeamData)s.push(c);if(d.insetionArr?.length)for(let c of d.insetionArr)i.push(c);if(d.DrawDoor?.length)for(let c of d.DrawDoor)l.push(c);d.boxData&&!u&&(u=d.boxData),d.rooftopPz!==void 0&&(f===void 0||d.rooftopPz>f)&&(f=d.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),f!==void 0&&(t.rooftopPz=f)}function fn(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,f=l.end.y-l.start.y,d=Math.sqrt(u*u+f*f)||1,c=u/d,a=f/d,h=i.x-l.start.x,g=i.y-l.start.y,y=(h*c+g*a)/d;for(let w of e){if(w===l)continue;let m=w.end.x-w.start.x,p=w.end.y-w.start.y,x=Math.sqrt(m*m+p*p)||1,b=m/x,z=p/x,M=Math.abs(c*b+a*z),E=Math.acos(Math.min(M,1))*(180/Math.PI);if(Math.abs(E-90)>n)continue;let S=[w.start,w.end];for(let I of S){let H=I.x-l.start.x,D=I.y-l.start.y,T=(H*c+D*a)/d,R=l.start.x+T*d*c,v=l.start.y+T*d*a;if(Math.sqrt((I.x-R)**2+(I.y-v)**2)>r)continue;let V=Math.abs((T-y)*d);if(V<=o){s.push({seg:w,distAlongWall:V,angle:E,endPoint:I});break}}}return s}function Dn(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)),f={x:n.x+u*r,y:n.y+u*s,z:n.z+(o.z-n.z)*u||0};function d(x){if(!x||!x.length)return[[],[]];let b=[],z=[];for(let M of x){let P=((M.x-n.x)*r+(M.y-n.y)*s)/(i*i);P<=u+1e-8&&b.push(M),P>=u-1e-8&&z.push(M)}return(b.length===0||c(b[b.length-1],f)>1e-6)&&b.push({...f}),(z.length===0||c(z[0],f)>1e-6)&&z.unshift({...f}),[b,z]}function c(x,b){return Math.sqrt((x.x-b.x)**2+(x.y-b.y)**2)}let[a,h]=d(t.originalPoints),g=Math.max(u*i,1e-6),y=Math.max((1-u)*i,1e-6),w=t.direction||{x:r/i,y:s/i,z:(o.z-n.z)/i||0},m={...t,start:{...n},end:{...f},length:g,direction:{...w},originalPoints:a.length?a:void 0},p={...t,start:{...f},end:{...o},length:y,direction:{...w},originalPoints:h.length?h:void 0};if("isRebuild"in t&&(m.isRebuild=t.isRebuild,p.isRebuild=t.isRebuild),t.DrawDoor&&t.DrawDoor.length>0){let x=[],b=[];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&&x.push(z),M>=u-1e-8&&b.push(z)}m.DrawDoor=x.length?x:void 0,p.DrawDoor=b.length?b:void 0}else m.DrawDoor=void 0,p.DrawDoor=void 0;if(t.boxData){let x=b=>{if(!b.length)return;let z=1/0,M=1/0,P=1/0,E=-1/0,S=-1/0,I=-1/0;for(let H of b)H.x<z&&(z=H.x),H.y<M&&(M=H.y),H.z!==void 0&&H.z<P&&(P=H.z),H.x>E&&(E=H.x),H.y>S&&(S=H.y),H.z!==void 0&&H.z>I&&(I=H.z);return{isBox3:!0,min:{x:z,y:M,z:P},max:{x:E,y:S,z:I}}};m.boxData=x(a),p.boxData=x(h)}return[m,p]}function vn(t,e,n,o){let r=Pl(n),s=[],{segments:i,sourceMap:l}=o??Qe(e),u=i,f=Cs(u);for(let d of t){let c=d.coordinatesByArea?.coordinates;if(!c||c.length<4)continue;let a=c.slice(0,4),h=$o(d.nline),g=no(a),y,w,m,p,x;if(h?(y=h.midX,w=h.midY,m=h.length,p=h.dirX,x=h.dirY):(y=a.reduce((L,O)=>L+O.x,0)/4,w=a.reduce((L,O)=>L+O.y,0)/4,m=g.longSide,p=g.dirX,x=g.dirY),m<.01)continue;let b=a.reduce((L,O)=>L+O.z,0)/4,z=Ke(e,y,w);if(b<z-.3)continue;let M=Rs(a),P=[...a].sort((L,O)=>L.z-O.z),E=P[0].x-P[1].x,S=P[0].y-P[1].y,I=Math.sqrt(E*E+S*S),H=Tl(a,y,w);Sl(d.name,u,y,w,H,m,p,x,r);let D=Rl(u,I,p,x,H,r,d.name,M,d.nline);if(D.length>0)for(let L=0;L<D.length;L++){let O=D[L],$=O.seg,G=!!O.hingeInfo?.hingePoint,Q=O.hingeInfo?.isClosed,j=O.hingeInfo?.hingeDist??-1,Z=jt(H[0].x,H[0].y,$.start.x,$.start.y,$.end.x,$.end.y)}if(D=Dl(D,H,e,d.name),D.length===0){for(let O of u){let $=O.start.x+(O.end.x-O.start.x)/2-y,G=O.start.y+(O.end.y-O.start.y)/2-w;if(Math.sqrt($*$+G*G)>2)continue;let j=O.end.x-O.start.x,Z=O.end.y-O.start.y,Y=Math.sqrt(j*j+Z*Z),it=j/Y,ht=Z/Y,Tt=Math.abs(it*p+ht*x),nt=Math.acos(Math.min(1,Math.abs(Tt)))*180/Math.PI,wt=jt(y,w,O.start.x,O.start.y,O.end.x,O.end.y)}let L=0;for(let O of u)jt(y,w,O.start.x,O.start.y,O.end.x,O.end.y).dist<2&&L++}let T=I;for(let L of D){let O=L.seg;if(O.originalPoints&&O.originalPoints.length>100&&O.length>.5)try{let $=oo(O,.1),G=Hs(O,$,O.length,.5,.5,3,.35),Q,j=!1;if(d.nline){let ht=_s(d.nline,O.start,O.end);if(ht)Q=ht.hingeT,j=ht.hingeDist>.05;else{let Tt=jt(y,w,O.start.x,O.start.y,O.end.x,O.end.y);Q=Math.max(0,Math.min(1,Tt.t))}}else{let ht=jt(y,w,O.start.x,O.start.y,O.end.x,O.end.y);Q=Math.max(0,Math.min(1,ht.t))}let Z=Is($),Y,it=Z<=.3;it?Y={score:Xo($.avgDensity,f),bestRegion:null,bestOverlap:0,bestOpeningStartT:0,bestOpeningEndT:1}:(Y=As({hingeT:Q,doorWidth:T,isOpenDoor:j},G,O.length,f.medianDensity),Y.score<0&&(Y={score:Xo($.avgDensity,f),bestRegion:null,bestOverlap:0,bestOpeningStartT:0,bestOpeningEndT:1})),d.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=Z,L.densityUsedGlobalRank=it}catch{L.densityScore=-1}else L.densityScore=-1}if(d.name.includes("door_002"))for(let L=0;L<D.length;L++){let $=D[L].seg,G=u.findIndex(j=>Math.abs(j.start.x-$.start.x)<.001&&Math.abs(j.start.y-$.start.y)<.001&&Math.abs(j.end.x-$.end.x)<.001&&Math.abs(j.end.y-$.end.y)<.001),Q=G>=0?l[G]||[]:[];for(let j of Q){let Z=e[j]}}if(D.sort((L,O)=>{let $=L.densityScore>=0?L.densityScore:-1/0,G=O.densityScore>=0?O.densityScore:-1/0;if($!==G)return G-$;if(Math.abs($-G)<.3){let Z=L.ratio||0,Y=O.ratio||0,it=Math.abs(Z-1),ht=Math.abs(Y-1);if(it!==ht)return it-ht}let Q=L.hingeScore||0,j=O.hingeScore||0;return Q!==j?j-Q:L.minDist-O.minDist}),D.length>0)for(let L=0;L<D.length;L++){let O=D[L],$=O.seg,G=O.ratio||$.length/T,Q=Math.abs(G-1)}let R=null,v=1/0,W=0,V=0,C=null,_=-1,A=0,B=0,k=0;if(D.length>0){let L=D[0];R=L.seg,v=L.minDist,W=L.ratio,V=L.embedRatio,C=L.hingeInfo,_=L.densityScore??-1,A=L.densityOverlap??0,B=L.densityOpeningStartT??0,k=L.densityOpeningEndT??0}let F;if(R&&(F=vl(R,a,d,i),F&&k>B&&(F.wallTMin=Math.max(0,Math.min(1,B)),F.wallTMax=Math.max(0,Math.min(1,k))),!r.printOnly)){let L=R;L.DrawDoor||(L.DrawDoor=[]),L.DrawDoor.push(F),L.isDoor=!0}if(R){let L=D.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}}),O={doorName:d.name,doorCategory:d.category,doorCenter:d.center,wallSegment:R,distance:v,wallLengthRatio:W,DrawDoor:F,densityScore:_,densityOverlap:A,candidates:L,hingePoint:C?.hingePoint,otherPoint:C?.otherPoint,isClosed:C?.isClosed,doorWidth:F?.width,wallTMin:F?.wallTMin,wallTMax:F?.wallTMax};if(s.push(O),(d.name==="1527727501200_window_001"||d.name==="1527727427200_window_001")&&F){let $=R.end.x-R.start.x,G=R.end.y-R.start.y,Q=Math.sqrt($*$+G*G),j=$/Q,Z=G/Q,Y=F.p.x-R.start.x,it=F.p.y-R.start.y,ht=(Y*j+it*Z)/Q,Tt=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(j*Pt+Z*Mt),ot=Math.acos(Math.min(It,1))*(180/Math.PI);if(Math.abs(ot-90)>10)continue;Tt++;let ft=[nt.start,nt.end],rt="";for(let tt of ft){let ae=tt.x-R.start.x,bt=tt.y-R.start.y,Jt=(ae*j+bt*Z)/Q,he=R.start.x+Jt*Q*j,St=R.start.y+Jt*Q*Z,ee=Math.sqrt((tt.x-he)**2+(tt.y-St)**2),et=Math.abs((Jt-ht)*Q);rt+=`\u7AEF(${tt.x.toFixed(2)},${tt.y.toFixed(2)})\u22A5=${ee.toFixed(3)}m \u6CBF\u5899=${et.toFixed(3)}m `}}}if(F&&F.width>1){let $=fn(O,i);$.length>0&&$.forEach((G,Q)=>{})}}}for(let d of s){let c=d.wallSegment,a=i.indexOf(c);if(a===-1)continue;let h=l[a];!h||h.length<=1||Zo(c,h,e)}return s}function ro(t){return[t.wallTMin??0,t.wallTMax??1]}function Vl(t,e){let[n,o]=ro(t),[r,s]=ro(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 Il(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 Bs(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 ks(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 d=0;d<t.length;d++){let a=t[d].wallSegment;i.has(a)||i.set(a,[]),i.get(a).push(d)}let l=0;for(let[d,c]of i){l++;let a=c.map(y=>t[y].doorName).join(", "),h=d.start,g=d.end}for(let[,d]of i){if(d.length<2)continue;let c=[...d].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 y=a+1;y<c.length;y++){let w=c[y];if(s.has(w))continue;let m=t[w],p=!1,x="",b=Vl(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 V of M){let C=Math.sqrt((W.x-V.x)**2+(W.y-V.y)**2);if(C>.25)continue;let _=Bs(W,g.wallSegment),A=Bs(V,m.wallSegment),B=Math.abs(_-A);(!P||C<P.dist)&&(P={dist:C,tDiff:B})}P&&P.tDiff<=.08&&(p=!0,x=`\u6700\u77ED\u8FB9\u8DDD=${P.dist.toFixed(3)}m t\u5DEE=${P.tDiff.toFixed(3)}`);let[E,S]=ro(g),[I,H]=ro(m),D=Il(g,m);g.doorName.includes("door_002")||g.doorName.includes("door_004")||m.doorName.includes("door_002")||m.doorName.includes("door_004");let T=[g.hingePoint,g.otherPoint].filter(Boolean),R=[m.hingePoint,m.otherPoint].filter(Boolean),v=1/0;for(let W of T)for(let V of R){let C=Math.sqrt((W.x-V.x)**2+(W.y-V.y)**2);C<v&&(v=C)}p&&s.add(w)}}}let u=t.filter((d,c)=>!s.has(c)),f=t.filter((d,c)=>s.has(c)).map(d=>d.doorName);return{matches:u,removed:f}}function Go(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,p)=>[p]);else{let m=Qe(t);s=m.segments,i=m.sourceMap}for(let m=0;m<s.length;m++){let p=i[m];p&&!s[m].originalPoints&&Zo(s[m],p,t)}let l=vn(r,t,o,{segments:s,sourceMap:i}),f=ks(l,{minTOverlapRatio:.5}).matches,d=new Set(f.map(m=>m.doorName));for(let m of s){let p=m;if(p.DrawDoor&&p.DrawDoor.length>0){let x=l.filter(z=>z.wallSegment===m).length;f.filter(z=>z.wallSegment===m).length===0&&(p.DrawDoor=[],p.isDoor=!1)}}let c=new Map;for(let m=0;m<f.length;m++){let p=f[m],x=s.indexOf(p.wallSegment);x>=0&&c.set(x,m)}let a=[],h=new Set,g=new Map;for(let m of e)m&&m.name&&g.set(m.name,m);for(let[m,p]of c){let x=i[m];if(!x)continue;let b=s[m],z=b.DrawDoor,M=b.isDoor,P=b.end.x-b.start.x,E=b.end.y-b.start.y,S=P*P+E*E,I=0,H=1,D=f[p],R=(D?g.get(D.doorName):void 0)?.coordinatesByArea?.coordinates;if(R&&R.length>=4&&S>0){let C=R.slice(0,4).map(_=>{let A=_.x-b.start.x,B=_.y-b.start.y;return(A*P+B*E)/S});I=Math.max(0,Math.min(1,Math.min(...C))),H=Math.max(0,Math.min(1,Math.max(...C)))}let v,W;S>0&&H>I&&(v={x:b.start.x+I*P,y:b.start.y+I*E,z:b.start.z+I*(b.end.z-b.start.z)},W={x:b.start.x+H*P,y:b.start.y+H*E,z:b.start.z+H*(b.end.z-b.start.z)});let V=!1;for(let C of x){let _=t[C];if(!_)continue;let A=_.end.x-_.start.x,B=_.end.y-_.start.y,k=A*A+B*B,F=Math.sqrt(k);if(k<1e-10||!v||!W){h.add(C),a.push(_);continue}let L=((v.x-_.start.x)*A+(v.y-_.start.y)*B)/k,O=((W.x-_.start.x)*A+(W.y-_.start.y)*B)/k,$=Math.max(0,Math.min(1,Math.min(L,O))),G=Math.max(0,Math.min(1,Math.max(L,O)));if(G-$<.001)continue;h.add(C);let Q=nt=>({x:_.start.x+nt*A,y:_.start.y+nt*B,z:_.start.z+nt*(_.end.z-_.start.z)}),j=Q($),Z=Q(G),Y=_.direction||{x:A/F,y:B/F,z:0},it,ht,Tt;if(_.originalPoints&&_.originalPoints.length>0){it=[],ht=[],Tt=[];for(let nt of _.originalPoints){let wt=((nt.x-_.start.x)*A+(nt.y-_.start.y)*B)/k;wt<$-1e-8?it.push(nt):wt>G+1e-8?Tt.push(nt):ht.push(nt)}it.length===0&&(it=void 0),ht.length===0&&(ht=void 0),Tt.length===0&&(Tt=void 0)}if($>.001){let nt={..._,start:{..._.start},end:{...j},length:$*F,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={..._,start:{...j},end:{...Z},length:(G-$)*F,direction:{...Y}};if(z&&(nt.DrawDoor=z),M&&(nt.isDoor=!0),nt.__matchIdx=p,nt.length<.01?(nt.isRebuild=!0,nt.originalPoints=[]):nt.originalPoints=ht,!V&&z&&z.length>0){V=!0;let wt=Math.sqrt(S),zt=wt>0?-E/wt:0,Dt=wt>0?P/wt:0,Pt={pointNum:2,start:v,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={..._,start:{...Z},end:{..._.end},length:(1-G)*F,direction:{...Y}};nt.DrawDoor=void 0,nt.isDoor=!1,nt.drawDoorData=void 0,nt.length<.01?(nt.isRebuild=!0,nt.originalPoints=[]):nt.originalPoints=Tt,a.push(nt)}}}for(let m=0;m<t.length;m++)h.has(m)||a.push(t[m]);let y=new Set(f.map(m=>m.doorName));for(let m of e)m&&m.category==="door"&&(y.has(m.name)?delete m.AbnormalDoor:m.AbnormalDoor=!0);let w=new Map;for(let m of f){if(!m.DrawDoor||m.DrawDoor.width<=1)continue;let p=g.get(m.doorName);if(!p||!p.positionArr||!p.positionArr.length)continue;let x=fn(m,s);if(x.length<=1)continue;let b=p.positionArr[0],z=m.DrawDoor.p,M=b.x-z.x,P=b.y-z.y,E=Math.sqrt(M*M+P*P);if(E<.001)continue;let S=M/E,I=P/E,H=x.filter(C=>{let _=(C.seg.start.x+C.seg.end.x)/2,A=(C.seg.start.y+C.seg.end.y)/2,B=_-z.x,k=A-z.y;return B*S+k*I>0});if(!H.length)continue;let D=H[0].endPoint,T=m.wallSegment;if(w.has(T))continue;let[R,v]=Dn(T,D);w.set(T,[R,v]);let W=((z.x-T.start.x)*(T.end.x-T.start.x)+(z.y-T.start.y)*(T.end.y-T.start.y))/(T.length*T.length),V=((D.x-T.start.x)*(T.end.x-T.start.x)+(D.y-T.start.y)*(T.end.y-T.start.y))/(T.length*T.length);W<=V?m.wallSegment=R:m.wallSegment=v}if(w.size>0){let m=[];for(let p of a)w.has(p)?m.push(...w.get(p)):m.push(p);for(let p of m)p.isDoor=!!(p.DrawDoor&&p.DrawDoor.length>0);return{segments:m,matches:f}}for(let m of a)m.isDoor=!!(m.DrawDoor&&m.DrawDoor.length>0);return{segments:a,matches:f}}var Cl={findWalls:Rn,mergeSegments:Ye,computeFloorZ:Ge,analyzeQuadrangle:Ze,detectPerpWalls:Tn,splitSegment:Sn,process:qo},Wl={findWalls:vn,mergeSegments:Qe,computeFloorZ:Ke,analyzeQuadrangle:Ze,detectPerpWalls:fn,splitSegment:Dn,process:Go};function dn(t){return t==="window"?Cl:Wl}function Hl(t,e,n,o,r){return dn(t).findWalls(e,n,o,r)}function _l(t,e,n,o){return dn(t).process(e,n,o)}function Al(t,e){return dn(t).mergeSegments(e)}function Ll(t,e,n){return dn(t).detectPerpWalls(e,n)}function Bl(t,e,n){return dn(t).splitSegment(e,n)}function Je(t,e){let n=Math.atan2(e,t);return n<0&&(n+=Math.PI),n>=Math.PI&&(n-=Math.PI),n}function Ce(t,e,n){let o=Math.cos(n),r=Math.sin(n);return{x:t*o-e*r,z:t*r+e*o}}function so(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,y=e-o;return Math.sqrt(g*g+y*y)}let f=((t-n)*i+(e-o)*l)/u;f=Math.max(0,Math.min(1,f));let d=n+f*i,c=o+f*l,a=t-d,h=e-c;return Math.sqrt(a*a+h*h)}function Os(t){if(t.length<3)return 0;let e=0,n=t.length;for(let o=0;o<n;o++){let 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 d of t){let c=d.x2-d.x1,a=d.z2-d.z1,h=Math.sqrt(c*c+a*a);if(h<.01)continue;let g=Je(c,a),y=Math.floor(g/o);y>=e&&(y=e-1),n[y]+=h}let r=new Array(e).fill(0),s=5;for(let d=0;d<e;d++){let c=0;for(let a=-s;a<=s;a++){let h=d+a;h<0&&(h+=e),h>=e&&(h-=e),c+=n[h]}r[d]=c}let i=0,l=0;for(let d=0;d<e;d++)r[d]>i&&(i=r[d],l=d);let u=(l+.5)*o;return{rotated:t.map(d=>{let c=Ce(d.x1,d.z1,-u),a=Ce(d.x2,d.z2,-u);return{...d,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 d of t){let c=d.x2-d.x1,a=d.z2-d.z1,h=Math.sqrt(c*c+a*a);if(h<.01)continue;let g=Je(c,a),y;if(e==="X"?y=g<Uo||g>Math.PI-Uo:y=Math.abs(g-Math.PI/2)<Uo,!y)continue;let w,m,p;e==="X"?(w=(d.z1+d.z2)/2,m=Math.min(d.x1,d.x2),p=Math.max(d.x1,d.x2)):(w=(d.x1+d.x2)/2,m=Math.min(d.z1,d.z2),p=Math.max(d.z1,d.z2)),r.push({line:d,offset:w,pStart:m,pEnd:p,length:h})}if(r.length===0)return{groups:[],lineToGroup:new Map};r.sort((d,c)=>d.offset-c.offset);let s=[],i=[r[0]],l=r[0].offset;for(let d=1;d<r.length;d++){let c=r[d];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=[],f=new Map;for(let d of s){d.sort((a,h)=>a.pStart-h.pStart);let c=[];for(let a of d){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(y=>y.line),g=u.length;u.push(h);for(let y of h)f.set(y.id,g)}}return{groups:u,lineToGroup:f}}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=so(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 hn=.15;function kl(t,e){return Math.round(t/hn)+"_"+Math.round(e/hn)}function Fs(t,e=5){if(t.length<3)return new Set;let n=new Map,o=0,r=0;function s(u,f){let d=kl(u,f),c=n.get(d);if(c)return c;let a=Math.round(u/hn),h=Math.round(f/hn),g=null,y=hn*hn;for(let w=-1;w<=1;w++)for(let m=-1;m<=1;m++){let p=a+w+"_"+(h+m),x=n.get(p);if(!x)continue;let b=x.x-u,z=x.z-f,M=b*b+z*z;M<y&&(y=M,g=x)}return g?(n.set(d,g),g):(c={id:o++,x:u,z:f,edges:[]},n.set(d,c),c)}let i=[];for(let u of t){let f=s(u.x1,u.z1),d=s(u.x2,u.z2);if(f.id===d.id)continue;let c=Math.atan2(d.z-f.z,d.x-f.x),a=Math.atan2(f.z-d.z,f.x-d.x),h={id:r++,wallId:u.id,from:f,to:d,twin:null,angle:c,visited:!1},g={id:r++,wallId:u.id,from:d,to:f,twin:h,angle:a,visited:!1};h.twin=g,f.edges.push(h),d.edges.push(g),i.push(h,g)}if(i.length<6)return new Set;for(let u of n.values())u.edges.sort((f,d)=>f.angle-d.angle);let l=new Set;for(let u of i){if(u.visited)continue;let f=[],d=u,c=i.length+10;for(;!d.visited&&f.length<c;){d.visited=!0,f.push(d);let a=d.to,h=d.twin,g=a.edges.indexOf(h);if(g<0)break;let y=(g+1)%a.edges.length;d=a.edges[y]}if(f.length>=3){let a=f[0];if(f[f.length-1].to.id===a.from.id){let g=[],y=new Set;for(let m of f)y.add(m.wallId),g.length===0&&g.push({x:m.from.x,z:m.from.z}),g.push({x:m.to.x,z:m.to.z});if(Os(g)>=e)for(let m of y)l.add(m)}}}return l}var cp=12*(Math.PI/180);function Ns(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 Ol=0;function qs(){return++Ol}function js(t,e,n=.15,o=.5){if(!t.length)return[];let r=10*Math.PI/180,s=[];for(let d of t){let c=d.x2-d.x1,a=d.z2-d.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=(d.z1+d.z2)/2,y=Math.min(d.x1,d.x2),w=Math.max(d.x1,d.x2);s.push({line:d,pStart:y,pEnd:w,offset:g,yMin:Math.min(d.y1,d.y2),yMax:Math.max(d.y1,d.y2)})}else{if(Math.abs(c)>h*Math.sin(r))continue;let g=(d.x1+d.x2)/2,y=Math.min(d.z1,d.z2),w=Math.max(d.z1,d.z2);s.push({line:d,pStart:y,pEnd:w,offset:g,yMin:Math.min(d.y1,d.y2),yMax:Math.max(d.y1,d.y2)})}}if(!s.length)return[];s.sort((d,c)=>d.offset-c.offset);let i=[],l=[s[0]],u=s[0].offset;for(let d=1;d<s.length;d++){let c=s[d];Math.abs(c.offset-u)<n?l.push(c):(i.push(l),l=[c],u=c.offset)}i.push(l);let f=[];for(let d of i){d.sort((a,h)=>a.pStart-h.pStart);let c=[];for(let a of d){if(c.length===0){c.push({pStart:a.pStart,pEnd:a.pEnd,offset:a.offset,count:1,yMin:a.yMin,yMax:a.yMax});continue}let h=c[c.length-1];a.pStart<=h.pEnd+o?(h.pEnd=Math.max(h.pEnd,a.pEnd),h.count+=1,h.yMin=Math.min(h.yMin,a.yMin),h.yMax=Math.max(h.yMax,a.yMax),h.offset=(h.offset*(h.count-1)+a.offset)/h.count):c.push({pStart:a.pStart,pEnd:a.pEnd,offset:a.offset,count:1,yMin:a.yMin,yMax:a.yMax})}for(let a of c){let h=a.pEnd-a.pStart;if(h<.01)continue;let g;e==="X"?g={id:qs(),x1:a.pStart,y1:a.yMin,z1:a.offset,x2:a.pEnd,y2:a.yMax,z2:a.offset,length:h,pointCount:a.count,isMain:!1}:g={id:qs(),x1:a.offset,y1:a.yMin,z1:a.pStart,x2:a.offset,y2:a.yMax,z2:a.pEnd,length:h,pointCount:a.count,isMain:!1},f.push(g)}}return f}function $s(t,e=.8,n=3){return t.filter(o=>o.length>=e&&o.pointCount>=n)}function Xs(t,e=1,n=3){return t.filter(o=>o.length>=e&&o.pointCount>=n)}function Fl(t,e,n={}){let{distTol:o=.15,gapTol:r=.5,minLen:s=.2,minGroupLen:i=1,minArea:l=3,maxWinDist:u=.3,minLongWall:f=2}=n,d=performance.now(),{rotated:c,mainAngle:a}=io(t),h=performance.now(),g=e.map(v=>{let W=Ce(v.x,v.z,-a);return{...v,x:W.x,z:W.z}}),{groups:y}=ao(c,"X",o,r),{groups:w}=ao(c,"Z",o,r),m=[...y,...w],p=performance.now(),x=new Map,b=[];for(let v=0;v<m.length;v++){let W=m[v];if(W.length===0){b.push(0);continue}let V=0;for(let C of W)V+=Yo(C),x.set(C.id,v);b.push(V)}let z=performance.now(),M=new Set;for(let v=0;v<m.length;v++)b[v]>=f&&M.add(v);if(M.size>0){let v=[...M];for(;v.length>0;){let W=v.shift(),V=m[W];for(let C=0;C<m.length;C++){if(M.has(C)||b[C]<i)continue;let _=m[C],A=!1;t:for(let B of V)for(let k of _)if(Math.hypot(B.x1-k.x1,B.z1-k.z1)<=co||Math.hypot(B.x1-k.x2,B.z1-k.z2)<=co||Math.hypot(B.x2-k.x1,B.z2-k.z1)<=co||Math.hypot(B.x2-k.x2,B.z2-k.z2)<=co){A=!0;break t}A&&(M.add(C),v.push(C))}}}let P=c.map((v,W)=>{let V=Yo(v),C=x.get(v.id),_=C!==void 0&&M.has(C),A=V>=f;return{id:W,x1:v.x1,y1:v.y1,z1:v.z1,x2:v.x2,y2:v.y2,z2:v.z2,length:V,pointCount:1,isMain:_||A}}),E=P.filter(v=>v.isMain),S=P.filter(v=>!v.isMain),I=performance.now(),H=lo(g,E,u),D=performance.now(),T=v=>v.map(W=>{let V=Ce(W.x1,W.z1,a),C=Ce(W.x2,W.z2,a);return{...W,x1:V.x,z1:V.z,x2:C.x,z2:C.z}}),R=performance.now();return console.log(`[\u4E3B\u4F53\u67B6\u6784] \u89D2\u5EA6\u5F52\u4E00\u5316: ${(h-d).toFixed(0)}ms`),console.log(`[\u4E3B\u4F53\u67B6\u6784] \u5171\u7EBF\u5206\u7EC4: ${(p-h).toFixed(0)}ms (\u6C34\u5E73${y.length}\u7EC4 \u5782\u76F4${w.length}\u7EC4)`),console.log(`[\u4E3B\u4F53\u67B6\u6784] \u7EC4\u5206\u6790+\u4E3B\u4F53\u5224\u5B9A: ${(R-p).toFixed(0)}ms (\u4E3B\u4F53\u7EC4${M.size} / \u603B\u7EC4${m.length})`),console.log(`[\u4E3B\u4F53\u67B6\u6784] \u6807\u8BB0\u539F\u59CB\u7EBF\u6BB5: ${(I-R).toFixed(0)}ms (\u4E3B\u4F53${E.length} / \u6742\u7EBF${S.length})`),console.log(`[\u4E3B\u4F53\u67B6\u6784] \u7A97\u6237\u6302\u63A5: ${(D-I).toFixed(0)}ms`),console.log(`[\u4E3B\u4F53\u67B6\u6784] \u603B\u8BA1: ${(D-d).toFixed(0)}ms`),{mainWalls:T(E),noiseWalls:T(S),windowToWall:H}}var co=.2;function Te(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 In(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 we(t,e,n,o){let r=n-t,s=o-e;return Math.sqrt(r*r+s*s)}function Cn(t,e,n,o,r,s){let i=r-n,l=s-o,u=i*i+l*l;if(u<1e-6)return we(t,e,n,o);let f=((t-n)*i+(e-o)*l)/u;return f=Math.max(0,Math.min(1,f)),we(t,e,n+f*i,o+f*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 Zs(t,e){let n=1/0;for(let o of t)for(let r=0;r<e.length-1;r++){let s=Cn(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),f=Math.floor(l.z/e),d=u+","+f;n.set(d,(n.get(d)||0)+1),u<o&&(o=u),u>r&&(r=u),f<s&&(s=f),f>i&&(i=f)}return{cells:n,minX:o,maxX:r,minZ:s,maxZ:i}}function Gs(t,e){let n=new Set,o=1/0,r=-1/0,s=1/0,i=-1/0,l=(u,f)=>{let d=u+","+f;n.add(d),u<o&&(o=u),u>r&&(r=u),f<s&&(s=f),f>i&&(i=f)};for(let u of t){let f=u.x1,d=u.z1,c=u.x2,a=u.z2,h=Math.floor(f/e),g=Math.floor(d/e),y=Math.floor(c/e),w=Math.floor(a/e),m=Math.abs(y-h),p=Math.abs(w-g),x=h<y?1:-1,b=g<w?1:-1,z=m-p,M=Math.max(m,p)*2+5,P=0;for(;P++<M&&(l(h,g),!(h===y&&g===w));){let E=2*z;E>-p&&(z-=p,h+=x),E<m&&(z+=m,g+=b)}}return{active:n,minX:o,maxX:r,minZ:s,maxZ:i}}function Hn(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 f=-1;f<=1;f++)for(let d=-1;d<=1;d++)f===0&&d===0||r.add(l+f+","+(u+d))}let s=new Set(r);for(let i of r){let[l,u]=i.split(",").map(Number),f=!0;for(let d=-1;d<=1;d++){for(let c=-1;c<=1;c++)if(!r.has(l+d+","+(u+c))){f=!1;break}if(!f)break}f||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 f=-1;f<=1;f++)for(let d=-1;d<=1;d++){if(f===0&&d===0)continue;let c=l+f+","+(u+d);t.has(c)&&!n.has(c)&&(n.add(c),s.push(c))}}r.size>=4&&e.push(r)}return e}function tr(t,e){if(t.size<3)return[];let n=new Set,o=(g,y)=>t.has(g+","+y);for(let g of t){let[y,w]=g.split(",").map(Number);(!o(y+1,w)||!o(y-1,w)||!o(y,w+1)||!o(y,w-1))&&n.add(g)}if(n.size<3)return[];let r="",s=1/0,i=1/0;for(let g of n){let[y,w]=g.split(",").map(Number);(w<s||w===s&&y<i)&&(s=w,i=y,r=g)}if(!r)return[];let l=[[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1]],u=[],[f,d]=r.split(",").map(Number),c=0,a=new Set,h=n.size*8;for(let g=0;g<h;g++){let w=f+","+d+"|"+c;if(a.has(w))break;a.add(w),u.push({x:(f+.5)*e,z:(d+.5)*e});let m=(c+3)%8,p=!1;for(let x=0;x<8;x++){let b=(m+x)%8,z=f+l[b][0],M=d+l[b][1];if(n.has(z+","+M)){c=(b+4)%8,f=z,d=M,p=!0;break}}if(!p||f+","+d===r&&u.length>2)break}return u}function Wn(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=Cn(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=Wn(t.slice(0,o+1),e),l=Wn(t.slice(o),e);return[...i.slice(0,-1),...l]}return[r,s]}var er={cellSize:.1,densityThreshold:1,minComponentCells:20,simplifyEpsilon:.01,heightMin:.3,heightMax:2.8,closeIterations:5,sparseRadius:.3,sparseMinNeighbors:5,lineDensityMin:0,lineDensityMinLen:1,densityRatio:.12};function mn(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,f=0,d=0;for(let m of t){let p=m.x,x=m.z;n+=p,o+=x,r+=p*p,s+=x*x,i+=p*x,l+=p*p*p,u+=x*x*x,f+=p*p*x,d+=p*x*x}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+d)-n*(r+s))/c,h=(e*(f+u)-o*(r+s))/c,g=Math.sqrt(Math.abs((r+s-2*a*n-2*h*o)/e+a*a+h*h)),y=0;for(let m of t){let x=Math.hypot(m.x-a,m.z-h)-g;y+=x*x}let w=Math.sqrt(y/e);return{cx:a,cz:h,r:g,rmsResidual:w}}function Nl(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 b of t)n+=b.x,o+=b.z;n/=e,o/=e;let r=0,s=0,i=0;for(let b of t){let z=b.x-n,M=b.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),f=Math.sqrt(u),d=(l+f)/2,c=(l-f)/2,a=Math.sqrt(d),h=Math.sqrt(c),g=h,y=1,w=0,m=0,p=1;if(Math.abs(i)>1e-12||Math.abs(r-s)>1e-12){let b=i,z=d-r,M=Math.sqrt(b*b+z*z);M>1e-12&&(y=b/M,w=z/M);let P=i,E=c-r,S=Math.sqrt(P*P+E*E);S>1e-12&&(m=P/S,p=E/S)}let x=d>1e-10?c/d:0;return{eigenRatio:x,isLinear:x<.05,spread:g,mx:n,mz:o,v1x:y,v1z:w,v2x:m,v2z:p,s1:a,s2:h}}function Ys(t,e,n){if(t.length<6)return{type:"straight",eigenRatio:.5,spread:0,cloudUsed:t.length,mx:0,mz:0,v1x:1,v1z:0,v2x:0,v2z:1,s1:0,s2:0};let{eigenRatio:o,isLinear:r,spread:s,mx:i,mz:l,v1x:u,v1z:f,v2x:d,v2z:c,s1:a,s2:h}=Nl(t),g=0;for(let b=1;b<t.length;b++){let z=t[b].x-t[b-1].x,M=t[b].z-t[b-1].z;g+=Math.sqrt(z*z+M*M)}let y=ql(t),w=mn(y);if(w.r>.1&&w.r<Math.max(g*5,2)&&w.rmsResidual<.07)return{type:"curved",eigenRatio:o,spread:s,cloudUsed:t.length,mx:i,mz:l,v1x:u,v1z:f,v2x:d,v2z:c,s1:a,s2:h};let p=g>.01?s/g:1;return{type:r&&(s<.05||p<.1)?"straight":"curved",eigenRatio:o,spread:s,cloudUsed:t.length,mx:i,mz:l,v1x:u,v1z:f,v2x:d,v2z:c,s1:a,s2:h}}function ql(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 jl(t,e,n=1.57){if(e<10)return[];let o=[];for(let y=0;y<e;y++){let w=(y+1)%e;o.push(Math.atan2(t[w].z-t[y].z,t[w].x-t[y].x))}let r=[o[0]];for(let y=1;y<e;y++){let w=o[y]-o[y-1];w>Math.PI?w-=2*Math.PI:w<-Math.PI&&(w+=2*Math.PI),r.push(r[y-1]+w)}let s=0;{let y=o[0]-o[e-1];y>Math.PI?y-=2*Math.PI:y<-Math.PI&&(y+=2*Math.PI),s=y}Math.abs(s)<.1;let i=[],l=5;for(let y=0;y<e;y++){let w=0;for(let m=-l;m<=l;m++)w+=r[(y+m+e)%e];i.push(w/(l*2+1))}let u=5,f=[];for(let y=0;y<e;y++){let w=i[(y+u)%e]-i[y];w>Math.PI?w-=2*Math.PI:w<-Math.PI&&(w+=2*Math.PI),f.push(w)}let d=10,c=.003,a=10,h=.05,g=[];for(let y=0;y<e;y++){let w=y,m=y,p=0,x=0,b=y,z=e+10;for(;z-- >0;){let P=f[b],E=Math.abs(P),S=P>0?1:P<0?-1:0;if(E<c){b=(b+1)%e;continue}if(x===0){x=S,p=E,m=b,b=(b+1)%e;continue}if(S!==x){let I=E,H=S,D=(b+1)%e,T=1;for(let R=0;R<a&&T<a*2;R++){let v=f[D],W=Math.abs(v);if(W<c){D=(D+1)%e;continue}(v>0?1:-1)===H?I+=W:(I-=W,I<0&&(H=-H,I=-I)),D=(D+1)%e,T++}if(H===x&&I>h){b=(b+1)%e;continue}break}if(p+=E,m=b,b=(b+1)%e,b===y)break}if((m>w?m-w+1:e-w+m+1)>=d&&p>=n){let P=w,E=(w+u)%e,S=(m-u+e)%e,I=m,H=t[P],D=t[E],T=t[S],R=t[I],v=Math.atan2(D.z-H.z,D.x-H.x),V=Math.atan2(R.z-T.z,R.x-T.x)-v;V>Math.PI?V-=2*Math.PI:V<-Math.PI&&(V+=2*Math.PI);let C=Math.abs(V);if(!g.some(A=>{function B(L,O,$){return L<=O?$>=L&&$<=O:$>=L||$<=O}let k=0,F=0;for(let L=w;F++,B(A.start,A.end,L)&&k++,L!==m;L=(L+1)%e);return F>0&&k/F>.7})){let A=g.findIndex(B=>{function k(O,$,G){return O<=$?G>=O&&G<=$:G>=O||G<=$}let F=0,L=0;for(let O=B.start;L++,k(w,m,O)&&F++,O!==B.end;O=(O+1)%e);return L>0&&F/L>.7});A>=0?p>g[A].cumAngle&&(g[A]={start:w,end:m,cumAngle:p,actualAngle:C}):g.push({start:w,end:m,cumAngle:p,actualAngle:C})}}}return g}function $l(t,e){let s=new Array(e).fill(!1);for(let f=0;f<e;f++){let d=t[f],c=t[(f+15)%e],a=t[(f+30)%e],h=Math.atan2(c.z-d.z,c.x-d.x),g=Math.atan2(a.z-c.z,a.x-c.x),y=Math.abs(g-h);y>Math.PI&&(y=2*Math.PI-y),y>.07&&(s[(f+15)%e]=!0)}let i=new Set,l=[],u=-1;for(let f=0;f<e*2;f++){let d=f%e;if(s[d])u<0&&(u=d);else if(u>=0){let c=(d-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 f=l[0],d=l[l.length-1];d.end>e-3&&f.start<3&&(l[0]={start:d.start,end:f.end},l.pop())}return l}function Xl(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 b=a;b<=h;b++)g.push(t[b]);if(g.length<c-1)continue;let{cx:y,cz:w,r:m,rmsResidual:p}=mn(g);if(m<.1||p>o||m<s)continue;let x=0;for(let b=1;b<g.length;b++){let z=g[b-1].x-y,M=g[b-1].z-w,P=g[b].x-y,E=g[b].z-w;x+=Math.abs(Math.atan2(z*E-M*P,z*P+M*E))}if(!(x<r))for(let b=a;b<=h;b++)u[b]++}let f=[],d=-1;for(let c=0;c<e*2;c++){let a=c%e;if(u[a]>=2)d<0&&(d=a);else if(d>=0){let h=(a-1+e)%e,g=0;for(let y=d;g++,y!==h;y=(y+1)%e);g>=l&&f.push({start:d,end:h}),d=-1}}if(f.length>1){let c=f[0],a=f[f.length-1];a.end>e-3&&c.start<3&&(f[0]={start:a.start,end:c.end},f.pop())}return f}function Zl(t,e,n){function o(h,g){return h<=g?g-h+1:n-h+(g+1)}function r(h,g,y){return h<=g?y>=h&&y<=g:y>=h||y<=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,f=s<=i?e.start:t.start,d=s<=i?e.end:t.end,c=0;for(let h=l;r(f,d,h)&&c++,h!==u;h=(h+1)%n);let a=s+i-c;return a>0?c/a:0}function Gl(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 f=l+1;f<t.length;f++){let d=t[f],c=u.bx-u.ax,a=u.bz-u.az,h=d.bx-d.ax,g=d.bz-d.az,y=Math.sqrt(c*c+a*a),w=Math.sqrt(h*h+g*g);if(y<.01||w<.01)continue;let m=Math.abs(Math.atan2(c*g-a*h,c*h+a*g));if(m<o||m>r)continue;let p=[{x:u.ax,z:u.az},{x:u.bx,z:u.bz}],x=[{x:d.ax,z:d.az},{x:d.bx,z:d.bz}];for(let b of p)for(let z of x){let M=b.x-z.x,P=b.z-z.z;Math.sqrt(M*M+P*P)<n&&e.push({x:(b.x+z.x)/2,z:(b.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,f=e[l].z,d=1;i[l]=!0;for(let c=l+1;c<e.length;c++){if(i[c])continue;let a=e[c].x-u/d,h=e[c].z-f/d;Math.sqrt(a*a+h*h)<.3&&(u+=e[c].x,f+=e[c].z,d++,i[c]=!0)}s.push({x:u/d,z:f/d})}return s}function Us(t,e){if(t.length<6)return[];let n={minCurveAngle:.05,minCurvePoints:5,smoothWindow:3,...e},o=t.length,r=[];for(let T=0;T<o;T++){let R=t[(T-1+o)%o],v=t[T],W=t[(T+1)%o],V=v.x-R.x,C=v.z-R.z,_=W.x-v.x,A=W.z-v.z,B=Math.sqrt(V*V+C*C),k=Math.sqrt(_*_+A*A);if(B<.001||k<.001){r.push(0);continue}r.push(Math.atan2((V*A-C*_)/(B*k),(V*_+C*A)/(B*k)))}let s=[],i=n.smoothWindow;for(let T=0;T<o;T++){let R=0;for(let v=-i;v<=i;v++)R+=r[(T+v+o)%o];s.push(R/(i*2+1))}let l=.008,u=[],f=-1,d=0,c=new Set;for(let T=0;T<o*2;T++){let R=T%o,v=s[R],W=v>=0?1:-1;if(Math.abs(v)>l&&(d===0||d===W))f<0&&(f=R,d=W);else if(f>=0){let V=(R-1+o)%o,C=0,_=0;for(let A=f;C+=Math.abs(s[A]),_++,A!==V;A=(A+1)%o);if(_>=n.minCurvePoints&&C>n.minCurveAngle){let A=`${f},${V}`;c.has(A)||(c.add(A),u.push({start:f,end:V,sign:d}))}f=-1,d=0}}if(u.length>1){let T=u[0],R=u[u.length-1];T.sign===R.sign&&R.end>o-3&&T.start<3&&(u[0]={start:R.start,end:T.end,sign:T.sign},u.pop())}{let T=s.filter(V=>Math.abs(V)>.001).map(V=>Math.abs(V)),R=T.length>0?Math.max(...T):0,v=T.length>0?T.reduce((V,C)=>V+C,0)/T.length:0,W=u.reduce((V,C)=>{let _=0;for(let A=C.start;_++,A!==C.end;A=(A+1)%o);return V+_},0)}let a=$l(t,o),h=Xl(t,o),g=[...u,...a.map(T=>({start:T.start,end:T.end,sign:1})),...h.map(T=>({start:T.start,end:T.end,sign:1}))],y=u.length,m=g.map((T,R)=>{let v=[];for(let G=T.start;v.push({...t[G]}),G!==T.end;G=(G+1)%o);let W=0;for(let G=1;G<v.length;G++)s[(T.start+G-1)%o]*s[(T.start+G)%o]<-1e-8&&W++;let{cx:V,cz:C,r:_,rmsResidual:A}=mn(v),B=0,k=0;for(let G=1;G<v.length;G++){let Q=v[G-1].x-V,j=v[G-1].z-C,Z=v[G].x-V,Y=v[G].z-C,it=Math.atan2(Q*Y-j*Z,Q*Z+j*Y);B+=Math.abs(it),k+=it}let F=Se(v),L=W===0?.12:.08;if(_>.1&&A>L||_>.1&&_>Math.max(F*15,8)||Math.abs(k)<.05)return null;let O=R<y?"turning":"sliding",$=O!=="turning"?Math.abs(k)>.35?"C_curve":"S_curve":W>0?"S_curve":"C_curve";return{seg:{points:v,type:$,radius:_,centerX:V,centerZ:C,arcAngle:B,arcLength:F},start:T.start,end:T.end,source:O}}).filter(T=>T!==null),p=new Set;function x(T,R){return T<=R?R-T+1:o-T+(R+1)}function b(T,R,v,W){for(let V=T;;V=(V+1)%o){let C;if(v<=W?C=V>=v&&V<=W:C=V>=v||V<=W,!C)return!1;if(V===R)break}return!0}for(let T=0;T<m.length;T++)if(!p.has(T))for(let R=T+1;R<m.length;R++){if(p.has(R))continue;if(Zl({start:m[T].start,end:m[T].end},{start:m[R].start,end:m[R].end},o)>.6){let V=(m[T].seg.arcAngle>=m[R].seg.arcAngle?T:R)===T?R:T;if(m[T].seg.arcAngle>=m[R].seg.arcAngle)p.add(R);else{p.add(T);break}}else{let W=x(m[T].start,m[T].end),V=x(m[R].start,m[R].end),C=W<=V?T:R,_=W<=V?R:T;b(m[C].start,m[C].end,m[_].start,m[_].end)&&x(m[C].start,m[C].end)/x(m[_].start,m[_].end)<.7&&p.add(C)}}let z=m.filter((T,R)=>!p.has(R)),M=10,P=10,E=30,S=15,I=[],H=0;if(z.length>0){for(let v of z)v.start=(v.start-S+o)%o,v.end=(v.end+S)%o;let T=[...z].sort((v,W)=>v.start-W.start),R=T[0];for(let v=1;v<T.length;v++){let W=T[v],V=W.start-R.end;V<0&&(R.end>o*.5&&W.start<o*.5?V=W.start+o-R.end:V=0);let C=V===0,_=V<=E&&C;if(!_&&V<=E){let A=Math.sqrt((R.seg.centerX-W.seg.centerX)**2+(R.seg.centerZ-W.seg.centerZ)**2),B=Math.max(R.seg.radius,W.seg.radius),k=Math.min(R.seg.radius,W.seg.radius),F=k>0?B/k:99;_=A<P&&F<M}if(_){let A=Math.min(R.start,W.start),B=Math.max(R.end,W.end),k=[];for(let G=A;k.push({...t[G]}),G!==B;G=(G+1)%o);let{cx:F,cz:L,r:O}=mn(k),$=0;for(let G=1;G<k.length;G++){let Q=k[G-1].x-F,j=k[G-1].z-L,Z=k[G].x-F,Y=k[G].z-L;$+=Math.abs(Math.atan2(Q*Y-j*Z,Q*Z+j*Y))}R={seg:{points:k,type:"C_curve",radius:O,centerX:F,centerZ:L,arcAngle:$,arcLength:Se(k)},start:R.start,end:W.end,source:R.source},H++}else I.push(R),R=W}I.push(R)}{if(I.length>1){let R=I.map((v,W)=>{if(W===0)return 0;let V=v.start-I[W-1].end;return V<0&&(V=v.start+o-I[W-1].end),V})}let T=[];for(let R=0;R<I.length;R++){if(T.length===0){T.push(I[R]);continue}let v=T[T.length-1],W=I[R].start-v.end;if(W<0&&(W=I[R].start+o-v.end),W<=30){let V=[...v.seg.points];for(let k=(v.end+1)%o;V.push({...t[k]}),k!==I[R].end;k=(k+1)%o);let{cx:C,cz:_,r:A}=mn(V),B=0;for(let k=1;k<V.length;k++){let F=V[k-1].x-C,L=V[k-1].z-_,O=V[k].x-C,$=V[k].z-_;B+=Math.abs(Math.atan2(F*$-L*O,F*O+L*$))}T[T.length-1]={seg:{points:V,type:"C_curve",radius:A,centerX:C,centerZ:_,arcAngle:B,arcLength:Se(V)},start:v.start,end:I[R].end,source:v.source}}else T.push(I[R])}I=T}return I.map((T,R)=>{let v=T.seg;return v.candidateId=R,v})}function Yl(t){let e=t.length;if(e<6)return null;let n=jl(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:f}=mn(s);if(u>.1&&f>.1)return null;let d=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&&d>.17?{points:s,type:"C_curve",radius:u,centerX:i,centerZ:l,arcAngle:d,arcLength:c}:null}function ho(t,e,n){let o={...er,...n},r=Date.now(),s=t,i=Array.isArray(e)?e:[],l=[];if(i.length>10)try{for(let T of i){let R=T.x1,v=T.z1,W=T.x2,V=T.z2;if(R==null||v==null||W==null||V==null){let C=T.start?.x,_=T.start?.y,A=T.end?.x,B=T.end?.y;if(C==null||_==null||A==null||B==null)continue;l.push({ax:C,az:_,bx:A,bz:B})}else l.push({ax:R,az:v,bx:W,bz:V})}let D=.1*.1;if(l.length>5){let T=[],R=[],v=new Array(l.length).fill(0);for(let V of t){let C=1/0,_=-1;for(let A=0;A<l.length;A++){let B=l[A],k=B.bx-B.ax,F=B.bz-B.az,L=k*k+F*F,O;if(L<1e-8)O=(V.x-B.ax)**2+(V.y-B.az)**2;else{let $=((V.x-B.ax)*k+(V.y-B.az)*F)/L;$=Math.max(0,Math.min(1,$));let G=B.ax+$*k,Q=B.az+$*F;O=(V.x-G)**2+(V.y-Q)**2}if(O<C&&(C=O,_=A),C<=D)break}C<=D&&(R.push(V),T.push(_),v[_]++)}let W=R;if(o.lineDensityMin>0&&o.lineDensityMinLen>0){let V=new Set;for(let C=0;C<l.length;C++){let _=l[C],A=Math.hypot(_.bx-_.ax,_.bz-_.az);if(A>=o.lineDensityMinLen)continue;(A>.01?v[C]/A:0)<o.lineDensityMin&&V.add(C)}if(V.size>0){let C=[];for(let _=0;_<R.length;_++)V.has(T[_])||C.push(R[_]);W=C}}s=W}}catch(D){console.warn("[\u70B9\u4E91\u8F6E\u5ED3] \u7EBF\u6BB5\u8FC7\u6EE4\u5931\u8D25:",D)}let u=Gl(l),f=[];for(let D of s){let T=D.z;T<o.heightMin||T>o.heightMax||f.push({x:D.x,z:D.y})}if(f.length<50)return tn(e,r);if(o.sparseRadius>0){let D=new Map,T=o.cellSize;for(let V of f){let C=`${Math.round(V.x/T)},${Math.round(V.z/T)}`;D.has(C)||D.set(C,[]),D.get(C).push(V)}let R=[],v=Math.ceil(o.sparseRadius/T);for(let V=-v;V<=v;V++)for(let C=-v;C<=v;C++)R.push(`${V},${C}`);let W=[];for(let V of f){let C=Math.round(V.x/T),_=Math.round(V.z/T),A=0;for(let B of R){let[k,F]=B.split(",").map(Number),L=D.get(`${C+k},${_+F}`);if(L&&(A+=L.length),A>=o.sparseMinNeighbors)break}A>=o.sparseMinNeighbors&&W.push(V)}f.length=0;for(let V=0;V<W.length;V++)f.push(W[V])}if(f.length<50)return tn(e,r);let d=Date.now(),{cells:c}=fo(f,o.cellSize),a=new Set;if(o.densityRatio>0&&c.size>10){let D=Array.from(c.values()).sort((v,W)=>v-W),T=D[Math.floor(D.length/2)],R=Math.max(o.densityThreshold,Math.ceil(T*o.densityRatio));for(let[v,W]of c)W>=R&&a.add(v);if(a.size<o.minComponentCells){a.clear();for(let[v,W]of c)W>=o.densityThreshold&&a.add(v)}}else for(let[D,T]of c)T>=o.densityThreshold&&a.add(D);if(a.size<o.minComponentCells)return tn(e,r);let h=a;o.closeIterations>0&&(h=Hn(a,o.closeIterations));let g=Date.now(),y=Jo(h).filter(D=>D.size>=o.minComponentCells);y.sort((D,T)=>T.size-D.size);let w=20;y.length>w&&(y=y.slice(0,w));let m=Date.now(),p=[];for(let D of y){let T=tr(D,o.cellSize);T.length>=4&&p.push(T)}let x=Date.now(),b=p.map(D=>{let T=Wn(D,o.simplifyEpsilon);if(T.length>=7)for(let R=0;R<2;R++){let v=T.length,W=T.map(V=>({x:V.x,z:V.z}));for(let V=0;V<v;V++){let C=T[(V-1+v)%v],_=T[V],A=T[(V+1)%v],B=_.x-C.x,k=_.z-C.z,F=A.x-_.x,L=A.z-_.z,O=Math.sqrt(B*B+k*k),$=Math.sqrt(F*F+L*L);if(O<.001||$<.001)continue;if(Math.abs(Math.atan2(B*L-k*F,B*F+k*L))>1.8){let Q=[-2,-1,0,1,2].map(Y=>T[(V+Y+v)%v]),j=Q.map(Y=>Y.x).sort((Y,it)=>Y-it),Z=Q.map(Y=>Y.z).sort((Y,it)=>Y-it);W[V]={x:j[2],z:Z[2]}}}T=W}if(T=Qo(T),u.length>0&&T.length>=5)for(let R of u){let v=1/0,W=-1;for(let V=0;V<T.length;V++){let C=T[V].x-R.x,_=T[V].z-R.z,A=C*C+_*_;A<v&&(v=A,W=V)}W>=0&&v<.3*.3&&(T[W]={x:R.x,z:R.z})}if(T.length>2){let R=T[0],v=T[T.length-1];(Math.abs(R.x-v.x)>.001||Math.abs(R.z-v.z)>.001)&&T.push({...R})}return T}),z=o.cellSize/2;function M(D){let T=0;for(let R=0;R<D.length;R++){let v=(R+1)%D.length;T+=D[R].x*D[v].z-D[v].x*D[R].z}return T/2}let P=b.map(D=>{if(D.length<3)return D;let T=M(D)>=0;return D.map((R,v)=>{let W=D[(v-1+D.length)%D.length],V=D[(v+1)%D.length],C=V.x-W.x,_=V.z-W.z;if(Math.sqrt(C*C+_*_)<.001)return{...R};let B=T?_:-_,k=T?-C:C,F=Math.sqrt(B*B+k*k);return F<.001?{...R}:{x:R.x+B/F*z,z:R.z+k/F*z}})}),E=Date.now(),S=[];for(let D=0;D<P.length;D++){let T=P[D];T.length<3||S.push({id:-D-1,points:T,length:Se(T),pointCount:T.length,type:"straight",isMain:!1})}let I=Date.now()-r,H=[];for(let D of b){let T=Us(D);for(let v of T)H.push(v);let R=Yl(D);R&&H.push(R)}return{mainWalls:[],noiseWalls:[],contours:S,curvedSegments:H,filteredPoints:s,stats:{totalRawLines:e?.length??t.length,totalWalls:0,mainCount:0,noiseCount:S.length,elapsedMs:I}}}function Ks(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 tn(t,i);let l=t.map(S=>({x1:S.x1,z1:S.z1,x2:S.x2,z2:S.z2})),{active:u}=Gs(l,n);if(u.size<r)return tn(t,i);let f=Date.now(),d=Hn(u,o),c=Date.now(),a=Jo(d).filter(S=>S.size>=r);if(a.length===0)return tn(t,i);let h=a.reduce((S,I)=>S.size>=I.size?S:I),g=Date.now(),y=tr(h,n);if(y.length<4)return tn(t,i);let w=Date.now(),m=Wn(y,s);if(m=Qo(m),m.length>2){let S=m[0],I=m[m.length-1];(Math.abs(S.x-I.x)>.001||Math.abs(S.z-I.z)>.001)&&m.push({...S})}let p=n/2;function x(S){let I=0;for(let H=0;H<S.length;H++){let D=(H+1)%S.length;I+=S[H].x*S[D].z-S[D].x*S[H].z}return I/2}let b=x(m)>=0,z=m.map((S,I)=>{let H=m[(I-1+m.length)%m.length],D=m[(I+1)%m.length],T=D.x-H.x,R=D.z-H.z;if(Math.sqrt(T*T+R*R)<.001)return{...S};let W=b?R:-R,V=b?-T:T,C=Math.sqrt(W*W+V*V);return C<.001?{...S}:{x:S.x+W/C*p,z:S.z+V/C*p}}),M=Date.now(),P=[];z.length>=3&&P.push({id:-1,points:z,length:Se(z),pointCount:z.length,type:"straight",isMain:!0});let E=Date.now()-i;return{mainWalls:[],noiseWalls:[],contours:P,stats:{totalRawLines:t.length,totalWalls:0,mainCount:0,noiseCount:P.length,elapsedMs:E}}}function tn(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),f=Math.floor(l.y/e),d=`${u},${f}`;o.has(d)||o.set(d,[]),o.get(d).push(l)}let r=new Map;for(let[l,u]of o){let[f,d]=l.split(","),c=parseInt(f),a=parseInt(d),h=0;for(let g=-2;g<=2;g++)for(let y=-2;y<=2;y++){let w=`${c+g},${a+y}`;h+=o.get(w)?.length??0}r.set(l,h)}let s=[],i=0;for(let l of t){let u=Math.floor(l.x/e),f=Math.floor(l.y/e),d=`${u},${f}`;(r.get(d)??0)>=n?s.push(l):i++}return s}function po(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),f=`${i},${l},${u}`;o.has(f)||o.set(f,[]),o.get(f).push(s)}let r=[];for(let s of o.values())if(s.length>=n){let i=s.reduce((f,d)=>f+d.x,0)/s.length,l=s.reduce((f,d)=>f+d.y,0)/s.length,u=s.reduce((f,d)=>f+d.z,0)/s.length;r.push({x:i,y:l,z:u})}return r}function Qs(t,e,n){let o=po(t,e,n),r=t.length-o.length;return o}function Js(t){let e=[];for(let f of t){let d=f.originalPoints??f.points??[];if(!Array.isArray(d)||d.length<2)continue;let c=Math.min(d.length,200);for(let a=1;a<c;a++){let h=Math.hypot(d[a].x-d[a-1].x,d[a].y-d[a-1].y,d[a].z-d[a-1].z);h>.001&&e.push(h)}}let n={voxelSize:.08,minPoints:3,minCentroids:3};if(e.length<10)return n;e.sort((f,d)=>f-d);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 f=t[u],d=f.originalPoints??f.points??[];if(!Array.isArray(d)||d.length===0){s.push(f),i.push(e[u]);continue}let c=po(d,n,o);c.length>=r?(f.originalPoints&&(f.originalPoints=c),f.points&&(f.points=c),s.push(f),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],f=u.originalPoints??u.points??[],c=(Array.isArray(f)?f.filter(w=>w&&w.x!==void 0&&w.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 en(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 f=((t-n)*i+(e-o)*l)/u;return f=Math.max(0,Math.min(1,f)),Math.hypot(t-(n+f*i),e-(o+f*l))}function nr(t,e,n=.2){for(let o of e)if(en(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=en(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(x,b,z,M){let P=z.points[0],E=z.points[z.points.length-1];return Math.hypot(x-P.x,b-P.z)<=M||Math.hypot(x-E.x,b-E.z)<=M}function y(x,b,z,M){for(let P=0;P<z.points.length-1;P++)if(en(x,b,z.points[P].x,z.points[P].z,z.points[P+1].x,z.points[P+1].z)<=M)return!0;return!1}function w(x,b,z){let M=0,P=x[0],E=x[x.length-1];for(let S of b)if(g(P.x,P.z,S,z)||y(P.x,P.z,S,z)){M++;break}for(let S of b)if(g(E.x,E.z,S,z)||y(E.x,E.z,S,z)){M++;break}return M}function m(x){if(x.length<2)return 0;if(x.length<=30){let P=0;for(let E=0;E<x.length;E++)for(let S=E+1;S<x.length;S++){let I=Math.hypot(x[E].x-x[S].x,x[E].z-x[S].z);I>P&&(P=I)}return P}let b=Math.max(1,Math.floor(x.length/15)),z=[];for(let P=0;P<x.length;P+=b)z.push(x[P]);z[z.length-1]!==x[x.length-1]&&z.push(x[x.length-1]);let M=0;for(let P=0;P<z.length;P++)for(let E=P+1;E<z.length;E++){let S=Math.hypot(z[P].x-z[E].x,z[P].z-z[E].z);S>M&&(M=S)}return M}let p=[];for(let x of t){let b=x.points,z=b.length>=2?m(b):0,M=x.candidateId!==void 0?`#${x.candidateId}`:"#?";if(o&&console.log(`[\u5F27\u6BB5\u5206\u6790] ${M} r=${x.radius.toFixed(3)}m \u5F27\u89D2=${(x.arcAngle*180/Math.PI).toFixed(1)}\xB0 \u5F26\u957F=${z.toFixed(3)}m pts=${b.length}`),x.radius<.2){o&&console.log(` \u2192 \u534A\u5F84<${.2}m \u8FC7\u6EE4`);continue}if(b.length<3){o&&console.log(" \u2192 \u70B9\u6570<3 \u8FC7\u6EE4");continue}let P=z/x.radius,E=z/2,S=0;E<=x.radius?S=x.radius-Math.sqrt(x.radius*x.radius-E*E):S=z;let I=z>.01?S/z:0,H=w(b,e,.8),D=x.arcAngle>1.745&&x.radius<5,T=x.radius>15&&P>.15&&b.length>=10,R=P>.12&&x.radius>1&&x.radius<4&&x.arcAngle>=.35&&b.length>=3;if(o&&console.log(` \u7279\u5F81: \u5F26\u957F/\u534A\u5F84=${P.toFixed(3)} \u5F13\u9AD8/\u5F26\u957F=${I.toFixed(4)} \u8FDE\u63A5=${H}/2${D?" \u5927\u5F27\u89D2\u8C41\u514D":""}${T?" \u5927\u534A\u5F84\u7ED3\u6784\u5F27":""}${R?" \u5408\u7406\u77ED\u5F27\u8C41\u514D":""}`),b.length>20&&x.arcAngle>5.2&&x.radius>.2){o&&console.log(` \u2192 \u8FD1\u95ED\u5408\u5706\u8C41\u514D(\u5F27\u89D2=${(x.arcAngle*180/Math.PI).toFixed(1)}\xB0, ${b.length}pts)`),p.push(x);continue}if(P<.15)if(H>=2&&x.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 v=H>=2?.025:.035;if(I<v&&!D&&!R&&!T){o&&console.log(` \u2192 \u5F13\u9AD8/\u5F26\u957F=${I.toFixed(4)} < ${v}(${H>=2?"\u5BBD\u677E":"\u6807\u51C6"})\uFF0C\u6781\u6241\u5F27(\u76F4\u7EBF\u6BB5\u566A\u58F0) \u8FC7\u6EE4`);continue}if(!D&&!R&&!T){if(x.arcAngle<.17){o&&console.log(` \u2192 \u5F27\u89D2<${(.17*180/Math.PI).toFixed(0)}\xB0 \u8FC7\u6EE4`);continue}if(x.arcAngle<.35&&H<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(!D&&!T){let W=H>=2?2.5:1.5,V=Math.floor(b.length/2),C=b[V].x-b[0].x,_=b[V].z-b[0].z,A=b[b.length-1].x-b[V].x,B=b[b.length-1].z-b[V].z,k=Math.atan2(_,C),F=Math.atan2(B,A),L=Math.abs(F-k);if(L>Math.PI&&(L=2*Math.PI-L),L>60*Math.PI/180&&L>x.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)}=${(x.arcAngle*180/Math.PI*W).toFixed(1)}\xB0`);continue}}if(n&&n.length>5&&!(x.radius>15&&x.arcAngle>.26)){let W=b[0],V=b[b.length-1],C=.3,_=null,A=1/0,B=null,k=1/0;for(let F of n){let L=en(W.x,W.z,F.x1,F.z1,F.x2,F.z2),O=en(V.x,V.z,F.x1,F.z1,F.x2,F.z2);L<C&&L<A&&(_=F,A=L),O<C&&O<k&&(B=F,k=O)}if(!_||!B)console.log(` [\u7EBF\u6BB5\u8F6C\u89D2\u8C03\u8BD5 #${M}] \u672A\u627E\u5230\u5B8C\u6574\u7EBF\u6BB5: \u8D77\u7AEF=${!!_}(d=${A.toFixed(3)}) \u672B\u7AEF=${!!B}(d=${k.toFixed(3)})`);else if(_===B){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 F=_.x2-_.x1,L=_.z2-_.z1,O=B.x2-B.x1,$=B.z2-B.z1,G=Math.sqrt(F*F+L*L),Q=Math.sqrt(O*O+$*$);if(G>.01&&Q>.01){let j=Math.abs(Math.atan2(F*$-L*O,F*O+L*$)),Z=j*180/Math.PI;if(console.log(` [\u7EBF\u6BB5\u8F6C\u89D2\u8C03\u8BD5 #${M}] \u5F27\u4E24\u7AEF\u6BB5\u5939\u89D2=${Z.toFixed(1)}\xB0 \u5F27\u89D2=${(x.arcAngle*180/Math.PI).toFixed(1)}\xB0`),j>.35&&j<3.05){let Y=j>2.09;if(!Y||x.arcAngle<.44){console.log(` \u2192 \u7EBF\u6BB5\u8F6C\u89D2\u9A8C\u8BC1: \u5F27\u4E24\u7AEF\u6BB5\u5939\u89D2=${Z.toFixed(1)}\xB0\uFF0C${Y?"\u659C\u5899":"\u6298\u5899"}\u78E8\u5706\u5047\u5F27 \u8FC7\u6EE4`);continue}}}}}o&&console.log(" \u2192 \u2713 \u4FDD\u7559"),p.push(x)}return o&&console.log(`[\u56DE\u52A0\u5224\u65AD] ${t.length} \u2192 ${p.length} \u4E2A\u5F27\u6BB5`),p}function ri(t,e){for(let n=0;n<t.length;n++){let o=t[n],r=[];for(let i of e)nr(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 rr={gridSize:2,connectDist:.8,angleTol:25,minLength:.8,minPointCount:3,hardCornerThreshold:30,minArea:5,minCurvePoints:6,curveStraightDist:.25,longWallMinLength:5};function si(t){if(!t.length)return{rotated:[],mainAngle:0};let e=180,n=new Array(e).fill(0),o=Math.PI/e;for(let d of t){let c=d.x2-d.x1,a=d.z2-d.z1,h=Math.sqrt(c*c+a*a);if(h<.01)continue;let g=Te(c,a),y=Math.floor(g/o);y>=e&&(y=e-1),n[y]+=h}let r=new Array(e).fill(0),s=5;for(let d=0;d<e;d++){let c=0;for(let a=-s;a<=s;a++){let h=d+a;h<0&&(h+=e),h>=e&&(h-=e),c+=n[h]}r[d]=c}let i=0,l=0;for(let d=0;d<e;d++)r[d]>i&&(i=r[d],l=d);let u=(l+.5)*o;return{rotated:t.map(d=>{let c=In(d.x1,d.z1,-u),a=In(d.x2,d.z2,-u);return{...d,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 f=!0;for(;f;){f=!1;let a=i[i.length-1],h=a.x2,g=a.z2,y=Te(a.x2-a.x1,a.z2-a.z1),w=null,m=e;for(let p of t){if(o.has(p.id))continue;let x=we(h,g,p.x1,p.z1),b=we(h,g,p.x2,p.z2),z=b<x,M=Math.min(x,b);if(M>m)continue;let P=z?Te(p.x1-p.x2,p.z1-p.z2):Te(p.x2-p.x1,p.z2-p.z1);Math.abs(Vn(P-y))>n||(w=p,m=M)}if(w){o.add(w.id),u.add(w.id);let p=i[i.length-1],x=we(p.x2,p.z2,w.x1,w.z1),b=we(p.x2,p.z2,w.x2,w.z2);x<=b?i.push(w):i.push({id:w.id,x1:w.x2,z1:w.z2,x2:w.x1,z2:w.z1}),f=!0}}for(f=!0;f;){f=!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,y=l.length>0?Te(a.x2-a.x1,a.z2-a.z1):Te(a.x2-a.x1,a.z2-a.z1),w=null,m=e;for(let p of t){if(o.has(p.id))continue;let x=we(h,g,p.x1,p.z1),b=we(h,g,p.x2,p.z2),z=b<x,M=Math.min(x,b);if(M>m)continue;let P=z?Te(p.x1-p.x2,p.z1-p.z2):Te(p.x2-p.x1,p.z2-p.z1);Math.abs(Vn(P-y))>n||(w=p,m=M)}if(w){o.add(w.id),u.add(w.id);let p=we(h,g,w.x1,w.z1),x=we(h,g,w.x2,w.z2);p<=x?l.push({id:w.id,x1:w.x2,z1:w.z2,x2:w.x1,z2:w.z1}):l.push({...w}),f=!0}}let d=[];for(let a=l.length-1;a>=0;a--){let h=l[a];a===l.length-1&&d.push({x:h.x1,z:h.z1}),d.push({x:h.x2,z:h.z2})}for(let a=0;a<i.length;a++){let h=i[a];a===0&&d.length===0&&d.push({x:h.x1,z:h.z1}),d.push({x:h.x2,z:h.z2})}let c=[];for(let a of d){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),f=Vn(u-l);e.push(f)}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 d=0;for(let c of t){let a=Cn(c.x,c.z,n.x,n.z,o.x,o.z);a>d&&(d=a)}if(d<.05)return"straight"}let l=li(t);if(l.reduce((d,c)=>d+Math.abs(c),0)<.1||t.length<e)return"straight";let f=0;for(let d=0;d<l.length-1;d++)l[d]*l[d+1]<0&&f++;return f>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),f=Se(l),d=f/(s.length||1),c=Math.max(1,Math.round(s.pointCount*d));o.push({id:r++,points:l,length:f,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(f,d){return Math.round(f/n)+"_"+Math.round(d/n)}let r=new Map,s=0;function i(f,d){let c=o(f,d),a=r.get(c);if(a)return a;let h=Math.round(f/n),g=Math.round(d/n),y=null,w=n*n;for(let m=-1;m<=1;m++)for(let p=-1;p<=1;p++){let x=h+m+"_"+(g+p),b=r.get(x);if(!b)continue;let z=b.x-f,M=b.z-d,P=z*z+M*M;P<w&&(w=P,y=b)}return y?(r.set(c,y),y):(a={id:s++,x:f,z:d,edges:[]},r.set(c,a),a)}for(let f of t){if(f.points.length<2)continue;let d=f.points[0],c=f.points[f.points.length-1],a=i(d.x,d.z),h=i(c.x,c.z);if(a.id===h.id)continue;let g={to:h,wallId:f.id,visited:!1,twin:null},y={to:a,wallId:f.id,visited:!1,twin:g};g.twin=y,a.edges.push(g),h.edges.push(y)}for(let f of r.values())f.edges.sort((d,c)=>{let a=Math.atan2(d.to.z-f.z,d.to.x-f.x),h=Math.atan2(c.to.z-f.z,c.to.x-f.x);return a-h});let l=new Set,u=new Set;for(let f of r.values())for(let d of f.edges)u.add(d);for(let f of u){if(f.visited)continue;let d=[],c=f,a=u.size+10;for(;!c.visited&&d.length<a;){c.visited=!0,d.push(c);let h=c.to,g=c.twin,y=h.edges.indexOf(g);if(y<0)break;let w=(y+1)%h.edges.length;c=h.edges[w]}if(d.length>=3){let h=d[0];if(d[d.length-1].to.id===h.from?.id){let y=[],w=new Set,m=null;for(let p of r.values())if(p.edges.includes(d[0])){m=p;break}if(!m)continue;y.push({x:m.x,z:m.z});for(let p of d)w.add(p.wallId),y.push({x:p.to.x,z:p.to.z});if(d[d.length-1].to.id===m.id&&Ko(y)>=e)for(let x of w)l.add(x)}}}return l}function pn(t,e){let n={...rr,...e},o=Date.now(),{rotated:r,mainAngle:s}=si(t),i=Date.now(),l=ii(r,n.gridSize),u=Date.now(),f=uo(n.angleTol),d=[];for(let D of l.values()){let T=D.map(v=>({id:v.id,x1:v.x1,z1:v.z1,x2:v.x2,z2:v.z2})),R=ai(T,n.connectDist,f);d.push(...R)}let c=Date.now(),a=new Set,h=d.filter(D=>{let T=D.length>=n.minLength||D.pointCount>=n.minPointCount;return T&&a.add(D),T}),g=d.filter(D=>!a.has(D)),y=Date.now(),w=fi(h,n.hardCornerThreshold,n.minCurvePoints),m=Date.now(),p=di(w,n.minArea);w.forEach(D=>{D.isMain=p.has(D.id),D.length>=n.longWallMinLength&&(D.isMain=!0)});let x=Date.now();function b(D,T,R=.1){let v=D[0],W=D[D.length-1],V=T[0],C=T[T.length-1];return Math.hypot(v.x-V.x,v.z-V.z)<R||Math.hypot(v.x-C.x,v.z-C.z)<R||Math.hypot(W.x-V.x,W.z-V.z)<R||Math.hypot(W.x-C.x,W.z-C.z)<R}let z=[],M=[];for(let D of w){if(D.type==="straight"&&D.points.length>=2){let T=!1;for(let R of w){if(R.id===D.id||R.type==="straight"||b(D.points,R.points))continue;if(Zs(D.points,R.points)<n.curveStraightDist){T=!0;break}}if(T){z.push({...D,id:-z.length-1});continue}}M.push(D)}let P=Date.now(),E=M,S=[];for(let D=0;D<g.length;D++){let T=g[D];S.push({id:-D-1,points:T.points,length:T.length,pointCount:T.pointCount,lineIds:T.lineIds,type:"straight",isMain:!1})}for(let D of z)S.push(D);let I=D=>D.map(T=>({...T,points:T.points.map(R=>In(R.x,R.z,s))})),H=Date.now()-o;return{mainWalls:I(E),noiseWalls:I(S),stats:{totalRawLines:t.length,totalWalls:w.length,mainCount:E.length,noiseCount:S.length,elapsedMs:H}}}function sr(t,e,n){let o={...er,...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 pn(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=Hn(l,o.morphIterations),f=[],d={total:0,lowDensity:0};for(let h of e){let g=h.x1,y=h.z1,w=h.x2,m=h.z2;if(Math.sqrt((w-g)**2+(m-y)**2)<.3){f.push(h);continue}let x=0,b=9;for(let z=0;z<b;z++){let M=z/(b-1),P=g+(w-g)*M,E=y+(m-y)*M,S=Math.floor(P/o.cellSize),I=Math.floor(E/o.cellSize);u.has(S+","+I)&&x++}x>=Math.ceil(b*.5)?f.push(h):d.lowDensity++,d.total++}if(f.length<5)return pn(e);let c=pn(f),a=Date.now()-r;return c}function or(t){return{id:t.id,points:[{x:t.x1,z:t.z1},{x:t.x2,z:t.z2}],length:Math.hypot(t.x2-t.x1,t.z2-t.z1),pointCount:1,type:"straight",isMain:!1}}function ir(t,e,n){let o={outlierEnabled:!0,outlierCellSize:.1,outlierMinNeighbors:3,densityFilterEnabled:!1,...n},r=Date.now(),s=pn(t),i=s.mainWalls,l=s.noiseWalls,u=new Set(i.map(M=>M.id)),f=[];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&&f.push({x:E.x,y:E.y,z:E.z})}let d=f.length,c=f;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 S=1/0,I=-1/0,H=1/0,D=-1/0;for(let v of E)v.x<S&&(S=v.x),v.x>I&&(I=v.x),v.z<H&&(H=v.z),v.z>D&&(D=v.z);let T=[];for(let v of t)ni(v,E,.2)&&T.push(v.id);let R=E.map(v=>({x:v.x,y:v.z,z:0}));g.push({id:M,originalPoints:R,rawLineIds:T})}let y;if(o.densityFilterEnabled&&c.length>0&&i.length>0){let M=new Set(s.mainWalls.map(S=>S.id)),P=t.filter(S=>M.has(S.id));y=sr(c,P).mainWalls}let w=new Set;for(let M of s.mainWalls)if(M.lineIds)for(let P of M.lineIds)w.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 p=t.filter(M=>w.has(M.id)).map(or),x=t.filter(M=>m.has(M.id)).map(or),b;if(y&&y.length>0){let M=new Set;for(let P of y)if(P.lineIds)for(let E of P.lineIds)M.add(E);b=t.filter(P=>M.has(P.id)).map(or)}let z=Date.now()-r;return{mainWalls:p,noiseWalls:x,contours:a,curvedSegments:h,lineCurves:g.length>0?g:void 0,filteredPoints:c,secondMainWalls:b,stats:{totalRawLines:t.length,firstMainCount:p.length,firstNoiseCount:x.length,contourCount:a.length,curvedCount:h.length,secondMainCount:y?.length,mainWallPointCount:d,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],f=u.start??u,d=u.end??u;o.push({id:l,x1:f.x??0,y1:f.z??0,z1:f.y??0,x2:d.x??0,y2:d.z??0,z2:d.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=ir(o,r,e),i=Array.isArray(t)?{data:t}:{...t};return i.lineCurves=s.lineCurves??[],i.lineCurveNum=s.curvedSegments?.length??0,i}export{rr as CONFIG,no as analyzeDoorQuad,Ze as analyzeQuad,po as applyVoxelFilter,lo as attachWindows,Je as calcAngle,qi as checkBeamIsReasonable,Ys as classifyWallByPointCloudPCA,pn as classifyWallShapes,Ka as computeContour,Ke as computeDoorLocalFloorZ,Ge as computeLocalFloorZ,Js as computeVoxelParams,ei as densityPreFilter,fn as detectDoorPerpendicularWalls,Ll as detectPerpWalls,Tn as detectPerpendicularWalls,Aa as drawStaircase,oi as filterFalseArcCurves,$s as filterWalls,Xs as filterWallsHard,vn as findDoorWalls,Fs as findMainByLoops,Rn as findWindowWalls,Ni as getBeamLine,Gi as getColLine,Pi as getLineCheckResults,dn as getMatcherAPI,Ba as getMergeFloorMeaning,La as getMergeMeaning,Ei as getOneLineCheckResults,Si as getOneLineClusterResults,ka as getStaircase,nr as isRawLineNearArc,ri as logArcRawSegments,Hl as matchWalls,js as mergeCollinear,Ye as mergeCollinearSegments,Qe as mergeDoorCollinearSegments,Al as mergeWallSegments,io as normalizeAngles,jt as pointToDoorSegmentDist,so as pointToSegDist,en as pointToSegDist2D,Ie as pointToSegmentDist,qo as processData,Go as processDoorData,sr as processFilteredByPointCloud,ho as processFromPointCloud,Ks as processFromSegments,Fl as processPipeline,hi as processSegments,_l as processWallData,mo as removeOutlierPoints,Ce as rotateXZ,ir as runMainWallPipeline,Ns as spatialGrid,Dn as splitDoorWallSegment,Bl as splitWallSeg,Sn as splitWallSegment,Hi as updateStEdPoint,Qs as voxelFilter,ti as voxelFilterLines};
|