@fluixi/utils 1.0.0-alpha.83 → 1.0.0-alpha.85

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/dist/index.cjs +2858 -1
  2. package/dist/index.mjs +2838 -1
  3. package/dist/lib/array/advanced.cjs +2227 -1
  4. package/dist/lib/array/advanced.mjs +2204 -1
  5. package/dist/lib/array/array.cjs +57 -1
  6. package/dist/lib/array/array.mjs +36 -1
  7. package/dist/lib/array/index.cjs +2344 -1
  8. package/dist/lib/array/index.mjs +2322 -1
  9. package/dist/lib/array/utils.cjs +103 -1
  10. package/dist/lib/array/utils.mjs +82 -1
  11. package/dist/lib/color/color.cjs +2190 -1
  12. package/dist/lib/color/color.mjs +2167 -1
  13. package/dist/lib/color/constants.cjs +380 -1
  14. package/dist/lib/color/constants.mjs +359 -1
  15. package/dist/lib/color/conversions.cjs +629 -1
  16. package/dist/lib/color/conversions.mjs +608 -1
  17. package/dist/lib/color/helpers.cjs +2534 -1
  18. package/dist/lib/color/helpers.mjs +2511 -1
  19. package/dist/lib/color/index.cjs +2641 -1
  20. package/dist/lib/color/index.mjs +2619 -1
  21. package/dist/lib/color/types.cjs +18 -1
  22. package/dist/lib/color/utils.cjs +962 -1
  23. package/dist/lib/color/utils.mjs +939 -1
  24. package/dist/lib/compare/comparators.cjs +171 -1
  25. package/dist/lib/compare/comparators.mjs +150 -1
  26. package/dist/lib/compare/index.cjs +172 -1
  27. package/dist/lib/compare/index.mjs +152 -1
  28. package/dist/lib/crypto/hash.cjs +83 -1
  29. package/dist/lib/crypto/hash.mjs +62 -1
  30. package/dist/lib/crypto/index.cjs +85 -1
  31. package/dist/lib/crypto/index.mjs +62 -1
  32. package/dist/lib/dom/events.cjs +40 -1
  33. package/dist/lib/dom/events.mjs +19 -1
  34. package/dist/lib/dom/index.cjs +78 -1
  35. package/dist/lib/dom/index.mjs +56 -1
  36. package/dist/lib/dom/utils.cjs +57 -1
  37. package/dist/lib/dom/utils.mjs +36 -1
  38. package/dist/lib/functions/functions.cjs +366 -1
  39. package/dist/lib/functions/functions.mjs +345 -1
  40. package/dist/lib/functions/index.cjs +369 -1
  41. package/dist/lib/functions/index.mjs +347 -1
  42. package/dist/lib/functions/types.cjs +18 -1
  43. package/dist/lib/helpers.cjs +78 -1
  44. package/dist/lib/helpers.mjs +59 -1
  45. package/dist/lib/index.cjs +2857 -1
  46. package/dist/lib/index.mjs +2836 -1
  47. package/dist/lib/maths/constants.cjs +70 -1
  48. package/dist/lib/maths/constants.mjs +50 -1
  49. package/dist/lib/maths/fn/advanced.cjs +231 -1
  50. package/dist/lib/maths/fn/advanced.mjs +208 -1
  51. package/dist/lib/maths/fn/basic.cjs +212 -1
  52. package/dist/lib/maths/fn/basic.mjs +191 -1
  53. package/dist/lib/maths/fn/complex.cjs +268 -1
  54. package/dist/lib/maths/fn/complex.mjs +247 -1
  55. package/dist/lib/maths/fn/index.cjs +877 -1
  56. package/dist/lib/maths/fn/index.mjs +855 -1
  57. package/dist/lib/maths/fn/trigo.cjs +179 -1
  58. package/dist/lib/maths/fn/trigo.mjs +156 -1
  59. package/dist/lib/maths/fn/vector.cjs +728 -1
  60. package/dist/lib/maths/fn/vector.mjs +707 -1
  61. package/dist/lib/maths/formatter.cjs +61 -1
  62. package/dist/lib/maths/formatter.mjs +40 -1
  63. package/dist/lib/maths/guards.cjs +164 -1
  64. package/dist/lib/maths/guards.mjs +144 -1
  65. package/dist/lib/maths/index.cjs +1152 -1
  66. package/dist/lib/maths/index.mjs +1130 -1
  67. package/dist/lib/maths/parser.cjs +75 -1
  68. package/dist/lib/maths/parser.mjs +54 -1
  69. package/dist/lib/maths/random.cjs +49 -1
  70. package/dist/lib/maths/random.mjs +28 -1
  71. package/dist/lib/maths/types/advanced.cjs +18 -1
  72. package/dist/lib/maths/types/basic.cjs +18 -1
  73. package/dist/lib/maths/types/index.cjs +19 -1
  74. package/dist/lib/maths/types/index.mjs +1 -0
  75. package/dist/lib/maths/types/negative.cjs +18 -1
  76. package/dist/lib/maths/types/operations.cjs +18 -1
  77. package/dist/lib/object/clone.cjs +88 -1
  78. package/dist/lib/object/clone.mjs +65 -1
  79. package/dist/lib/object/diff.cjs +573 -1
  80. package/dist/lib/object/diff.mjs +550 -1
  81. package/dist/lib/object/getter-setter.cjs +2351 -1
  82. package/dist/lib/object/getter-setter.mjs +2330 -1
  83. package/dist/lib/object/index.cjs +3956 -6
  84. package/dist/lib/object/index.mjs +3936 -6
  85. package/dist/lib/object/merge.cjs +1029 -1
  86. package/dist/lib/object/merge.mjs +1006 -1
  87. package/dist/lib/object/object.cjs +280 -1
  88. package/dist/lib/object/object.mjs +257 -1
  89. package/dist/lib/object/omit.cjs +2022 -1
  90. package/dist/lib/object/omit.mjs +1999 -1
  91. package/dist/lib/object/reconcile.cjs +126 -1
  92. package/dist/lib/object/reconcile.js +1 -1
  93. package/dist/lib/object/reconcile.mjs +105 -1
  94. package/dist/lib/object/selector.cjs +303 -1
  95. package/dist/lib/object/selector.mjs +282 -1
  96. package/dist/lib/object/sort.cjs +209 -1
  97. package/dist/lib/object/sort.d.ts +1 -1
  98. package/dist/lib/object/sort.js +3 -3
  99. package/dist/lib/object/sort.mjs +186 -1
  100. package/dist/lib/object/transform.cjs +2211 -1
  101. package/dist/lib/object/transform.mjs +2190 -1
  102. package/dist/lib/object/types.cjs +18 -1
  103. package/dist/lib/object/utils.cjs +326 -6
  104. package/dist/lib/object/utils.mjs +305 -6
  105. package/dist/lib/primitive/boolean/boolean.cjs +407 -1
  106. package/dist/lib/primitive/boolean/boolean.mjs +386 -1
  107. package/dist/lib/primitive/boolean/index.cjs +382 -1
  108. package/dist/lib/primitive/boolean/index.mjs +359 -1
  109. package/dist/lib/primitive/boolean/types.cjs +18 -1
  110. package/dist/lib/primitive/date/date.cjs +1126 -1
  111. package/dist/lib/primitive/date/date.mjs +1105 -1
  112. package/dist/lib/primitive/date/index.cjs +1128 -1
  113. package/dist/lib/primitive/date/index.mjs +1105 -1
  114. package/dist/lib/primitive/date/types.cjs +18 -1
  115. package/dist/lib/primitive/index.cjs +2338 -5
  116. package/dist/lib/primitive/index.mjs +2316 -5
  117. package/dist/lib/primitive/string/index.cjs +875 -5
  118. package/dist/lib/primitive/string/index.mjs +852 -5
  119. package/dist/lib/primitive/string/parser-2.cjs +543 -8
  120. package/dist/lib/primitive/string/parser-2.mjs +522 -8
  121. package/dist/lib/primitive/string/parser.cjs +236 -3
  122. package/dist/lib/primitive/string/parser.mjs +215 -3
  123. package/dist/lib/primitive/string/string.cjs +926 -5
  124. package/dist/lib/primitive/string/string.mjs +903 -5
  125. package/dist/lib/primitive/string/types.cjs +18 -1
  126. package/dist/lib/primitive/types.cjs +18 -1
  127. package/dist/lib/url/index.cjs +327 -1
  128. package/dist/lib/url/index.mjs +304 -1
  129. package/dist/lib/url/parser.cjs +325 -1
  130. package/dist/lib/url/parser.mjs +304 -1
  131. package/dist/lib/url/types.cjs +18 -1
  132. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  133. package/package.json +5 -5
