@pacem/pacem-numerical 1.0.0-bernoulli → 1.0.0-bessel

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.
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * @pacem/pacem-numerical v1.0.0-bernoulli (https://js.pacem.it)
2
+ * @pacem/pacem-numerical v1.0.0-bessel (https://js.pacem.it)
3
3
  * Pacem (https://pacem.it)
4
4
  * Licensed under Apache-2.0
5
5
  */
@@ -1,7 +1,6 @@
1
1
  /*!
2
- * @pacem/pacem-numerical v1.0.0-bernoulli (https://js.pacem.it)
2
+ * @pacem/pacem-numerical v1.0.0-bessel (https://js.pacem.it)
3
3
  * Pacem (https://pacem.it)
4
4
  * Licensed under Apache-2.0
5
5
  */
6
6
  !function(t){"use strict";class Vector{static unit(t){const e={x:t.x,y:t.y};return this.normalize(e),e}static magSqr(t){return t.x*t.x+t.y*t.y}static mag(t){return Math.sqrt(Vector.magSqr(t))}static normalize(t){const e=Vector.mag(t);if(e<=0)throw"Cannot normalize a vector of length 0.";const r=1/e;t.x*=r,t.y*=r}static from(e,r){return t.Point.subtract(e,r)}static dot(t,e){return t.x*e.x+t.y*e.y}static cross(t,e){return t.x*e.y-t.y*e.x}static areClose(t,e){return(e.x-t.x).isCloseTo(0)&&(e.y-t.y).isCloseTo(0)}}class Vertex{constructor(t,e,r=-1){this.x=t,this.y=e,this.index=r}equals(t){return this.x===t.x&&this.y===t.y}}class Triangle{constructor(t,e,r){this.v0=t,this.v1=e,this.v2=r,this.circumCirc=function(t,e,r){const n=t.x,s=t.y,o=e.x,i=e.y,a=r.x,m=r.y,c=2*(n*(i-m)+o*(m-s)+a*(s-i));if(Math.abs(c)<1e-12)return{c:{x:0,y:0},r:1/0};const l=((n*n+s*s)*(i-m)+(o*o+i*i)*(m-s)+(a*a+m*m)*(s-i))/c,u=((n*n+s*s)*(a-o)+(o*o+i*i)*(n-a)+(a*a+m*m)*(o-n))/c;return{c:{x:l,y:u},r:Math.hypot(l-n,u-s)}}(t,e,r)}inCircumcircle(t){const e=this.circumCirc.c.x-t.x,r=this.circumCirc.c.y-t.y;return Math.hypot(e,r)<=this.circumCirc.r+1e-9}}function e(t,e){const r=[];e=e.filter(e=>!e.inCircumcircle(t)||(r.push({v0:e.v0,v1:e.v1}),r.push({v0:e.v1,v1:e.v2}),r.push({v0:e.v2,v1:e.v0}),!1));const n=function(t){const e=[];for(let r=0;r<t.length;++r){let n=!0;for(let e=0;e<t.length;++e)if(r!==e){const s=t[r],o=t[e];if(s.v0.equals(o.v0)&&s.v1.equals(o.v1)||s.v0.equals(o.v1)&&s.v1.equals(o.v0)){n=!1;break}}n&&e.push(t[r])}return e}(r);for(const r of n)e.push(new Triangle(r.v0,r.v1,t));return e}function r(t){if(t.length<3)return[];const r=function(t){let e=1/0,r=1/0,n=-1/0,s=-1/0;for(const o of t)e=Math.min(e,o.x),r=Math.min(r,o.y),n=Math.max(n,o.x),s=Math.max(s,o.y);const o=10*(n-e),i=10*(s-r),a=new Vertex(e-o,r-3*i),m=new Vertex(e-o,s+i),c=new Vertex(n+3*o,s+i);return new Triangle(a,m,c)}(t);let n=[r];for(const r of t)n=e(r,n);return n=n.filter(t=>!(t.v0===r.v0||t.v0===r.v1||t.v0===r.v2||t.v1===r.v0||t.v1===r.v1||t.v1===r.v2||t.v2===r.v0||t.v2===r.v1||t.v2===r.v2)),n}class Delaunay{static triangulate(t){return function(t){if(t.length<3)return[];const e=r(t.map((t,e)=>new Vertex(t.x,t.y,e))),n=[];for(const t of e)n.push(t.v0.index,t.v1.index,t.v2.index);return n}(t)}}const n=180/Math.PI,s=2*Math.PI;function o(e){return t.Point.isPoint(e)}let i=class Utils{static slopeRad(t,e){return Math.atan2(e.y-t.y,e.x-t.x)}static slopeRad2(t,e){return(s+Utils.slopeRad(t,e))%s}static slopeDeg(t,e){return Utils.slopeRad(t,e)*n}static slopeDeg2(t,e){return(360+Utils.slopeDeg(t,e))%360}static intersect(e,r,...n){return Array.isArray(e)&&Array.isArray(r)?Utils._intersectSegments(e,r,!0):t.Rect.isRect(e)?Utils._intersectRects(...arguments):"vertices"in e?Utils._mergePolygons(e,r,"intersect")?.polygons??null:null}static boundingBox(t){let e=Number.MAX_VALUE,r=Number.MAX_VALUE,n=-Number.MAX_VALUE,s=-Number.MAX_VALUE;t.length;for(let o of t)e=Math.min(e,o.x),r=Math.min(r,o.y),n=Math.max(n,o.x),s=Math.max(s,o.y);return{x:e,y:r,width:n-e,height:s-r}}static combinePolygons(t,e,r){return Utils._mergePolygons(t,e,r)}static _mergePolygons(e,r,n){if(t.NullChecker.isNullOrEmpty(e?.vertices)||t.NullChecker.isNullOrEmpty(r?.vertices))return null;const s=e.vertices.filter(t=>Utils.inPolygon(t,r.vertices));if(e.vertices.length==s.length)return{polygons:"intersect"===n?[e]:[r]};const o=r.vertices.filter(t=>Utils.inPolygon(t,e.vertices));if(r.vertices.length===o.length)return{polygons:"intersect"===n?[r]:[e]};const i=Utils.boundingBox(e.vertices),a=Utils.boundingBox(r.vertices),m=Utils.intersect(i,a);if(!("union"===n||t.Rect.isRect(m)&&m.width>0&&m.height>0))return null;const{vertices:c}=e,{vertices:l}=r;if(c.length<3||l.length<3)return null;const u=(t,e,r)=>[t,r[(e+1)%r.length]],f=(t,e)=>t.x===e.x?t.y-e.y:t.x-e.x,h=c.map(u),y=l.map(u),x=c.concat(l),g=new Map,p=t=>{if(!g.has(t)){const e=[];g.set(t,e)}return g.get(t)};let M=!1;for(let e of h){const r=p(e);for(let n of y){const s=p(n),o=Utils.intersect(e,n);t.NullChecker.isNull(o)||(M=!0,x.push(o),r.push(o),s.push(o))}}if(0===s.length&&0===o.length&&!M)return"union"===n?{polygons:[e,r]}:null;const d=[];for(let e of h.concat(y)){const r=p(e);if(t.NullChecker.isNullOrEmpty(r))d.push(e);else{const t=e.concat(r).sort(f);for(let e=0;e<t.length-1;e++)d.push([t[e],t[e+1]])}}var v,b=!1;do{x.sort(f),x.filter((t,e,r)=>0===e||!Utils.areClose(t,r[e-1])),v=Utils.mesh(x);const{vertices:e,triangleIndices:r}=v;b=!1;for(let n=0;n<r.length;n+=3){const s=r[n],o=r[n+1],i=r[n+2],a=e[s],m=e[o],c=e[i],l=[[a,m],[m,c],[c,a]];for(let e of d)for(let r of l){const n=Utils.areClose(r[0],e[0])||Utils.areClose(r[1],e[1])||Utils.areClose(r[0],e[1])||Utils.areClose(r[1],e[0])?null:Utils.intersect(r,e);t.NullChecker.isNull(n)||-1!==x.findIndex(t=>Utils.areClose(t,n,4))||(b=!0,x.push(n))}}}while(b);const{vertices:w,triangleIndices:z}=v,U=[];for(let t=0;t<z.length;t+=3){const e=t+1,r=t+2,s=w[z[t]],o=w[z[e]],i=w[z[r]],a={x:(s.x+o.x+i.x)/3,y:(s.y+o.y+i.y)/3},m=Utils.inPolygon(a,c),u=Utils.inPolygon(a,l);(m&&u&&"intersect"===n||(m||u)&&"union"===n||(m&&!u||!m&&u)&&"difference"===n)&&U.push([s,o,i])}const D=U.flatMap(([t,e,r])=>[[t,e],[e,r],[r,t]]),C=[];for(let t=0;t<D.length;t++){const e=D[t];if(0==t){C.push(e);continue}const r=C.findIndex(t=>Utils.areClose(t[0],e[0])&&Utils.areClose(t[1],e[1])||Utils.areClose(t[0],e[1])&&Utils.areClose(t[1],e[0]));-1===r?C.push(e):C.splice(r,1)}if(C.length<3)return null;const A=[],N=t=>{const{length:e}=t,r=Utils.areClose(t[0],t[e-1]),n=t.slice(0,r?e-1:e);return n.length>3&&Utils.inSegment(n[0],[n[1],n[n.length-1]])&&n.shift(),n},[V,_]=C.shift(),P=[V,_];for(;C.length>1;){const t=P[P.length-1],e=C.findIndex(e=>Utils.areClose(e[0],t)||Utils.areClose(e[1],t));if(-1===e){A.push({vertices:N(P.splice(0))});const[t,e]=C.shift();P.push(t,e)}else{const[r]=C.splice(e,1),n=Utils.areClose(r[0],t)?r[1]:Utils.areClose(r[1],t)?r[0]:null;P.length>1&&Utils.inSegment(P[P.length-1],[P[P.length-2],n])?P.splice(P.length-1,1,n):P.push(n)}}return A.push({vertices:N(P)}),{polygons:A,mesh:v,triangles:U.map(t=>({vertices:t}))}}static mesh(t,...e){const r=[].concat(t).concat(e);return{vertices:r,triangleIndices:Delaunay.triangulate(r)}}static intersectLines(t,e,r,n){let s,o;if(Array.isArray(t)&&Array.isArray(e)&&2===t.length&&2===e.length&&"number"==typeof t[0]&&"number"==typeof e[0]&&"number"==typeof t[1]&&"number"==typeof e[1]&&(r=e[0],n=e[1],e=t[1],t=t[0]),"number"==typeof t&&"number"==typeof e){s=[{x:0,y:e},{x:1,y:t+e}],o=[{x:0,y:n},{x:1,y:r+n}]}else s=t,o=e;return Utils._intersectSegments(s,o,!1)}static cramer(t,e){Array.isArray(t)&&(t={a:t[0],b:t[1],c:t[2]}),Array.isArray(e)&&(e={a:e[0],b:e[1],c:e[2]});let r=(t.b*e.c-t.c*e.b)/(t.b*e.a-t.a*e.b),n=(t.c*e.a-t.a*e.c)/(t.b*e.a-t.a*e.b);return{x:-r.roundoff(),y:-n.roundoff()}}static mq(t,e){let r;if(o(t)?r=t:(r=t[0],e=t[1]),r.x===e.x)return[Number.NaN,Number.NaN];const n=(e.y-r.y)/(e.x-r.x);return[n,r.y-n*r.x]}static _intersectSegments(t,e,r){const n=t[0],s=t[1],o=e[0],i=e[1],a=Math.min(n.x,s.x),m=Math.min(n.y,s.y),c=Math.max(n.x,s.x),l=c-a,u=Math.max(n.y,s.y),f=u-m,h=Math.min(o.x,i.x),y=Math.min(o.y,i.y),x=Math.max(o.x,i.x),g=x-h,p=Math.max(o.y,i.y),M=p-y;if(0===l&&0===g)return null;if(0===f&&0===M)return null;const d=t=>t.x<h||t.x>x||t.x<a||t.x>c,v=t=>t.y<y||t.y>p||t.y<m||t.y>u;var b=null;if(0===l){if(r&&(h>a||x<c))return null;const t=Utils.mq(o,i);b=Utils.cramer([1,0,-a],[t[0],-1,t[1]]),r&&v(b)&&(b=null)}else if(0===g){if(r&&(a>h||c<x))return null;const t=Utils.mq(n,s);b=Utils.cramer([t[0],-1,t[1]],[1,0,-h]),r&&v(b)&&(b=null)}else if(0===f){if(r&&(y>m||p<u))return null;const t=Utils.mq(o,i);b=Utils.cramer([0,1,-m],[t[0],-1,t[1]]),r&&d(b)&&(b=null)}else if(0===M){if(r&&(m>y||u<p))return null;const t=Utils.mq(n,s);b=Utils.cramer([t[0],-1,t[1]],[0,1,-y]),r&&d(b)&&(b=null)}else{let t;if(!r||(t=Utils._intersectRects({x:a,y:m,width:l,height:f},{x:h,y:y,width:g,height:M}))&&t.width>0&&t.height>0){const e=Utils.mq(n,s),a=Utils.mq(o,i),m=e[0],c=a[0],l=e[1],u=a[1];if(m!==c){let e=(b=Utils.cramer([m,-1,l],[c,-1,u])).x,n=b.y;r&&(e<t.x||e>t.x+t.width||n<t.y||n>t.y+t.height)&&(b=null)}}}return null===b?null:{x:b.x,y:b.y}}static _intersectRects(...e){return t.Rect.intersect(...e)}static _areClose(t,e,r=12){return Math.abs(t.x-e.x).isCloseTo(0,r)&&Math.abs(t.y-e.y).isCloseTo(0,r)}static areClose(t,e,r=12){return Utils._areClose(t,e,r)}static dot(t,e){return Vector.dot(t,e)}static cross(t,e){return Vector.cross(t,e)}static distance(e,r){if(null!=(n=e)&&Array.isArray(n)&&2===n.length&&o(n[0])&&o(n[1]))return t.Point.distance(e[0],e[1]);if(o(r))return t.Point.distance(e,r);{const t=r[0],n=r[1];return Math.abs(t*e.x-e.y+n)/Math.sqrt(Math.pow(t,2)+1)}var n}static _pointSegmentDistance(t,e){const r=Vector.from(e[0],e[1]),n=Vector.from(e[0],t);return Utils.cross(r,n)}static isWithin(t,e,r,n=12){const s=Utils._pointSegmentDistance(t,e);return!s.isCloseTo(0,n)&&(r?s<0:s>0)}static isBeyond(t,e,r,n=12){return Utils.isWithin(t,e,!r,n)}static inLine(t,e,r=12){return Utils._pointSegmentDistance(t,e).isCloseTo(0,r)}static inSegment(t,e,r=12){const n=Math.min(e[0].x,e[1].x),s=Math.max(e[0].x,e[1].x),o=Math.min(e[0].y,e[1].y),i=Math.max(e[0].y,e[1].y);return t.x>=n&&t.x<=s&&t.y>=o&&t.y<=i&&Utils.inLine(t,e,r)}static inTriangle(e,r){let n;for(let s=0;s<3;s++){const o=r[s],i=r[(s+1)%3],a=t.Point.subtract(i,e),m=t.Point.subtract(o,e),c=Utils.cross(a,m);if(s>0&&c*n<=0)return!1;n=c}return!0}static inPolygon(t,e,r=12){if(!(e?.length>=3))throw"Not enough vertices";const n=e.length;if(3===n)return Utils.inTriangle(t,[e[0],e[1],e[2]]);r>0&&(e=e.map(t=>({x:t.x.roundoff(r),y:t.y.roundoff(r)})),t={x:t.x.roundoff(r),y:t.y.roundoff(r)});let s=Number.MAX_VALUE,o=Number.MAX_VALUE,i=Number.MIN_VALUE,a=Number.MIN_VALUE;for(let t=0;t<n;t++){const r=e[t];s=Math.min(s,r.x),o=Math.min(o,r.y),i=Math.max(i,r.x),a=Math.max(a,r.y)}if(t.x<s||t.x>i||t.y<o||t.y>a)return!1;const m=[{x:s-1,y:t.y},t];let c=0;for(let r=0;r<n;r++){const s=e[r],o=e[(r+1)%n],i=[s,o];if(s.y===t.y){const i=e[(r-1+n)%n];t.x>s.x&&(i.y-t.y)*(o.y-t.y)<0&&c++}else{if(o.y===t.y)continue;null!=Utils.intersect(i,m)&&c++}}return c%2==1}static area(t,...e){const r=[].concat(t).concat(e);let n=0;const s=r.length;if(s>=3){for(let t=0;t<r.length;t++){const{x:e,y:o}=r[t],i=t===s-1?0:t+1,{x:a,y:m}=r[i];n+=e*m-o*a}n*=.5}return Math.abs(n.roundoff())}static convexHull(t,...e){const r=[].concat(t).concat(e);if(!(r?.length>1))return r?.slice()??[];const n=r.map(t=>({x:t.x,y:t.y})).sort((t,e)=>t.x===e.x?t.y-e.y:t.x-e.x),s=[];for(const t of n){const e=s[s.length-1];e&&e.x===t.x&&e.y===t.y||s.push(t)}if(s.length<=2)return s;const o=(t,e,r)=>(e.x-t.x)*(r.y-t.y)-(e.y-t.y)*(r.x-t.x),i=[];for(const t of s){for(;i.length>=2&&o(i[i.length-2],i[i.length-1],t)<=0;)i.pop();i.push(t)}const a=[];for(let t=s.length-1;t>=0;t--){const e=s[t];for(;a.length>=2&&o(a[a.length-2],a[a.length-1],e)<=0;)a.pop();a.push(e)}return i.pop(),a.pop(),i.concat(a)}};class Polygon{static{this._eps=1e-12}static isPolygon(e){return function(e){let r;return"vertices"in e&&Array.isArray(e.vertices)&&(r=e.vertices).length>=3&&r.every(e=>t.Point.isPoint(e))}(e)}static from(...t){return{vertices:Array.from(t)}}static contains(t,e){return i.inPolygon(e,t.vertices,12)}static centroid(t){const e=Polygon.boundingBox(t);return{x:e.x+e.width/2,y:e.y+e.height/2}}static boundingBox(t){return i.boundingBox(t.vertices)}static sides(t){const{vertices:e}=t,r=[];for(let t=1;t<=e.length;t++){const n=e[t%e.length],s=e[t-1];r.push([s,n])}return r}static isConvex(e){const{vertices:r}=e,n=r.length;if(n<=3)return!0;let s=0;for(let e=0;e<r.length;e++){const o=r[(e-1+n)%n],i=r[e],a=r[(e+1)%n],m=t.Angle.angleBetween(i,o,a);if(0!==s){if(s!=Math.sign(m))return!1}else s=Math.sign(m)}return!0}static isSelfIntersecting(e){const{vertices:r}=e;if(r.length<=3)return!1;const n=Polygon.sides(e);for(let e of n)for(let r of n){if(r===e||r[0]===e[1]||e[0]===r[1])continue;const n=i.intersect(r,e);if(!t.NullChecker.isNull(n))return!0}return!1}static isCounterClockwise(e){const{vertices:[r,n,s]}=e;return t.Angle.angleBetween(n,r,s)>0}static expand(e,r){const{vertices:n}=e,s=n.length,o=[];for(let e=0;e<n.length;e++){const i=n[(e-1+s)%s],a=n[e],m=n[(e+1)%s],c=t.Angle.angleBetween(a,i,m),l=-r/Math.sin(Math.abs(c)/2),u=t.Matrix2D.scale(t.Matrix2D.identity,l),f=t.Point.subtract(a,i);Vector.normalize(f);const h=t.Point.subtract(a,m);Vector.normalize(h);const y=t.Point.add(f,h);Vector.normalize(y);const x=t.Matrix2D.multiply(y,u);o.push(t.Point.add(a,{x:x.x.roundoff(),y:x.y.roundoff()}))}return{vertices:o}}static area(t){return i.area(t.vertices)}static intersect(t,e){return i.intersect(t,e)}static convexHull(t){return{vertices:i.convexHull(t.vertices)}}}const a=180/Math.PI,m=1/a;class Vector3D{static from(...t){if(3!==t.length)throw new RangeError("Must provide exactly 3 numbers");return{x:t[0],y:t[1],z:t[2]}}static parse(e){const r=t.parseAsNumericalArray(e);if(r&&3===r.length)return Vector3D.from.apply(null,r);throw new Error(`Cannot parse "${e}" as a valid Vector3D.`)}static i(){return{x:1,y:0,z:0}}static j(){return{x:0,y:1,z:0}}static k(){return{x:0,y:0,z:1}}static zero(){return{x:0,y:0,z:0}}static subtract(t,e){return{x:e.x-t.x,y:e.y-t.y,z:e.z-t.z}}static add(...t){var e={x:0,y:0,z:0};for(var r of t)e.x+=r.x,e.y+=r.y,e.z+=r.z;return e}static dot(t,e){return t.x*e.x+t.y*e.y+t.z*e.z}static cross(t,e){return{x:t.y*e.z-t.z*e.y,y:t.z*e.x-t.x*e.z,z:t.x*e.y-t.y*e.x}}static scale(t,e,r=e,n=e){return{x:t.x*e,y:t.y*r,z:t.z*n}}static magSqr(t){return t.x*t.x+t.y*t.y+t.z*t.z}static areClose(t,e){return(e.x-t.x).isCloseTo(0)&&(e.y-t.y).isCloseTo(0)&&(e.z-t.z).isCloseTo(0)}static mag(t){return Math.sqrt(Vector3D.magSqr(t))}static negate(t){return{x:-t.x,y:-t.y,z:-t.z}}static unit(t){const e={x:t.x,y:t.y,z:t.z};return this.normalize(e),e}static normalize(t){const e=Vector3D.mag(t);if(e<=0)throw"Cannot normalize a vector of length 0.";const r=1/e;t.x*=r,t.y*=r,t.z*=r}static angleBetween(t,e){let r;const n=Vector3D.unit(t),s=Vector3D.unit(e);if(Vector3D.dot(n,s)<0){const t={x:-n.x-s.x,y:-n.y-s.y,z:-n.z-s.z},e=Vector3D.mag(t);r=Math.PI-2*Math.asin(e/2)}else{const t={x:n.x-s.x,y:n.y-s.y,z:n.z-s.z},e=Vector3D.mag(t);r=2*Math.asin(e/2)}return a*r}}class Spherical{static from(t,e,r){return{rho:t.clamp(0,1/0),theta:e.clamp(-180,180),phi:r.clamp(0,360)}}static fromVector(t,e,r){"number"==typeof t&&(t=Vector3D.from(t,e,r));const n=Vector3D.mag(t);if(n.isCloseTo(0))return Spherical.from(0,0,0);const s=Math.atan2(t.x,t.z),o=Math.acos((t.y/n).clamp(-1,1));return Spherical.from(n,s*a,o*a)}static toVector(t){const{rho:e,theta:r,phi:n}=t,s=n*m,o=r*m,i=Math.sin(s)*e;return{x:i*Math.sin(o),y:Math.cos(s)*e,z:i*Math.cos(o)}}static toRotationMatrix(t){const{theta:e,phi:r}=t,n=m*e,s=Math.sin(n),o=Math.cos(n),i=m*r,a=Math.sin(i),c=Math.cos(i);return Matrix3D.from(s*c,s*a,o,0,o*c,o*a,-s,0,-a,c,0,0,0,0,0,1)}}class Matrix3DUtils{static modify(t,e){const{m11:r,m12:n,m13:s,m14:o,m21:i,m22:a,m23:m,m24:c,m31:l,m32:u,m33:f,m34:h,offsetX:y,offsetY:x,offsetZ:g,m44:p}=t,M={m11:r,m12:n,m13:s,m14:o,m21:i,m22:a,m23:m,m24:c,m31:l,m32:u,m33:f,m34:h,offsetX:y,offsetY:x,offsetZ:g,m44:p};return e(M),M}static clone(t){return Matrix3DUtils.modify(t,t=>{})}static multiply(t,e){return Matrix3D.isIdentity(t)?e:Matrix3D.isIdentity(e)?t:Matrix3D.from(t.m11*e.m11+t.m12*e.m21+t.m13*e.m31+t.m14*e.offsetX,t.m11*e.m12+t.m12*e.m22+t.m13*e.m32+t.m14*e.offsetY,t.m11*e.m13+t.m12*e.m23+t.m13*e.m33+t.m14*e.offsetZ,t.m11*e.m14+t.m12*e.m24+t.m13*e.m34+t.m14*e.m44,t.m21*e.m11+t.m22*e.m21+t.m23*e.m31+t.m24*e.offsetX,t.m21*e.m12+t.m22*e.m22+t.m23*e.m32+t.m24*e.offsetY,t.m21*e.m13+t.m22*e.m23+t.m23*e.m33+t.m24*e.offsetZ,t.m21*e.m14+t.m22*e.m24+t.m23*e.m34+t.m24*e.m44,t.m31*e.m11+t.m32*e.m21+t.m33*e.m31+t.m34*e.offsetX,t.m31*e.m12+t.m32*e.m22+t.m33*e.m32+t.m34*e.offsetY,t.m31*e.m13+t.m32*e.m23+t.m33*e.m33+t.m34*e.offsetZ,t.m31*e.m14+t.m32*e.m24+t.m33*e.m34+t.m34*e.m44,t.offsetX*e.m11+t.offsetY*e.m21+t.offsetZ*e.m31+t.m44*e.offsetX,t.offsetX*e.m12+t.offsetY*e.m22+t.offsetZ*e.m32+t.m44*e.offsetY,t.offsetX*e.m13+t.offsetY*e.m23+t.offsetZ*e.m33+t.m44*e.offsetZ,t.offsetX*e.m14+t.offsetY*e.m24+t.offsetZ*e.m34+t.m44*e.m44)}}class Matrix3D{static identity(){return{m11:1,m12:0,m13:0,m14:0,m21:0,m22:1,m23:0,m24:0,m31:0,m32:0,m33:1,m34:0,offsetX:0,offsetY:0,offsetZ:0,m44:1}}static from(...t){if(16!==t.length)throw new RangeError("Must provide exactly 16 numbers");return{m11:t[0],m12:t[1],m13:t[2],m14:t[3],m21:t[4],m22:t[5],m23:t[6],m24:t[7],m31:t[8],m32:t[9],m33:t[10],m34:t[11],offsetX:t[12],offsetY:t[13],offsetZ:t[14],m44:t[15]}}static transpose(t){return Matrix3D.from(t.m11,t.m21,t.m31,t.offsetX,t.m12,t.m22,t.m32,t.offsetY,t.m13,t.m23,t.m33,t.offsetZ,t.m14,t.m24,t.m34,t.m44)}static toArray(t){return[t.m11,t.m12,t.m13,t.m14,t.m21,t.m22,t.m23,t.m24,t.m31,t.m32,t.m33,t.m34,t.offsetX,t.offsetY,t.offsetZ,t.m44]}static clone(t,e){return"function"==typeof e?Matrix3DUtils.modify(t,e):Matrix3DUtils.clone(t)}static scale(t,e,r,n){return"number"==typeof e?(r??=e,n??=e):(n=e.z,r=e.y,e=e.x),Matrix3DUtils.modify(t,t=>{t.m11*=e,t.m22*=r,t.m33*=n})}static translate(t,e){return Matrix3DUtils.modify(t,t=>{t.offsetX+=e.x,t.offsetY+=e.y,t.offsetZ+=e.z})}static parse(e){const r=t.parseAsNumericalArray(e);if(r&&16===r.length)return Matrix3D.from.apply(null,r);throw new Error(`Cannot parse "${e}" as a valid Matrix3D.`)}static isIdentity(t){return 1==t.m11&&0==t.m12&&0==t.m13&&0==t.m14&&0==t.m21&&1==t.m22&&0==t.m23&&0==t.m24&&0==t.m31&&0==t.m32&&1==t.m33&&0==t.m34&&0==t.offsetX&&0==t.offsetY&&0==t.offsetZ&&1==t.m44}static isAffine(t){return 0==t.m14&&0==t.m24&&0==t.m34&&1==t.m44}static determinant(t){if(Matrix3D.isIdentity(t))return 1;if(Matrix3D.isAffine(t))return t.m11*(t.m22*t.m33-t.m32*t.m23)-t.m12*(t.m21*t.m33-t.m31*t.m23)+t.m13*(t.m21*t.m32-t.m31*t.m22);{const e=t.m13*t.m24-t.m23*t.m14,r=t.m13*t.m34-t.m33*t.m14,n=t.m13*t.m44-t.offsetZ*t.m14,s=t.m23*t.m34-t.m33*t.m24,o=t.m23*t.m44-t.offsetZ*t.m24,i=t.m33*t.m44-t.offsetZ*t.m34,a=t.m22*r-t.m32*e-t.m12*s,m=t.m12*o-t.m22*n+t.offsetY*e,c=t.m32*n-t.offsetY*r-t.m12*i,l=t.m22*i-t.m32*o+t.offsetY*s;return t.offsetX*a+t.m31*m+t.m21*c+t.m11*l}}static multiply(...t){if(0===t.length)throw new ReferenceError("Matrix not provided.");const e=Array.from(t);let r=e[0];for(let t=1;t<e.length;t++)r=Matrix3DUtils.multiply(r,e[t]);return r}static invert(t){if(Matrix3D.isAffine(t)){const e=Matrix3D.determinant(t);if(0==e)return null;const r=t.m12*t.m23-t.m22*t.m13,n=t.m32*t.m13-t.m12*t.m33,s=t.m22*t.m33-t.m32*t.m23,o=t.m21*t.m13-t.m11*t.m23,i=t.m11*t.m33-t.m31*t.m13,a=t.m31*t.m23-t.m21*t.m33,m=t.m11*t.m22-t.m21*t.m12,c=t.m11*t.m32-t.m31*t.m12,l=t.m11*t.offsetY-t.offsetX*t.m12,u=t.m21*t.m32-t.m31*t.m22,f=t.m21*t.offsetY-t.offsetX*t.m22,h=t.m31*t.offsetY-t.offsetX*t.m32,y=t.m23*l-t.offsetZ*m-t.m13*f,x=t.m13*h-t.m33*l+t.offsetZ*c,g=t.m33*f-t.offsetZ*u-t.m23*h,p=m,M=-c,d=u,v=1/e;return Matrix3D.from(s*v,n*v,r*v,0,a*v,i*v,o*v,0,d*v,M*v,p*v,0,g*v,x*v,y*v,1)}{const e=Matrix3D.determinant(t);if(0==e)return null;const r=t.m33*t.m44-t.m34*t.offsetZ,n=t.m32*t.m44-t.m34*t.offsetY,s=t.m31*t.m44-t.m34*t.offsetX,o=t.m32*t.offsetZ-t.m33*t.offsetY,i=t.m31*t.offsetZ-t.m33*t.offsetX,a=t.m31*t.offsetY-t.m32*t.offsetX,m=t.m33*t.m44-t.m34*t.offsetZ,c=t.m32*t.m44-t.m34*t.offsetY,l=t.m31*t.m44-t.m34*t.offsetX,u=t.m32*t.offsetZ-t.m33*t.offsetY,f=t.m31*t.offsetZ-t.m33*t.offsetX,h=t.m31*t.offsetY-t.m32*t.offsetX,y=t.m23*t.m44-t.m24*t.offsetZ,x=t.m22*t.m44-t.m24*t.offsetY,g=t.m21*t.m44-t.m24*t.offsetX,p=t.m22*t.offsetZ-t.m23*t.offsetY,M=t.m21*t.offsetZ-t.m23*t.offsetX,d=t.m21*t.offsetY-t.m22*t.offsetX,v=t.m23*t.m34-t.m24*t.m33,b=t.m22*t.m34-t.m24*t.m32,w=t.m21*t.m34-t.m24*t.m31,z=t.m22*t.m33-t.m23*t.m32,U=t.m21*t.m33-t.m23*t.m31,D=t.m21*t.m32-t.m22*t.m31,C=t.m22*r-t.m23*n+t.m24*o,A=-(t.m21*r-t.m23*s+t.m24*i),N=t.m21*n-t.m22*s+t.m24*a,V=-(t.m21*o-t.m22*i+t.m23*a),_=-(t.m12*m-t.m13*c+t.m14*u),P=t.m11*m-t.m13*l+t.m14*f,q=-(t.m11*c-t.m12*l+t.m14*h),X=t.m11*u-t.m12*f+t.m13*h,S=t.m12*y-t.m13*x+t.m14*p,Y=-(t.m11*y-t.m13*g+t.m14*M),Z=t.m11*x-t.m12*g+t.m14*d,E=-(t.m11*p-t.m12*M+t.m13*d),T=-(t.m12*v-t.m13*b+t.m14*z),I=t.m11*v-t.m13*w+t.m14*U,R=-(t.m11*b-t.m12*w+t.m14*D),Q=t.m11*z-t.m12*U+t.m13*D,L=1/e;return Matrix3D.from(C*L,_*L,S*L,T*L,A*L,P*L,Y*L,I*L,N*L,q*L,Z*L,R*L,V*L,X*L,E*L,Q*L)}}static transform(t,e){var r={x:t.x,y:t.y,z:t.z};if(!Matrix3D.isIdentity(e)){var n=r.x,s=r.y,o=r.z;if(r.x=n*e.m11+s*e.m21+o*e.m31+e.offsetX,r.y=n*e.m12+s*e.m22+o*e.m32+e.offsetY,r.z=n*e.m13+s*e.m23+o*e.m33+e.offsetZ,!Matrix3D.isAffine(e)){var i=n*e.m14+s*e.m24+o*e.m34+e.m44;0!=i&&(r.x/=i,r.y/=i,r.z/=i)}}return r}}class Quaternion{static identity(){return Quaternion.from(0,0,0,1)}static from(...t){if(4!==t.length)throw new RangeError("Must provide exactly 4 numbers");return{x:t[0],y:t[1],z:t[2],w:t[3]}}static parse(e){const r=t.parseAsNumericalArray(e);if(r&&4===r.length)return Quaternion.from.apply(null,r);throw new Error(`Cannot parse "${e}" as a valid Quaternion.`)}static fromVectors(t,e){Vector3D.normalize(t),Vector3D.normalize(e);const r=(t,e,r,n)=>{const s=Quaternion.from(t,e,r,n);return Quaternion.normalize(s),s};let n=Vector3D.dot(t,e)+1;return n.isCloseTo(0)?Math.abs(t.x)>Math.abs(t.z)?r(-t.y,t.x,0,0):r(0,-t.z,t.y,0):r(t.y*e.z-t.z*e.y,t.z*e.x-t.x*e.z,t.x*e.y-t.y*e.x,n)}static normalize(t){const e=Quaternion.mag(t);if(e.isCloseTo(0))t.x=t.y=t.z=0,t.w=1;else{const r=1/e;t.x*=r,t.y*=r,t.z*=r,t.w*=r}}static unit(t){const e=Quaternion.from(t.x,t.y,t.z,t.w);return Quaternion.normalize(e),e}static fromAxisAngle(t,e){var r=m*(e%=360),n=Vector3D.mag(t);if(0==n)throw new RangeError("Invalid argument");var s=Math.sin(.5*r)/n,o=t.x*s,i=t.y*s,a=t.z*s;return Quaternion.from(o,i,a,Math.cos(.5*r))}static fromRotationMatrix(t){const e=t.m11+t.m22+t.m33+t.m44;if(e>0){const r=.5/Math.sqrt(e),n=.25/r,s=(t.m23-t.m32)*r,o=(t.m31-t.m13)*r,i=(t.m12-t.m21)*r;return Quaternion.from(s,o,i,n)}if(t.m11>t.m22&&t.m11>t.m22){const e=.5/Math.sqrt(t.m44+t.m11-t.m22-t.m33),r=(t.m23-t.m32)*e,n=.25/e,s=(t.m12+t.m21)*e,o=(t.m31+t.m13)*e;return Quaternion.from(n,s,o,r)}if(t.m22>t.m33){const e=.5/Math.sqrt(t.m44+t.m22-t.m11-t.m33),r=(t.m23+t.m32)*e,n=.25/e,s=(t.m12+t.m21)*e,o=(t.m31-t.m13)*e;return Quaternion.from(s,n,r,o)}{const e=.5/Math.sqrt(t.m44+t.m33-t.m11-t.m22),r=(t.m23+t.m32)*e,n=.25/e,s=(t.m12-t.m21)*e,o=(t.m31-t.m13)*e;return Quaternion.from(o,r,n,s)}}static conjugate(t){return Quaternion.from(-t.x,-t.y,-t.z,t.w)}static mag(t){return Math.sqrt(t.x*t.x+t.y*t.y+t.z*t.z+t.w*t.w)}static norm(t){return t.x*t.x+t.y*t.y+t.z*t.z}static axis(t){return 0==t.x&&0==t.y&&0==t.z?Vector3D.j():Vector3D.unit(t)}static transform(t,e){Quaternion.normalize(e);const r=Vector3D.cross(e,t),n=Vector3D.scale(r,2),s=Vector3D.cross(e,n);return{x:t.x+e.w*n.x+s.x,y:t.y+e.w*n.y+s.y,z:t.z+e.w*n.z+s.z}}static angle(t){let e=Math.sqrt(t.x*t.x+t.y*t.y+t.z*t.z),r=t.w;if(e>Number.MAX_VALUE){const n=Math.max(Math.abs(t.x),Math.max(Math.abs(t.y),Math.abs(t.z))),s=t.x/n,o=t.y/n,i=t.z/n;e=Math.sqrt(s*s+o*o+i*i),r/=n}return 114.59155902616465*Math.atan2(e,r)}static toRotationMatrix(t){var e=Matrix3D.identity(),r=t.x,n=t.y,s=t.z,o=t.w;return e.m11=1-2*n*n-2*s*s,e.m12=2*r*n+2*o*s,e.m13=2*r*s-2*o*n,e.m21=2*r*n-2*o*s,e.m22=1-2*r*r-2*s*s,e.m23=2*n*s+2*o*r,e.m31=2*o*n+2*r*s,e.m32=2*n*s-2*o*r,e.m33=1-2*r*r-2*n*n,e}static invert(t){const e=Quaternion.unit(t);return Quaternion.conjugate(e)}static multiply(t,e){return Quaternion.from(t.w*e.x+t.x+e.w+t.y*e.z-t.z*e.y,t.w*e.y-t.x*e.z+t.y*e.w+t.z*e.x,t.w*e.z+t.x*e.y-t.y*e.x+t.z*e.w,t.w*e.w-t.x*e.x-t.y*e.y-t.z*e.z)}static dot(t,e){return Quaternion.multiply(t,Quaternion.conjugate(e)).w}}var c,l=Object.freeze({__proto__:null,Matrix3D:Matrix3D,Quaternion:Quaternion,Spherical:Spherical,Vector:Vector,Vector3D:Vector3D}),u=Object.freeze({__proto__:null,LinearAlgebra:l,Polygon:Polygon,Utils:i,Utils3D:class Utils3D{static intersect(t,e){const[r,n]=t,s=Vector3D.subtract(r,n),[o,i,a]=e,m=Vector3D.subtract(o,i),c=Vector3D.subtract(o,a),l=Vector3D.cross(s,c),u=Vector3D.dot(m,l);if(u.isCloseTo(0))return null;const f=1/u,h=Vector3D.subtract(r,o),y=f*Vector3D.dot(h,l);if(y<0||y>1)return null;const x=Vector3D.cross(h,m),g=f*Vector3D.dot(s,x);if(g<0||y+g>1)return null;const p=f*Vector3D.dot(c,x);return p<0||p.isCloseTo(0)?null:Vector3D.add(r,Vector3D.scale(s,p))}}});function f(t){return"number"==typeof t&&(t={real:t,img:0}),t}function h(t,e){const r={};return Object.defineProperty(r,"real",{value:t,writable:!1}),Object.defineProperty(r,"img",{value:e,writable:!1}),r}function y(){return c||(c=h(Number.NaN,Number.NaN))}class Complex{static build(t,e){return this.isComplex(t)?t:(e??=0,"number"!=typeof t||"number"!=typeof e?y():h(t,e||0))}static add(t,e){const r=f(t),n=f(e);return h(r.real+n.real,r.img+n.img)}static subtract(t,e){const r=f(t),n=f(e);return h(r.real-n.real,r.img-n.img)}static multiply(t,e){const r=f(t),n=f(e);return h(r.real*n.real-r.img*n.img,r.real*n.img+r.img*n.real)}static divide(t,e){const r=f(t),n=f(e),s=this.absSquare(n).roundoff();if(0===s)return y();const o=1/s;return h(o*(r.real*n.real+r.img*n.img),o*(r.img*n.real-r.real*n.img))}static absSquare(t){const e=f(t);return Math.pow(e.real,2)+Math.pow(e.img,2)}static modulus(t){return Math.sqrt(this.absSquare(t))}static isComplex(t){return null!=t&&"object"==typeof t&&"real"in t&&"img"in t&&"number"==typeof t.real&&"number"==typeof t.img}static conjugate(t){return h((t=f(t)).real,0==Math.abs(t.img)?0:-t.img)}static equals(t,e){const r=this.build(t),n=this.build(e);return!(!this.isComplex(t)||!this.isComplex(e))&&(r.real===n.real&&r.img===n.img)}static get NaC(){return y()}}const x={};function g(t,e){const r=x[e]=x[e]||{};return r[t]=r[t]||function(t,e){const r=2*Math.PI*t/e;return Complex.build(Math.cos(r),Math.sin(r))}(t,e)}function p(t){const e=[],r=t.length;if(1===r)return[Complex.build(t[0])];const n=p(t.filter((t,e)=>e%2==0)),s=p(t.filter((t,e)=>e%2==1));for(var o=0;o<r/2;o++){const t=n[o],i=Complex.multiply(g(o,r),s[o]);e[o]=Complex.add(t,i),e[o+r/2]=Complex.subtract(t,i)}return e}const M=Math.sqrt(Math.PI);class Gaussian{constructor(t,e){this.mean=t,this.stdev=Math.abs(e),this.variance=Math.pow(e,2)}static get normal(){return d}weight(t){return Math.exp(-.5*Math.pow(this._z(t),2))}probabilityDensity(t){const e=this.stdev*Math.SQRT2*M;return this.weight(t)/e}_z(t){return(t-this.mean)/this.stdev}probability(t){return.5*function(t){const e=Math.abs(t),r=1/(1+.5*e),n=r*Math.exp(-e*e-1.26551223+r*(1.00002368+r*(.37409196+r*(.09678418+r*(r*(.27886807+r*(r*(1.48851587+r*(.17087277*r-.82215223))-1.13520398))-.18628806)))));return t>=0?n:2-n}(-this._z(t)/Math.SQRT2)}}const d=new Gaussian(0,1);class Lagrange{constructor(t){this.#t=t}#t;#e=null;_prepareBarycentric(){if(this.#e)return;const t=this.#t||[],e=t.length;if(0===e)return void(this.#e=[]);const r=new Array(e),n=new Array(e);for(let s=0;s<e;s++){let o=0,i=1;const a=t[s].x;for(let r=0;r<e;r++){if(r===s)continue;const e=a-t[r].x;if(0===e)throw new Error("Invalid function provided.");e<0&&(i=-i),o+=Math.log(Math.abs(e))}r[s]=-o,n[s]=i}let s=r[0];for(let t=1;t<e;t++)r[t]>s&&(s=r[t]);const o=new Array(e);for(let t=0;t<e;t++){const e=Math.exp(r[t]-s);o[t]=n[t]*e}this.#e=o}_computeBarycentric(t){const e=this.#t||[];this.#e||this._prepareBarycentric();const r=this.#e||[];let n=0,s=0;for(let o=0;o<e.length;o++){const i=e[o].x;if(t===i)return e[o].y;const a=r[o]/(t-i);n+=a*e[o].y,s+=a}return n/s}interpolate(t){return this._computeBarycentric(t)}static create(...t){const e=(arguments.length>0&&Array.isArray(arguments[0])?arguments[0]:Array.from(t)).map((t,e)=>"number"==typeof t?{x:e,y:t}:t);return new Lagrange(e)}}const v={create:Lagrange.create};class Pchip{constructor(t){if(!t||t.length<2)throw new Error("Need at least 2 points");const e=t.slice().sort((t,e)=>t.x-e.x);this.xs=e.map(t=>t.x),this.ys=e.map(t=>t.y),this.ms=this.computeDerivatives()}computeDerivatives(){const t=this.xs.length,e=new Array(t-1),r=new Array(t-1);for(let n=0;n<t-1;n++)e[n]=this.xs[n+1]-this.xs[n],r[n]=(this.ys[n+1]-this.ys[n])/e[n];const n=new Array(t).fill(0);n[0]=r[0],n[t-1]=r[t-2];for(let s=1;s<t-1;s++){const t=r[s-1],o=r[s];if(0===t||0===o||t*o<=0)n[s]=0;else{const r=2*e[s]+e[s-1],i=e[s]+2*e[s-1];n[s]=(r+i)/(r/t+i/o)}}for(let e=0;e<t-1;e++)if(0===r[e])n[e]=0,n[e+1]=0;else{const t=n[e]/r[e],s=n[e+1]/r[e],o=t*t+s*s;if(o>9){const i=3/Math.sqrt(o);n[e]=i*t*r[e],n[e+1]=i*s*r[e]}}return n}interpolate(t){const e=this.xs,r=this.ys,n=this.ms,s=e.length;if(t<=e[0]){const s=n[0];return r[0]+s*(t-e[0])}if(t>=e[s-1]){const o=n[s-1];return r[s-1]+o*(t-e[s-1])}let o=0,i=s-1;for(;i-o>1;){const r=o+i>>1;e[r]<=t?o=r:i=r}const a=e[o+1]-e[o],m=(t-e[o])/a,c=m*m,l=c*m,u=l-2*c+m,f=-2*l+3*c,h=l-c;return(2*l-3*c+1)*r[o]+u*(n[o]*a)+f*r[o+1]+h*(n[o+1]*a)}static create(...t){const e=(arguments.length>0&&Array.isArray(arguments[0])?arguments[0]:Array.from(t)).map((t,e)=>"number"==typeof t?{x:e,y:t}:t);return new Pchip(e)}}class Newton{constructor(t){if(!t||0===t.length)throw new Error("Need at least 1 point");const e=t.slice().sort((t,e)=>t.x-e.x);this.xs=e.map(t=>t.x);const r=e.length,n=e.map(t=>t.y);for(let t=1;t<r;t++)for(let e=r-1;e>=t;e--){const r=this.xs[e]-this.xs[e-t];if(0===r)throw new Error("Invalid function provided.");n[e]=(n[e]-n[e-1])/r}this.coeffs=n}interpolate(t){const e=this.xs,r=this.coeffs,n=r.length;if(0===n)return NaN;let s=r[n-1];for(let o=n-2;o>=0;o--)s=s*(t-e[o])+r[o];return s}static create(...t){const e=(arguments.length>0&&Array.isArray(arguments[0])?arguments[0]:Array.from(t)).map((t,e)=>"number"==typeof t?{x:e,y:t}:t);return new Newton(e)}}const b=(t,e)=>t;function w(t,e=b){return t.reduce((t,r,n)=>t+e(r,n),0)}function z(t,e=b){return w(t,e)/t.length}function U(t,e=b,r=!1){const n=z(t,e);return t.reduce((t,e)=>Math.pow(e-n,2)+t,0)/(t.length-(r?1:0))}function D(t,e=b,r=!1){const n=U(t,e,r);return Math.sqrt(n)}function C(t,e){return(r,n,s,o)=>{let i=r,a=n,m=t(i,a),c=e(i,a),l=s(m),u=s(c);for(;a-i>o;)l<u?(a=c,c=m,u=l,m=t(i,a),l=s(m)):(i=m,m=c,l=u,c=e(i,a),u=s(c));return.5*(m+c)}}const A={linear:(t=2)=>function(t){if(t<=1)throw new RangeError("segments must be a number grater than 1.");return(e,r,n,s=.001)=>C((e,r)=>e+(r-e)/t,(e,r)=>r-(r-e)/t)(e,r,n,s)}(t),goldenRatio:(t,e,r,n=.001)=>C((t,e)=>e-(e-t)/1.618,(t,e)=>t+(e-t)/1.618)(t,e,r,n),gaussian:(t,e,r,n=.001)=>{var s=null,o=null;const i=(t,e)=>(o??=e-t,s??=o/Math.sqrt(12),s*(e-t)/o);return C((t,e)=>Math.max(t,(e+t)/2-i(t,e)),(t,e)=>Math.min(e,(e+t)/2+i(t,e)))(t,e,r,n)}};var N=Object.freeze({__proto__:null,Fourier:class Fourier{static transform(t,e=!0){return(r=(t=t||[]).length)>0&&!(r&r-1)?this.fft(t,e):this.dft(t,e);var r}static invert(t,e=!0){return this.idft(t||[],e)}static dft(t,e=!0){const r=(t||[])?.length,n=e?1/Math.sqrt(r):1,s=[];for(let e=0;e<r;e++){s.push({real:0,img:0});for(let o=0;o<r;o++){const i=g(e*o,r),a=Complex.multiply(t[o],i),m=Complex.multiply(a,n);s[e]=Complex.add(s[e],m)}}return s}static idft(t,e=!0){const r=t.map(t=>Complex.build(t.img,t.real));return this.transform(r,e).map(t=>Complex.build(t.img,t.real))}static fft(t,e=!0){const r=p(t);if(!e)return r;const n=1/Math.sqrt(t.length);return r.map(t=>Complex.multiply(t,n))}},Gaussian:Gaussian,Lagrange:Lagrange,Lagrangian:v,Newton:Newton,Pchip:Pchip,SearchFunctions:A,Utils:class Utils{static sum(t,e){return w(t,e)}static mean(t,e){return z(t,e)}static median(t,e){return function(t,e=b){const r=t.slice(0),n=r.length;r.sort((t,r)=>e(t)-e(r));const s=Math.ceil(r.length/2)-1;return n%2==1?r[s]:.5*(r[s+1]+r[s])}(t,e)}static mode(t,e){return function(t,e=b){const r=Object.groupBy(t,e);let n,s=0;for(let t in r){const e=r[t].length;e>s&&(n=parseInt(t),s=e)}return n}(t,e)}static var(t,e){return U(t,e,!0)}static varp(t,e){return U(t,e,!1)}static stdevp(t,e){return D(t,e,!1)}static stdev(t,e){return D(t,e,!0)}static correlation(t,e,r,n){return function(t,e,r=b,n=b){const s=Array.isArray(e);if(s&&e.length!==t.length)throw new Error("Sets must be of the same length.");const o=t.length,i=t,a=s?e:t,m=s?r:e,c=s?n:r,l=z(i,m),u=z(a,c);let f=0,h=0,y=0;for(let t=0;t<o;t++){const e=i[t],r=a[t],n=m(e,t)-l,s=c(r,t)-u;f+=n*s,h+=n*n,y+=s*s}return f/Math.sqrt(h*y)}(t,e,r,n)}static linearRegression(t,e,r,n){return function(t,e,r=b,n=b){const s=Array.isArray(e);if(s&&e.length!==t.length)throw new Error("Sets must be of the same length.");const o=t,i=s?e:t,a=s?r:e,m=a??(t=>t.x),c=(s?n:a)??(t=>t.y),l=t.length;let u=0,f=0,h=0,y=0;for(let t=0;t<l;t++){const e=o[t],r=i[t],n=m(e,t),s=c(r,t);u+=n*s,f+=n,h+=s,y+=n*n}const x=(l*u-f*h)/(l*y-Math.pow(f,2));return[x,(h-x*f)/l]}(t,e,r,n)}static gaussian(t,e){return new Gaussian(t,e)}}});const V="0123456789abcdefghijklmnopqrstuvwxyz",_="Radix out of range: possible values go between positive 1 exclusive and 36 inclusive";class Utils{static lcd(...e){if(t.NullChecker.isNullOrEmpty(e)||e.length<=1)throw"Insufficient set of numbers.";function r(t,e){return e?r(e,t%e):0===e?t:NaN}function n(t,e){return t*e/r(t,e)}let s=Math.round(e[0]);for(let t=1;t<e.length;t++)s=n(s,Math.round(e[t]));return s}static gcd(t,e){return t=Math.round(t),e=Math.round(e),0===t?e:Utils.gcd(e%t,t)}static rebaseInt(e,r,n){return t.Numbers.rebase(e,r,n)}static rebaseFloat(t,e,r,n=12){const s=Utils.rebaseFloat10ToN,o=Utils.rebaseFloatNTo10;if(10===e){const e=parseFloat(t.toString());return r%1==0?Utils.rebaseFloat10ToNIntBase(e,r,n):s(e,r,n)}if(10===r)return o(t.toString(),e,n);return s(o(t.toString(),e,n+1),r,n)}static rebaseFloatNTo10(t,e,r=12){const n=V;if(e<=1||e>n.length)throw new Error(_);const s=(t??"0").toString().toLowerCase(),o=Number.NaN;if("0"===s)return 0;const i=/^([-+]?) *([\da-z]+)?(.[\da-z]+)?$/.exec(s);if(i.length<2)return o;const a="-"===i[1]?-1:1,m=i[2]||"0",c=i[3]||".0";let l=0,u=0;for(let t of m+c.substr(1)){const r=n.indexOf(t);if(-1===r||r>=e)return o;l+=r*Math.pow(e,m.length-u-1),u++}return a*l}static rebaseFloat10ToNIntBase(t,e,r=12){const n=V;if(e<=1||e>36)throw new Error(_);const s=e;let o=Math.abs(t??0);if(0===o||Number.isNaN(o))return t.toString();let i=(o%1).roundoff(),a="";for(;;){let t=o/s,e=Math.floor(t),r=(o-e*s).roundoff(),i=Math.floor(r);if(a=i>=36?`[${i}]`+a:n[i]+a,e<=0)break;o=e}if(a=a.replace(/^0+/,""),a||="0",0===i)return a;let m="";do{o=(i*s).roundoff();const t=Math.floor(o),e=(o-t).roundoff();t>=36?m=`[${t}]`:m+=n[t],i=e}while(!i.isCloseTo(0)&&m.length<r);return/^0*$/.test(m)?a:(Math.sign(t)<0?"-":"")+a+"."+m.replace(/0+$/,"")}static rebaseFloat10ToN(e,r,n=12){const s=V;if(r<=1||r>s.length)throw new Error(_);const o=r;let i=Math.abs(e??0);if(0===i||Number.isNaN(i))return e.toString();let a=Math.sign(e)<0?"-":"",m=[],c=[];for(let t=0;t<20;t++)m.push("0"),c.push("0");const l=o%1==0?o:Math.ceil(o);function u(t,e,r){const n=t?m:c,o=n[e]=n[e]||"0",i=s.indexOf(o)+r,a=i%l,f=Math.floor(i/l);return n[e]=s[a],f>0&&(t?u(t,e+1,f):0===e?u(!0,0,f):u(!1,e-1,f)),f}let f=0;for(;;){const e=Math.floor(t.Numbers.log(i,o)),r=e>=0;if(u(r,r?e:Math.abs(1+e),1),i=(i-Math.pow(o,e).roundoff()).roundoff(),r||f++,0===i||f>=100){const t=a+(m.reverse().map(t=>t||"0").join("").replace(/^0+/,"")||"0"),e=c.map(t=>t||"0").join("").substr(0,n).replace(/0+$/,"");return/^0*$/.test(e)?t:t+"."+e}}}}var P=Object.freeze({__proto__:null,Utils:Utils}),q=Object.freeze({__proto__:null,Complex:Complex,DataAnalysis:N,NumberTheory:P}),X=Object.freeze({__proto__:null,Geometry:u,Mathematics:q});t.DeepMerger.merge(X)}(Pacem);
7
- //# sourceMappingURL=pacem-numerical.min.js.map
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * @pacem/pacem-numerical v1.0.0-bernoulli (https://js.pacem.it)
2
+ * @pacem/pacem-numerical v1.0.0-bessel (https://js.pacem.it)
3
3
  * Pacem (https://pacem.it)
4
4
  * Licensed under Apache-2.0
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * @pacem/pacem-numerical v1.0.0-bernoulli (https://js.pacem.it)
2
+ * @pacem/pacem-numerical v1.0.0-bessel (https://js.pacem.it)
3
3
  * Pacem (https://pacem.it)
4
4
  * Licensed under Apache-2.0
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * @pacem/pacem-numerical v1.0.0-bernoulli (https://js.pacem.it)
2
+ * @pacem/pacem-numerical v1.0.0-bessel (https://js.pacem.it)
3
3
  * Pacem (https://pacem.it)
4
4
  * Licensed under Apache-2.0
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * @pacem/pacem-numerical v1.0.0-bernoulli (https://js.pacem.it)
2
+ * @pacem/pacem-numerical v1.0.0-bessel (https://js.pacem.it)
3
3
  * Pacem (https://pacem.it)
4
4
  * Licensed under Apache-2.0
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * @pacem/pacem-numerical v1.0.0-bernoulli (https://js.pacem.it)
2
+ * @pacem/pacem-numerical v1.0.0-bessel (https://js.pacem.it)
3
3
  * Pacem (https://pacem.it)
4
4
  * Licensed under Apache-2.0
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * @pacem/pacem-numerical v1.0.0-bernoulli (https://js.pacem.it)
2
+ * @pacem/pacem-numerical v1.0.0-bessel (https://js.pacem.it)
3
3
  * Pacem (https://pacem.it)
4
4
  * Licensed under Apache-2.0
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * @pacem/pacem-numerical v1.0.0-bernoulli (https://js.pacem.it)
2
+ * @pacem/pacem-numerical v1.0.0-bessel (https://js.pacem.it)
3
3
  * Pacem (https://pacem.it)
4
4
  * Licensed under Apache-2.0
5
5
  */
package/dist/esm/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * @pacem/pacem-numerical v1.0.0-bernoulli (https://js.pacem.it)
2
+ * @pacem/pacem-numerical v1.0.0-bessel (https://js.pacem.it)
3
3
  * Pacem (https://pacem.it)
4
4
  * Licensed under Apache-2.0
5
5
  */
package/package.json CHANGED
@@ -27,7 +27,7 @@
27
27
  "types": "./typings/index.d.ts"
28
28
  }
29
29
  },
30
- "version": "1.0.0-bernoulli",
30
+ "version": "1.0.0-bessel",
31
31
  "author": {
32
32
  "name": "Pacem",
33
33
  "url": "https://pacem.it"
@@ -1 +0,0 @@
1
- {"version":3,"file":"pacem-numerical.min.js","sources":["../esm/geom/linear-algebra.js","../esm/geom/algorithms/delaunay.js","../esm/geom/geom.js","../esm/geom/polygon.js","../esm/geom/geom3d.js","../esm/math/complex.js","../esm/geom/util3d.js","../esm/math/fourier.js","../esm/math/gaussian.js","../esm/math/interpolation.js","../esm/math/statistics.js","../esm/math/math.js","../esm/index-iife.js"],"sourcesContent":["import { Point } from '@pacem/pacem-foundation';\n/** 2D vector utils. */\nexport class Vector {\n /**\n * Returns the unit (normalized) vector having the same direction and sense of the provided one.\n * @param v\n */\n static unit(v) {\n const clone = { x: v.x, y: v.y };\n this.normalize(clone);\n return clone;\n }\n static magSqr(v) {\n return v.x * v.x + v.y * v.y;\n }\n static mag(v) {\n return Math.sqrt(Vector.magSqr(v));\n }\n /**\n * Normalizes the provided vector in place.\n * @param v\n */\n static normalize(v) {\n const l = Vector.mag(v);\n if (l <= 0) {\n throw 'Cannot normalize a vector of length 0.';\n }\n const inv = 1 / l;\n v.x *= inv;\n v.y *= inv;\n }\n /**\n * Returns the vector joining two points.\n * @param p1 Start point\n * @param p2 End point\n */\n static from(p1, p2) {\n return Point.subtract(p1, p2);\n }\n /**\n * Returns the dot product between two vectors/points.\n * @param v1\n * @param v2\n */\n static dot(v1, v2) {\n return v1.x * v2.x + v1.y * v2.y;\n }\n /**\n * Returns the cross product between two vectors/points (magnitude along the z axis).\n * @param v1\n * @param v2\n */\n static cross(v1, v2) {\n return v1.x * v2.y - v1.y * v2.x;\n }\n /**\n * Checks if the two points are effectively the same location.\n * @param v1 The first point.\n * @param v2 The second point.\n * @returns True if the points are considered coincident within tolerance; otherwise, false.\n */\n static areClose(v1, v2) {\n return (v2.x - v1.x).isCloseTo(0)\n && (v2.y - v1.y).isCloseTo(0);\n }\n}\n","class Vertex {\n constructor(x, y, index = -1 // original index in the input array\n ) {\n this.x = x;\n this.y = y;\n this.index = index;\n }\n equals(other) {\n return this.x === other.x && this.y === other.y;\n }\n}\n// Compute circumcircle of a triangle (center + radius)\nfunction calcCircumCirc(v0, v1, v2) {\n const ax = v0.x, ay = v0.y;\n const bx = v1.x, by = v1.y;\n const cx = v2.x, cy = v2.y;\n const d = 2 * (ax * (by - cy) + bx * (cy - ay) + cx * (ay - by));\n if (Math.abs(d) < 1e-12) {\n // Degenerate (collinear) triangle\n return { c: { x: 0, y: 0 }, r: Infinity };\n }\n const ux = ((ax * ax + ay * ay) * (by - cy) +\n (bx * bx + by * by) * (cy - ay) +\n (cx * cx + cy * cy) * (ay - by)) /\n d;\n const uy = ((ax * ax + ay * ay) * (cx - bx) +\n (bx * bx + by * by) * (ax - cx) +\n (cx * cx + cy * cy) * (bx - ax)) /\n d;\n const r = Math.hypot(ux - ax, uy - ay);\n return { c: { x: ux, y: uy }, r };\n}\nclass Triangle {\n constructor(v0, v1, v2) {\n this.v0 = v0;\n this.v1 = v1;\n this.v2 = v2;\n this.circumCirc = calcCircumCirc(v0, v1, v2);\n }\n inCircumcircle(v) {\n const dx = this.circumCirc.c.x - v.x;\n const dy = this.circumCirc.c.y - v.y;\n return Math.hypot(dx, dy) <= this.circumCirc.r + 1e-9;\n }\n}\n// Create a large \"super triangle\" that encloses all points\nfunction superTriangle(vertices) {\n let minX = Infinity, minY = Infinity;\n let maxX = -Infinity, maxY = -Infinity;\n for (const v of vertices) {\n minX = Math.min(minX, v.x);\n minY = Math.min(minY, v.y);\n maxX = Math.max(maxX, v.x);\n maxY = Math.max(maxY, v.y);\n }\n const dx = (maxX - minX) * 10;\n const dy = (maxY - minY) * 10;\n const v0 = new Vertex(minX - dx, minY - dy * 3);\n const v1 = new Vertex(minX - dx, maxY + dy);\n const v2 = new Vertex(maxX + dx * 3, maxY + dy);\n return new Triangle(v0, v1, v2);\n}\n// Collect unique edges from a list of triangles (used during point insertion)\nfunction uniqueEdges(edges) {\n const unique = [];\n for (let i = 0; i < edges.length; ++i) {\n let isUnique = true;\n for (let j = 0; j < edges.length; ++j) {\n if (i !== j) {\n const e1 = edges[i];\n const e2 = edges[j];\n if ((e1.v0.equals(e2.v0) && e1.v1.equals(e2.v1)) ||\n (e1.v0.equals(e2.v1) && e1.v1.equals(e2.v0))) {\n isUnique = false;\n break;\n }\n }\n }\n if (isUnique)\n unique.push(edges[i]);\n }\n return unique;\n}\n// Insert a new vertex into the current triangulation\nfunction addVertex(vertex, triangles) {\n const edges = [];\n // 1. Remove all triangles whose circumcircle contains the new vertex\n triangles = triangles.filter((triangle) => {\n if (triangle.inCircumcircle(vertex)) {\n edges.push({ v0: triangle.v0, v1: triangle.v1 });\n edges.push({ v0: triangle.v1, v1: triangle.v2 });\n edges.push({ v0: triangle.v2, v1: triangle.v0 });\n return false;\n }\n return true;\n });\n // 2. Create new triangles from the unique polygon edges + new vertex\n const unique = uniqueEdges(edges);\n for (const edge of unique) {\n triangles.push(new Triangle(edge.v0, edge.v1, vertex));\n }\n return triangles;\n}\n// Main Delaunay triangulation (Bowyer-Watson)\nfunction triangulate(vertices) {\n if (vertices.length < 3)\n return [];\n // 1. Create super triangle\n const st = superTriangle(vertices);\n // 2. Start with the super triangle\n let triangles = [st];\n // 3. Insert each point one by one\n for (const vertex of vertices) {\n triangles = addVertex(vertex, triangles);\n }\n // 4. Remove any triangle that touches the super triangle\n triangles = triangles.filter((t) => !(t.v0 === st.v0 ||\n t.v0 === st.v1 ||\n t.v0 === st.v2 ||\n t.v1 === st.v0 ||\n t.v1 === st.v1 ||\n t.v1 === st.v2 ||\n t.v2 === st.v0 ||\n t.v2 === st.v1 ||\n t.v2 === st.v2));\n return triangles;\n}\n// Public API: Delaunay triangulation given vertices → triangle indices\nfunction delaunayTriangulation(vertices) {\n if (vertices.length < 3)\n return [];\n // Create internal vertices that remember their original index\n const vertList = vertices.map((p, idx) => new Vertex(p.x, p.y, idx));\n const triangles = triangulate(vertList);\n // Convert to flat index array: [i0, j0, k0, i1, j1, k1, ...]\n const indices = [];\n for (const t of triangles) {\n // All vertices in the final triangulation come from the original input\n indices.push(t.v0.index, t.v1.index, t.v2.index);\n }\n return indices;\n}\n// Example usage:\n/*\nconst vertices: Point[] = [\n { x: 0, y: 0 },\n { x: 10, y: 0 },\n { x: 5, y: 10 },\n { x: 15, y: 5 },\n { x: 2, y: 8 },\n // ... any number of points\n];\n\nconst triangleIndices = delaunayTriangulation(vertices);\n\n// triangleIndices is a flat array of indices, e.g. [0,1,2, 0,2,4, 1,3,2, ...]\n// Use it like this:\nfor (let i = 0; i < triangleIndices.length; i += 3) {\n const a = vertices[triangleIndices[i]];\n const b = vertices[triangleIndices[i + 1]];\n const c = vertices[triangleIndices[i + 2]];\n console.log(`Triangle: ${a.x},${a.y} → ${b.x},${b.y} → ${c.x},${c.y}`);\n}\n*/\n// This implementation is self-contained, numerically robust (small epsilon), and works with floating-point coordinates.\n// It assumes general position (no four points exactly cocircular). For production use with degenerate cases,\n// you may want to add a tiny random jitter to the points if needed.\nexport class Delaunay {\n static triangulate(vertices) {\n return delaunayTriangulation(vertices);\n }\n}\n//}\n","import { Point, Rect, NullChecker } from '@pacem/pacem-foundation';\nimport { Vector } from './linear-algebra';\nimport { Delaunay } from './algorithms/delaunay';\nconst RAD2DEG = 180.0 / Math.PI;\nconst RAD_ROUND = 2 * Math.PI;\nconst PRECISION = 12; // default epsilon 1e-12 checking proximity (not used for roundoffs)\n;\nfunction isPoint(p) {\n return Point.isPoint(p);\n}\nfunction isSegment(s) {\n return s != null && Array.isArray(s) && s.length === 2\n && isPoint(s[0]) && isPoint(s[1]);\n}\nexport class Utils {\n /**\n * Computes the slope (in radians) of the segment joining two points.\n * @param p1 Point 1\n * @param p2 Point 2\n */\n static slopeRad(p1, p2) {\n return Math.atan2(p2.y - p1.y, p2.x - p1.x);\n }\n /**\n * Computes the slope (in radians) of the segment joining two points and returns a strictly positive value (0 to 2*pi).\n * @param p1 Point 1\n * @param p2 Point 2\n */\n static slopeRad2(p1, p2) {\n return (RAD_ROUND + Utils.slopeRad(p1, p2)) % RAD_ROUND;\n }\n /**\n * Computes the slope (in degrees) of the segment joining two points.\n * @param p1 Point 1\n * @param p2 Point 2\n */\n static slopeDeg(p1, p2) {\n return Utils.slopeRad(p1, p2) * RAD2DEG;\n }\n /**\n * Computes the slope (in degrees) of the segment joining two points and returns a strictly positive value (0 to 360).\n * @param p1 Point 1\n * @param p2 Point 2\n */\n static slopeDeg2(p1, p2) {\n return (360 + Utils.slopeDeg(p1, p2)) % 360;\n }\n static intersect(arg1, arg2, ...args) {\n if (Array.isArray(arg1) && Array.isArray(arg2)) {\n return Utils._intersectSegments(arg1, arg2, true);\n }\n else if (Rect.isRect(arg1)) {\n return Utils._intersectRects(...arguments);\n }\n else if ('vertices' in arg1) {\n return Utils._mergePolygons(arg1, arg2, 'intersect')?.polygons ?? null;\n }\n else {\n return null;\n }\n }\n static boundingBox(vertices) {\n let xmin = Number.MAX_VALUE, ymin = Number.MAX_VALUE, xmax = -Number.MAX_VALUE, ymax = -Number.MAX_VALUE;\n const l = vertices.length;\n for (let v of vertices) {\n xmin = Math.min(xmin, v.x);\n ymin = Math.min(ymin, v.y);\n xmax = Math.max(xmax, v.x);\n ymax = Math.max(ymax, v.y);\n }\n return { x: xmin, y: ymin, width: xmax - xmin, height: ymax - ymin };\n }\n static combinePolygons(polygon1, polygon2, operator) {\n return Utils._mergePolygons(polygon1, polygon2, operator);\n }\n static _mergePolygons(polygon1, polygon2, operator) {\n if (NullChecker.isNullOrEmpty(polygon1?.vertices) || NullChecker.isNullOrEmpty(polygon2?.vertices)) {\n return null;\n }\n // look for sudden exit\n // 2 contains 1\n const contained1 = polygon1.vertices.filter(v => Utils.inPolygon(v, polygon2.vertices));\n if (polygon1.vertices.length == contained1.length) {\n return {\n polygons: operator === 'intersect' ? [polygon1] : /* hole in difference */ [polygon2]\n };\n }\n // 1 contains 2\n const contained2 = polygon2.vertices.filter(v => Utils.inPolygon(v, polygon1.vertices));\n if (polygon2.vertices.length === contained2.length) {\n return {\n polygons: operator === 'intersect' ? [polygon2] : /* hole in difference */ [polygon1]\n };\n }\n // bboxes do not intersect\n const bbox1 = Utils.boundingBox(polygon1.vertices), bbox2 = Utils.boundingBox(polygon2.vertices);\n const rect = Utils.intersect(bbox1, bbox2);\n if (operator !== 'union' && (!Rect.isRect(rect) || !(rect.width > 0) || !(rect.height > 0))) {\n return null; // { polygons: [] };\n }\n const { vertices: vertices1 } = polygon1, { vertices: vertices2 } = polygon2;\n if (vertices1.length < 3 || vertices2.length < 3) {\n return null;\n }\n // steps:\n // 1. compute the intersection points between the two polygon's edges,\n // 2. triangulate all the vertices (original + intersection points)\n // 3. filter the triangles whose barycenter is not within both the original polygons\n // 4. return the vertices of the remaining triangles as the intersection polygon vertices\n const sideBuilderCallback = (v, j, arr) => [v, arr[(j + 1) % arr.length]];\n const verticesSortCallback = (a, b) => a.x === b.x ? a.y - b.y : a.x - b.x;\n const edges1 = vertices1.map(sideBuilderCallback), edges2 = vertices2.map(sideBuilderCallback);\n const outputVertices = vertices1.concat(vertices2);\n const memoizer = new Map();\n const ensureMemoizer = e => {\n if (!memoizer.has(e)) {\n const retval = [];\n memoizer.set(e, retval);\n }\n return memoizer.get(e);\n };\n // loop to find edge intersections\n let thereAreIntersections = false;\n for (let edge1 of edges1) {\n const additionalVertices1 = ensureMemoizer(edge1);\n for (let edge2 of edges2) {\n const additionalVertices2 = ensureMemoizer(edge2);\n const intersection = Utils.intersect(edge1, edge2);\n if (!NullChecker.isNull(intersection)) {\n // found intersection\n thereAreIntersections = true;\n outputVertices.push(intersection);\n additionalVertices1.push(intersection);\n additionalVertices2.push(intersection);\n }\n }\n }\n // if no point is contained in each other's polygon AND additionalVertices is empty AND 'intersect' => exit\n if (contained1.length === 0 && contained2.length === 0 && !thereAreIntersections) {\n switch (operator) {\n case 'union':\n return { polygons: [polygon1, polygon2] };\n default:\n return null; // { polygons: [] };\n }\n }\n const constraints = [];\n for (let edge of edges1.concat(edges2)) {\n const additionalVertices = ensureMemoizer(edge);\n if (NullChecker.isNullOrEmpty(additionalVertices)) {\n constraints.push(edge);\n }\n else {\n // split the edge into segments by the additional vertices\n const totalVertices = edge.concat(additionalVertices).sort(verticesSortCallback);\n for (let j = 0; j < totalVertices.length - 1; j++) {\n constraints.push([totalVertices[j], totalVertices[j + 1]]);\n }\n }\n }\n // simplify by removing coinciding vertices\n var dirty = false;\n var mesh;\n do {\n outputVertices.sort(verticesSortCallback);\n outputVertices.filter((v, i, arr) => { return i === 0 || !Utils.areClose(v, arr[i - 1]); });\n // triangulate\n mesh = Utils.mesh(outputVertices);\n const { vertices, triangleIndices } = mesh;\n dirty = false;\n // enforce constraints\n for (let j = 0; j < triangleIndices.length; j += 3) {\n const indexA = triangleIndices[j], indexB = triangleIndices[j + 1], indexC = triangleIndices[j + 2];\n const A = vertices[indexA], B = vertices[indexB], C = vertices[indexC];\n const sides = [[A, B], [B, C], [C, A]];\n for (let constraint of constraints) {\n for (let side of sides) {\n const consecutive = Utils.areClose(side[0], constraint[0])\n || Utils.areClose(side[1], constraint[1])\n || Utils.areClose(side[0], constraint[1])\n || Utils.areClose(side[1], constraint[0]);\n const intersection = consecutive ? null : Utils.intersect(side, constraint);\n if (!NullChecker.isNull(intersection) && outputVertices.findIndex(p => Utils.areClose(p, intersection, 4)) === -1) {\n // pick triangle adjacent to the intesected side\n dirty = true;\n outputVertices.push(intersection);\n //break;\n }\n }\n }\n }\n } while (dirty);\n const { vertices, triangleIndices } = mesh;\n // loop through triangles and filter by barycenter\n const triangles = [];\n for (let j = 0; j < triangleIndices.length; j += 3) {\n const jA = j, jB = j + 1, jC = j + 2;\n const A = vertices[triangleIndices[jA]], B = vertices[triangleIndices[jB]], C = vertices[triangleIndices[jC]];\n const O = { x: (A.x + B.x + C.x) / 3, y: (A.y + B.y + C.y) / 3 };\n const in1 = Utils.inPolygon(O, vertices1), in2 = Utils.inPolygon(O, vertices2);\n if (in1 && in2 && operator === 'intersect'\n || (in1 || in2) && operator === 'union'\n || (in1 && !in2 || !in1 && in2) && operator === 'difference') {\n triangles.push([A, B, C]);\n }\n }\n // return the unique vertices of the remaining triangles as the intersection polygon vertices\n // 1. list all edges\n const edges = triangles.flatMap(([A, B, C]) => [[A, B], [B, C], [C, A]]);\n // 2. filter by uniqueness\n const uniqueEdges = [];\n for (let j = 0; j < edges.length; j++) {\n const edge = edges[j];\n if (j == 0) {\n uniqueEdges.push(edge);\n continue;\n }\n const alreadyIn = uniqueEdges.findIndex(e => Utils.areClose(e[0], edge[0]) && Utils.areClose(e[1], edge[1]) || Utils.areClose(e[0], edge[1]) && Utils.areClose(e[1], edge[0]));\n if (alreadyIn === -1) {\n uniqueEdges.push(edge);\n }\n else {\n uniqueEdges.splice(alreadyIn, 1);\n }\n }\n if (uniqueEdges.length < 3) {\n return null;\n }\n const polygons = [];\n const cleanupPolygon = (vertices) => {\n // check that the starting vertex is not repeated\n const { length } = vertices;\n const repeated = Utils.areClose(vertices[0], vertices[length - 1]);\n const retval = vertices.slice(0, repeated ? (length - 1) : length);\n // check sneaky starting in-segment vertex\n if (retval.length > 3 && Utils.inSegment(retval[0], [retval[1], retval[retval.length - 1]])) {\n retval.shift();\n }\n return retval;\n };\n // 3. order the boundary vertices by following the edges\n const [P0, P1] = uniqueEdges.shift();\n const boundaryVertices = [P0, P1];\n while (uniqueEdges.length > 1) {\n const lastVertex = boundaryVertices[boundaryVertices.length - 1];\n const nextEdgeIndex = uniqueEdges.findIndex(e => Utils.areClose(e[0], lastVertex) || Utils.areClose(e[1], lastVertex));\n // manage to return multiple polygons in case of multiple disconnected intersections\n // nextVertex could be null but uniqueEdges not empty, then move to another polygon to yield.\n if (nextEdgeIndex === -1) {\n // check that the starting vertex is not repeated\n polygons.push({ vertices: cleanupPolygon(boundaryVertices.splice(0)) });\n // start next polygon\n const [P2, P3] = uniqueEdges.shift();\n boundaryVertices.push(P2, P3);\n }\n else {\n const [nextEdge] = uniqueEdges.splice(nextEdgeIndex, 1);\n const nextVertex = Utils.areClose(nextEdge[0], lastVertex) ? nextEdge[1] : (Utils.areClose(nextEdge[1], lastVertex) ? nextEdge[0] : null);\n // cleanup past in-segment vertices\n if (boundaryVertices.length > 1 && Utils.inSegment(boundaryVertices[boundaryVertices.length - 1], [boundaryVertices[boundaryVertices.length - 2], nextVertex])) {\n boundaryVertices.splice(boundaryVertices.length - 1, 1, nextVertex);\n }\n else {\n boundaryVertices.push(nextVertex);\n }\n }\n }\n polygons.push({ vertices: cleanupPolygon(boundaryVertices) });\n return {\n polygons, mesh, triangles: triangles.map(vertices => { return { vertices }; })\n };\n }\n static mesh(point, ...points) {\n const vertices = [].concat(point).concat(points), triangleIndices = Delaunay.triangulate(vertices);\n return { vertices, triangleIndices };\n }\n static intersectLines(segment1, segment2, m2, q2) {\n let s1, s2;\n // overload 2 => m+q in pairs, reset as overload 1\n if (Array.isArray(segment1) && Array.isArray(segment2)\n && segment1.length === 2 && segment2.length === 2\n && typeof segment1[0] === 'number' && typeof segment2[0] === 'number' && typeof segment1[1] === 'number' && typeof segment2[1] === 'number') {\n // var type switch, instructions' order matter!\n m2 = segment2[0];\n q2 = segment2[1];\n segment2 = segment1[1];\n segment1 = segment1[0];\n }\n // overload 1?\n if (typeof segment1 === 'number' && typeof segment2 === 'number') {\n const m1 = segment1, q1 = segment2;\n // dummy segments\n s1 = [\n { x: 0, y: q1 },\n { x: 1, y: m1 + q1 }\n ];\n s2 = [\n { x: 0, y: q2 },\n { x: 1, y: m2 + q2 }\n ];\n }\n // overload 0\n else {\n s1 = segment1;\n s2 = segment2;\n }\n return Utils._intersectSegments(s1, s2, false);\n }\n static cramer(l1, l2) {\n if (Array.isArray(l1)) {\n l1 = { a: l1[0], b: l1[1], c: l1[2] };\n }\n if (Array.isArray(l2)) {\n l2 = { a: l2[0], b: l2[1], c: l2[2] };\n }\n let xP = (l1.b * l2.c - l1.c * l2.b) / (l1.b * l2.a - l1.a * l2.b), yP = (l1.c * l2.a - l1.a * l2.c) / (l1.b * l2.a - l1.a * l2.b);\n return { x: -xP.roundoff(), y: -yP.roundoff() };\n }\n static mq(arg0, p2) {\n let p1;\n if (isPoint(arg0)) {\n p1 = arg0;\n }\n else {\n p1 = arg0[0];\n p2 = arg0[1];\n }\n if (p1.x === p2.x) {\n return [Number.NaN, Number.NaN];\n }\n const m = (p2.y - p1.y) / (p2.x - p1.x);\n const q = p1.y - m * p1.x;\n return [m, q];\n }\n static _intersectSegments(segment1, segment2, excludeProjection) {\n // do bounding boxes intersect?\n const A = segment1[0], B = segment1[1], C = segment2[0], D = segment2[1], xAB = Math.min(A.x, B.x), yAB = Math.min(A.y, B.y), XAB = Math.max(A.x, B.x), wAB = XAB - xAB, YAB = Math.max(A.y, B.y), hAB = YAB - yAB, xCD = Math.min(C.x, D.x), yCD = Math.min(C.y, D.y), XCD = Math.max(C.x, D.x), wCD = XCD - xCD, YCD = Math.max(C.y, D.y), hCD = YCD - yCD;\n if (wAB === 0 && wCD === 0) {\n // both vertical segments (null or infinite intersections) return null\n return null;\n }\n if (hAB === 0 && hCD === 0) {\n // both horizontal segments (null or infinite intersections) return null\n return null;\n }\n // dry\n const outOfXBounds = (p) => {\n return p.x < xCD || p.x > XCD || p.x < xAB || p.x > XAB;\n };\n const outOfYBounds = (p) => {\n return p.y < yCD || p.y > YCD || p.y < yAB || p.y > YAB;\n };\n var retval = null;\n if (wAB === 0) {\n if (excludeProjection && (xCD > xAB || XCD < XAB)) {\n return null;\n }\n const mqCD = Utils.mq(C, D);\n retval = Utils.cramer([1, 0, -xAB], [mqCD[0], -1, mqCD[1]]);\n if (excludeProjection && outOfYBounds(retval)) {\n retval = null;\n }\n }\n else if (wCD === 0) {\n if (excludeProjection && (xAB > xCD || XAB < XCD)) {\n return null;\n }\n const mqAB = Utils.mq(A, B);\n retval = Utils.cramer([mqAB[0], -1, mqAB[1]], [1, 0, -xCD]);\n if (excludeProjection && outOfYBounds(retval)) {\n retval = null;\n }\n }\n else if (hAB === 0) {\n if (excludeProjection && (yCD > yAB || YCD < YAB)) {\n return null;\n }\n const mqCD = Utils.mq(C, D);\n retval = Utils.cramer([0, 1, -yAB], [mqCD[0], -1, mqCD[1]]);\n if (excludeProjection && outOfXBounds(retval)) {\n retval = null;\n }\n }\n else if (hCD === 0) {\n if (excludeProjection && (yAB > yCD || YAB < YCD)) {\n return null;\n }\n const mqAB = Utils.mq(A, B);\n retval = Utils.cramer([mqAB[0], -1, mqAB[1]], [0, 1, -yCD]);\n if (excludeProjection && outOfXBounds(retval)) {\n retval = null;\n }\n }\n else {\n let intersection;\n if (!excludeProjection ||\n ((intersection = Utils._intersectRects({ x: xAB, y: yAB, width: wAB, height: hAB }, { x: xCD, y: yCD, width: wCD, height: hCD }))\n && intersection.width > 0\n && intersection.height > 0)) {\n // cramer's rule\n const mqAB = Utils.mq(A, B), mqCD = Utils.mq(C, D);\n const mAB = mqAB[0], mCD = mqCD[0], qAB = mqAB[1], qCD = mqCD[1];\n // parallel os superposed segments yield null\n if (mAB !== mCD) {\n retval = Utils.cramer([mAB, -1, qAB], [mCD, -1, qCD]);\n let xR = retval.x, yR = retval.y;\n if (excludeProjection\n && (xR < intersection.x || xR > (intersection.x + intersection.width)\n || yR < intersection.y || yR > (intersection.y + intersection.height))) {\n retval = null;\n }\n }\n }\n }\n if (retval === null) {\n return null;\n }\n return { x: retval.x, y: retval.y };\n }\n static _intersectRects(...args) {\n return Rect.intersect(...args);\n }\n static _areClose(p1, p2, precision = PRECISION) {\n return Math.abs(p1.x - p2.x).isCloseTo(0, precision) && Math.abs(p1.y - p2.y).isCloseTo(0, precision);\n }\n static areClose(p1, p2, precision = PRECISION) {\n return Utils._areClose(p1, p2, precision);\n }\n /**\n * Returns the dot product between two vectors/points.\n * @param v1\n * @param v2\n */\n static dot(v1, v2) {\n return Vector.dot(v1, v2);\n }\n /**\n * Returns the cross product between two vectors/points (magnitude along the z axis).\n * @param v1\n * @param v2\n */\n static cross(v1, v2) {\n return Vector.cross(v1, v2);\n }\n static distance(p1, arg2) {\n if (isSegment(p1)) {\n return Point.distance(p1[0], p1[1]);\n }\n else if (isPoint(arg2)) {\n return Point.distance(p1, arg2);\n }\n else {\n const m = arg2[0], q = arg2[1];\n return Math.abs(m * p1.x - p1.y + q) / Math.sqrt(Math.pow(m, 2) + 1);\n }\n }\n static _pointSegmentDistance(p, segment) {\n const v1 = Vector.from(segment[0], segment[1]), v2 = Vector.from(segment[0], p);\n return Utils.cross(v1, v2);\n }\n static isWithin(p, segment, clockwise, precision = PRECISION) {\n const cross = Utils._pointSegmentDistance(p, segment);\n if (cross.isCloseTo(0, precision)) {\n return false;\n }\n return clockwise ? cross < 0 : cross > 0;\n }\n static isBeyond(p, segment, clockwise, precision = PRECISION) {\n return Utils.isWithin(p, segment, !clockwise, precision);\n }\n static inLine(p, segment, precision = PRECISION) {\n const cross = Utils._pointSegmentDistance(p, segment);\n return cross.isCloseTo(0, precision);\n }\n static inSegment(p, segment, precision = PRECISION) {\n const minx = Math.min(segment[0].x, segment[1].x), maxx = Math.max(segment[0].x, segment[1].x), miny = Math.min(segment[0].y, segment[1].y), maxy = Math.max(segment[0].y, segment[1].y);\n return p.x >= minx && p.x <= maxx && p.y >= miny && p.y <= maxy && Utils.inLine(p, segment, precision);\n }\n static inTriangle(p, triangle) {\n let last;\n for (let j = 0; j < 3; j++) {\n const p1 = triangle[j], p2 = triangle[(j + 1) % 3], v1 /* vector */ = Point.subtract(p2, p), v2 = Point.subtract(p1, p), current = Utils.cross(v1, v2);\n if (j > 0 && (current * last) <= 0) {\n // in the current 'triangle' we face a different direction,\n // then exit (:=not in polygon)\n return false;\n }\n last = current;\n }\n return true;\n }\n static inPolygon(p, vertices, precision = PRECISION) {\n if (!(vertices?.length >= 3)) {\n throw `Not enough vertices`;\n }\n const length = vertices.length;\n if (length === 3) {\n return Utils.inTriangle(p, [vertices[0], vertices[1], vertices[2]]);\n }\n if (precision > 0) {\n vertices = vertices.map(v => { return { x: v.x.roundoff(precision), y: v.y.roundoff(precision) }; });\n p = { x: p.x.roundoff(precision), y: p.y.roundoff(precision) };\n }\n // true polygon (might be concave, hulled, ...)\n // 1. preliminary bbox check\n let minx = Number.MAX_VALUE, miny = Number.MAX_VALUE, maxx = Number.MIN_VALUE, maxy = Number.MIN_VALUE;\n for (let j = 0; j < length; j++) {\n const v = vertices[j];\n minx = Math.min(minx, v.x);\n miny = Math.min(miny, v.y);\n maxx = Math.max(maxx, v.x);\n maxy = Math.max(maxy, v.y);\n }\n if (p.x < minx || p.x > maxx || p.y < miny || p.y > maxy) {\n return false;\n }\n // 2. intersections\n const /* dummy point 'left' to the left-most point of the shape and haivng the same 'y' of the target point */ outerPoint = { x: minx - 1, y: p.y }, \n /* horizontal segment that binds the provided point with the outside one */ test = [outerPoint, p];\n let intersections = 0;\n for (let j = 0; j < length; j++) {\n const p1 = vertices[j], p2 = vertices[(j + 1) % length], side = [p1, p2];\n // edge case\n if (p1.y === p.y) {\n const p0 = vertices[(j - 1 + length) % length];\n // not on the same side (above or below)? then counts as an intersection\n if (p.x > p1.x && (p0.y - p.y) * (p2.y - p.y) < 0) {\n intersections++;\n }\n }\n else if (p2.y === p.y) {\n // already handled at previous statement one loop ago, skip\n continue;\n }\n else {\n // straddle testing\n if (Utils.intersect(side, test) != null) {\n intersections++;\n }\n }\n }\n return intersections % 2 === 1;\n }\n static area(point, ...points) {\n const pts = [].concat(point).concat(points);\n // shoelace algorithm\n let retval = 0;\n const length = pts.length;\n if (length >= 3) {\n for (let j = 0; j < pts.length; j++) {\n const { x: xj, y: yj } = pts[j], next = j === (length - 1) ? 0 : j + 1, { x: xnext, y: ynext } = pts[next];\n retval += (xj * ynext - yj * xnext);\n }\n retval *= .5;\n }\n return Math.abs(retval.roundoff());\n }\n static convexHull(point, ...points) {\n const pts = [].concat(point).concat(points);\n if (!(pts?.length > 1)) {\n return pts?.slice() ?? [];\n }\n const sorted = pts\n .map(p => ({ x: p.x, y: p.y }))\n .sort((a, b) => a.x === b.x ? a.y - b.y : a.x - b.x);\n const unique = [];\n for (const p of sorted) {\n const last = unique[unique.length - 1];\n if (!last || last.x !== p.x || last.y !== p.y) {\n unique.push(p);\n }\n }\n if (unique.length <= 2) {\n return unique;\n }\n const cross = (o, a, b) => {\n return (a.x - o.x) * (b.y - o.y) - (a.y - o.y) * (b.x - o.x);\n };\n const lower = [];\n for (const p of unique) {\n while (lower.length >= 2\n && cross(lower[lower.length - 2], lower[lower.length - 1], p) <= 0) {\n lower.pop();\n }\n lower.push(p);\n }\n const upper = [];\n for (let j = unique.length - 1; j >= 0; j--) {\n const p = unique[j];\n while (upper.length >= 2\n && cross(upper[upper.length - 2], upper[upper.length - 1], p) <= 0) {\n upper.pop();\n }\n upper.push(p);\n }\n lower.pop();\n upper.pop();\n return lower.concat(upper);\n }\n}\n// }\n","import { Point, Matrix2D, Angle, NullChecker } from '@pacem/pacem-foundation';\n// namespace Pacem.Geometry {\nimport { Utils } from './geom';\nimport * as LinearAlgebra from './linear-algebra';\nfunction isPolygon(obj) {\n let vertices;\n return 'vertices' in obj && Array.isArray(obj.vertices)\n && (vertices = obj.vertices).length >= 3\n && vertices.every(i => Point.isPoint(i));\n}\nexport class Polygon {\n static { this._eps = 1e-12; }\n static isPolygon(obj) {\n return isPolygon(obj);\n }\n static from(...points) {\n return { vertices: Array.from(points) };\n }\n static contains(polygon, p) {\n return Utils.inPolygon(p, polygon.vertices, 12);\n }\n static centroid(polygon) {\n const bbox = Polygon.boundingBox(polygon);\n return { x: bbox.x + bbox.width / 2, y: bbox.y + bbox.height / 2 };\n }\n static boundingBox(polygon) {\n return Utils.boundingBox(polygon.vertices);\n }\n static sides(polygon) {\n const { vertices } = polygon;\n const retval = [];\n for (let j = 1; j <= vertices.length; j++) {\n const v = vertices[j % vertices.length], v0 = vertices[j - 1];\n retval.push([v0, v]);\n }\n return retval;\n }\n static isConvex(polygon) {\n const { vertices } = polygon, l = vertices.length;\n if (l <= 3) {\n return true;\n }\n let sign = 0;\n for (let j = 0; j < vertices.length; j++) {\n const p0 = vertices[(j - 1 + l) % l], p = vertices[j], p1 = vertices[(j + 1) % l];\n const theta = Angle.angleBetween(p, p0, p1);\n //if (Math.abs(theta) > Math.PI) {\n // return false;\n //}\n if (sign === 0) {\n sign = Math.sign(theta);\n continue;\n }\n if (sign != Math.sign(theta)) {\n return false;\n }\n }\n return true;\n }\n /**\n * Check whether a polygon is a self-intersecting one.\n * @param polygon\n * @returns\n */\n static isSelfIntersecting(polygon) {\n const { vertices } = polygon;\n if (vertices.length <= 3) {\n return false;\n }\n const sides = Polygon.sides(polygon);\n for (let side of sides) {\n for (let check of sides) {\n if ( /* same */check === side || /* contiguous */ check[0] === side[1] || side[0] === check[1]) {\n continue;\n }\n const intersection = Utils.intersect(check, side);\n if (!NullChecker.isNull(intersection)) {\n return true;\n }\n }\n }\n return false;\n }\n /**\n * Returns whether the vertices of the spcified polygon have been provided in counter-clockwise order.\n * Meaningless in case of self-intersecting polygons.\n * @param polygon\n * @returns\n */\n static isCounterClockwise(polygon) {\n const { vertices: [p0, p1, p2] } = polygon;\n return Angle.angleBetween(p1, p0, p2) > 0; /* ccw angle <=> cw polygon and viceversa */\n }\n /**\n * Expands (or contracts) a polygon by a provided offset.\n * @param polygon\n * @param offset\n *\n */\n static expand(polygon, offset) {\n // TODO: https://en.wikipedia.org/wiki/Straight_skeleton\n const { vertices } = polygon, l = vertices.length, retval = [];\n for (let j = 0; j < vertices.length; j++) {\n const p0 = vertices[(j - 1 + l) % l], p = vertices[j], p1 = vertices[(j + 1) % l];\n const theta = Angle.angleBetween(p, p0, p1), scale = -offset / Math.sin(Math.abs(theta) / 2);\n const matrix = Matrix2D.scale(Matrix2D.identity, scale);\n const v0 = Point.subtract(p, p0);\n LinearAlgebra.Vector.normalize(v0);\n const v1 = Point.subtract(p, p1);\n LinearAlgebra.Vector.normalize(v1);\n const vector = Point.add(v0, v1);\n LinearAlgebra.Vector.normalize(vector);\n const pOffset = Matrix2D.multiply(vector, matrix);\n retval.push(Point.add(p, { x: pOffset.x.roundoff(), y: pOffset.y.roundoff() }));\n }\n return { vertices: retval };\n }\n /**\n * Returns the area of a polygon using the shoelace algorithm. It's meaningless in case of self-intersecting polygons.\n * @param polygon\n * @returns\n */\n static area(polygon) {\n return Utils.area(polygon.vertices);\n }\n static intersect(polygon1, polygon2) {\n return Utils.intersect(polygon1, polygon2);\n }\n /**\n * Returns the convex hull of a polygon.\n * @param polygon\n * @returns\n */\n static convexHull(polygon) {\n const vertices = Utils.convexHull(polygon.vertices);\n return { vertices };\n }\n}\n//}\n","import { parseAsNumericalArray } from '@pacem/pacem-foundation';\n// namespace Pacem.Geometry.LinearAlgebra {\nconst RAD2DEG = 180.0 / Math.PI;\nconst DEG2RAD = 1.0 / RAD2DEG;\nexport class Vector3D {\n static from(...args) {\n const l = 3;\n if (args.length !== l) {\n throw new RangeError(`Must provide exactly ${l} numbers`);\n }\n return { x: args[0], y: args[1], z: args[2] };\n }\n static parse(input) {\n const arr = parseAsNumericalArray(input);\n if (arr && arr.length === 3) {\n return Vector3D.from.apply(null, arr);\n }\n throw new Error(`Cannot parse \"${input}\" as a valid Vector3D.`);\n }\n // notable vectors\n static i() {\n return { x: 1, y: 0, z: 0 };\n }\n static j() {\n return { x: 0, y: 1, z: 0 };\n }\n static k() {\n return { x: 0, y: 0, z: 1 };\n }\n static zero() {\n return { x: 0, y: 0, z: 0 };\n }\n /**\n * Subtracts a point p from another and returns the resulting vector.\n * @param p Point to subtract\n * @param from Point to be subtracted from\n */\n static subtract(p, from) {\n return { x: from.x - p.x, y: from.y - p.y, z: from.z - p.z };\n }\n /**\n * Adds a set of points together and returns the resulting vector.\n * @param points Points to add\n */\n static add(...points) {\n var point = { x: 0, y: 0, z: 0 };\n for (var p of points) {\n point.x += p.x;\n point.y += p.y;\n point.z += p.z;\n }\n return point;\n }\n /**\n * Returns the dot product between two vectors/points.\n * @param v1\n * @param v2\n */\n static dot(v1, v2) {\n return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z;\n }\n /**\n * Returns the cross product between two vectors/points (as a vector itself).\n * @param v1\n * @param v2\n */\n static cross(v1, v2) {\n return {\n x: (v1.y * v2.z) - (v1.z * v2.y),\n y: (v1.z * v2.x) - (v1.x * v2.z),\n z: (v1.x * v2.y) - (v1.y * v2.x)\n };\n }\n static scale(v, fx, fy = fx, fz = fx) {\n return { x: v.x * fx, y: v.y * fy, z: v.z * fz };\n }\n static magSqr(v) {\n return v.x * v.x + v.y * v.y + v.z * v.z;\n }\n /**\n * Checks if the two points are effectively the same location.\n * @param v1 The first point.\n * @param v2 The second point.\n * @returns True if the points are considered coincident within tolerance; otherwise, false.\n */\n static areClose(v1, v2) {\n return (v2.x - v1.x).isCloseTo(0)\n && (v2.y - v1.y).isCloseTo(0)\n && (v2.z - v1.z).isCloseTo(0);\n }\n static mag(v) {\n return Math.sqrt(Vector3D.magSqr(v));\n }\n static negate(v) {\n return { x: -v.x, y: -v.y, z: -v.z };\n }\n /**\n * Returns the unit (normalized) vector having the same direction and sense of the provided one.\n * @param v\n */\n static unit(v) {\n const clone = { x: v.x, y: v.y, z: v.z };\n this.normalize(clone);\n return clone;\n }\n /**\n * Normalizes the provided vector in place.\n * @param v\n */\n static normalize(v) {\n const l = Vector3D.mag(v);\n if (l <= 0) {\n throw 'Cannot normalize a vector of length 0.';\n }\n const inv = 1 / l;\n v.x *= inv;\n v.y *= inv;\n v.z *= inv;\n }\n /**\n * Returns the angle (in degrees) between two vectors.\n * @param vector1\n * @param vector2\n */\n static angleBetween(vector1, vector2) {\n let num;\n const v1 = Vector3D.unit(vector1);\n const v2 = Vector3D.unit(vector2);\n const dot = Vector3D.dot(v1, v2);\n if (dot < 0.0) {\n const vectord = { x: -v1.x - v2.x, y: -v1.y - v2.y, z: -v1.z - v2.z };\n const length = Vector3D.mag(vectord);\n num = Math.PI - (2.0 * Math.asin(length / 2.0));\n }\n else {\n const vectord = { x: v1.x - v2.x, y: v1.y - v2.y, z: v1.z - v2.z };\n const length = Vector3D.mag(vectord);\n num = 2.0 * Math.asin(length / 2.0);\n }\n return RAD2DEG * num;\n }\n}\nexport class Spherical {\n /**\n * Creates a new {@link Spherical} object.\n * @param rho radius.\n * @param theta Azimuth angle in degrees.\n * @param phi Polar angle in degrees.\n * @returns\n */\n static from(rho, theta, phi) {\n return { rho: rho.clamp(0, Infinity), theta: theta.clamp(-180, 180), phi: phi.clamp(0, 360) };\n }\n static fromVector(v, y, z) {\n if (typeof v === 'number') {\n v = Vector3D.from(v, y, z);\n }\n const rho = Vector3D.mag(v);\n if (rho.isCloseTo(0)) {\n return Spherical.from(0, 0, 0);\n }\n const theta = Math.atan2(v.x, v.z), phi = Math.acos((v.y / rho).clamp(-1, 1));\n return Spherical.from(rho, theta * RAD2DEG, phi * RAD2DEG);\n }\n static toVector(coords) {\n const { rho, theta: thetaDeg, phi: phiDeg } = coords;\n const phi = phiDeg * DEG2RAD;\n const theta = thetaDeg * DEG2RAD;\n const sinPhiRho = Math.sin(phi) * rho;\n return {\n x: sinPhiRho * Math.sin(theta),\n y: Math.cos(phi) * rho,\n z: sinPhiRho * Math.cos(theta)\n };\n //const t = DEG2RAD * theta,\n // sinTheta = Math.sin(t),\n // cosTheta = Math.cos(t),\n // p = DEG2RAD * phi,\n // sinPhi = Math.sin(p),\n // cosPhi = Math.cos(p);\n //const m = Matrix3D.from(\n // sinTheta * cosPhi, cosTheta * cosPhi, -sinPhi, 0,\n // sinTheta * sinPhi, cosTheta * sinPhi, cosPhi, 0,\n // cosTheta, -sinTheta, 0, 0,\n // 0, 0, 0, 1\n //);\n //return Matrix3D.transform({ x: rho, y: t, z: p }, m);\n }\n static toRotationMatrix(coords) {\n const { theta, phi } = coords;\n const t = DEG2RAD * theta, sinTheta = Math.sin(t), cosTheta = Math.cos(t), p = DEG2RAD * phi, sinPhi = Math.sin(p), cosPhi = Math.cos(p);\n return Matrix3D.from(sinTheta * cosPhi, sinTheta * sinPhi, cosTheta, 0, cosTheta * cosPhi, cosTheta * sinPhi, -sinTheta, 0, -sinPhi, cosPhi, 0, 0, 0, 0, 0, 1);\n }\n}\nclass Matrix3DUtils {\n /**\n * Modifies the content of a provided matrix and returns it as a new matrix instance.\n * @param m Input matrix\n * @param action Content change callback\n * @returns New matrix instance.\n */\n static modify(m, action) {\n const { m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, offsetX, offsetY, offsetZ, m44 } = m;\n const retval = {\n m11, m12, m13, m14,\n m21, m22, m23, m24,\n m31, m32, m33, m34,\n offsetX, offsetY, offsetZ, m44\n };\n action(retval);\n return retval;\n }\n static clone(m) {\n return Matrix3DUtils.modify(m, _ => { });\n }\n static multiply(m1, m2) {\n if (Matrix3D.isIdentity(m1))\n return m2;\n if (Matrix3D.isIdentity(m2))\n return m1;\n return Matrix3D.from((((m1.m11 * m2.m11) + (m1.m12 * m2.m21)) + (m1.m13 * m2.m31)) + (m1.m14 * m2.offsetX), (((m1.m11 * m2.m12) + (m1.m12 * m2.m22)) + (m1.m13 * m2.m32)) + (m1.m14 * m2.offsetY), (((m1.m11 * m2.m13) + (m1.m12 * m2.m23)) + (m1.m13 * m2.m33)) + (m1.m14 * m2.offsetZ), (((m1.m11 * m2.m14) + (m1.m12 * m2.m24)) + (m1.m13 * m2.m34)) + (m1.m14 * m2.m44), (((m1.m21 * m2.m11) + (m1.m22 * m2.m21)) + (m1.m23 * m2.m31)) + (m1.m24 * m2.offsetX), (((m1.m21 * m2.m12) + (m1.m22 * m2.m22)) + (m1.m23 * m2.m32)) + (m1.m24 * m2.offsetY), (((m1.m21 * m2.m13) + (m1.m22 * m2.m23)) + (m1.m23 * m2.m33)) + (m1.m24 * m2.offsetZ), (((m1.m21 * m2.m14) + (m1.m22 * m2.m24)) + (m1.m23 * m2.m34)) + (m1.m24 * m2.m44), (((m1.m31 * m2.m11) + (m1.m32 * m2.m21)) + (m1.m33 * m2.m31)) + (m1.m34 * m2.offsetX), (((m1.m31 * m2.m12) + (m1.m32 * m2.m22)) + (m1.m33 * m2.m32)) + (m1.m34 * m2.offsetY), (((m1.m31 * m2.m13) + (m1.m32 * m2.m23)) + (m1.m33 * m2.m33)) + (m1.m34 * m2.offsetZ), (((m1.m31 * m2.m14) + (m1.m32 * m2.m24)) + (m1.m33 * m2.m34)) + (m1.m34 * m2.m44), (((m1.offsetX * m2.m11) + (m1.offsetY * m2.m21)) + (m1.offsetZ * m2.m31)) + (m1.m44 * m2.offsetX), (((m1.offsetX * m2.m12) + (m1.offsetY * m2.m22)) + (m1.offsetZ * m2.m32)) + (m1.m44 * m2.offsetY), (((m1.offsetX * m2.m13) + (m1.offsetY * m2.m23)) + (m1.offsetZ * m2.m33)) + (m1.m44 * m2.offsetZ), (((m1.offsetX * m2.m14) + (m1.offsetY * m2.m24)) + (m1.offsetZ * m2.m34)) + (m1.m44 * m2.m44));\n }\n}\nexport class Matrix3D {\n //#region notable matrices\n /**\n * Identity 4x4 matrix.\n * @returns\n */\n static identity() {\n return {\n m11: 1, m12: 0, m13: 0, m14: 0,\n m21: 0, m22: 1, m23: 0, m24: 0,\n m31: 0, m32: 0, m33: 1, m34: 0,\n offsetX: 0, offsetY: 0, offsetZ: 0, m44: 1\n };\n }\n //#endregion\n static from(...args) {\n const l = 16;\n if (args.length !== l) {\n throw new RangeError(`Must provide exactly ${l} numbers`);\n }\n return {\n m11: args[0],\n m12: args[1],\n m13: args[2],\n m14: args[3],\n m21: args[4],\n m22: args[5],\n m23: args[6],\n m24: args[7],\n m31: args[8],\n m32: args[9],\n m33: args[10],\n m34: args[11],\n offsetX: args[12],\n offsetY: args[13],\n offsetZ: args[14],\n m44: args[15]\n };\n }\n static transpose(m) {\n return Matrix3D.from(m.m11, m.m21, m.m31, m.offsetX, m.m12, m.m22, m.m32, m.offsetY, m.m13, m.m23, m.m33, m.offsetZ, m.m14, m.m24, m.m34, m.m44);\n }\n static toArray(m) {\n return [m.m11, m.m12, m.m13, m.m14,\n m.m21, m.m22, m.m23, m.m24,\n m.m31, m.m32, m.m33, m.m34,\n m.offsetX, m.offsetY, m.offsetZ, m.m44];\n }\n static clone(m, modifier) {\n return typeof modifier === 'function' ? Matrix3DUtils.modify(m, modifier) : Matrix3DUtils.clone(m);\n }\n static scale(m, x, y, z) {\n if (typeof x === 'number') {\n y ??= x;\n z ??= x;\n }\n else {\n z = x.z;\n y = x.y;\n x = x.x;\n }\n return Matrix3DUtils.modify(m, s => {\n s.m11 *= x;\n s.m22 *= y;\n s.m33 *= z;\n });\n }\n static translate(m, offset) {\n return Matrix3DUtils.modify(m, s => {\n s.offsetX += offset.x;\n s.offsetY += offset.y;\n s.offsetZ += offset.z;\n });\n }\n static parse(input) {\n const arr = parseAsNumericalArray(input);\n if (arr && arr.length === 16) {\n return Matrix3D.from.apply(null, arr);\n }\n throw new Error(`Cannot parse \"${input}\" as a valid Matrix3D.`);\n }\n static isIdentity(m) {\n return m.m11 == 1.0 && m.m12 == .0 && m.m13 == .0 && m.m14 == .0\n && m.m21 == .0 && m.m22 == 1.0 && m.m23 == .0 && m.m24 == .0\n && m.m31 == .0 && m.m32 == .0 && m.m33 == 1.0 && m.m34 == .0\n && m.offsetX == .0 && m.offsetY == .0 && m.offsetZ == .0 && m.m44 == 1.0;\n }\n static isAffine(m) {\n return m.m14 == .0 && m.m24 == .0 && m.m34 == .0 && m.m44 == 1.0;\n }\n static determinant(m) {\n if (Matrix3D.isIdentity(m)) {\n return 1.0;\n }\n else if (Matrix3D.isAffine(m)) {\n return m.m11 * (m.m22 * m.m33 - m.m32 * m.m23)\n - m.m12 * (m.m21 * m.m33 - m.m31 * m.m23)\n + m.m13 * (m.m21 * m.m32 - m.m31 * m.m22);\n }\n else {\n const num6 = (m.m13 * m.m24) - (m.m23 * m.m14);\n const num5 = (m.m13 * m.m34) - (m.m33 * m.m14);\n const num4 = (m.m13 * m.m44) - (m.offsetZ * m.m14);\n const num3 = (m.m23 * m.m34) - (m.m33 * m.m24);\n const num2 = (m.m23 * m.m44) - (m.offsetZ * m.m24);\n const num = (m.m33 * m.m44) - (m.offsetZ * m.m34);\n const num10 = ((m.m22 * num5) - (m.m32 * num6)) - (m.m12 * num3);\n const num9 = ((m.m12 * num2) - (m.m22 * num4)) + (m.offsetY * num6);\n const num8 = ((m.m32 * num4) - (m.offsetY * num5)) - (m.m12 * num);\n const num7 = ((m.m22 * num) - (m.m32 * num2)) + (m.offsetY * num3);\n const det = ((((m.offsetX * num10) + (m.m31 * num9)) + (m.m21 * num8)) + (m.m11 * num7));\n return det;\n }\n }\n /**\n * Multiplies two matrices in the provided order (i.e.: applies {@link m2} to {@link m1}).\n * @param matrices Matrices to apply one to the other, sequentially.\n * @returns Combination matrix.\n */\n static multiply(...matrices) {\n if (matrices.length === 0) {\n throw new ReferenceError('Matrix not provided.');\n }\n const arr = Array.from(matrices);\n let m = arr[0];\n for (let i = 1; i < arr.length; i++) {\n m = Matrix3DUtils.multiply(m, arr[i]);\n }\n return m;\n }\n static invert(m) {\n if (Matrix3D.isAffine(m)) {\n // normalize affine invert\n const determinant = Matrix3D.determinant(m);\n if (determinant == 0.0) {\n return null;\n }\n const cofactor31 = (m.m12 * m.m23) - (m.m22 * m.m13);\n const cofactor21 = (m.m32 * m.m13) - (m.m12 * m.m33);\n const cofactor11 = (m.m22 * m.m33) - (m.m32 * m.m23);\n //\n const num20 = (m.m21 * m.m13) - (m.m11 * m.m23);\n const num19 = (m.m11 * m.m33) - (m.m31 * m.m13);\n const num18 = (m.m31 * m.m23) - (m.m21 * m.m33);\n const num7 = (m.m11 * m.m22) - (m.m21 * m.m12);\n const num6 = (m.m11 * m.m32) - (m.m31 * m.m12);\n const num5 = (m.m11 * m.offsetY) - (m.offsetX * m.m12);\n const num4 = (m.m21 * m.m32) - (m.m31 * m.m22);\n const num3 = (m.m21 * m.offsetY) - (m.offsetX * m.m22);\n const num2 = (m.m31 * m.offsetY) - (m.offsetX * m.m32);\n const num17 = ((m.m23 * num5) - (m.offsetZ * num7)) - (m.m13 * num3);\n const num16 = ((m.m13 * num2) - (m.m33 * num5)) + (m.offsetZ * num6);\n const num15 = ((m.m33 * num3) - (m.offsetZ * num4)) - (m.m23 * num2);\n const num14 = num7;\n const num13 = -num6;\n const num12 = num4;\n const invdet = 1.0 / determinant;\n return Matrix3D.from(cofactor11 * invdet, cofactor21 * invdet, cofactor31 * invdet, .0, num18 * invdet, num19 * invdet, num20 * invdet, .0, num12 * invdet, num13 * invdet, num14 * invdet, .0, num15 * invdet, num16 * invdet, num17 * invdet, 1.0);\n }\n else {\n const determinant = Matrix3D.determinant(m);\n if (determinant == 0.0) {\n return null;\n }\n const num1 = m.m33 * m.m44 - m.m34 * m.offsetZ;\n const num2 = m.m32 * m.m44 - m.m34 * m.offsetY;\n const num3 = m.m31 * m.m44 - m.m34 * m.offsetX;\n const num4 = m.m32 * m.offsetZ - m.m33 * m.offsetY;\n const num5 = m.m31 * m.offsetZ - m.m33 * m.offsetX;\n const num6 = m.m31 * m.offsetY - m.m32 * m.offsetX;\n const num7 = m.m33 * m.m44 - m.m34 * m.offsetZ;\n const num8 = m.m32 * m.m44 - m.m34 * m.offsetY;\n const num9 = m.m31 * m.m44 - m.m34 * m.offsetX;\n const num10 = m.m32 * m.offsetZ - m.m33 * m.offsetY;\n const num11 = m.m31 * m.offsetZ - m.m33 * m.offsetX;\n const num12 = m.m31 * m.offsetY - m.m32 * m.offsetX;\n const num13 = m.m23 * m.m44 - m.m24 * m.offsetZ;\n const num14 = m.m22 * m.m44 - m.m24 * m.offsetY;\n const num15 = m.m21 * m.m44 - m.m24 * m.offsetX;\n const num16 = m.m22 * m.offsetZ - m.m23 * m.offsetY;\n const num17 = m.m21 * m.offsetZ - m.m23 * m.offsetX;\n const num18 = m.m21 * m.offsetY - m.m22 * m.offsetX;\n const num19 = m.m23 * m.m34 - m.m24 * m.m33;\n const num20 = m.m22 * m.m34 - m.m24 * m.m32;\n const num21 = m.m21 * m.m34 - m.m24 * m.m31;\n const num22 = m.m22 * m.m33 - m.m23 * m.m32;\n const num23 = m.m21 * m.m33 - m.m23 * m.m31;\n const num24 = m.m21 * m.m32 - m.m22 * m.m31;\n const cofactor11 = (m.m22 * num1 - m.m23 * num2 + m.m24 * num4);\n const cofactor12 = -(m.m21 * num1 - m.m23 * num3 + m.m24 * num5);\n const cofactor13 = (m.m21 * num2 - m.m22 * num3 + m.m24 * num6);\n const cofactor14 = -(m.m21 * num4 - m.m22 * num5 + m.m23 * num6);\n const cofactor21 = -(m.m12 * num7 - m.m13 * num8 + m.m14 * num10);\n const cofactor22 = (m.m11 * num7 - m.m13 * num9 + m.m14 * num11);\n const cofactor23 = -(m.m11 * num8 - m.m12 * num9 + m.m14 * num12);\n const cofactor24 = (m.m11 * num10 - m.m12 * num11 + m.m13 * num12);\n const cofactor31 = (m.m12 * num13 - m.m13 * num14 + m.m14 * num16);\n const cofactor32 = -(m.m11 * num13 - m.m13 * num15 + m.m14 * num17);\n const cofactor33 = (m.m11 * num14 - m.m12 * num15 + m.m14 * num18);\n const cofactor34 = -(m.m11 * num16 - m.m12 * num17 + m.m13 * num18);\n const cofactor41 = -(m.m12 * num19 - m.m13 * num20 + m.m14 * num22);\n const cofactor42 = (m.m11 * num19 - m.m13 * num21 + m.m14 * num23);\n const cofactor43 = -(m.m11 * num20 - m.m12 * num21 + m.m14 * num24);\n const cofactor44 = (m.m11 * num22 - m.m12 * num23 + m.m13 * num24);\n const inverseDet = 1.0 / determinant;\n return Matrix3D.from(cofactor11 * inverseDet, cofactor21 * inverseDet, cofactor31 * inverseDet, cofactor41 * inverseDet, cofactor12 * inverseDet, cofactor22 * inverseDet, cofactor32 * inverseDet, cofactor42 * inverseDet, cofactor13 * inverseDet, cofactor23 * inverseDet, cofactor33 * inverseDet, cofactor43 * inverseDet, cofactor14 * inverseDet, cofactor24 * inverseDet, cofactor34 * inverseDet, cofactor44 * inverseDet);\n }\n }\n /**\n * Moves a given point in 3D space given the transformation matrix.\n * @param point\n * @param matrix\n */\n static transform(point, matrix) {\n var pt = { x: point.x, y: point.y, z: point.z };\n if (!Matrix3D.isIdentity(matrix)) {\n var x = pt.x;\n var y = pt.y;\n var z = pt.z;\n pt.x = (((x * matrix.m11) + (y * matrix.m21)) + (z * matrix.m31)) + matrix.offsetX;\n pt.y = (((x * matrix.m12) + (y * matrix.m22)) + (z * matrix.m32)) + matrix.offsetY;\n pt.z = (((x * matrix.m13) + (y * matrix.m23)) + (z * matrix.m33)) + matrix.offsetZ;\n if (!Matrix3D.isAffine(matrix)) {\n var num4 = (((x * matrix.m14) + (y * matrix.m24)) + (z * matrix.m34)) + matrix.m44;\n if (num4 != .0) {\n pt.x /= num4;\n pt.y /= num4;\n pt.z /= num4;\n }\n }\n }\n return pt;\n }\n}\nexport class Quaternion {\n static identity() {\n return Quaternion.from(0, 0, 0, 1);\n }\n static from(...args) {\n const l = 4;\n if (args.length !== l) {\n throw new RangeError(`Must provide exactly ${l} numbers`);\n }\n return {\n x: args[0],\n y: args[1],\n z: args[2],\n w: args[3],\n };\n }\n static parse(input) {\n const arr = parseAsNumericalArray(input);\n if (arr && arr.length === 4) {\n return Quaternion.from.apply(null, arr);\n }\n throw new Error(`Cannot parse \"${input}\" as a valid Quaternion.`);\n }\n static fromVectors(from, to) {\n // setup\n Vector3D.normalize(from);\n Vector3D.normalize(to);\n const yieldQ = (x, y, z, w) => {\n const retval = Quaternion.from(x, y, z, w);\n Quaternion.normalize(retval);\n return retval;\n };\n // process\n let r = Vector3D.dot(from, to) + 1;\n if (r.isCloseTo(0)) {\n if (Math.abs(from.x) > Math.abs(from.z)) {\n return yieldQ(-from.y, from.x, 0, /* r */ 0);\n }\n return yieldQ(0, -from.z, from.y, /* r */ 0);\n }\n else {\n return yieldQ(from.y * to.z - from.z * to.y, from.z * to.x - from.x * to.z, from.x * to.y - from.y * to.x, r);\n }\n }\n /**\n * In-place normalizarion of the provided quaternion\n * @param q {Quaternion}\n */\n static normalize(q) {\n const l = Quaternion.mag(q);\n if (l.isCloseTo(0)) {\n q.x = q.y = q.z = 0;\n q.w = 1;\n }\n else {\n const f = 1 / l;\n q.x *= f;\n q.y *= f;\n q.z *= f;\n q.w *= f;\n }\n }\n /**\n * Returns a normalized copy of the source quaternion.\n * @param q {Quaternion}\n */\n static unit(q) {\n const clone = Quaternion.from(q.x, q.y, q.z, q.w);\n Quaternion.normalize(clone);\n return clone;\n }\n /**\n * Creates a quaternion instance given the rotation axis and an angle (in degrees).\n * @param axis\n * @param angleDeg\n */\n static fromAxisAngle(axis, angleDeg) {\n angleDeg %= 360.0;\n var angleInRadians = DEG2RAD * angleDeg;\n var length = Vector3D.mag(axis);\n if (length == 0.0) {\n throw new RangeError('Invalid argument');\n }\n var factor = Math.sin(0.5 * angleInRadians) / length;\n var x = axis.x * factor;\n var y = axis.y * factor;\n var z = axis.z * factor;\n return Quaternion.from(x, y, z, Math.cos(.5 * angleInRadians));\n }\n /**\n * Creates a quaternion instance given the rotation matrix.\n * @param rotationMatrix\n */\n static fromRotationMatrix(rotationMatrix) {\n const trace = rotationMatrix.m11 + rotationMatrix.m22 + rotationMatrix.m33 + rotationMatrix.m44;\n if (trace > 0) {\n const sq = 0.5 / Math.sqrt(trace);\n const w = 0.25 / sq;\n const x = (rotationMatrix.m23 - rotationMatrix.m32) * sq;\n const y = (rotationMatrix.m31 - rotationMatrix.m13) * sq;\n const z = (rotationMatrix.m12 - rotationMatrix.m21) * sq;\n return Quaternion.from(x, y, z, w);\n }\n else {\n if (rotationMatrix.m11 > rotationMatrix.m22 && rotationMatrix.m11 > rotationMatrix.m22) {\n const sq = 0.5 / Math.sqrt(rotationMatrix.m44 + rotationMatrix.m11 - rotationMatrix.m22 - rotationMatrix.m33);\n const w = (rotationMatrix.m23 - rotationMatrix.m32) * sq;\n const x = 0.25 / sq;\n const y = (rotationMatrix.m12 + rotationMatrix.m21) * sq;\n const z = (rotationMatrix.m31 + rotationMatrix.m13) * sq;\n return Quaternion.from(x, y, z, w);\n }\n else if (rotationMatrix.m22 > rotationMatrix.m33) {\n const sq = .5 / Math.sqrt(rotationMatrix.m44 + rotationMatrix.m22 - rotationMatrix.m11 - rotationMatrix.m33);\n const z = (rotationMatrix.m23 + rotationMatrix.m32) * sq;\n const y = 0.25 / sq;\n const x = (rotationMatrix.m12 + rotationMatrix.m21) * sq;\n const w = (rotationMatrix.m31 - rotationMatrix.m13) * sq;\n return Quaternion.from(x, y, z, w);\n }\n else {\n const sq = .5 / Math.sqrt(rotationMatrix.m44 + rotationMatrix.m33 - rotationMatrix.m11 - rotationMatrix.m22);\n const y = (rotationMatrix.m23 + rotationMatrix.m32) * sq;\n const z = 0.25 / sq;\n const w = (rotationMatrix.m12 - rotationMatrix.m21) * sq;\n const x = (rotationMatrix.m31 - rotationMatrix.m13) * sq;\n return Quaternion.from(x, y, z, w);\n }\n }\n }\n static conjugate(q) {\n return Quaternion.from(-q.x, -q.y, -q.z, q.w);\n }\n /**\n * Returns the magnitude/length of the provided quaternion.\n * @param q {Quaternion}\n */\n static mag(q) {\n return Math.sqrt(q.x * q.x + q.y * q.y + q.z * q.z + q.w * q.w);\n }\n static norm(q) {\n return (q.x * q.x + q.y * q.y + q.z * q.z);\n }\n static axis(q) {\n if (q.x == .0 && q.y == .0 && q.z == .0) {\n return Vector3D.j();\n }\n return Vector3D.unit(q);\n }\n static transform(v, q) {\n Quaternion.normalize(q);\n const cross = Vector3D.cross(q, v);\n const t = Vector3D.scale(cross, 2);\n const tCross = Vector3D.cross(q, t);\n return {\n x: v.x + q.w * t.x + tCross.x,\n y: v.y + q.w * t.y + tCross.y,\n z: v.z + q.w * t.z + tCross.z,\n };\n }\n /**\n * Returns the rotation angle (in degrees) of the provided quaternion.\n * @param q\n */\n static angle(q) {\n let y = Math.sqrt(q.x * q.x + q.y * q.y + q.z * q.z);\n let x = q.w;\n if (y > Number.MAX_VALUE) {\n const num = Math.max(Math.abs(q.x), Math.max(Math.abs(q.y), Math.abs(q.z)));\n const num5 = q.x / num;\n const num4 = q.y / num;\n const num3 = q.z / num;\n y = Math.sqrt(((num5 * num5) + (num4 * num4)) + (num3 * num3));\n x /= num;\n }\n return (Math.atan2(y, x) * 114.59155902616465);\n }\n static toRotationMatrix(q) {\n var m = Matrix3D.identity();\n var X = q.x;\n var Y = q.y;\n var Z = q.z;\n var W = q.w;\n m.m11 = 1.0 - 2.0 * Y * Y - 2.0 * Z * Z;\n m.m12 = 2.0 * X * Y + 2.0 * W * Z;\n m.m13 = 2.0 * X * Z - 2.0 * W * Y;\n m.m21 = 2.0 * X * Y - 2.0 * W * Z;\n m.m22 = 1.0 - 2.0 * X * X - 2.0 * Z * Z;\n m.m23 = 2.0 * Y * Z + 2.0 * W * X;\n m.m31 = 2.0 * W * Y + 2.0 * X * Z;\n m.m32 = 2.0 * Y * Z - 2.0 * W * X;\n m.m33 = 1.0 - 2.0 * X * X - 2.0 * Y * Y;\n return m;\n }\n static invert(q) {\n const n = Quaternion.unit(q);\n return Quaternion.conjugate(n);\n }\n /**\n * Combines two quaternions.\n * @param q1\n * @param q2\n */\n static multiply(q1, q2) {\n return Quaternion.from(q1.w * q2.x + q1.x + q2.w + q1.y * q2.z - q1.z * q2.y, q1.w * q2.y - q1.x * q2.z + q1.y * q2.w + q1.z * q2.x, q1.w * q2.z + q1.x * q2.y - q1.y * q2.x + q1.z * q2.w, q1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z);\n }\n /**\n * Returns the dot product of two quaternions.\n * @param q1\n * @param q2\n */\n static dot(q1, q2) {\n var q = Quaternion.multiply(q1, Quaternion.conjugate(q2));\n return q.w;\n }\n}\n// #endregion\n//}\n","// namespace Pacem.Mathematics {\nfunction complex(c) {\n if (typeof c === 'number') {\n c = { real: c, img: 0 };\n }\n return c;\n}\nvar NOT_A_COMPLEX;\nfunction buildComplex(real, img) {\n const c = {};\n Object.defineProperty(c, 'real', { value: real, writable: false });\n Object.defineProperty(c, 'img', { value: img, writable: false });\n return c;\n}\nfunction nac() {\n return NOT_A_COMPLEX || (NOT_A_COMPLEX = buildComplex(Number.NaN, Number.NaN));\n}\nexport class Complex {\n static build(real, img) {\n if (this.isComplex(real)) {\n return real;\n }\n img ??= 0;\n if (typeof real != 'number' || typeof img != 'number') {\n return nac();\n }\n return buildComplex(real, img || 0);\n }\n static add(a, b) {\n const ac = complex(a), bc = complex(b);\n return buildComplex(ac.real + bc.real, ac.img + bc.img);\n }\n static subtract(from, what) {\n const ac = complex(from), bc = complex(what);\n return buildComplex(ac.real - bc.real, ac.img - bc.img);\n }\n static multiply(a, b) {\n const ac = complex(a), bc = complex(b);\n return buildComplex(\n /* real*/ ac.real * bc.real - ac.img * bc.img, \n /* img */ ac.real * bc.img + ac.img * bc.real);\n }\n static divide(a, b) {\n const ac = complex(a), bc = complex(b);\n const div = this.absSquare(bc).roundoff();\n if (div === 0) {\n return nac();\n }\n const inv_div = 1 / div;\n return buildComplex(\n /* real*/ inv_div * (ac.real * bc.real + ac.img * bc.img), \n /* img */ inv_div * (ac.img * bc.real - ac.real * bc.img));\n }\n static absSquare(c) {\n const ac = complex(c);\n return Math.pow(ac.real, 2) + Math.pow(ac.img, 2);\n }\n static modulus(c) {\n return Math.sqrt(this.absSquare(c));\n }\n static isComplex(c) {\n return c != null && typeof c === 'object' && 'real' in c && 'img' in c && typeof c.real === 'number' && typeof c.img === 'number';\n }\n static conjugate(a) {\n a = complex(a);\n return buildComplex(a.real, Math.abs(a.img) == 0 ? 0 : -a.img);\n }\n static equals(c1, c2) {\n const c_1 = this.build(c1), c_2 = this.build(c2);\n if (!this.isComplex(c1) || !this.isComplex(c2)) {\n return false;\n }\n return c_1.real === c_2.real && c_1.img === c_2.img;\n }\n //static isNaN(c: Complex | number): boolean {\n // switch (c) {\n // case undefined:\n // // doh!\n // return true;\n // case null:\n // // doh!\n // return false;\n // default:\n // if (!this.isComplex( c)\n // }\n //}\n static get NaC() { return nac(); }\n}\n//}\n","//namespace Pacem.Geometry {\nimport { Vector3D } from './geom3d';\n//#region Utils\nexport class Utils3D {\n /**\n * Computes the intersection between a ray and a triangle in the 3D space - if any - using the Möller–Trumbore algorithm.\n * @param ray Array of two points identifying a ray.\n * @param triangle Array of three points identifying a triangle.\n * @returns Intersection point if any, otherwise null.\n */\n static intersect(ray, triangle) {\n // Möller–Trumbore algorithm\n const [start, end] = ray;\n const vector = Vector3D.subtract(start, end);\n const [a, b, c] = triangle;\n const ab = Vector3D.subtract(a, b);\n const ac = Vector3D.subtract(a, c);\n const cross = Vector3D.cross(vector, ac);\n const det = Vector3D.dot(ab, cross);\n if (det.isCloseTo(0)) {\n return null;\n }\n const invDet = 1 / det;\n const s = Vector3D.subtract(start, a);\n const u = invDet * Vector3D.dot(s, cross);\n if (u < 0 || u > 1) {\n return null;\n }\n const scross = Vector3D.cross(s, ab);\n const v = invDet * Vector3D.dot(vector, scross);\n if (v < 0 || (u + v) > 1) {\n return null;\n }\n const t = invDet * Vector3D.dot(ac, scross);\n if (t < 0 || t.isCloseTo(0)) {\n return null;\n }\n return Vector3D.add(start, Vector3D.scale(vector, t));\n }\n}\n//#endregion\n//}\n","//namespace Pacem.Mathematics.DataAnalysis {\nimport { Complex } from './complex';\n// #region DFT utils\n/**\n * Unit circle Euler's formula\n * @param k partial 'slices'\n * @param N total 'slices'\n */\nfunction euler(k, N) {\n const x = 2 * Math.PI * k / N;\n return Complex.build(Math.cos(x), Math.sin(x));\n}\n/** Unit circle memoizer */\nconst unitCircle = {};\nfunction exp(k, N) {\n const memN = unitCircle[N] = unitCircle[N] || {};\n return memN[k] = memN[k] || euler(k, N);\n}\n// #endregion\nfunction isPowerOfTwo(length) {\n return length > 0 && (length & (length - 1)) === 0;\n}\n/** Cooley-Tukey */\nfunction fftRec(data) {\n const retval = [], N = data.length;\n if (N === 1) {\n return [Complex.build(data[0])];\n }\n // even/odds recursion\n const retval_2n = fftRec(data.filter((_, i) => i % 2 === 0)), retval_2n1 = fftRec(data.filter((_, i) => i % 2 === 1));\n for (var k = 0; k < N / 2; k++) {\n const t = retval_2n[k], e = Complex.multiply(exp(k, N), retval_2n1[k]);\n retval[k] = Complex.add(t, e);\n retval[k + (N / 2)] = Complex.subtract(t, e);\n }\n return retval;\n}\nexport class Fourier {\n /**\n * Checks the input vector and outputs a frequency vector using the best performing algo.\n * @param data Input vector of any size\n * @param normalize Whether to normalize the signal or not (default true)\n */\n static transform(data, normalize = true) {\n data = data || [];\n if (isPowerOfTwo(data.length)) {\n return this.fft(data, normalize);\n }\n return this.dft(data, normalize);\n }\n /**\n * Checks the input vector and applies inverted fourier transform's best performing algo.\n * @param data Input frequency vector\n */\n static invert(data, normalize = true) {\n return this.idft(data || [], normalize);\n }\n /**\n * Naive Discrete Fourier Transform implementation (O(n^2) algo).\n * @param data Input vector of any size\n * @param normalize Whether to normalize the signal or not (default true)\n */\n static dft(data, normalize = true) {\n const N = (data || [])?.length, DEN = normalize ? 1 / Math.sqrt(N) : 1, retval = [];\n for (let k = 0; k < N; k++) {\n retval.push({ real: 0, img: 0 });\n for (let j = 0; j < N; j++) {\n const e = exp(k * j, N), item = Complex.multiply(data[j], e), itemN = Complex.multiply(item, DEN);\n retval[k] = Complex.add(retval[k], itemN);\n }\n }\n return retval;\n }\n /**\n * Inverse Discrete Fourier Transform.\n * @param data Input vector data of any size\n */\n static idft(data, normalize = true) {\n const reversed = data.map(i => Complex.build(i.img, i.real)), temp = this.transform(reversed, normalize);\n return temp.map(c => Complex.build(c.img, c.real));\n }\n /**\n * FFT processing using Cooley-Tukey.\n * @param data Input vector (size MUST be power of 2)\n */\n static fft(data, normalize = true) {\n const retval = fftRec(data);\n if (!normalize) {\n return retval;\n }\n const DEN = 1 / Math.sqrt(data.length);\n return retval.map(i => Complex.multiply(i, DEN));\n }\n}\n//}\n","//namespace Pacem.Mathematics.DataAnalysis {\nconst SQRT_PI = Math.sqrt(Math.PI);\n/**\n * Complementary Error Function as seen on Numerical Recipes in C (p.221).\n * @param x Input\n */\nfunction erfc(x) {\n const z = Math.abs(x);\n const t = 1.0 / (1.0 + 0.5 * z);\n const ans = t * Math.exp(-z * z - 1.26551223 + t * (1.00002368 + t * (0.37409196 + t * (0.09678418 +\n t * (-0.18628806 + t * (0.27886807 + t * (-1.13520398 + t * (1.48851587 +\n t * (-0.82215223 + t * 0.17087277)))))))));\n return x >= 0.0 ? ans : 2.0 - ans;\n}\n/**\n * Error Function.\n * @param x\n */\nfunction erf(x) {\n return 1 - erfc(x);\n}\nexport class Gaussian {\n constructor(mean, stdev) {\n this.mean = mean;\n this.stdev = Math.abs(stdev);\n this.variance = Math.pow(stdev, 2);\n }\n static get normal() {\n return _normal;\n }\n /**\n * Un-normalized probability density function.\n * Can be useful as a weight function without requiring the integral w(x)dx to be 1.\n * @param x Input value\n */\n weight(x) {\n // e^(.5 *(-Z^2))\n return Math.exp(-0.5 * Math.pow(this._z(x), 2));\n }\n /**\n * Probability density function (PDF).\n * @param x Input value\n */\n probabilityDensity(x) {\n // 1/(σ √2π) * e^(.5 *(-Z^2))\n const inv_coeff = this.stdev * Math.SQRT2 * SQRT_PI, exp_part = this.weight(x);\n return exp_part / inv_coeff;\n }\n _z(x) {\n // Z = (x - μ)/σ\n return (x - this.mean) / this.stdev;\n }\n /**\n * Returns the area under the PDF from -∞ to x\n * @param x Input value\n */\n probability(x) {\n return 0.5 * erfc(-this._z(x) / Math.SQRT2);\n }\n}\nconst _normal = new Gaussian(0, 1);\n//}\n","export class Lagrange {\n constructor(points) {\n this.#set = points;\n }\n #set;\n #weights = null;\n _prepareBarycentric() {\n if (this.#weights) {\n return;\n }\n const points = this.#set || [];\n const n = points.length;\n if (n === 0) {\n this.#weights = [];\n return;\n }\n // Compute barycentric weights in a numerically stable way.\n // Direct product of differences can overflow/underflow for large n.\n // We compute log-weights and normalize by subtracting the max log to\n // keep values in a reasonable range (scaling cancels out in evaluation).\n const logs = new Array(n);\n const signs = new Array(n);\n for (let j = 0; j < n; j++) {\n let sumLog = 0;\n let sign = 1;\n const xj = points[j].x;\n for (let m = 0; m < n; m++) {\n if (m === j)\n continue;\n const diff = xj - points[m].x;\n if (diff === 0) {\n throw new Error('Invalid function provided.');\n }\n if (diff < 0)\n sign = -sign;\n sumLog += Math.log(Math.abs(diff));\n }\n // log of weight is -sumLog\n logs[j] = -sumLog;\n signs[j] = sign;\n }\n // normalize logs to avoid underflow/overflow when exponentiating\n let maxLog = logs[0];\n for (let j = 1; j < n; j++) {\n if (logs[j] > maxLog)\n maxLog = logs[j];\n }\n const w = new Array(n);\n for (let j = 0; j < n; j++) {\n // scaled weight: sign * exp(log - maxLog)\n const scaled = Math.exp(logs[j] - maxLog);\n w[j] = signs[j] * scaled;\n }\n this.#weights = w;\n }\n _computeBarycentric(x) {\n const points = this.#set || [];\n if (!this.#weights) {\n this._prepareBarycentric();\n }\n const w = this.#weights || [];\n let numerator = 0;\n let denominator = 0;\n for (let j = 0; j < points.length; j++) {\n const xj = points[j].x;\n if (x === xj) {\n return points[j].y;\n }\n const temp = w[j] / (x - xj);\n numerator += temp * points[j].y;\n denominator += temp;\n }\n return numerator / denominator;\n }\n // Iterative/global Lagrange computation removed — barycentric is used\n // exclusively for interpolation.\n interpolate(x) {\n return this._computeBarycentric(x);\n }\n static create(...values) {\n var array = [];\n if (arguments.length > 0 && Array.isArray(arguments[0])) {\n array = arguments[0];\n }\n else {\n array = Array.from(values);\n }\n const points = array.map((y, x) => { return typeof y === 'number' ? { x, y } : y; });\n return new Lagrange(points);\n }\n}\n/**\n * @deprecated Use Lagrange instead. This alias is kept for backward compatibility.\n */\nexport const Lagrangian = {\n create: Lagrange.create\n};\nexport class Pchip {\n constructor(points) {\n if (!points || points.length < 2)\n throw new Error('Need at least 2 points');\n const pts = points.slice().sort((a, b) => a.x - b.x);\n this.xs = pts.map(p => p.x);\n this.ys = pts.map(p => p.y);\n this.ms = this.computeDerivatives();\n }\n computeDerivatives() {\n const n = this.xs.length;\n const h = new Array(n - 1);\n const delta = new Array(n - 1);\n for (let i = 0; i < n - 1; i++) {\n h[i] = this.xs[i + 1] - this.xs[i];\n delta[i] = (this.ys[i + 1] - this.ys[i]) / h[i];\n }\n const m = new Array(n).fill(0);\n // endpoints: use one-sided slope\n m[0] = delta[0];\n m[n - 1] = delta[n - 2];\n // interior: weighted harmonic mean (PCHIP)\n for (let i = 1; i < n - 1; i++) {\n const d1 = delta[i - 1], d2 = delta[i];\n if (d1 === 0 || d2 === 0 || d1 * d2 <= 0) {\n m[i] = 0;\n }\n else {\n const w1 = 2 * h[i] + h[i - 1];\n const w2 = h[i] + 2 * h[i - 1];\n m[i] = (w1 + w2) / ((w1 / d1) + (w2 / d2));\n }\n }\n // (Optional) limit derivative to avoid overshoot: monotonicity constraints\n for (let i = 0; i < n - 1; i++) {\n if (delta[i] === 0) {\n m[i] = 0;\n m[i + 1] = 0;\n }\n else {\n const a = m[i] / delta[i];\n const b = m[i + 1] / delta[i];\n const s = a * a + b * b;\n if (s > 9) { // limit size, algorithm from Fritsch-Carlson/PCHIP\n const tau = 3 / Math.sqrt(s);\n m[i] = tau * a * delta[i];\n m[i + 1] = tau * b * delta[i];\n }\n }\n }\n return m;\n }\n interpolate(x) {\n const xs = this.xs, ys = this.ys, ms = this.ms;\n const n = xs.length;\n // quick bounds\n if (x <= xs[0]) {\n // avoid dangerous extrapolation: use linear extension or return ys[0]\n const slope = ms[0];\n return ys[0] + slope * (x - xs[0]);\n }\n if (x >= xs[n - 1]) {\n const slope = ms[n - 1];\n return ys[n - 1] + slope * (x - xs[n - 1]);\n }\n // locate interval\n let i = 0, j = n - 1;\n while (j - i > 1) {\n const mid = (i + j) >> 1;\n if (xs[mid] <= x)\n i = mid;\n else\n j = mid;\n }\n const h = xs[i + 1] - xs[i];\n const t = (x - xs[i]) / h;\n const t2 = t * t, t3 = t2 * t;\n // Hermite basis\n const h00 = 2 * t3 - 3 * t2 + 1;\n const h10 = t3 - 2 * t2 + t;\n const h01 = -2 * t3 + 3 * t2;\n const h11 = t3 - t2;\n return h00 * ys[i] + h10 * (ms[i] * h) + h01 * ys[i + 1] + h11 * (ms[i + 1] * h);\n }\n static create(...values) {\n var array = [];\n if (arguments.length > 0 && Array.isArray(arguments[0])) {\n array = arguments[0];\n }\n else {\n array = Array.from(values);\n }\n const points = array.map((y, x) => { return typeof y === 'number' ? { x, y } : y; });\n return new Pchip(points);\n }\n}\nexport class Newton {\n constructor(points) {\n if (!points || points.length === 0)\n throw new Error('Need at least 1 point');\n const pts = points.slice().sort((a, b) => a.x - b.x);\n this.xs = pts.map(p => p.x);\n const n = pts.length;\n // copy y values into coefficients array and convert in-place to divided differences\n const a = pts.map(p => p.y);\n for (let j = 1; j < n; j++) {\n for (let i = n - 1; i >= j; i--) {\n const denom = this.xs[i] - this.xs[i - j];\n if (denom === 0)\n throw new Error('Invalid function provided.');\n a[i] = (a[i] - a[i - 1]) / denom;\n }\n }\n this.coeffs = a;\n }\n interpolate(x) {\n const xs = this.xs, a = this.coeffs;\n const n = a.length;\n if (n === 0)\n return NaN;\n // evaluate Newton form with nested multiplication (Horner-like)\n let result = a[n - 1];\n for (let i = n - 2; i >= 0; i--) {\n result = result * (x - xs[i]) + a[i];\n }\n return result;\n }\n static create(...values) {\n var array = [];\n if (arguments.length > 0 && Array.isArray(arguments[0])) {\n array = arguments[0];\n }\n else {\n array = Array.from(values);\n }\n const points = array.map((y, x) => { return typeof y === 'number' ? { x, y } : y; });\n return new Newton(points);\n }\n}\n//}\n","import { Gaussian } from './gaussian';\nconst selfSelector = (i, _) => i;\nfunction mode(set, selector = selfSelector) {\n const groups = Object.groupBy(set, selector);\n let key, max = 0;\n for (let group in groups) {\n const l = groups[group].length;\n if (l > max) {\n key = parseInt(group);\n max = l;\n }\n }\n return key;\n}\nfunction median(set, selector = selfSelector) {\n const setCopy = set.slice(0), length = setCopy.length;\n setCopy.sort((a, b) => {\n const i = selector(a), j = selector(b);\n return i - j;\n });\n const index = Math.ceil(setCopy.length / 2) - 1;\n if (length % 2 == 1) {\n return setCopy[index];\n }\n return .5 * (setCopy[index + 1] + setCopy[index]);\n}\nfunction sum(set, selector = selfSelector) {\n return set.reduce((p, c, i) => p + selector(c, i), 0);\n}\nfunction mean(set, selector = selfSelector) {\n return sum(set, selector) / set.length;\n}\nfunction variance(set, selector = selfSelector, bessel = false) {\n const avg = mean(set, selector);\n return set.reduce((p, c) => Math.pow(c - avg, 2) + p, 0) / (set.length - (bessel ? 1 : 0));\n}\nfunction stdev(set, selector = selfSelector, bessel = false) {\n const v = variance(set, selector, bessel);\n return Math.sqrt(v);\n}\nfunction correlation(set, arg2, selector1 = selfSelector, selector2 = selfSelector) {\n const twoArrays = Array.isArray(arg2);\n if (twoArrays && arg2.length !== set.length) {\n throw new Error('Sets must be of the same length.');\n }\n const length = set.length;\n const setX = set, setY = twoArrays ? arg2 : set;\n const selectorX = twoArrays ? selector1 : arg2;\n const selectorY = twoArrays ? selector2 : selector1;\n const meanX = mean(setX, selectorX);\n const meanY = mean(setY, selectorY);\n let accNum = 0;\n let accDenXSq = 0;\n let accDenYSq = 0;\n for (let i = 0; i < length; i++) {\n const itemX = setX[i], itemY = setY[i];\n const a = selectorX(itemX, i) - meanX;\n const b = selectorY(itemY, i) - meanY;\n accNum += (a * b);\n accDenXSq += (a * a);\n accDenYSq += (b * b);\n }\n return accNum / Math.sqrt(accDenXSq * accDenYSq);\n}\nfunction linearRegression(set, arg2, selector1 = selfSelector, selector2 = selfSelector) {\n const twoArrays = Array.isArray(arg2);\n if (twoArrays && arg2.length !== set.length) {\n throw new Error('Sets must be of the same length.');\n }\n const setX = set, setY = twoArrays ? arg2 : set;\n const selectorX0 = twoArrays ? selector1 : arg2;\n const selectorY0 = twoArrays ? selector2 : selectorX0;\n const selectorX = selectorX0 ?? (p => p.x);\n const selectorY = selectorY0 ?? (p => p.y);\n const length = set.length;\n let xyAcc = 0, xAcc = 0, yAcc = 0, x2Acc = 0, y2Acc = 0;\n for (let i = 0; i < length; i++) {\n const itemX = setX[i], itemY = setY[i];\n const x = selectorX(itemX, i);\n const y = selectorY(itemY, i);\n xyAcc += x * y;\n xAcc += x;\n yAcc += y;\n x2Acc += x * x;\n y2Acc += y * y;\n }\n const m = (length * xyAcc - xAcc * yAcc) / (length * x2Acc - Math.pow(xAcc, 2));\n const q = (yAcc - m * xAcc) / length;\n return [m, q];\n}\n/** Utility tools about statistics, probability, data analysis... */\nexport class Utils {\n static sum(set, selector) {\n return sum(set, selector);\n }\n static mean(set, selector) {\n return mean(set, selector);\n }\n static median(set, selector) {\n return median(set, selector);\n }\n static mode(set, selector) {\n return mode(set, selector);\n }\n static var(set, selector) {\n return variance(set, selector, true);\n }\n static varp(set, selector) {\n return variance(set, selector, false);\n }\n static stdevp(set, selector) {\n return stdev(set, selector, false);\n }\n static stdev(set, selector) {\n return stdev(set, selector, true);\n }\n static correlation(set, arg2, selector1, selector2) {\n return correlation(set, arg2, selector1, selector2);\n }\n static linearRegression(set, arg2, selector1, selector2) {\n return linearRegression(set, arg2, selector1, selector2);\n }\n // restart from here: https://en.wikipedia.org/wiki/Multivariate_statistics#Multivariate_analysis\n /**\n * Returns a set of utilities for gaussian distribution computations.\n * @param mean\n * @param stdev\n */\n static gaussian(mean, stdev) {\n return new Gaussian(mean, stdev);\n }\n}\nfunction searchFnFactory(minAssigner, maxAssigner) {\n const fn = (left, right, f, tolerance) => {\n let min = left;\n let max = right;\n let x1 = minAssigner(min, max);\n let x2 = maxAssigner(min, max);\n let f1 = f(x1);\n let f2 = f(x2);\n while ((max - min) > tolerance) {\n if (f1 < f2) {\n max = x2;\n x2 = x1;\n f2 = f1;\n x1 = minAssigner(min, max);\n f1 = f(x1);\n }\n else {\n min = x1;\n x1 = x2;\n f1 = f2;\n x2 = maxAssigner(min, max);\n f2 = f(x2);\n }\n }\n return .5 * (x1 + x2);\n };\n return fn;\n}\nconst DEFAULT_TOLERANCE = 1e-3;\n/**\n * Weight function based on golden ratio.\n */\nconst goldenRatioSearch = (left, right, weight, tolerance = DEFAULT_TOLERANCE) => {\n const phi = 1.618;\n const minAssigner = (min, max) => max - (max - min) / phi;\n const maxAssigner = (min, max) => min + (max - min) / phi;\n const fn = searchFnFactory(minAssigner, maxAssigner);\n return fn(left, right, weight, tolerance);\n};\nfunction linearSearch(segments) {\n if (segments <= 1) {\n throw new RangeError(\"segments must be a number grater than 1.\");\n }\n return (left, right, weight, tolerance = DEFAULT_TOLERANCE) => {\n const minAssigner = (min, max) => min + (max - min) / segments;\n const maxAssigner = (min, max) => max - (max - min) / segments;\n const fn = searchFnFactory(minAssigner, maxAssigner);\n return fn(left, right, weight, tolerance);\n };\n}\nconst gaussianSearch = (left, right, weight, tolerance = DEFAULT_TOLERANCE) => {\n var sigma0 = null;\n var length0 = null;\n const computeSigma = (min, max) => {\n length0 ??= (max - min);\n sigma0 ??= length0 / Math.sqrt(12);\n return sigma0 * (max - min) / length0;\n };\n const minAssigner = (min, max) => Math.max(min, (max + min) / 2 - computeSigma(min, max));\n const maxAssigner = (min, max) => Math.min(max, (max + min) / 2 + computeSigma(min, max));\n const fn = searchFnFactory(minAssigner, maxAssigner);\n return fn(left, right, weight, tolerance);\n};\nexport const SearchFunctions = {\n /**\n * Creates a linear search function.\n * @param segments How many segments to split the range into.\n */\n linear: (segments = 2) => linearSearch(segments),\n /** Golden section search function. */\n goldenRatio: goldenRatioSearch,\n /** Gaussian search function. */\n gaussian: gaussianSearch,\n};\n//}\n","import { Numbers, NullChecker } from '@pacem/pacem-foundation';\n//namespace Pacem.Mathematics.NumberTheory {\nconst ALPHABET = '0123456789abcdefghijklmnopqrstuvwxyz';\nconst OUT_OF_RANGE = `Radix out of range: possible values go between positive 1 exclusive and ${ALPHABET.length} inclusive`;\n/** Utility tools about number theory, 'diophantine' stuff... */\nexport class Utils {\n static lcd(...args) {\n if (NullChecker.isNullOrEmpty(args) || args.length <= 1) {\n throw 'Insufficient set of numbers.';\n }\n function ex9(x, y) {\n if (!y)\n return y === 0 ? x : NaN;\n return ex9(y, x % y);\n }\n function ex10(x, y) {\n return x * y / ex9(x, y);\n }\n let result = Math.round(args[0]);\n for (let j = 1; j < args.length; j++) {\n result = ex10(result, Math.round(args[j]));\n }\n return result;\n }\n static gcd(a, b) {\n // force integers\n a = Math.round(a),\n b = Math.round(b);\n if (a === 0) {\n return b;\n }\n return Utils.gcd(b % a, a);\n }\n static rebaseInt(v, from, to) {\n return Numbers.rebase(v, from, to);\n }\n static rebaseFloat(v, fromRadix, toRadix, precision = 12) {\n const from10 = Utils.rebaseFloat10ToN, to10 = Utils.rebaseFloatNTo10;\n if (fromRadix === 10) {\n const vFloat = parseFloat(v.toString());\n if (toRadix % 1 === 0) {\n return Utils.rebaseFloat10ToNIntBase(vFloat, toRadix, precision);\n }\n return from10(vFloat, toRadix, precision);\n }\n if (toRadix === 10) {\n return to10(v.toString(), fromRadix, precision);\n }\n const _10 = to10(v.toString(), fromRadix, precision + 1);\n return from10(_10, toRadix, precision);\n }\n static rebaseFloatNTo10(v, radix, precision = 12) {\n const alphabet = ALPHABET;\n if (radix <= 1 || radix > alphabet.length) {\n throw new Error(OUT_OF_RANGE);\n }\n const vs = (v ?? '0').toString().toLowerCase(), nan = Number.NaN;\n if (vs === '0') {\n return 0;\n }\n const arr = /^([-+]?) *([\\da-z]+)?(.[\\da-z]+)?$/.exec(vs);\n if (arr.length < 2) {\n return nan;\n }\n const sign = arr[1] === '-' ? -1 : 1, int = arr[2] || '0', frac = arr[3] || '.0';\n let retval = 0, cursor = 0;\n for (let digit of (int + frac.substr(1))) {\n const num = alphabet.indexOf(digit);\n if (num === -1 || num >= radix) {\n return nan;\n }\n retval += num * Math.pow(radix, int.length - cursor - 1);\n cursor++;\n }\n return sign * retval;\n }\n static rebaseFloat10ToNIntBase(v, radix, precision = 12) {\n const alphabet = ALPHABET;\n if (radix <= 1 || radix > alphabet.length) {\n throw new Error(OUT_OF_RANGE);\n }\n const to = radix;\n let value = Math.abs(v ?? 0);\n if (value === 0 || Number.isNaN(value)) {\n return v.toString();\n }\n let decimals = (value % 1).roundoff();\n let output = '';\n // loop\n do {\n // std\n let div = value / to /* do not roundoff: e.g. 35.99999999999986 / 36 rounds off to 1 */;\n let divFloor = Math.floor(div);\n let mod = (value - divFloor * to).roundoff();\n let intPart = Math.floor(mod);\n if (intPart >= alphabet.length) {\n output = `[${intPart}]` + output;\n }\n else {\n output = alphabet[intPart] + output;\n }\n if (divFloor <= 0) {\n break;\n }\n value = divFloor;\n } while (true);\n output = output.replace(/^0+/, '');\n output ||= '0';\n if (decimals === 0) {\n return output;\n }\n let rebasedFrac = '';\n // loop (same)\n // TODO: tidy up code.\n do {\n value = (decimals * to).roundoff();\n const intPart = Math.floor(value), remainder = (value - intPart).roundoff();\n if (intPart >= alphabet.length) {\n rebasedFrac = `[${intPart}]`;\n }\n else {\n rebasedFrac += alphabet[intPart];\n }\n decimals = remainder;\n } while (!decimals.isCloseTo(0) && rebasedFrac.length < precision);\n if (/^0*$/.test(rebasedFrac)) {\n return output;\n }\n return (Math.sign(v) < 0 ? '-' : '') + output + '.' + rebasedFrac.replace(/0+$/, '');\n }\n static rebaseFloat10ToN(v, radix, precision = 12) {\n const alphabet = ALPHABET;\n if (radix <= 1 || radix > alphabet.length) {\n throw new Error(OUT_OF_RANGE);\n }\n const to = radix;\n let value = Math.abs(v ?? 0);\n if (value === 0 || Number.isNaN(value)) {\n return v.toString();\n }\n let sign = Math.sign(v) < 0 ? '-' : '';\n let int = [];\n let dec = [];\n for (let j = 0; j < 20; j++) {\n int.push('0');\n dec.push('0');\n }\n const maxIndex = to % 1 === 0 ? to : Math.ceil(to);\n function add(integers, j /* cellIndex */, digitIndex) {\n const output = integers ? int : dec;\n const current = output[j] = output[j] || '0';\n const index = alphabet.indexOf(current) + digitIndex, tgetIndex = index % maxIndex, carryIndex = Math.floor(index / maxIndex);\n output[j] = alphabet[tgetIndex];\n if (carryIndex > 0) {\n if (integers) {\n // integers\n add(integers, j + 1, carryIndex);\n }\n else {\n // fractionals\n if (j === 0) {\n // carry on integers\n add(true, 0, carryIndex);\n }\n else {\n add(false, j - 1, carryIndex);\n }\n }\n }\n return carryIndex;\n }\n let step = 0;\n do {\n const magnitude = Math.floor(Numbers.log(value, to));\n const isInteger = magnitude >= 0;\n const absMagnitude = isInteger ? magnitude : Math.abs(1 + magnitude);\n add(isInteger, absMagnitude, 1);\n value = (value - Math.pow(to, magnitude).roundoff()).roundoff();\n if (!isInteger) {\n step++;\n }\n if (value === 0 || step >= 100) {\n const integer = sign + (int.reverse().map(i => i || '0').join('').replace(/^0+/, '') || '0'), fractional = dec.map(i => i || '0').join('').substr(0, precision).replace(/0+$/, '');\n if (/^0*$/.test(fractional)) {\n return integer;\n }\n return integer + '.' + fractional;\n }\n } while (true);\n }\n}\n//}\n","import { DeepMerger } from '@pacem/pacem-foundation';\nimport * as Output from './index';\nDeepMerger.merge(Output);\n"],"names":["Vector","unit","v","clone","x","y","this","normalize","magSqr","mag","Math","sqrt","l","inv","from","p1","p2","Point","subtract","dot","v1","v2","cross","areClose","isCloseTo","Vertex","constructor","index","equals","other","Triangle","v0","circumCirc","ax","ay","bx","by","cx","cy","d","abs","c","r","Infinity","ux","uy","hypot","calcCircumCirc","inCircumcircle","dx","dy","addVertex","vertex","triangles","edges","filter","triangle","push","unique","i","length","isUnique","j","e1","e2","uniqueEdges","edge","triangulate","vertices","st","minX","minY","maxX","maxY","min","max","superTriangle","t","Delaunay","map","p","idx","indices","delaunayTriangulation","RAD2DEG","PI","RAD_ROUND","isPoint","Utils$2","Utils","slopeRad","atan2","slopeRad2","slopeDeg","slopeDeg2","intersect","arg1","arg2","args","Array","isArray","_intersectSegments","Rect","isRect","_intersectRects","arguments","_mergePolygons","polygons","boundingBox","xmin","Number","MAX_VALUE","ymin","xmax","ymax","width","height","combinePolygons","polygon1","polygon2","operator","NullChecker","isNullOrEmpty","contained1","inPolygon","contained2","bbox1","bbox2","rect","vertices1","vertices2","sideBuilderCallback","arr","verticesSortCallback","a","b","edges1","edges2","outputVertices","concat","memoizer","Map","ensureMemoizer","e","has","retval","set","get","thereAreIntersections","edge1","additionalVertices1","edge2","additionalVertices2","intersection","isNull","constraints","additionalVertices","totalVertices","sort","mesh","dirty","triangleIndices","indexA","indexB","indexC","A","B","C","sides","constraint","side","findIndex","jB","jC","O","in1","in2","flatMap","alreadyIn","splice","cleanupPolygon","repeated","slice","inSegment","shift","P0","P1","boundaryVertices","lastVertex","nextEdgeIndex","P2","P3","nextEdge","nextVertex","point","points","intersectLines","segment1","segment2","m2","q2","s1","s2","cramer","l1","l2","xP","yP","roundoff","mq","arg0","NaN","m","excludeProjection","D","xAB","yAB","XAB","wAB","YAB","hAB","xCD","yCD","XCD","wCD","YCD","hCD","outOfXBounds","outOfYBounds","mqCD","mqAB","mAB","mCD","qAB","qCD","xR","yR","_areClose","precision","PRECISION","distance","s","q","pow","_pointSegmentDistance","segment","isWithin","clockwise","isBeyond","inLine","minx","maxx","miny","maxy","inTriangle","last","current","MIN_VALUE","test","intersections","p0","area","pts","xj","yj","next","xnext","ynext","convexHull","sorted","o","lower","pop","upper","Polygon","_eps","isPolygon","obj","every","contains","polygon","centroid","bbox","isConvex","sign","theta","Angle","angleBetween","isSelfIntersecting","check","isCounterClockwise","expand","offset","scale","sin","matrix","Matrix2D","identity","LinearAlgebra.Vector","vector","add","pOffset","multiply","DEG2RAD","Vector3D","RangeError","z","parse","input","parseAsNumericalArray","apply","Error","k","zero","fx","fy","fz","negate","vector1","vector2","num","vectord","asin","Spherical","rho","phi","clamp","fromVector","acos","toVector","coords","thetaDeg","phiDeg","sinPhiRho","cos","toRotationMatrix","sinTheta","cosTheta","sinPhi","cosPhi","Matrix3D","Matrix3DUtils","modify","action","m11","m12","m13","m14","m21","m22","m23","m24","m31","m32","m33","m34","offsetX","offsetY","offsetZ","m44","_","m1","isIdentity","transpose","toArray","modifier","translate","isAffine","determinant","num6","num5","num4","num3","num2","num10","num9","num8","num7","matrices","ReferenceError","invert","cofactor31","cofactor21","cofactor11","num20","num19","num18","num17","num16","num15","num14","num13","num12","invdet","num1","num11","num21","num22","num23","num24","cofactor12","cofactor13","cofactor14","cofactor22","cofactor23","cofactor24","cofactor32","cofactor33","cofactor34","cofactor41","cofactor42","cofactor43","cofactor44","inverseDet","transform","pt","Quaternion","w","fromVectors","to","yieldQ","f","fromAxisAngle","axis","angleDeg","angleInRadians","factor","fromRotationMatrix","rotationMatrix","trace","sq","conjugate","norm","tCross","angle","X","Y","Z","W","n","q1","NOT_A_COMPLEX","Utils3D","ray","start","end","ab","ac","det","invDet","u","scross","complex","real","img","buildComplex","Object","defineProperty","value","writable","nac","Complex","build","isComplex","bc","what","divide","div","absSquare","inv_div","modulus","c1","c2","c_1","c_2","NaC","unitCircle","exp","N","memN","euler","fftRec","data","retval_2n","retval_2n1","SQRT_PI","Gaussian","mean","stdev","variance","normal","_normal","weight","_z","probabilityDensity","inv_coeff","SQRT2","probability","ans","erfc","Lagrange","weights","_prepareBarycentric","logs","signs","sumLog","diff","log","maxLog","scaled","_computeBarycentric","numerator","denominator","temp","interpolate","create","values","Lagrangian","Pchip","xs","ys","ms","computeDerivatives","h","delta","fill","d1","d2","w1","w2","tau","slope","mid","t2","t3","h10","h01","h11","Newton","denom","coeffs","result","selfSelector","sum","selector","reduce","bessel","avg","searchFnFactory","minAssigner","maxAssigner","left","right","tolerance","x1","x2","f1","f2","SearchFunctions","linear","segments","DEFAULT_TOLERANCE","fn","linearSearch","goldenRatio","gaussian","sigma0","length0","computeSigma","Fourier","fft","dft","idft","DEN","item","itemN","reversed","median","setCopy","ceil","mode","groups","groupBy","key","group","parseInt","varp","stdevp","correlation","selector1","selector2","twoArrays","setX","setY","selectorX","selectorY","meanX","meanY","accNum","accDenXSq","accDenYSq","itemX","itemY","linearRegression","selectorX0","xyAcc","xAcc","yAcc","x2Acc","ALPHABET","OUT_OF_RANGE","lcd","ex9","ex10","round","gcd","rebaseInt","Numbers","rebase","rebaseFloat","fromRadix","toRadix","from10","rebaseFloat10ToN","to10","rebaseFloatNTo10","vFloat","parseFloat","toString","rebaseFloat10ToNIntBase","radix","alphabet","vs","toLowerCase","nan","exec","int","frac","cursor","digit","substr","indexOf","isNaN","decimals","output","divFloor","floor","mod","intPart","replace","rebasedFrac","remainder","dec","maxIndex","integers","digitIndex","tgetIndex","carryIndex","step","magnitude","isInteger","integer","reverse","join","fractional","DeepMerger","merge","Output"],"mappings":"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"}