@@ -1 +1,728 @@
1
- "use strict";var l=Object.defineProperty;var C=Object.getOwnPropertyDescriptor;var j=Object.getOwnPropertyNames;var B=Object.prototype.hasOwnProperty;var N=(r,t)=>{for(var e in t)l(r,e,{get:t[e],enumerable:!0})},P=(r,t,e,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of j(t))!B.call(r,n)&&n!==e&&l(r,n,{get:()=>t[n],enumerable:!(o=C(t,n))||o.enumerable});return r};var A=r=>P(l({},"__esModule",{value:!0}),r);var kr={};N(kr,{addVectors2D:()=>Q,addVectors3D:()=>b,addVectors4D:()=>U,angleBetween2D:()=>q,angleBetween3D:()=>er,centroid2D:()=>$r,createVector2D:()=>R,createVector3D:()=>X,createVector4D:()=>Y,crossProduct3D:()=>O,cubicBezier2D:()=>ar,distance2D:()=>nr,distance3D:()=>ur,distance4D:()=>Dr,distanceSquared2D:()=>cr,distanceSquared3D:()=>xr,distanceSquared4D:()=>ir,dotProduct2D:()=>w,dotProduct3D:()=>M,dotProduct4D:()=>K,lerp2D:()=>yr,lerp3D:()=>T,lerp4D:()=>sr,lerpClamped2D:()=>Vr,lerpClamped3D:()=>mr,lerpClamped4D:()=>pr,magnitude2D:()=>z,magnitude3D:()=>p,magnitude4D:()=>S,magnitudeSquared2D:()=>E,magnitudeSquared3D:()=>Z,magnitudeSquared4D:()=>I,mapRange:()=>lr,mapRangeClamped:()=>gr,midpoint2D:()=>Tr,negateVector2D:()=>Cr,negateVector3D:()=>jr,negateVector4D:()=>Br,normalize2D:()=>L,normalize3D:()=>F,normalize4D:()=>H,perpendicular2D:()=>Nr,project2D:()=>Er,quadraticBezier2D:()=>hr,reflect2D:()=>Mr,rotate2D:()=>$,rotate2DDegrees:()=>Sr,safeNormalize2D:()=>k,safeNormalize3D:()=>G,safeNormalize4D:()=>J,scaleVector2D:()=>rr,scaleVector3D:()=>g,scaleVector4D:()=>tr,signedAngleBetween2D:()=>or,slerp3D:()=>zr,smootherstep2D:()=>wr,smoothstep2D:()=>fr,smoothstepClamped2D:()=>dr,subtractVectors2D:()=>W,subtractVectors3D:()=>_,subtractVectors4D:()=>v,unitX2D:()=>Xr,unitX3D:()=>Zr,unitY2D:()=>Yr,unitY3D:()=>Ir,unitZ3D:()=>Lr,vectorsEqual2D:()=>Fr,vectorsEqual3D:()=>br,vectorsEqual4D:()=>qr,zeroVector2D:()=>Pr,zeroVector3D:()=>Ar,zeroVector4D:()=>Rr});module.exports=A(kr);function u(r,t){if(typeof r!="number"||!Number.isFinite(r))throw new Error(`${t} must be a finite number, got ${r}`)}function y(r){return Math.abs(r)<1e-9}function m(r,t){return Math.abs(r-t)<1e-6}function c(r,t="Vector2D"){if(!r||typeof r!="object")throw new Error(`${t} must be an object`);u(r.x,`${t}.x`),u(r.y,`${t}.y`)}function x(r,t="Vector3D"){if(!r||typeof r!="object")throw new Error(`${t} must be an object`);u(r.x,`${t}.x`),u(r.y,`${t}.y`),u(r.z,`${t}.z`)}function i(r,t="Vector4D"){if(!r||typeof r!="object")throw new Error(`${t} must be an object`);u(r.x,`${t}.x`),u(r.y,`${t}.y`),u(r.z,`${t}.z`),u(r.w,`${t}.w`)}function R(r,t){return u(r,"x"),u(t,"y"),{x:r,y:t}}function X(r,t,e){return u(r,"x"),u(t,"y"),u(e,"z"),{x:r,y:t,z:e}}function Y(r,t,e,o){return u(r,"x"),u(t,"y"),u(e,"z"),u(o,"w"),{x:r,y:t,z:e,w:o}}function z(r){c(r);let t=Math.sqrt(r.x*r.x+r.y*r.y);return y(t)?0:t}function E(r){return c(r),r.x*r.x+r.y*r.y}function p(r){x(r);let t=Math.sqrt(r.x*r.x+r.y*r.y+r.z*r.z);return y(t)?0:t}function Z(r){return x(r),r.x*r.x+r.y*r.y+r.z*r.z}function S(r){i(r);let t=Math.sqrt(r.x*r.x+r.y*r.y+r.z*r.z+r.w*r.w);return y(t)?0:t}function I(r){return i(r),r.x*r.x+r.y*r.y+r.z*r.z+r.w*r.w}function L(r){c(r);let t=z(r);if(y(t))throw new Error("Cannot normalize zero or near-zero vector");return{x:r.x/t,y:r.y/t}}function k(r){c(r);let t=z(r);return y(t)?{x:0,y:0}:{x:r.x/t,y:r.y/t}}function F(r){x(r);let t=p(r);if(y(t))throw new Error("Cannot normalize zero or near-zero vector");return{x:r.x/t,y:r.y/t,z:r.z/t}}function G(r){x(r);let t=p(r);return y(t)?{x:0,y:0,z:0}:{x:r.x/t,y:r.y/t,z:r.z/t}}function H(r){i(r);let t=S(r);if(y(t))throw new Error("Cannot normalize zero or near-zero vector");return{x:r.x/t,y:r.y/t,z:r.z/t,w:r.w/t}}function J(r){i(r);let t=S(r);return y(t)?{x:0,y:0,z:0,w:0}:{x:r.x/t,y:r.y/t,z:r.z/t,w:r.w/t}}function w(r,t){return c(r,"First vector"),c(t,"Second vector"),r.x*t.x+r.y*t.y}function M(r,t){return x(r,"First vector"),x(t,"Second vector"),r.x*t.x+r.y*t.y+r.z*t.z}function K(r,t){return i(r,"First vector"),i(t,"Second vector"),r.x*t.x+r.y*t.y+r.z*t.z+r.w*t.w}function O(r,t){return x(r,"First vector"),x(t,"Second vector"),{x:r.y*t.z-r.z*t.y,y:r.z*t.x-r.x*t.z,z:r.x*t.y-r.y*t.x}}function Q(r,t){return c(r,"First vector"),c(t,"Second vector"),{x:r.x+t.x,y:r.y+t.y}}function b(r,t){return x(r,"First vector"),x(t,"Second vector"),{x:r.x+t.x,y:r.y+t.y,z:r.z+t.z}}function U(r,t){return i(r,"First vector"),i(t,"Second vector"),{x:r.x+t.x,y:r.y+t.y,z:r.z+t.z,w:r.w+t.w}}function W(r,t){return c(r,"First vector"),c(t,"Second vector"),{x:r.x-t.x,y:r.y-t.y}}function _(r,t){return x(r,"First vector"),x(t,"Second vector"),{x:r.x-t.x,y:r.y-t.y,z:r.z-t.z}}function v(r,t){return i(r,"First vector"),i(t,"Second vector"),{x:r.x-t.x,y:r.y-t.y,z:r.z-t.z,w:r.w-t.w}}function rr(r,t){return c(r),u(t,"scalar"),{x:r.x*t,y:r.y*t}}function g(r,t){return x(r),u(t,"scalar"),{x:r.x*t,y:r.y*t,z:r.z*t}}function tr(r,t){return i(r),u(t,"scalar"),{x:r.x*t,y:r.y*t,z:r.z*t,w:r.w*t}}function q(r,t){c(r,"First vector"),c(t,"Second vector");let e=w(r,t),o=z(r),n=z(t);if(y(o)||y(n))throw new Error("Cannot calculate angle with zero or near-zero vector");let D=Math.max(-1,Math.min(1,e/(o*n)));return Math.acos(D)}function er(r,t){x(r,"First vector"),x(t,"Second vector");let e=M(r,t),o=p(r),n=p(t);if(y(o)||y(n))throw new Error("Cannot calculate angle with zero or near-zero vector");let D=Math.max(-1,Math.min(1,e/(o*n)));return Math.acos(D)}function or(r,t){c(r,"First vector"),c(t,"Second vector");let e=q(r,t);return r.x*t.y-r.y*t.x>=0?e:-e}function nr(r,t){c(r,"First point"),c(t,"Second point");let e=t.x-r.x,o=t.y-r.y,n=Math.sqrt(e*e+o*o);return y(n)?0:n}function cr(r,t){c(r,"First point"),c(t,"Second point");let e=t.x-r.x,o=t.y-r.y;return e*e+o*o}function ur(r,t){x(r,"First point"),x(t,"Second point");let e=t.x-r.x,o=t.y-r.y,n=t.z-r.z,D=Math.sqrt(e*e+o*o+n*n);return y(D)?0:D}function xr(r,t){x(r,"First point"),x(t,"Second point");let e=t.x-r.x,o=t.y-r.y,n=t.z-r.z;return e*e+o*o+n*n}function Dr(r,t){i(r,"First point"),i(t,"Second point");let e=t.x-r.x,o=t.y-r.y,n=t.z-r.z,D=t.w-r.w,V=Math.sqrt(e*e+o*o+n*n+D*D);return y(V)?0:V}function ir(r,t){i(r,"First point"),i(t,"Second point");let e=t.x-r.x,o=t.y-r.y,n=t.z-r.z,D=t.w-r.w;return e*e+o*o+n*n+D*D}function yr(r,t,e){return c(r,"Start vector"),c(t,"End vector"),u(e,"t"),{x:r.x+(t.x-r.x)*e,y:r.y+(t.y-r.y)*e}}function Vr(r,t,e){c(r,"Start vector"),c(t,"End vector"),u(e,"t");let o=Math.max(0,Math.min(1,e));return{x:r.x+(t.x-r.x)*o,y:r.y+(t.y-r.y)*o}}function T(r,t,e){return x(r,"Start vector"),x(t,"End vector"),u(e,"t"),{x:r.x+(t.x-r.x)*e,y:r.y+(t.y-r.y)*e,z:r.z+(t.z-r.z)*e}}function mr(r,t,e){x(r,"Start vector"),x(t,"End vector"),u(e,"t");let o=Math.max(0,Math.min(1,e));return{x:r.x+(t.x-r.x)*o,y:r.y+(t.y-r.y)*o,z:r.z+(t.z-r.z)*o}}function sr(r,t,e){return i(r,"Start vector"),i(t,"End vector"),u(e,"t"),{x:r.x+(t.x-r.x)*e,y:r.y+(t.y-r.y)*e,z:r.z+(t.z-r.z)*e,w:r.w+(t.w-r.w)*e}}function pr(r,t,e){i(r,"Start vector"),i(t,"End vector"),u(e,"t");let o=Math.max(0,Math.min(1,e));return{x:r.x+(t.x-r.x)*o,y:r.y+(t.y-r.y)*o,z:r.z+(t.z-r.z)*o,w:r.w+(t.w-r.w)*o}}function zr(r,t,e){x(r,"Start vector"),x(t,"End vector"),u(e,"t");let o=p(r),n=p(t);if(Math.abs(o-1)>1e-8||Math.abs(n-1)>1e-8)throw new Error("SLERP requires unit vectors");let D=Math.max(0,Math.min(1,e)),V=M(r,t),f=Math.max(-1,Math.min(1,V));if(f>.9995)return F(T(r,t,D));let s=Math.acos(f),d=Math.sin(s),h=Math.sin((1-D)*s)/d,a=Math.sin(D*s)/d;return b(g(r,h),g(t,a))}function fr(r,t,e){c(r,"Start vector"),c(t,"End vector"),u(e,"t");let o=e*e*(3-2*e);return{x:r.x+(t.x-r.x)*o,y:r.y+(t.y-r.y)*o}}function dr(r,t,e){c(r,"Start vector"),c(t,"End vector"),u(e,"t");let o=Math.max(0,Math.min(1,e)),n=o*o*(3-2*o);return{x:r.x+(t.x-r.x)*n,y:r.y+(t.y-r.y)*n}}function wr(r,t,e){c(r,"Start vector"),c(t,"End vector"),u(e,"t");let o=e*e*e*(e*(e*6-15)+10);return{x:r.x+(t.x-r.x)*o,y:r.y+(t.y-r.y)*o}}function hr(r,t,e,o){c(r,"Start point"),c(t,"Control point"),c(e,"End point"),u(o,"t");let n=1-o,D=n*n*r.x+2*n*o*t.x+o*o*e.x,V=n*n*r.y+2*n*o*t.y+o*o*e.y;return{x:D,y:V}}function ar(r,t,e,o,n){c(r,"Start point"),c(t,"First control point"),c(e,"Second control point"),c(o,"End point"),u(n,"t");let D=1-n,V=D*D,f=V*D,s=n*n,d=s*n,h=f*r.x+3*V*n*t.x+3*D*s*e.x+d*o.x,a=f*r.y+3*V*n*t.y+3*D*s*e.y+d*o.y;return{x:h,y:a}}function lr(r,t,e,o,n){return u(r,"value"),u(t,"inMin"),u(e,"inMax"),u(o,"outMin"),u(n,"outMax"),m(t,e)?o:o+(n-o)*(r-t)/(e-t)}function gr(r,t,e,o,n){if(u(r,"value"),u(t,"inMin"),u(e,"inMax"),u(o,"outMin"),u(n,"outMax"),m(t,e))return o;let D=(r-t)/(e-t),V=Math.max(0,Math.min(1,D));return o+(n-o)*V}function $(r,t){c(r),u(t,"angle");let e=Math.cos(t),o=Math.sin(t);return{x:r.x*e-r.y*o,y:r.x*o+r.y*e}}function Sr(r,t){return $(r,t*(Math.PI/180))}function Mr(r,t){c(r,"Vector"),c(t,"Normal");let e=z(t);if(Math.abs(e-1)>1e-10)throw new Error("Normal vector must be unit length for reflection");let o=w(r,t);return{x:r.x-2*o*t.x,y:r.y-2*o*t.y}}function Er(r,t){c(r,"First vector"),c(t,"Second vector");let e=E(t);if(y(e))throw new Error("Cannot project onto zero or near-zero vector");let o=w(r,t)/e;return{x:t.x*o,y:t.y*o}}function Fr(r,t){return c(r,"First vector"),c(t,"Second vector"),m(r.x,t.x)&&m(r.y,t.y)}function br(r,t){return x(r,"First vector"),x(t,"Second vector"),m(r.x,t.x)&&m(r.y,t.y)&&m(r.z,t.z)}function qr(r,t){return i(r,"First vector"),i(t,"Second vector"),m(r.x,t.x)&&m(r.y,t.y)&&m(r.z,t.z)&&m(r.w,t.w)}function Tr(r,t){return c(r,"First point"),c(t,"Second point"),{x:(r.x+t.x)/2,y:(r.y+t.y)/2}}function $r(r){if(!Array.isArray(r)||r.length===0)throw new Error("Points array must not be empty");let t=0,e=0;for(let o=0;o<r.length;o++)c(r[o],`points[${o}]`),t+=r[o].x,e+=r[o].y;return{x:t/r.length,y:e/r.length}}function Cr(r){return c(r),{x:-r.x,y:-r.y}}function jr(r){return x(r),{x:-r.x,y:-r.y,z:-r.z}}function Br(r){return i(r),{x:-r.x,y:-r.y,z:-r.z,w:-r.w}}function Nr(r,t=!0){return c(r),t?{x:r.y,y:-r.x}:{x:-r.y,y:r.x}}function Pr(){return{x:0,y:0}}function Ar(){return{x:0,y:0,z:0}}function Rr(){return{x:0,y:0,z:0,w:0}}function Xr(){return{x:1,y:0}}function Yr(){return{x:0,y:1}}function Zr(){return{x:1,y:0,z:0}}function Ir(){return{x:0,y:1,z:0}}function Lr(){return{x:0,y:0,z:1}}
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/lib/maths/fn/vector.ts
21
+ var vector_exports = {};
22
+ __export(vector_exports, {
23
+ addVectors2D: () => addVectors2D,
24
+ addVectors3D: () => addVectors3D,
25
+ addVectors4D: () => addVectors4D,
26
+ angleBetween2D: () => angleBetween2D,
27
+ angleBetween3D: () => angleBetween3D,
28
+ centroid2D: () => centroid2D,
29
+ createVector2D: () => createVector2D,
30
+ createVector3D: () => createVector3D,
31
+ createVector4D: () => createVector4D,
32
+ crossProduct3D: () => crossProduct3D,
33
+ cubicBezier2D: () => cubicBezier2D,
34
+ distance2D: () => distance2D,
35
+ distance3D: () => distance3D,
36
+ distance4D: () => distance4D,
37
+ distanceSquared2D: () => distanceSquared2D,
38
+ distanceSquared3D: () => distanceSquared3D,
39
+ distanceSquared4D: () => distanceSquared4D,
40
+ dotProduct2D: () => dotProduct2D,
41
+ dotProduct3D: () => dotProduct3D,
42
+ dotProduct4D: () => dotProduct4D,
43
+ lerp2D: () => lerp2D,
44
+ lerp3D: () => lerp3D,
45
+ lerp4D: () => lerp4D,
46
+ lerpClamped2D: () => lerpClamped2D,
47
+ lerpClamped3D: () => lerpClamped3D,
48
+ lerpClamped4D: () => lerpClamped4D,
49
+ magnitude2D: () => magnitude2D,
50
+ magnitude3D: () => magnitude3D,
51
+ magnitude4D: () => magnitude4D,
52
+ magnitudeSquared2D: () => magnitudeSquared2D,
53
+ magnitudeSquared3D: () => magnitudeSquared3D,
54
+ magnitudeSquared4D: () => magnitudeSquared4D,
55
+ mapRange: () => mapRange,
56
+ mapRangeClamped: () => mapRangeClamped,
57
+ midpoint2D: () => midpoint2D,
58
+ negateVector2D: () => negateVector2D,
59
+ negateVector3D: () => negateVector3D,
60
+ negateVector4D: () => negateVector4D,
61
+ normalize2D: () => normalize2D,
62
+ normalize3D: () => normalize3D,
63
+ normalize4D: () => normalize4D,
64
+ perpendicular2D: () => perpendicular2D,
65
+ project2D: () => project2D,
66
+ quadraticBezier2D: () => quadraticBezier2D,
67
+ reflect2D: () => reflect2D,
68
+ rotate2D: () => rotate2D,
69
+ rotate2DDegrees: () => rotate2DDegrees,
70
+ safeNormalize2D: () => safeNormalize2D,
71
+ safeNormalize3D: () => safeNormalize3D,
72
+ safeNormalize4D: () => safeNormalize4D,
73
+ scaleVector2D: () => scaleVector2D,
74
+ scaleVector3D: () => scaleVector3D,
75
+ scaleVector4D: () => scaleVector4D,
76
+ signedAngleBetween2D: () => signedAngleBetween2D,
77
+ slerp3D: () => slerp3D,
78
+ smootherstep2D: () => smootherstep2D,
79
+ smoothstep2D: () => smoothstep2D,
80
+ smoothstepClamped2D: () => smoothstepClamped2D,
81
+ subtractVectors2D: () => subtractVectors2D,
82
+ subtractVectors3D: () => subtractVectors3D,
83
+ subtractVectors4D: () => subtractVectors4D,
84
+ unitX2D: () => unitX2D,
85
+ unitX3D: () => unitX3D,
86
+ unitY2D: () => unitY2D,
87
+ unitY3D: () => unitY3D,
88
+ unitZ3D: () => unitZ3D,
89
+ vectorsEqual2D: () => vectorsEqual2D,
90
+ vectorsEqual3D: () => vectorsEqual3D,
91
+ vectorsEqual4D: () => vectorsEqual4D,
92
+ zeroVector2D: () => zeroVector2D,
93
+ zeroVector3D: () => zeroVector3D,
94
+ zeroVector4D: () => zeroVector4D
95
+ });
96
+ module.exports = __toCommonJS(vector_exports);
97
+ function validateNumber(value, name) {
98
+ if (typeof value !== "number" || !Number.isFinite(value)) {
99
+ throw new Error(`${name} must be a finite number, got ${value}`);
100
+ }
101
+ }
102
+ function isApproximatelyZero(value) {
103
+ return Math.abs(value) < 1e-9;
104
+ }
105
+ function approximatelyEqual(a, b) {
106
+ return Math.abs(a - b) < 1e-6;
107
+ }
108
+ function validateVector2D(vector, name = "Vector2D") {
109
+ if (!vector || typeof vector !== "object") {
110
+ throw new Error(`${name} must be an object`);
111
+ }
112
+ validateNumber(vector.x, `${name}.x`);
113
+ validateNumber(vector.y, `${name}.y`);
114
+ }
115
+ function validateVector3D(vector, name = "Vector3D") {
116
+ if (!vector || typeof vector !== "object") {
117
+ throw new Error(`${name} must be an object`);
118
+ }
119
+ validateNumber(vector.x, `${name}.x`);
120
+ validateNumber(vector.y, `${name}.y`);
121
+ validateNumber(vector.z, `${name}.z`);
122
+ }
123
+ function validateVector4D(vector, name = "Vector4D") {
124
+ if (!vector || typeof vector !== "object") {
125
+ throw new Error(`${name} must be an object`);
126
+ }
127
+ validateNumber(vector.x, `${name}.x`);
128
+ validateNumber(vector.y, `${name}.y`);
129
+ validateNumber(vector.z, `${name}.z`);
130
+ validateNumber(vector.w, `${name}.w`);
131
+ }
132
+ function createVector2D(x, y) {
133
+ validateNumber(x, "x");
134
+ validateNumber(y, "y");
135
+ return { x, y };
136
+ }
137
+ function createVector3D(x, y, z) {
138
+ validateNumber(x, "x");
139
+ validateNumber(y, "y");
140
+ validateNumber(z, "z");
141
+ return { x, y, z };
142
+ }
143
+ function createVector4D(x, y, z, w) {
144
+ validateNumber(x, "x");
145
+ validateNumber(y, "y");
146
+ validateNumber(z, "z");
147
+ validateNumber(w, "w");
148
+ return { x, y, z, w };
149
+ }
150
+ function magnitude2D(vector) {
151
+ validateVector2D(vector);
152
+ const magnitude = Math.sqrt(vector.x * vector.x + vector.y * vector.y);
153
+ return isApproximatelyZero(magnitude) ? 0 : magnitude;
154
+ }
155
+ function magnitudeSquared2D(vector) {
156
+ validateVector2D(vector);
157
+ return vector.x * vector.x + vector.y * vector.y;
158
+ }
159
+ function magnitude3D(vector) {
160
+ validateVector3D(vector);
161
+ const magnitude = Math.sqrt(
162
+ vector.x * vector.x + vector.y * vector.y + vector.z * vector.z
163
+ );
164
+ return isApproximatelyZero(magnitude) ? 0 : magnitude;
165
+ }
166
+ function magnitudeSquared3D(vector) {
167
+ validateVector3D(vector);
168
+ return vector.x * vector.x + vector.y * vector.y + vector.z * vector.z;
169
+ }
170
+ function magnitude4D(vector) {
171
+ validateVector4D(vector);
172
+ const magnitude = Math.sqrt(
173
+ vector.x * vector.x + vector.y * vector.y + vector.z * vector.z + vector.w * vector.w
174
+ );
175
+ return isApproximatelyZero(magnitude) ? 0 : magnitude;
176
+ }
177
+ function magnitudeSquared4D(vector) {
178
+ validateVector4D(vector);
179
+ return vector.x * vector.x + vector.y * vector.y + vector.z * vector.z + vector.w * vector.w;
180
+ }
181
+ function normalize2D(vector) {
182
+ validateVector2D(vector);
183
+ const mag = magnitude2D(vector);
184
+ if (isApproximatelyZero(mag)) {
185
+ throw new Error("Cannot normalize zero or near-zero vector");
186
+ }
187
+ return {
188
+ x: vector.x / mag,
189
+ y: vector.y / mag
190
+ };
191
+ }
192
+ function safeNormalize2D(vector) {
193
+ validateVector2D(vector);
194
+ const mag = magnitude2D(vector);
195
+ if (isApproximatelyZero(mag)) {
196
+ return { x: 0, y: 0 };
197
+ }
198
+ return {
199
+ x: vector.x / mag,
200
+ y: vector.y / mag
201
+ };
202
+ }
203
+ function normalize3D(vector) {
204
+ validateVector3D(vector);
205
+ const mag = magnitude3D(vector);
206
+ if (isApproximatelyZero(mag)) {
207
+ throw new Error("Cannot normalize zero or near-zero vector");
208
+ }
209
+ return {
210
+ x: vector.x / mag,
211
+ y: vector.y / mag,
212
+ z: vector.z / mag
213
+ };
214
+ }
215
+ function safeNormalize3D(vector) {
216
+ validateVector3D(vector);
217
+ const mag = magnitude3D(vector);
218
+ if (isApproximatelyZero(mag)) {
219
+ return { x: 0, y: 0, z: 0 };
220
+ }
221
+ return {
222
+ x: vector.x / mag,
223
+ y: vector.y / mag,
224
+ z: vector.z / mag
225
+ };
226
+ }
227
+ function normalize4D(vector) {
228
+ validateVector4D(vector);
229
+ const mag = magnitude4D(vector);
230
+ if (isApproximatelyZero(mag)) {
231
+ throw new Error("Cannot normalize zero or near-zero vector");
232
+ }
233
+ return {
234
+ x: vector.x / mag,
235
+ y: vector.y / mag,
236
+ z: vector.z / mag,
237
+ w: vector.w / mag
238
+ };
239
+ }
240
+ function safeNormalize4D(vector) {
241
+ validateVector4D(vector);
242
+ const mag = magnitude4D(vector);
243
+ if (isApproximatelyZero(mag)) {
244
+ return { x: 0, y: 0, z: 0, w: 0 };
245
+ }
246
+ return {
247
+ x: vector.x / mag,
248
+ y: vector.y / mag,
249
+ z: vector.z / mag,
250
+ w: vector.w / mag
251
+ };
252
+ }
253
+ function dotProduct2D(a, b) {
254
+ validateVector2D(a, "First vector");
255
+ validateVector2D(b, "Second vector");
256
+ return a.x * b.x + a.y * b.y;
257
+ }
258
+ function dotProduct3D(a, b) {
259
+ validateVector3D(a, "First vector");
260
+ validateVector3D(b, "Second vector");
261
+ return a.x * b.x + a.y * b.y + a.z * b.z;
262
+ }
263
+ function dotProduct4D(a, b) {
264
+ validateVector4D(a, "First vector");
265
+ validateVector4D(b, "Second vector");
266
+ return a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w;
267
+ }
268
+ function crossProduct3D(a, b) {
269
+ validateVector3D(a, "First vector");
270
+ validateVector3D(b, "Second vector");
271
+ return {
272
+ x: a.y * b.z - a.z * b.y,
273
+ y: a.z * b.x - a.x * b.z,
274
+ z: a.x * b.y - a.y * b.x
275
+ };
276
+ }
277
+ function addVectors2D(a, b) {
278
+ validateVector2D(a, "First vector");
279
+ validateVector2D(b, "Second vector");
280
+ return {
281
+ x: a.x + b.x,
282
+ y: a.y + b.y
283
+ };
284
+ }
285
+ function addVectors3D(a, b) {
286
+ validateVector3D(a, "First vector");
287
+ validateVector3D(b, "Second vector");
288
+ return {
289
+ x: a.x + b.x,
290
+ y: a.y + b.y,
291
+ z: a.z + b.z
292
+ };
293
+ }
294
+ function addVectors4D(a, b) {
295
+ validateVector4D(a, "First vector");
296
+ validateVector4D(b, "Second vector");
297
+ return {
298
+ x: a.x + b.x,
299
+ y: a.y + b.y,
300
+ z: a.z + b.z,
301
+ w: a.w + b.w
302
+ };
303
+ }
304
+ function subtractVectors2D(a, b) {
305
+ validateVector2D(a, "First vector");
306
+ validateVector2D(b, "Second vector");
307
+ return {
308
+ x: a.x - b.x,
309
+ y: a.y - b.y
310
+ };
311
+ }
312
+ function subtractVectors3D(a, b) {
313
+ validateVector3D(a, "First vector");
314
+ validateVector3D(b, "Second vector");
315
+ return {
316
+ x: a.x - b.x,
317
+ y: a.y - b.y,
318
+ z: a.z - b.z
319
+ };
320
+ }
321
+ function subtractVectors4D(a, b) {
322
+ validateVector4D(a, "First vector");
323
+ validateVector4D(b, "Second vector");
324
+ return {
325
+ x: a.x - b.x,
326
+ y: a.y - b.y,
327
+ z: a.z - b.z,
328
+ w: a.w - b.w
329
+ };
330
+ }
331
+ function scaleVector2D(vector, scalar) {
332
+ validateVector2D(vector);
333
+ validateNumber(scalar, "scalar");
334
+ return {
335
+ x: vector.x * scalar,
336
+ y: vector.y * scalar
337
+ };
338
+ }
339
+ function scaleVector3D(vector, scalar) {
340
+ validateVector3D(vector);
341
+ validateNumber(scalar, "scalar");
342
+ return {
343
+ x: vector.x * scalar,
344
+ y: vector.y * scalar,
345
+ z: vector.z * scalar
346
+ };
347
+ }
348
+ function scaleVector4D(vector, scalar) {
349
+ validateVector4D(vector);
350
+ validateNumber(scalar, "scalar");
351
+ return {
352
+ x: vector.x * scalar,
353
+ y: vector.y * scalar,
354
+ z: vector.z * scalar,
355
+ w: vector.w * scalar
356
+ };
357
+ }
358
+ function angleBetween2D(a, b) {
359
+ validateVector2D(a, "First vector");
360
+ validateVector2D(b, "Second vector");
361
+ const dot = dotProduct2D(a, b);
362
+ const magA = magnitude2D(a);
363
+ const magB = magnitude2D(b);
364
+ if (isApproximatelyZero(magA) || isApproximatelyZero(magB)) {
365
+ throw new Error("Cannot calculate angle with zero or near-zero vector");
366
+ }
367
+ const cosTheta = Math.max(-1, Math.min(1, dot / (magA * magB)));
368
+ return Math.acos(cosTheta);
369
+ }
370
+ function angleBetween3D(a, b) {
371
+ validateVector3D(a, "First vector");
372
+ validateVector3D(b, "Second vector");
373
+ const dot = dotProduct3D(a, b);
374
+ const magA = magnitude3D(a);
375
+ const magB = magnitude3D(b);
376
+ if (isApproximatelyZero(magA) || isApproximatelyZero(magB)) {
377
+ throw new Error("Cannot calculate angle with zero or near-zero vector");
378
+ }
379
+ const cosTheta = Math.max(-1, Math.min(1, dot / (magA * magB)));
380
+ return Math.acos(cosTheta);
381
+ }
382
+ function signedAngleBetween2D(a, b) {
383
+ validateVector2D(a, "First vector");
384
+ validateVector2D(b, "Second vector");
385
+ const angle = angleBetween2D(a, b);
386
+ const cross = a.x * b.y - a.y * b.x;
387
+ return cross >= 0 ? angle : -angle;
388
+ }
389
+ function distance2D(a, b) {
390
+ validateVector2D(a, "First point");
391
+ validateVector2D(b, "Second point");
392
+ const dx = b.x - a.x;
393
+ const dy = b.y - a.y;
394
+ const distance = Math.sqrt(dx * dx + dy * dy);
395
+ return isApproximatelyZero(distance) ? 0 : distance;
396
+ }
397
+ function distanceSquared2D(a, b) {
398
+ validateVector2D(a, "First point");
399
+ validateVector2D(b, "Second point");
400
+ const dx = b.x - a.x;
401
+ const dy = b.y - a.y;
402
+ return dx * dx + dy * dy;
403
+ }
404
+ function distance3D(a, b) {
405
+ validateVector3D(a, "First point");
406
+ validateVector3D(b, "Second point");
407
+ const dx = b.x - a.x;
408
+ const dy = b.y - a.y;
409
+ const dz = b.z - a.z;
410
+ const distance = Math.sqrt(dx * dx + dy * dy + dz * dz);
411
+ return isApproximatelyZero(distance) ? 0 : distance;
412
+ }
413
+ function distanceSquared3D(a, b) {
414
+ validateVector3D(a, "First point");
415
+ validateVector3D(b, "Second point");
416
+ const dx = b.x - a.x;
417
+ const dy = b.y - a.y;
418
+ const dz = b.z - a.z;
419
+ return dx * dx + dy * dy + dz * dz;
420
+ }
421
+ function distance4D(a, b) {
422
+ validateVector4D(a, "First point");
423
+ validateVector4D(b, "Second point");
424
+ const dx = b.x - a.x;
425
+ const dy = b.y - a.y;
426
+ const dz = b.z - a.z;
427
+ const dw = b.w - a.w;
428
+ const distance = Math.sqrt(dx * dx + dy * dy + dz * dz + dw * dw);
429
+ return isApproximatelyZero(distance) ? 0 : distance;
430
+ }
431
+ function distanceSquared4D(a, b) {
432
+ validateVector4D(a, "First point");
433
+ validateVector4D(b, "Second point");
434
+ const dx = b.x - a.x;
435
+ const dy = b.y - a.y;
436
+ const dz = b.z - a.z;
437
+ const dw = b.w - a.w;
438
+ return dx * dx + dy * dy + dz * dz + dw * dw;
439
+ }
440
+ function lerp2D(start, end, t) {
441
+ validateVector2D(start, "Start vector");
442
+ validateVector2D(end, "End vector");
443
+ validateNumber(t, "t");
444
+ return {
445
+ x: start.x + (end.x - start.x) * t,
446
+ y: start.y + (end.y - start.y) * t
447
+ };
448
+ }
449
+ function lerpClamped2D(start, end, t) {
450
+ validateVector2D(start, "Start vector");
451
+ validateVector2D(end, "End vector");
452
+ validateNumber(t, "t");
453
+ const clampedT = Math.max(0, Math.min(1, t));
454
+ return {
455
+ x: start.x + (end.x - start.x) * clampedT,
456
+ y: start.y + (end.y - start.y) * clampedT
457
+ };
458
+ }
459
+ function lerp3D(start, end, t) {
460
+ validateVector3D(start, "Start vector");
461
+ validateVector3D(end, "End vector");
462
+ validateNumber(t, "t");
463
+ return {
464
+ x: start.x + (end.x - start.x) * t,
465
+ y: start.y + (end.y - start.y) * t,
466
+ z: start.z + (end.z - start.z) * t
467
+ };
468
+ }
469
+ function lerpClamped3D(start, end, t) {
470
+ validateVector3D(start, "Start vector");
471
+ validateVector3D(end, "End vector");
472
+ validateNumber(t, "t");
473
+ const clampedT = Math.max(0, Math.min(1, t));
474
+ return {
475
+ x: start.x + (end.x - start.x) * clampedT,
476
+ y: start.y + (end.y - start.y) * clampedT,
477
+ z: start.z + (end.z - start.z) * clampedT
478
+ };
479
+ }
480
+ function lerp4D(start, end, t) {
481
+ validateVector4D(start, "Start vector");
482
+ validateVector4D(end, "End vector");
483
+ validateNumber(t, "t");
484
+ return {
485
+ x: start.x + (end.x - start.x) * t,
486
+ y: start.y + (end.y - start.y) * t,
487
+ z: start.z + (end.z - start.z) * t,
488
+ w: start.w + (end.w - start.w) * t
489
+ };
490
+ }
491
+ function lerpClamped4D(start, end, t) {
492
+ validateVector4D(start, "Start vector");
493
+ validateVector4D(end, "End vector");
494
+ validateNumber(t, "t");
495
+ const clampedT = Math.max(0, Math.min(1, t));
496
+ return {
497
+ x: start.x + (end.x - start.x) * clampedT,
498
+ y: start.y + (end.y - start.y) * clampedT,
499
+ z: start.z + (end.z - start.z) * clampedT,
500
+ w: start.w + (end.w - start.w) * clampedT
501
+ };
502
+ }
503
+ function slerp3D(start, end, t) {
504
+ validateVector3D(start, "Start vector");
505
+ validateVector3D(end, "End vector");
506
+ validateNumber(t, "t");
507
+ const startMag = magnitude3D(start);
508
+ const endMag = magnitude3D(end);
509
+ if (Math.abs(startMag - 1) > 1e-8 || Math.abs(endMag - 1) > 1e-8) {
510
+ throw new Error("SLERP requires unit vectors");
511
+ }
512
+ const clampedT = Math.max(0, Math.min(1, t));
513
+ const dot = dotProduct3D(start, end);
514
+ const clampedDot = Math.max(-1, Math.min(1, dot));
515
+ if (clampedDot > 0.9995) {
516
+ return normalize3D(lerp3D(start, end, clampedT));
517
+ }
518
+ const theta = Math.acos(clampedDot);
519
+ const sinTheta = Math.sin(theta);
520
+ const factor1 = Math.sin((1 - clampedT) * theta) / sinTheta;
521
+ const factor2 = Math.sin(clampedT * theta) / sinTheta;
522
+ return addVectors3D(
523
+ scaleVector3D(start, factor1),
524
+ scaleVector3D(end, factor2)
525
+ );
526
+ }
527
+ function smoothstep2D(start, end, t) {
528
+ validateVector2D(start, "Start vector");
529
+ validateVector2D(end, "End vector");
530
+ validateNumber(t, "t");
531
+ const smoothedT = t * t * (3 - 2 * t);
532
+ return {
533
+ x: start.x + (end.x - start.x) * smoothedT,
534
+ y: start.y + (end.y - start.y) * smoothedT
535
+ };
536
+ }
537
+ function smoothstepClamped2D(start, end, t) {
538
+ validateVector2D(start, "Start vector");
539
+ validateVector2D(end, "End vector");
540
+ validateNumber(t, "t");
541
+ const clampedT = Math.max(0, Math.min(1, t));
542
+ const smoothedT = clampedT * clampedT * (3 - 2 * clampedT);
543
+ return {
544
+ x: start.x + (end.x - start.x) * smoothedT,
545
+ y: start.y + (end.y - start.y) * smoothedT
546
+ };
547
+ }
548
+ function smootherstep2D(start, end, t) {
549
+ validateVector2D(start, "Start vector");
550
+ validateVector2D(end, "End vector");
551
+ validateNumber(t, "t");
552
+ const smootherT = t * t * t * (t * (t * 6 - 15) + 10);
553
+ return {
554
+ x: start.x + (end.x - start.x) * smootherT,
555
+ y: start.y + (end.y - start.y) * smootherT
556
+ };
557
+ }
558
+ function quadraticBezier2D(p0, p1, p2, t) {
559
+ validateVector2D(p0, "Start point");
560
+ validateVector2D(p1, "Control point");
561
+ validateVector2D(p2, "End point");
562
+ validateNumber(t, "t");
563
+ const oneMinusT = 1 - t;
564
+ const x = oneMinusT * oneMinusT * p0.x + 2 * oneMinusT * t * p1.x + t * t * p2.x;
565
+ const y = oneMinusT * oneMinusT * p0.y + 2 * oneMinusT * t * p1.y + t * t * p2.y;
566
+ return { x, y };
567
+ }
568
+ function cubicBezier2D(p0, p1, p2, p3, t) {
569
+ validateVector2D(p0, "Start point");
570
+ validateVector2D(p1, "First control point");
571
+ validateVector2D(p2, "Second control point");
572
+ validateVector2D(p3, "End point");
573
+ validateNumber(t, "t");
574
+ const oneMinusT = 1 - t;
575
+ const oneMinusT2 = oneMinusT * oneMinusT;
576
+ const oneMinusT3 = oneMinusT2 * oneMinusT;
577
+ const t2 = t * t;
578
+ const t3 = t2 * t;
579
+ const x = oneMinusT3 * p0.x + 3 * oneMinusT2 * t * p1.x + 3 * oneMinusT * t2 * p2.x + t3 * p3.x;
580
+ const y = oneMinusT3 * p0.y + 3 * oneMinusT2 * t * p1.y + 3 * oneMinusT * t2 * p2.y + t3 * p3.y;
581
+ return { x, y };
582
+ }
583
+ function mapRange(value, inMin, inMax, outMin, outMax) {
584
+ validateNumber(value, "value");
585
+ validateNumber(inMin, "inMin");
586
+ validateNumber(inMax, "inMax");
587
+ validateNumber(outMin, "outMin");
588
+ validateNumber(outMax, "outMax");
589
+ if (approximatelyEqual(inMin, inMax)) {
590
+ return outMin;
591
+ }
592
+ return outMin + (outMax - outMin) * (value - inMin) / (inMax - inMin);
593
+ }
594
+ function mapRangeClamped(value, inMin, inMax, outMin, outMax) {
595
+ validateNumber(value, "value");
596
+ validateNumber(inMin, "inMin");
597
+ validateNumber(inMax, "inMax");
598
+ validateNumber(outMin, "outMin");
599
+ validateNumber(outMax, "outMax");
600
+ if (approximatelyEqual(inMin, inMax)) {
601
+ return outMin;
602
+ }
603
+ const t = (value - inMin) / (inMax - inMin);
604
+ const clampedT = Math.max(0, Math.min(1, t));
605
+ return outMin + (outMax - outMin) * clampedT;
606
+ }
607
+ function rotate2D(vector, angle) {
608
+ validateVector2D(vector);
609
+ validateNumber(angle, "angle");
610
+ const cos = Math.cos(angle);
611
+ const sin = Math.sin(angle);
612
+ return {
613
+ x: vector.x * cos - vector.y * sin,
614
+ y: vector.x * sin + vector.y * cos
615
+ };
616
+ }
617
+ function rotate2DDegrees(vector, degrees) {
618
+ return rotate2D(vector, degrees * (Math.PI / 180));
619
+ }
620
+ function reflect2D(vector, normal) {
621
+ validateVector2D(vector, "Vector");
622
+ validateVector2D(normal, "Normal");
623
+ const normalMag = magnitude2D(normal);
624
+ if (Math.abs(normalMag - 1) > 1e-10) {
625
+ throw new Error("Normal vector must be unit length for reflection");
626
+ }
627
+ const dot = dotProduct2D(vector, normal);
628
+ return {
629
+ x: vector.x - 2 * dot * normal.x,
630
+ y: vector.y - 2 * dot * normal.y
631
+ };
632
+ }
633
+ function project2D(a, b) {
634
+ validateVector2D(a, "First vector");
635
+ validateVector2D(b, "Second vector");
636
+ const bMagSquared = magnitudeSquared2D(b);
637
+ if (isApproximatelyZero(bMagSquared)) {
638
+ throw new Error("Cannot project onto zero or near-zero vector");
639
+ }
640
+ const scale = dotProduct2D(a, b) / bMagSquared;
641
+ return {
642
+ x: b.x * scale,
643
+ y: b.y * scale
644
+ };
645
+ }
646
+ function vectorsEqual2D(a, b) {
647
+ validateVector2D(a, "First vector");
648
+ validateVector2D(b, "Second vector");
649
+ return approximatelyEqual(a.x, b.x) && approximatelyEqual(a.y, b.y);
650
+ }
651
+ function vectorsEqual3D(a, b) {
652
+ validateVector3D(a, "First vector");
653
+ validateVector3D(b, "Second vector");
654
+ return approximatelyEqual(a.x, b.x) && approximatelyEqual(a.y, b.y) && approximatelyEqual(a.z, b.z);
655
+ }
656
+ function vectorsEqual4D(a, b) {
657
+ validateVector4D(a, "First vector");
658
+ validateVector4D(b, "Second vector");
659
+ return approximatelyEqual(a.x, b.x) && approximatelyEqual(a.y, b.y) && approximatelyEqual(a.z, b.z) && approximatelyEqual(a.w, b.w);
660
+ }
661
+ function midpoint2D(a, b) {
662
+ validateVector2D(a, "First point");
663
+ validateVector2D(b, "Second point");
664
+ return {
665
+ x: (a.x + b.x) / 2,
666
+ y: (a.y + b.y) / 2
667
+ };
668
+ }
669
+ function centroid2D(points) {
670
+ if (!Array.isArray(points) || points.length === 0) {
671
+ throw new Error("Points array must not be empty");
672
+ }
673
+ let sumX = 0;
674
+ let sumY = 0;
675
+ for (let i = 0; i < points.length; i++) {
676
+ validateVector2D(points[i], `points[${i}]`);
677
+ sumX += points[i].x;
678
+ sumY += points[i].y;
679
+ }
680
+ return {
681
+ x: sumX / points.length,
682
+ y: sumY / points.length
683
+ };
684
+ }
685
+ function negateVector2D(vector) {
686
+ validateVector2D(vector);
687
+ return { x: -vector.x, y: -vector.y };
688
+ }
689
+ function negateVector3D(vector) {
690
+ validateVector3D(vector);
691
+ return { x: -vector.x, y: -vector.y, z: -vector.z };
692
+ }
693
+ function negateVector4D(vector) {
694
+ validateVector4D(vector);
695
+ return { x: -vector.x, y: -vector.y, z: -vector.z, w: -vector.w };
696
+ }
697
+ function perpendicular2D(vector, clockwise = true) {
698
+ validateVector2D(vector);
699
+ if (clockwise) {
700
+ return { x: vector.y, y: -vector.x };
701
+ } else {
702
+ return { x: -vector.y, y: vector.x };
703
+ }
704
+ }
705
+ function zeroVector2D() {
706
+ return { x: 0, y: 0 };
707
+ }
708
+ function zeroVector3D() {
709
+ return { x: 0, y: 0, z: 0 };
710
+ }
711
+ function zeroVector4D() {
712
+ return { x: 0, y: 0, z: 0, w: 0 };
713
+ }
714
+ function unitX2D() {
715
+ return { x: 1, y: 0 };
716
+ }
717
+ function unitY2D() {
718
+ return { x: 0, y: 1 };
719
+ }
720
+ function unitX3D() {
721
+ return { x: 1, y: 0, z: 0 };
722
+ }
723
+ function unitY3D() {
724
+ return { x: 0, y: 1, z: 0 };
725
+ }
726
+ function unitZ3D() {
727
+ return { x: 0, y: 0, z: 1 };
728
+ }