@fimbul-works/vec 1.0.3 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +208 -85
- package/dist/cjs/2d/add-2d.d.ts +8 -0
- package/dist/cjs/2d/add-2d.js +11 -0
- package/dist/cjs/2d/angle-between-2d.d.ts +8 -0
- package/dist/cjs/2d/angle-between-2d.js +11 -0
- package/dist/cjs/2d/angle-x-2d.d.ts +7 -0
- package/dist/cjs/2d/angle-x-2d.js +10 -0
- package/dist/cjs/2d/angle-y-2d.d.ts +7 -0
- package/dist/cjs/2d/angle-y-2d.js +10 -0
- package/dist/cjs/2d/clamp-2d.d.ts +10 -0
- package/dist/cjs/2d/clamp-2d.js +14 -0
- package/dist/cjs/2d/clone-2d.d.ts +7 -0
- package/dist/cjs/2d/clone-2d.js +10 -0
- package/dist/cjs/2d/cross-2d.d.ts +8 -0
- package/dist/cjs/2d/cross-2d.js +11 -0
- package/dist/cjs/2d/distance-2d.d.ts +8 -0
- package/dist/cjs/2d/distance-2d.js +11 -0
- package/dist/cjs/2d/distance-chebyshev-2d.d.ts +8 -0
- package/dist/cjs/2d/distance-chebyshev-2d.js +15 -0
- package/dist/cjs/2d/distance-manhattan-2d.d.ts +8 -0
- package/dist/cjs/2d/distance-manhattan-2d.js +11 -0
- package/dist/cjs/2d/distance-minkowski-2d.d.ts +9 -0
- package/dist/cjs/2d/distance-minkowski-2d.js +12 -0
- package/dist/cjs/2d/distance-sq-2d.d.ts +8 -0
- package/dist/cjs/2d/distance-sq-2d.js +11 -0
- package/dist/cjs/2d/divide-2d.d.ts +8 -0
- package/dist/cjs/2d/divide-2d.js +14 -0
- package/dist/cjs/2d/dot-2d.d.ts +8 -0
- package/dist/cjs/2d/dot-2d.js +11 -0
- package/dist/cjs/2d/from-angle-x-2d.d.ts +8 -0
- package/dist/cjs/2d/from-angle-x-2d.js +14 -0
- package/dist/cjs/2d/from-angle-y-2d.d.ts +8 -0
- package/dist/cjs/2d/from-angle-y-2d.js +14 -0
- package/dist/cjs/2d/from-object-2d.d.ts +10 -0
- package/dist/cjs/2d/from-object-2d.js +10 -0
- package/dist/cjs/2d/from-polar-coords-2d.d.ts +8 -0
- package/dist/cjs/2d/from-polar-coords-2d.js +11 -0
- package/dist/cjs/2d/immutable-2d.d.ts +7 -0
- package/dist/cjs/2d/immutable-2d.js +10 -0
- package/dist/cjs/2d/index.d.ts +47 -0
- package/dist/cjs/2d/index.js +63 -0
- package/dist/cjs/2d/is-equal-2d.d.ts +8 -0
- package/dist/cjs/2d/is-equal-2d.js +11 -0
- package/dist/cjs/2d/is-equal-approx-2d.d.ts +9 -0
- package/dist/cjs/2d/is-equal-approx-2d.js +12 -0
- package/dist/cjs/2d/is-infinite-2d.d.ts +7 -0
- package/dist/cjs/2d/is-infinite-2d.js +13 -0
- package/dist/cjs/2d/is-nan-2d.d.ts +7 -0
- package/dist/cjs/2d/is-nan-2d.js +10 -0
- package/dist/cjs/2d/is-opposite-2d.d.ts +8 -0
- package/dist/cjs/2d/is-opposite-2d.js +11 -0
- package/dist/cjs/2d/is-zero-2d.d.ts +7 -0
- package/dist/cjs/2d/is-zero-2d.js +10 -0
- package/dist/cjs/2d/lerp-2d.d.ts +9 -0
- package/dist/cjs/2d/lerp-2d.js +15 -0
- package/dist/cjs/2d/limit-max-2d.d.ts +9 -0
- package/dist/cjs/2d/limit-max-2d.js +13 -0
- package/dist/cjs/2d/limit-min-2d.d.ts +9 -0
- package/dist/cjs/2d/limit-min-2d.js +13 -0
- package/dist/cjs/2d/look-at-2d.d.ts +10 -0
- package/dist/cjs/2d/look-at-2d.js +14 -0
- package/dist/cjs/2d/magnitude-2d.d.ts +7 -0
- package/dist/cjs/2d/magnitude-2d.js +10 -0
- package/dist/cjs/2d/magnitude-sq-2d.d.ts +7 -0
- package/dist/cjs/2d/magnitude-sq-2d.js +10 -0
- package/dist/cjs/2d/multiply-2d.d.ts +8 -0
- package/dist/cjs/2d/multiply-2d.js +11 -0
- package/dist/cjs/2d/negate-2d.d.ts +7 -0
- package/dist/cjs/2d/negate-2d.js +10 -0
- package/dist/cjs/2d/normalize-2d.d.ts +8 -0
- package/dist/cjs/2d/normalize-2d.js +12 -0
- package/dist/cjs/2d/one-2d.d.ts +6 -0
- package/dist/cjs/2d/one-2d.js +9 -0
- package/dist/cjs/2d/project-2d.d.ts +10 -0
- package/dist/cjs/2d/project-2d.js +17 -0
- package/dist/cjs/2d/random-2d.d.ts +7 -0
- package/dist/cjs/2d/random-2d.js +13 -0
- package/dist/cjs/2d/reflect-2d.d.ts +9 -0
- package/dist/cjs/2d/reflect-2d.js +16 -0
- package/dist/cjs/2d/rotate-2d.d.ts +9 -0
- package/dist/cjs/2d/rotate-2d.js +27 -0
- package/dist/cjs/2d/set-magnitude-2d.d.ts +9 -0
- package/dist/cjs/2d/set-magnitude-2d.js +16 -0
- package/dist/cjs/2d/subtract-2d.d.ts +8 -0
- package/dist/cjs/2d/subtract-2d.js +11 -0
- package/dist/cjs/2d/types.d.ts +4 -0
- package/dist/cjs/2d/types.js +2 -0
- package/dist/cjs/2d/zero-2d.d.ts +6 -0
- package/dist/cjs/2d/zero-2d.js +9 -0
- package/dist/cjs/3d/add-3d.d.ts +8 -0
- package/dist/cjs/3d/add-3d.js +15 -0
- package/dist/cjs/3d/angle-between-3d.d.ts +10 -0
- package/dist/cjs/3d/angle-between-3d.js +14 -0
- package/dist/cjs/3d/angle-x-3d.d.ts +7 -0
- package/dist/cjs/3d/angle-x-3d.js +10 -0
- package/dist/cjs/3d/angle-y-3d.d.ts +7 -0
- package/dist/cjs/3d/angle-y-3d.js +10 -0
- package/dist/cjs/3d/angle-z-3d.d.ts +7 -0
- package/dist/cjs/3d/angle-z-3d.js +10 -0
- package/dist/cjs/3d/clamp-3d.d.ts +10 -0
- package/dist/cjs/3d/clamp-3d.js +18 -0
- package/dist/cjs/3d/clone-3d.d.ts +7 -0
- package/dist/cjs/3d/clone-3d.js +10 -0
- package/dist/cjs/3d/cross-3d.d.ts +8 -0
- package/dist/cjs/3d/cross-3d.js +15 -0
- package/dist/cjs/3d/distance-3d.d.ts +8 -0
- package/dist/cjs/3d/distance-3d.js +11 -0
- package/dist/cjs/3d/distance-chebyshev-3d.d.ts +8 -0
- package/dist/cjs/3d/distance-chebyshev-3d.js +16 -0
- package/dist/cjs/3d/distance-manhattan-3d.d.ts +8 -0
- package/dist/cjs/3d/distance-manhattan-3d.js +11 -0
- package/dist/cjs/3d/distance-minkowski-3d.d.ts +9 -0
- package/dist/cjs/3d/distance-minkowski-3d.js +12 -0
- package/dist/cjs/3d/distance-sq-3d.d.ts +8 -0
- package/dist/cjs/3d/distance-sq-3d.js +11 -0
- package/dist/cjs/3d/divide-3d.d.ts +8 -0
- package/dist/cjs/3d/divide-3d.js +15 -0
- package/dist/cjs/3d/dot-3d.d.ts +8 -0
- package/dist/cjs/3d/dot-3d.js +11 -0
- package/dist/cjs/3d/from-cylindrical-coords-3d.d.ts +9 -0
- package/dist/cjs/3d/from-cylindrical-coords-3d.js +16 -0
- package/dist/cjs/3d/from-object-3d.d.ts +11 -0
- package/dist/cjs/3d/from-object-3d.js +10 -0
- package/dist/cjs/3d/from-spherical-coords-3d.d.ts +9 -0
- package/dist/cjs/3d/from-spherical-coords-3d.js +16 -0
- package/dist/cjs/3d/immutable-3d.d.ts +7 -0
- package/dist/cjs/3d/immutable-3d.js +10 -0
- package/dist/cjs/3d/index.d.ts +49 -0
- package/dist/cjs/3d/index.js +65 -0
- package/dist/cjs/3d/is-equal-3d.d.ts +8 -0
- package/dist/cjs/3d/is-equal-3d.js +11 -0
- package/dist/cjs/3d/is-equal-approx-3d.d.ts +9 -0
- package/dist/cjs/3d/is-equal-approx-3d.js +14 -0
- package/dist/cjs/3d/is-infinite-3d.d.ts +7 -0
- package/dist/cjs/3d/is-infinite-3d.js +15 -0
- package/dist/cjs/3d/is-nan-3d.d.ts +7 -0
- package/dist/cjs/3d/is-nan-3d.js +10 -0
- package/dist/cjs/3d/is-opposite-3d.d.ts +8 -0
- package/dist/cjs/3d/is-opposite-3d.js +11 -0
- package/dist/cjs/3d/is-zero-3d.d.ts +7 -0
- package/dist/cjs/3d/is-zero-3d.js +10 -0
- package/dist/cjs/3d/lerp-3d.d.ts +9 -0
- package/dist/cjs/3d/lerp-3d.js +16 -0
- package/dist/cjs/3d/limit-max-3d.d.ts +9 -0
- package/dist/cjs/3d/limit-max-3d.js +13 -0
- package/dist/cjs/3d/limit-min-3d.d.ts +9 -0
- package/dist/cjs/3d/limit-min-3d.js +13 -0
- package/dist/cjs/3d/look-at-3d.d.ts +10 -0
- package/dist/cjs/3d/look-at-3d.js +14 -0
- package/dist/cjs/3d/magnitude-3d.d.ts +7 -0
- package/dist/cjs/3d/magnitude-3d.js +10 -0
- package/dist/cjs/3d/magnitude-sq-3d.d.ts +7 -0
- package/dist/cjs/3d/magnitude-sq-3d.js +10 -0
- package/dist/cjs/3d/multiply-3d.d.ts +8 -0
- package/dist/cjs/3d/multiply-3d.js +15 -0
- package/dist/cjs/3d/negate-3d.d.ts +7 -0
- package/dist/cjs/3d/negate-3d.js +10 -0
- package/dist/cjs/3d/normalize-3d.d.ts +8 -0
- package/dist/cjs/3d/normalize-3d.js +12 -0
- package/dist/cjs/3d/one-3d.d.ts +6 -0
- package/dist/cjs/3d/one-3d.js +9 -0
- package/dist/cjs/3d/project-3d.d.ts +10 -0
- package/dist/cjs/3d/project-3d.js +17 -0
- package/dist/cjs/3d/random-3d.d.ts +7 -0
- package/dist/cjs/3d/random-3d.js +11 -0
- package/dist/cjs/3d/reflect-3d.d.ts +9 -0
- package/dist/cjs/3d/reflect-3d.js +16 -0
- package/dist/cjs/3d/rotate-x-3d.d.ts +9 -0
- package/dist/cjs/3d/rotate-x-3d.js +26 -0
- package/dist/cjs/3d/rotate-y-3d.d.ts +9 -0
- package/dist/cjs/3d/rotate-y-3d.js +26 -0
- package/dist/cjs/3d/rotate-z-3d.d.ts +9 -0
- package/dist/cjs/3d/rotate-z-3d.js +26 -0
- package/dist/cjs/3d/set-magnitude-3d.d.ts +9 -0
- package/dist/cjs/3d/set-magnitude-3d.js +13 -0
- package/dist/cjs/3d/subtract-3d.d.ts +8 -0
- package/dist/cjs/3d/subtract-3d.js +15 -0
- package/dist/cjs/3d/types.d.ts +4 -0
- package/dist/cjs/3d/types.js +2 -0
- package/dist/cjs/3d/zero-3d.d.ts +6 -0
- package/dist/cjs/3d/zero-3d.js +9 -0
- package/dist/cjs/4d/add-4d.d.ts +8 -0
- package/dist/cjs/4d/add-4d.js +16 -0
- package/dist/cjs/4d/angle-between-4d.d.ts +10 -0
- package/dist/cjs/4d/angle-between-4d.js +15 -0
- package/dist/cjs/4d/angle-w-4d.d.ts +7 -0
- package/dist/cjs/4d/angle-w-4d.js +10 -0
- package/dist/cjs/4d/angle-x-4d.d.ts +7 -0
- package/dist/cjs/4d/angle-x-4d.js +10 -0
- package/dist/cjs/4d/angle-y-4d.d.ts +7 -0
- package/dist/cjs/4d/angle-y-4d.js +10 -0
- package/dist/cjs/4d/angle-z-4d.d.ts +7 -0
- package/dist/cjs/4d/angle-z-4d.js +10 -0
- package/dist/cjs/4d/clamp-4d.d.ts +10 -0
- package/dist/cjs/4d/clamp-4d.js +18 -0
- package/dist/cjs/4d/clone-4d.d.ts +7 -0
- package/dist/cjs/4d/clone-4d.js +10 -0
- package/dist/cjs/4d/distance-4d.d.ts +8 -0
- package/dist/cjs/4d/distance-4d.js +11 -0
- package/dist/cjs/4d/distance-chebyshev-4d.d.ts +8 -0
- package/dist/cjs/4d/distance-chebyshev-4d.js +23 -0
- package/dist/cjs/4d/distance-manhattan-4d.d.ts +8 -0
- package/dist/cjs/4d/distance-manhattan-4d.js +14 -0
- package/dist/cjs/4d/distance-minkowski-4d.d.ts +9 -0
- package/dist/cjs/4d/distance-minkowski-4d.js +16 -0
- package/dist/cjs/4d/distance-sq-4d.d.ts +9 -0
- package/dist/cjs/4d/distance-sq-4d.js +12 -0
- package/dist/cjs/4d/divide-4d.d.ts +8 -0
- package/dist/cjs/4d/divide-4d.js +16 -0
- package/dist/cjs/4d/dot-4d.d.ts +8 -0
- package/dist/cjs/4d/dot-4d.js +11 -0
- package/dist/cjs/4d/from-object-4d.d.ts +12 -0
- package/dist/cjs/4d/from-object-4d.js +15 -0
- package/dist/cjs/4d/immutable-4d.d.ts +7 -0
- package/dist/cjs/4d/immutable-4d.js +10 -0
- package/dist/cjs/4d/index.d.ts +44 -0
- package/dist/cjs/4d/index.js +60 -0
- package/dist/cjs/4d/is-equal-4d.d.ts +8 -0
- package/dist/cjs/4d/is-equal-4d.js +11 -0
- package/dist/cjs/4d/is-equal-approx-4d.d.ts +9 -0
- package/dist/cjs/4d/is-equal-approx-4d.js +15 -0
- package/dist/cjs/4d/is-infinite-4d.d.ts +7 -0
- package/dist/cjs/4d/is-infinite-4d.js +17 -0
- package/dist/cjs/4d/is-nan-4d.d.ts +7 -0
- package/dist/cjs/4d/is-nan-4d.js +10 -0
- package/dist/cjs/4d/is-opposite-4d.d.ts +8 -0
- package/dist/cjs/4d/is-opposite-4d.js +11 -0
- package/dist/cjs/4d/is-zero-4d.d.ts +7 -0
- package/dist/cjs/4d/is-zero-4d.js +10 -0
- package/dist/cjs/4d/lerp-4d.d.ts +9 -0
- package/dist/cjs/4d/lerp-4d.js +17 -0
- package/dist/cjs/4d/limit-max-4d.d.ts +9 -0
- package/dist/cjs/4d/limit-max-4d.js +13 -0
- package/dist/cjs/4d/limit-min-4d.d.ts +9 -0
- package/dist/cjs/4d/limit-min-4d.js +13 -0
- package/dist/cjs/4d/look-at-4d.d.ts +10 -0
- package/dist/cjs/4d/look-at-4d.js +14 -0
- package/dist/cjs/4d/magnitude-4d.d.ts +7 -0
- package/dist/cjs/4d/magnitude-4d.js +10 -0
- package/dist/cjs/4d/magnitude-sq-4d.d.ts +8 -0
- package/dist/cjs/4d/magnitude-sq-4d.js +11 -0
- package/dist/cjs/4d/multiply-4d.d.ts +8 -0
- package/dist/cjs/4d/multiply-4d.js +16 -0
- package/dist/cjs/4d/negate-4d.d.ts +7 -0
- package/dist/cjs/4d/negate-4d.js +10 -0
- package/dist/cjs/4d/normalize-4d.d.ts +8 -0
- package/dist/cjs/4d/normalize-4d.js +17 -0
- package/dist/cjs/4d/one-4d.d.ts +6 -0
- package/dist/cjs/4d/one-4d.js +9 -0
- package/dist/cjs/4d/project-4d.d.ts +10 -0
- package/dist/cjs/4d/project-4d.js +18 -0
- package/dist/cjs/4d/random-4d.d.ts +7 -0
- package/dist/cjs/4d/random-4d.js +21 -0
- package/dist/cjs/4d/reflect-4d.d.ts +9 -0
- package/dist/cjs/4d/reflect-4d.js +21 -0
- package/dist/cjs/4d/set-magnitude-4d.d.ts +9 -0
- package/dist/cjs/4d/set-magnitude-4d.js +18 -0
- package/dist/cjs/4d/subtract-4d.d.ts +8 -0
- package/dist/cjs/4d/subtract-4d.js +16 -0
- package/dist/cjs/4d/types.d.ts +4 -0
- package/dist/cjs/4d/types.js +2 -0
- package/dist/cjs/4d/zero-4d.d.ts +6 -0
- package/dist/cjs/4d/zero-4d.js +9 -0
- package/dist/cjs/index.d.ts +7 -0
- package/dist/cjs/index.js +23 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/slerp.d.ts +21 -0
- package/dist/cjs/slerp.js +28 -0
- package/dist/{vec2.d.ts → cjs/vec2.d.ts} +10 -4
- package/dist/cjs/vec2.js +889 -0
- package/dist/{vec3.d.ts → cjs/vec3.d.ts} +159 -100
- package/dist/cjs/vec3.js +1045 -0
- package/dist/cjs/vec4.d.ts +602 -0
- package/dist/cjs/vec4.js +1101 -0
- package/dist/esm/2d/add-2d.d.ts +8 -0
- package/dist/esm/2d/add-2d.js +7 -0
- package/dist/esm/2d/angle-between-2d.d.ts +8 -0
- package/dist/esm/2d/angle-between-2d.js +7 -0
- package/dist/esm/2d/angle-x-2d.d.ts +7 -0
- package/dist/esm/2d/angle-x-2d.js +6 -0
- package/dist/esm/2d/angle-y-2d.d.ts +7 -0
- package/dist/esm/2d/angle-y-2d.js +6 -0
- package/dist/esm/2d/clamp-2d.d.ts +10 -0
- package/dist/esm/2d/clamp-2d.js +10 -0
- package/dist/esm/2d/clone-2d.d.ts +7 -0
- package/dist/esm/2d/clone-2d.js +6 -0
- package/dist/esm/2d/cross-2d.d.ts +8 -0
- package/dist/esm/2d/cross-2d.js +7 -0
- package/dist/esm/2d/distance-2d.d.ts +8 -0
- package/dist/esm/2d/distance-2d.js +7 -0
- package/dist/esm/2d/distance-chebyshev-2d.d.ts +8 -0
- package/dist/esm/2d/distance-chebyshev-2d.js +11 -0
- package/dist/esm/2d/distance-manhattan-2d.d.ts +8 -0
- package/dist/esm/2d/distance-manhattan-2d.js +7 -0
- package/dist/esm/2d/distance-minkowski-2d.d.ts +9 -0
- package/dist/esm/2d/distance-minkowski-2d.js +8 -0
- package/dist/esm/2d/distance-sq-2d.d.ts +8 -0
- package/dist/esm/2d/distance-sq-2d.js +7 -0
- package/dist/esm/2d/divide-2d.d.ts +8 -0
- package/dist/esm/2d/divide-2d.js +10 -0
- package/dist/esm/2d/dot-2d.d.ts +8 -0
- package/dist/esm/2d/dot-2d.js +7 -0
- package/dist/esm/2d/from-angle-x-2d.d.ts +8 -0
- package/dist/esm/2d/from-angle-x-2d.js +10 -0
- package/dist/esm/2d/from-angle-y-2d.d.ts +8 -0
- package/dist/esm/2d/from-angle-y-2d.js +10 -0
- package/dist/esm/2d/from-object-2d.d.ts +10 -0
- package/dist/esm/2d/from-object-2d.js +6 -0
- package/dist/esm/2d/from-polar-coords-2d.d.ts +8 -0
- package/dist/esm/2d/from-polar-coords-2d.js +7 -0
- package/dist/esm/2d/immutable-2d.d.ts +7 -0
- package/dist/esm/2d/immutable-2d.js +6 -0
- package/dist/esm/2d/index.d.ts +47 -0
- package/dist/esm/2d/index.js +47 -0
- package/dist/esm/2d/is-equal-2d.d.ts +8 -0
- package/dist/esm/2d/is-equal-2d.js +7 -0
- package/dist/esm/2d/is-equal-approx-2d.d.ts +9 -0
- package/dist/esm/2d/is-equal-approx-2d.js +8 -0
- package/dist/esm/2d/is-infinite-2d.d.ts +7 -0
- package/dist/esm/2d/is-infinite-2d.js +9 -0
- package/dist/esm/2d/is-nan-2d.d.ts +7 -0
- package/dist/esm/2d/is-nan-2d.js +6 -0
- package/dist/esm/2d/is-opposite-2d.d.ts +8 -0
- package/dist/esm/2d/is-opposite-2d.js +7 -0
- package/dist/esm/2d/is-zero-2d.d.ts +7 -0
- package/dist/esm/2d/is-zero-2d.js +6 -0
- package/dist/esm/2d/lerp-2d.d.ts +9 -0
- package/dist/esm/2d/lerp-2d.js +11 -0
- package/dist/esm/2d/limit-max-2d.d.ts +9 -0
- package/dist/esm/2d/limit-max-2d.js +9 -0
- package/dist/esm/2d/limit-min-2d.d.ts +9 -0
- package/dist/esm/2d/limit-min-2d.js +9 -0
- package/dist/esm/2d/look-at-2d.d.ts +10 -0
- package/dist/esm/2d/look-at-2d.js +10 -0
- package/dist/esm/2d/magnitude-2d.d.ts +7 -0
- package/dist/esm/2d/magnitude-2d.js +6 -0
- package/dist/esm/2d/magnitude-sq-2d.d.ts +7 -0
- package/dist/esm/2d/magnitude-sq-2d.js +6 -0
- package/dist/esm/2d/multiply-2d.d.ts +8 -0
- package/dist/esm/2d/multiply-2d.js +7 -0
- package/dist/esm/2d/negate-2d.d.ts +7 -0
- package/dist/esm/2d/negate-2d.js +6 -0
- package/dist/esm/2d/normalize-2d.d.ts +8 -0
- package/dist/esm/2d/normalize-2d.js +8 -0
- package/dist/esm/2d/one-2d.d.ts +6 -0
- package/dist/esm/2d/one-2d.js +5 -0
- package/dist/esm/2d/project-2d.d.ts +10 -0
- package/dist/esm/2d/project-2d.js +13 -0
- package/dist/esm/2d/random-2d.d.ts +7 -0
- package/dist/esm/2d/random-2d.js +9 -0
- package/dist/esm/2d/reflect-2d.d.ts +9 -0
- package/dist/esm/2d/reflect-2d.js +12 -0
- package/dist/esm/2d/rotate-2d.d.ts +9 -0
- package/dist/esm/2d/rotate-2d.js +23 -0
- package/dist/esm/2d/set-magnitude-2d.d.ts +9 -0
- package/dist/esm/2d/set-magnitude-2d.js +12 -0
- package/dist/esm/2d/subtract-2d.d.ts +8 -0
- package/dist/esm/2d/subtract-2d.js +7 -0
- package/dist/esm/2d/types.d.ts +4 -0
- package/dist/esm/2d/types.js +1 -0
- package/dist/esm/2d/zero-2d.d.ts +6 -0
- package/dist/esm/2d/zero-2d.js +5 -0
- package/dist/esm/3d/add-3d.d.ts +8 -0
- package/dist/esm/3d/add-3d.js +11 -0
- package/dist/esm/3d/angle-between-3d.d.ts +10 -0
- package/dist/esm/3d/angle-between-3d.js +10 -0
- package/dist/esm/3d/angle-x-3d.d.ts +7 -0
- package/dist/esm/3d/angle-x-3d.js +6 -0
- package/dist/esm/3d/angle-y-3d.d.ts +7 -0
- package/dist/esm/3d/angle-y-3d.js +6 -0
- package/dist/esm/3d/angle-z-3d.d.ts +7 -0
- package/dist/esm/3d/angle-z-3d.js +6 -0
- package/dist/esm/3d/clamp-3d.d.ts +10 -0
- package/dist/esm/3d/clamp-3d.js +14 -0
- package/dist/esm/3d/clone-3d.d.ts +7 -0
- package/dist/esm/3d/clone-3d.js +6 -0
- package/dist/esm/3d/cross-3d.d.ts +8 -0
- package/dist/esm/3d/cross-3d.js +11 -0
- package/dist/esm/3d/distance-3d.d.ts +8 -0
- package/dist/esm/3d/distance-3d.js +7 -0
- package/dist/esm/3d/distance-chebyshev-3d.d.ts +8 -0
- package/dist/esm/3d/distance-chebyshev-3d.js +12 -0
- package/dist/esm/3d/distance-manhattan-3d.d.ts +8 -0
- package/dist/esm/3d/distance-manhattan-3d.js +7 -0
- package/dist/esm/3d/distance-minkowski-3d.d.ts +9 -0
- package/dist/esm/3d/distance-minkowski-3d.js +8 -0
- package/dist/esm/3d/distance-sq-3d.d.ts +8 -0
- package/dist/esm/3d/distance-sq-3d.js +7 -0
- package/dist/esm/3d/divide-3d.d.ts +8 -0
- package/dist/esm/3d/divide-3d.js +11 -0
- package/dist/esm/3d/dot-3d.d.ts +8 -0
- package/dist/esm/3d/dot-3d.js +7 -0
- package/dist/esm/3d/from-cylindrical-coords-3d.d.ts +9 -0
- package/dist/esm/3d/from-cylindrical-coords-3d.js +12 -0
- package/dist/esm/3d/from-object-3d.d.ts +11 -0
- package/dist/esm/3d/from-object-3d.js +6 -0
- package/dist/esm/3d/from-spherical-coords-3d.d.ts +9 -0
- package/dist/esm/3d/from-spherical-coords-3d.js +12 -0
- package/dist/esm/3d/immutable-3d.d.ts +7 -0
- package/dist/esm/3d/immutable-3d.js +6 -0
- package/dist/esm/3d/index.d.ts +49 -0
- package/dist/esm/3d/index.js +49 -0
- package/dist/esm/3d/is-equal-3d.d.ts +8 -0
- package/dist/esm/3d/is-equal-3d.js +7 -0
- package/dist/esm/3d/is-equal-approx-3d.d.ts +9 -0
- package/dist/esm/3d/is-equal-approx-3d.js +10 -0
- package/dist/esm/3d/is-infinite-3d.d.ts +7 -0
- package/dist/esm/3d/is-infinite-3d.js +11 -0
- package/dist/esm/3d/is-nan-3d.d.ts +7 -0
- package/dist/esm/3d/is-nan-3d.js +6 -0
- package/dist/esm/3d/is-opposite-3d.d.ts +8 -0
- package/dist/esm/3d/is-opposite-3d.js +7 -0
- package/dist/esm/3d/is-zero-3d.d.ts +7 -0
- package/dist/esm/3d/is-zero-3d.js +6 -0
- package/dist/esm/3d/lerp-3d.d.ts +9 -0
- package/dist/esm/3d/lerp-3d.js +12 -0
- package/dist/esm/3d/limit-max-3d.d.ts +9 -0
- package/dist/esm/3d/limit-max-3d.js +9 -0
- package/dist/esm/3d/limit-min-3d.d.ts +9 -0
- package/dist/esm/3d/limit-min-3d.js +9 -0
- package/dist/esm/3d/look-at-3d.d.ts +10 -0
- package/dist/esm/3d/look-at-3d.js +10 -0
- package/dist/esm/3d/magnitude-3d.d.ts +7 -0
- package/dist/esm/3d/magnitude-3d.js +6 -0
- package/dist/esm/3d/magnitude-sq-3d.d.ts +7 -0
- package/dist/esm/3d/magnitude-sq-3d.js +6 -0
- package/dist/esm/3d/multiply-3d.d.ts +8 -0
- package/dist/esm/3d/multiply-3d.js +11 -0
- package/dist/esm/3d/negate-3d.d.ts +7 -0
- package/dist/esm/3d/negate-3d.js +6 -0
- package/dist/esm/3d/normalize-3d.d.ts +8 -0
- package/dist/esm/3d/normalize-3d.js +8 -0
- package/dist/esm/3d/one-3d.d.ts +6 -0
- package/dist/esm/3d/one-3d.js +5 -0
- package/dist/esm/3d/project-3d.d.ts +10 -0
- package/dist/esm/3d/project-3d.js +13 -0
- package/dist/esm/3d/random-3d.d.ts +7 -0
- package/dist/esm/3d/random-3d.js +7 -0
- package/dist/esm/3d/reflect-3d.d.ts +9 -0
- package/dist/esm/3d/reflect-3d.js +12 -0
- package/dist/esm/3d/rotate-x-3d.d.ts +9 -0
- package/dist/esm/3d/rotate-x-3d.js +22 -0
- package/dist/esm/3d/rotate-y-3d.d.ts +9 -0
- package/dist/esm/3d/rotate-y-3d.js +22 -0
- package/dist/esm/3d/rotate-z-3d.d.ts +9 -0
- package/dist/esm/3d/rotate-z-3d.js +22 -0
- package/dist/esm/3d/set-magnitude-3d.d.ts +9 -0
- package/dist/esm/3d/set-magnitude-3d.js +9 -0
- package/dist/esm/3d/subtract-3d.d.ts +8 -0
- package/dist/esm/3d/subtract-3d.js +11 -0
- package/dist/esm/3d/types.d.ts +4 -0
- package/dist/esm/3d/types.js +1 -0
- package/dist/esm/3d/zero-3d.d.ts +6 -0
- package/dist/esm/3d/zero-3d.js +5 -0
- package/dist/esm/4d/add-4d.d.ts +8 -0
- package/dist/esm/4d/add-4d.js +12 -0
- package/dist/esm/4d/angle-between-4d.d.ts +10 -0
- package/dist/esm/4d/angle-between-4d.js +11 -0
- package/dist/esm/4d/angle-w-4d.d.ts +7 -0
- package/dist/esm/4d/angle-w-4d.js +6 -0
- package/dist/esm/4d/angle-x-4d.d.ts +7 -0
- package/dist/esm/4d/angle-x-4d.js +6 -0
- package/dist/esm/4d/angle-y-4d.d.ts +7 -0
- package/dist/esm/4d/angle-y-4d.js +6 -0
- package/dist/esm/4d/angle-z-4d.d.ts +7 -0
- package/dist/esm/4d/angle-z-4d.js +6 -0
- package/dist/esm/4d/clamp-4d.d.ts +10 -0
- package/dist/esm/4d/clamp-4d.js +14 -0
- package/dist/esm/4d/clone-4d.d.ts +7 -0
- package/dist/esm/4d/clone-4d.js +6 -0
- package/dist/esm/4d/distance-4d.d.ts +8 -0
- package/dist/esm/4d/distance-4d.js +7 -0
- package/dist/esm/4d/distance-chebyshev-4d.d.ts +8 -0
- package/dist/esm/4d/distance-chebyshev-4d.js +19 -0
- package/dist/esm/4d/distance-manhattan-4d.d.ts +8 -0
- package/dist/esm/4d/distance-manhattan-4d.js +10 -0
- package/dist/esm/4d/distance-minkowski-4d.d.ts +9 -0
- package/dist/esm/4d/distance-minkowski-4d.js +12 -0
- package/dist/esm/4d/distance-sq-4d.d.ts +9 -0
- package/dist/esm/4d/distance-sq-4d.js +8 -0
- package/dist/esm/4d/divide-4d.d.ts +8 -0
- package/dist/esm/4d/divide-4d.js +12 -0
- package/dist/esm/4d/dot-4d.d.ts +8 -0
- package/dist/esm/4d/dot-4d.js +7 -0
- package/dist/esm/4d/from-object-4d.d.ts +12 -0
- package/dist/esm/4d/from-object-4d.js +11 -0
- package/dist/esm/4d/immutable-4d.d.ts +7 -0
- package/dist/esm/4d/immutable-4d.js +6 -0
- package/dist/esm/4d/index.d.ts +44 -0
- package/dist/esm/4d/index.js +44 -0
- package/dist/esm/4d/is-equal-4d.d.ts +8 -0
- package/dist/esm/4d/is-equal-4d.js +7 -0
- package/dist/esm/4d/is-equal-approx-4d.d.ts +9 -0
- package/dist/esm/4d/is-equal-approx-4d.js +11 -0
- package/dist/esm/4d/is-infinite-4d.d.ts +7 -0
- package/dist/esm/4d/is-infinite-4d.js +13 -0
- package/dist/esm/4d/is-nan-4d.d.ts +7 -0
- package/dist/esm/4d/is-nan-4d.js +6 -0
- package/dist/esm/4d/is-opposite-4d.d.ts +8 -0
- package/dist/esm/4d/is-opposite-4d.js +7 -0
- package/dist/esm/4d/is-zero-4d.d.ts +7 -0
- package/dist/esm/4d/is-zero-4d.js +6 -0
- package/dist/esm/4d/lerp-4d.d.ts +9 -0
- package/dist/esm/4d/lerp-4d.js +13 -0
- package/dist/esm/4d/limit-max-4d.d.ts +9 -0
- package/dist/esm/4d/limit-max-4d.js +9 -0
- package/dist/esm/4d/limit-min-4d.d.ts +9 -0
- package/dist/esm/4d/limit-min-4d.js +9 -0
- package/dist/esm/4d/look-at-4d.d.ts +10 -0
- package/dist/esm/4d/look-at-4d.js +10 -0
- package/dist/esm/4d/magnitude-4d.d.ts +7 -0
- package/dist/esm/4d/magnitude-4d.js +6 -0
- package/dist/esm/4d/magnitude-sq-4d.d.ts +8 -0
- package/dist/esm/4d/magnitude-sq-4d.js +7 -0
- package/dist/esm/4d/multiply-4d.d.ts +8 -0
- package/dist/esm/4d/multiply-4d.js +12 -0
- package/dist/esm/4d/negate-4d.d.ts +7 -0
- package/dist/esm/4d/negate-4d.js +6 -0
- package/dist/esm/4d/normalize-4d.d.ts +8 -0
- package/dist/esm/4d/normalize-4d.js +13 -0
- package/dist/esm/4d/one-4d.d.ts +6 -0
- package/dist/esm/4d/one-4d.js +5 -0
- package/dist/esm/4d/project-4d.d.ts +10 -0
- package/dist/esm/4d/project-4d.js +14 -0
- package/dist/esm/4d/random-4d.d.ts +7 -0
- package/dist/esm/4d/random-4d.js +17 -0
- package/dist/esm/4d/reflect-4d.d.ts +9 -0
- package/dist/esm/4d/reflect-4d.js +17 -0
- package/dist/esm/4d/set-magnitude-4d.d.ts +9 -0
- package/dist/esm/4d/set-magnitude-4d.js +14 -0
- package/dist/esm/4d/subtract-4d.d.ts +8 -0
- package/dist/esm/4d/subtract-4d.js +12 -0
- package/dist/esm/4d/types.d.ts +4 -0
- package/dist/esm/4d/types.js +1 -0
- package/dist/esm/4d/zero-4d.d.ts +6 -0
- package/dist/esm/4d/zero-4d.js +5 -0
- package/dist/esm/index.d.ts +7 -0
- package/dist/esm/index.js +7 -0
- package/dist/esm/slerp.d.ts +21 -0
- package/dist/esm/slerp.js +23 -0
- package/dist/{vec4.d.ts → esm/vec2.d.ts} +165 -157
- package/dist/{vec2.js → esm/vec2.js} +14 -6
- package/dist/esm/vec3.d.ts +614 -0
- package/dist/{vec3.js → esm/vec3.js} +190 -123
- package/dist/esm/vec4.d.ts +602 -0
- package/dist/{vec4.js → esm/vec4.js} +211 -130
- package/docs/ArrayVector2D.md +1090 -0
- package/docs/ArrayVector3D.md +1162 -0
- package/docs/ArrayVector4D.md +1019 -0
- package/docs/README.md +13 -0
- package/docs/Slerp.md +64 -0
- package/docs/Vec2.md +1827 -0
- package/docs/Vec3.md +2084 -0
- package/docs/Vec4.md +2031 -0
- package/package.json +95 -70
- package/VEC2.md +0 -147
- package/VEC3.md +0 -159
- package/VEC4.md +0 -146
- package/dist/index.d.ts +0 -3
- package/dist/index.js +0 -3
package/dist/cjs/vec2.js
ADDED
|
@@ -0,0 +1,889 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Documentation for 2D Vector class.
|
|
4
|
+
* @module Vec2
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.Vec2 = void 0;
|
|
8
|
+
const { PI, sin, cos, atan2, sqrt, abs } = Math;
|
|
9
|
+
const PI2 = PI * 2;
|
|
10
|
+
/**
|
|
11
|
+
* Represents a 2D vector with various operations.
|
|
12
|
+
*/
|
|
13
|
+
class Vec2 {
|
|
14
|
+
#magnitude = 0;
|
|
15
|
+
#prevXY = new Float64Array([0, 0]);
|
|
16
|
+
#xy = new Float64Array(2);
|
|
17
|
+
/**
|
|
18
|
+
* Computes and updates the magnitude of the vector.
|
|
19
|
+
* @private
|
|
20
|
+
* @param {number} x - The x-component of the vector.
|
|
21
|
+
* @param {number} y - The y-component of the vector.
|
|
22
|
+
* @returns {void}
|
|
23
|
+
*/
|
|
24
|
+
#computeMagnitude(x = this.#xy[0], y = this.#xy[1]) {
|
|
25
|
+
if (x !== this.#prevXY[0] || y !== this.#prevXY[1]) {
|
|
26
|
+
this.#magnitude = sqrt(x ** 2 + y ** 2);
|
|
27
|
+
this.#prevXY[0] = x;
|
|
28
|
+
this.#prevXY[1] = y;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Creates a new Vec2 instance.
|
|
33
|
+
* @param {number} x - The x-coordinate of the vector.
|
|
34
|
+
* @param {number} y - The y-coordinate of the vector.
|
|
35
|
+
*/
|
|
36
|
+
constructor(x = 0, y = x) {
|
|
37
|
+
this.#xy[0] = x;
|
|
38
|
+
this.#xy[1] = y;
|
|
39
|
+
this.#computeMagnitude(x, y);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Adds two vectors.
|
|
43
|
+
* @param v - The first vector.
|
|
44
|
+
* @param w - The second vector.
|
|
45
|
+
* @returns A new Vec2 instance representing the sum.
|
|
46
|
+
*/
|
|
47
|
+
static add(v, w) {
|
|
48
|
+
return new Vec2(v.#xy[0] + w.#xy[0], v.#xy[1] + w.#xy[1]);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Subtracts one vector from another.
|
|
52
|
+
* @param v - The vector to subtract from.
|
|
53
|
+
* @param w - The vector to subtract.
|
|
54
|
+
* @returns A new Vec2 instance representing the difference.
|
|
55
|
+
*/
|
|
56
|
+
static subtract(v, w) {
|
|
57
|
+
return new Vec2(v.#xy[0] - w.#xy[0], v.#xy[1] - w.#xy[1]);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Multiplies one vector with another.
|
|
61
|
+
* @param v - The first vector.
|
|
62
|
+
* @param w - The second vector.
|
|
63
|
+
* @returns A new Vec2 instance representing the multiplied value.
|
|
64
|
+
*/
|
|
65
|
+
static multiply(v, w) {
|
|
66
|
+
return new Vec2(v.x * w.x, v.y * w.y);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Divides one vector with another.
|
|
70
|
+
* @param v - Divident.
|
|
71
|
+
* @param w - Divisor.
|
|
72
|
+
* @returns A new Vec2 instance representing the divided value.
|
|
73
|
+
*/
|
|
74
|
+
static divide(v, w) {
|
|
75
|
+
return new Vec2(w.x === 0 ? Number.POSITIVE_INFINITY : v.x / w.x, w.y === 0 ? Number.POSITIVE_INFINITY : v.y / w.y);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Calculates the angle between two vectors.
|
|
79
|
+
* @param v - The first vector.
|
|
80
|
+
* @param w - The second vector.
|
|
81
|
+
* @returns The angle between the vectors in radians.
|
|
82
|
+
*/
|
|
83
|
+
static angleBetween(v, w) {
|
|
84
|
+
const vX = v.#xy[0];
|
|
85
|
+
const vY = v.#xy[1];
|
|
86
|
+
const wX = w.#xy[0];
|
|
87
|
+
const wY = w.#xy[1];
|
|
88
|
+
return atan2(vX * wY - vY * wX, vX * wX + vY * wY);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Calculates the Euclidean distance between two vectors.
|
|
92
|
+
* @param v - The first vector.
|
|
93
|
+
* @param w - The second vector.
|
|
94
|
+
* @returns The distance between the vectors.
|
|
95
|
+
*/
|
|
96
|
+
static distance(v, w) {
|
|
97
|
+
return sqrt((v.#xy[0] - w.#xy[0]) ** 2 + (v.#xy[1] - w.#xy[1]) ** 2);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Calculates the Chebyshev distance between two vectors.
|
|
101
|
+
* @param v - The first vector.
|
|
102
|
+
* @param w - The second vector.
|
|
103
|
+
* @returns The Chebyshev distance between the vectors.
|
|
104
|
+
*/
|
|
105
|
+
static distanceChebyshev(v, w) {
|
|
106
|
+
const absX = abs(v.#xy[0] - w.#xy[0]);
|
|
107
|
+
const absY = abs(v.#xy[1] - w.#xy[1]);
|
|
108
|
+
return absX >= absY ? absX : absY;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Calculates the Manhattan distance between two vectors.
|
|
112
|
+
* @param v - The first vector.
|
|
113
|
+
* @param w - The second vector.
|
|
114
|
+
* @returns The Manhattan distance between the vectors.
|
|
115
|
+
*/
|
|
116
|
+
static distanceManhattan(v, w) {
|
|
117
|
+
return abs(v.#xy[0] - w.#xy[0]) + abs(v.#xy[1] - w.#xy[1]);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Calculates the Minkowski distance between two vectors.
|
|
121
|
+
* @param v - The first vector.
|
|
122
|
+
* @param w - The second vector.
|
|
123
|
+
* @param p - The order of the Minkowski distance.
|
|
124
|
+
* @returns The Minkowski distance between the vectors.
|
|
125
|
+
*/
|
|
126
|
+
static distanceMinkowski(v, w, p) {
|
|
127
|
+
return (abs(v.#xy[0] - w.#xy[0]) ** p + abs(v.#xy[1] - w.#xy[1]) ** p) ** (1 / p);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Calculates the squared Euclidean distance between two vectors.
|
|
131
|
+
* @param v - The first vector.
|
|
132
|
+
* @param w - The second vector.
|
|
133
|
+
* @returns The squared distance between the vectors.
|
|
134
|
+
*/
|
|
135
|
+
static distanceSq(v, w) {
|
|
136
|
+
return (v.#xy[0] - w.#xy[0]) ** 2 + (v.#xy[1] - w.#xy[1]) ** 2;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Calculates the dot product of two vectors.
|
|
140
|
+
* @param v - The first vector.
|
|
141
|
+
* @param w - The second vector.
|
|
142
|
+
* @returns The dot product of the vectors.
|
|
143
|
+
*/
|
|
144
|
+
static dot(v, w) {
|
|
145
|
+
return v.#xy[0] * w.#xy[0] + v.#xy[1] * w.#xy[1];
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Calculates the cross product of two vectors.
|
|
149
|
+
* @param v - The first vector.
|
|
150
|
+
* @param w - The second vector.
|
|
151
|
+
* @returns The cross product scalar value.
|
|
152
|
+
*/
|
|
153
|
+
static cross(v, w) {
|
|
154
|
+
return v.#xy[0] * w.#xy[1] - v.#xy[1] * w.#xy[0];
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Reflects the vector across a normal vector.
|
|
158
|
+
* @param v - The vector to reflect.
|
|
159
|
+
* @param normal - The normal vector to reflect across (must be normalized).
|
|
160
|
+
* @returns A new Vec2 instance representing the reflected vector.
|
|
161
|
+
*/
|
|
162
|
+
static reflect(v, normal) {
|
|
163
|
+
const dot = v.dot(normal);
|
|
164
|
+
return new Vec2(v.#xy[0] - 2 * dot * normal.#xy[0], v.#xy[1] - 2 * dot * normal.#xy[1]);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Creates a Vec2 instance from polar coordinates.
|
|
168
|
+
* @param r - The radius.
|
|
169
|
+
* @param theta - The angle in radians.
|
|
170
|
+
* @returns A new Vec2 instance.
|
|
171
|
+
*/
|
|
172
|
+
static fromPolarCoords(r, theta) {
|
|
173
|
+
return new Vec2(r * cos(theta), r * sin(theta));
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Creates an immutable Vec2-like object.
|
|
177
|
+
* @param x - The x-coordinate of the vector.
|
|
178
|
+
* @param y - The y-coordinate of the vector.
|
|
179
|
+
* @returns An immutable object with Vec2-like properties.
|
|
180
|
+
*/
|
|
181
|
+
static immutable(x = 0, y = 0) {
|
|
182
|
+
const data = new Float64Array(10);
|
|
183
|
+
data[0] = x;
|
|
184
|
+
data[1] = y;
|
|
185
|
+
data[4] = atan2(y, x) + (y < 0 ? PI2 : 0);
|
|
186
|
+
data[5] = -atan2(x, y) + (x > 0 ? PI2 : 0);
|
|
187
|
+
const magnitudeSq = x ** 2 + y ** 2;
|
|
188
|
+
data[8] = sqrt(magnitudeSq);
|
|
189
|
+
data[9] = magnitudeSq;
|
|
190
|
+
const isInfinite = x === Number.POSITIVE_INFINITY ||
|
|
191
|
+
x === Number.NEGATIVE_INFINITY ||
|
|
192
|
+
y === Number.POSITIVE_INFINITY ||
|
|
193
|
+
y === Number.NEGATIVE_INFINITY;
|
|
194
|
+
const _isNaN = Number.isNaN(x) && Number.isNaN(y);
|
|
195
|
+
const isZero = x === 0 && y === 0;
|
|
196
|
+
const xy = Object.freeze([...data.slice(0, 2)]);
|
|
197
|
+
return {
|
|
198
|
+
get x() {
|
|
199
|
+
return data[0];
|
|
200
|
+
},
|
|
201
|
+
get y() {
|
|
202
|
+
return data[1];
|
|
203
|
+
},
|
|
204
|
+
get xy() {
|
|
205
|
+
return xy;
|
|
206
|
+
},
|
|
207
|
+
get magnitude() {
|
|
208
|
+
return data[8];
|
|
209
|
+
},
|
|
210
|
+
get magnitudeSq() {
|
|
211
|
+
return data[10];
|
|
212
|
+
},
|
|
213
|
+
get angleX() {
|
|
214
|
+
return data[4];
|
|
215
|
+
},
|
|
216
|
+
get angleY() {
|
|
217
|
+
return data[5];
|
|
218
|
+
},
|
|
219
|
+
get isInfinite() {
|
|
220
|
+
return isInfinite;
|
|
221
|
+
},
|
|
222
|
+
get isNaN() {
|
|
223
|
+
return _isNaN;
|
|
224
|
+
},
|
|
225
|
+
get isZero() {
|
|
226
|
+
return isZero;
|
|
227
|
+
},
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Checks if a vector has infinite components.
|
|
232
|
+
* @param v - The vector to check.
|
|
233
|
+
* @returns True if the vector has infinite components, false otherwise.
|
|
234
|
+
*/
|
|
235
|
+
static isInfinite(v) {
|
|
236
|
+
const x = v.#xy[0];
|
|
237
|
+
const y = v.#xy[1];
|
|
238
|
+
return (x === Number.POSITIVE_INFINITY ||
|
|
239
|
+
x === Number.NEGATIVE_INFINITY ||
|
|
240
|
+
y === Number.POSITIVE_INFINITY ||
|
|
241
|
+
y === Number.NEGATIVE_INFINITY);
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Checks if a vector has NaN components.
|
|
245
|
+
* @param v - The vector to check.
|
|
246
|
+
* @returns True if the vector has NaN components, false otherwise.
|
|
247
|
+
*/
|
|
248
|
+
static isNaN(v) {
|
|
249
|
+
return Number.isNaN(v.#xy[0]) || Number.isNaN(v.#xy[1]);
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Checks if a vector is zero.
|
|
253
|
+
* @param v - The vector to check.
|
|
254
|
+
* @returns True if the vector is zero, false otherwise.
|
|
255
|
+
*/
|
|
256
|
+
static isZero(v) {
|
|
257
|
+
return v.#xy[0] === 0 && v.#xy[1] === 0;
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Performs linear interpolation between two vectors.
|
|
261
|
+
* @param v - The first vector.
|
|
262
|
+
* @param w - The second vector.
|
|
263
|
+
* @param t - The interpolation parameter (0 to 1).
|
|
264
|
+
* @returns A new Vec2 instance representing the interpolated vector.
|
|
265
|
+
*/
|
|
266
|
+
static lerp(v, w, t) {
|
|
267
|
+
if (t > 1)
|
|
268
|
+
t = 1;
|
|
269
|
+
else if (t < 0)
|
|
270
|
+
t = 0;
|
|
271
|
+
const vX = v.#xy[0];
|
|
272
|
+
const vY = v.#xy[1];
|
|
273
|
+
return new Vec2(vX + (w.#xy[0] - vX) * t, vY + (w.#xy[1] - vY) * t);
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Negates a vector.
|
|
277
|
+
* @param v - The vector to negate.
|
|
278
|
+
* @returns A new Vec2 instance representing the negated vector.
|
|
279
|
+
*/
|
|
280
|
+
static negate(v) {
|
|
281
|
+
return new Vec2(-v.#xy[0], -v.#xy[1]);
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Normalizes a vector.
|
|
285
|
+
* @param v - The vector to normalize.
|
|
286
|
+
* @returns A new Vec2 instance representing the normalized vector.
|
|
287
|
+
*/
|
|
288
|
+
static normalize(v) {
|
|
289
|
+
const m = v.#magnitude;
|
|
290
|
+
return new Vec2(v.#xy[0] / m, v.#xy[1] / m);
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Projects one vector onto another.
|
|
294
|
+
* @param v - The vector to project.
|
|
295
|
+
* @param w - The vector to project onto.
|
|
296
|
+
* @returns A new Vec2 instance representing the projected vector.
|
|
297
|
+
*/
|
|
298
|
+
static project(v, w) {
|
|
299
|
+
const vX = v.#xy[0];
|
|
300
|
+
const vY = v.#xy[1];
|
|
301
|
+
const wX = w.#xy[0];
|
|
302
|
+
const wY = w.#xy[1];
|
|
303
|
+
const wM = w.#magnitude;
|
|
304
|
+
const f = v.#magnitude * cos(atan2(vX * wY - vY * wX, vX * wX + vY * wY));
|
|
305
|
+
return new Vec2((wX / wM) * f, (wY / wM) * f);
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Creates a random unit vector.
|
|
309
|
+
* @param random - A function that returns a random number between 0 and 1.
|
|
310
|
+
* @returns A new Vec2 instance representing a random unit vector.
|
|
311
|
+
*/
|
|
312
|
+
static random(random = Math.random) {
|
|
313
|
+
const phi = random() * PI2;
|
|
314
|
+
return new Vec2(cos(phi), sin(phi));
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Checks if two vectors are equal.
|
|
318
|
+
* @param v - The first vector.
|
|
319
|
+
* @param w - The second vector.
|
|
320
|
+
* @returns True if the vectors are equal, false otherwise.
|
|
321
|
+
*/
|
|
322
|
+
static satisfyEquality(v, w) {
|
|
323
|
+
return v.#xy[0] === w.#xy[0] && v.#xy[1] === w.#xy[1];
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Checks if two vectors are opposite.
|
|
327
|
+
* @param v - The first vector.
|
|
328
|
+
* @param w - The second vector.
|
|
329
|
+
* @returns True if the vectors are opposite, false otherwise.
|
|
330
|
+
*/
|
|
331
|
+
static satisfyOpposition(v, w) {
|
|
332
|
+
return v.#xy[0] === -w.#xy[0] && v.#xy[1] === -w.#xy[1];
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Compares a vector with another vector using an epsilon value for floating-point comparison.
|
|
336
|
+
* @param v - The first vector.
|
|
337
|
+
* @param w - The second vector.
|
|
338
|
+
* @param epsilon - The maximum difference between components to consider them equal.
|
|
339
|
+
* @returns True if the vectors are equal within epsilon, false otherwise.
|
|
340
|
+
*/
|
|
341
|
+
static equals(v, w, epsilon = Number.EPSILON) {
|
|
342
|
+
return abs(v.#xy[0] - w.#xy[0]) <= epsilon && abs(v.#xy[1] - w.#xy[1]) <= epsilon;
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Scales a vector by a scalar value.
|
|
346
|
+
* @param v - The vector to scale.
|
|
347
|
+
* @param c - The scalar value.
|
|
348
|
+
* @returns A new Vec2 instance representing the scaled vector.
|
|
349
|
+
*/
|
|
350
|
+
static scale(v, c) {
|
|
351
|
+
return new Vec2(v.#xy[0] * c, v.#xy[1] * c);
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Creates a zero vector.
|
|
355
|
+
* @returns A new Vec2 instance representing a zero vector.
|
|
356
|
+
*/
|
|
357
|
+
static zero() {
|
|
358
|
+
return new Vec2();
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* Creates a vector with all components set to 1.0.
|
|
362
|
+
* @returns A new Vec2 instance representing a vector with all components set to 1.0.
|
|
363
|
+
*/
|
|
364
|
+
static one() {
|
|
365
|
+
return new Vec2(1, 1);
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Creates a Vec2 from an array.
|
|
369
|
+
* @param {[number, number] | number[]} arr - An array containing the x and y coordinates.
|
|
370
|
+
* @returns {Vec2} A new Vec2 instance.
|
|
371
|
+
*/
|
|
372
|
+
static fromArray(arr) {
|
|
373
|
+
return new Vec2(arr[0] ?? 0, arr[1] ?? 0);
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Creates a Vec2 from an object with x and y properties.
|
|
377
|
+
* @param {{ x: number; y: number }} obj - An object with x and y properties.
|
|
378
|
+
* @returns {Vec2} A new Vec2 instance.
|
|
379
|
+
*/
|
|
380
|
+
static fromObject(obj) {
|
|
381
|
+
return new Vec2(obj.x, obj.y);
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Creates a Vec2 instance from a JSON-parsed object.
|
|
385
|
+
* @param json - The JSON-parsed object containing x and y properties.
|
|
386
|
+
* @returns A new Vec2 instance.
|
|
387
|
+
*/
|
|
388
|
+
static fromJSON(json) {
|
|
389
|
+
return Vec2.fromObject(json);
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* Gets the x-component of the vector.
|
|
393
|
+
* @returns The x-component.
|
|
394
|
+
*/
|
|
395
|
+
get x() {
|
|
396
|
+
return this.#xy[0];
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Sets the x-component of the vector.
|
|
400
|
+
* @param x - The new x-component.
|
|
401
|
+
*/
|
|
402
|
+
set x(x) {
|
|
403
|
+
this.#xy[0] = x;
|
|
404
|
+
this.#computeMagnitude();
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Gets the y-component of the vector.
|
|
408
|
+
* @returns The y-component.
|
|
409
|
+
*/
|
|
410
|
+
get y() {
|
|
411
|
+
return this.#xy[1];
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* Sets the y-component of the vector.
|
|
415
|
+
* @param y - The new y-component.
|
|
416
|
+
*/
|
|
417
|
+
set y(y) {
|
|
418
|
+
this.#xy[1] = y;
|
|
419
|
+
this.#computeMagnitude();
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Gets a copy of the vector's components as an array.
|
|
423
|
+
* @returns An array containing the x and y components of the vector.
|
|
424
|
+
*/
|
|
425
|
+
get xy() {
|
|
426
|
+
return Array.from(this.#xy.slice());
|
|
427
|
+
}
|
|
428
|
+
/**
|
|
429
|
+
* Sets both components of the vector at once.
|
|
430
|
+
* @param xy - An array containing the new x and y components.
|
|
431
|
+
*/
|
|
432
|
+
set xy(xy) {
|
|
433
|
+
this.#xy[0] = xy[0];
|
|
434
|
+
this.#xy[1] = xy[1];
|
|
435
|
+
this.#computeMagnitude();
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* Gets the angle between the vector and the positive x-axis in radians.
|
|
439
|
+
* @returns The angle in radians, always in the range [0, 2π).
|
|
440
|
+
*/
|
|
441
|
+
get angleX() {
|
|
442
|
+
return atan2(this.#xy[1], this.#xy[0]) + (this.#xy[1] < 0 ? PI2 : 0);
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* Sets the angle between the vector and the positive x-axis, maintaining the vector's magnitude.
|
|
446
|
+
* @param phi - The new angle in radians.
|
|
447
|
+
*/
|
|
448
|
+
set angleX(phi) {
|
|
449
|
+
const m = this.#magnitude;
|
|
450
|
+
this.#xy[0] = m * cos(phi);
|
|
451
|
+
this.#xy[1] = m * sin(phi);
|
|
452
|
+
this.#computeMagnitude();
|
|
453
|
+
}
|
|
454
|
+
/**
|
|
455
|
+
* Gets the angle between the vector and the positive y-axis in radians.
|
|
456
|
+
* @returns The angle in radians, always in the range [0, 2π).
|
|
457
|
+
*/
|
|
458
|
+
get angleY() {
|
|
459
|
+
return -atan2(this.#xy[0], this.#xy[1]) + (this.#xy[0] > 0 ? PI2 : 0);
|
|
460
|
+
}
|
|
461
|
+
/**
|
|
462
|
+
* Sets the angle between the vector and the positive y-axis, maintaining the vector's magnitude.
|
|
463
|
+
* @param phi - The new angle in radians.
|
|
464
|
+
*/
|
|
465
|
+
set angleY(phi) {
|
|
466
|
+
const m = this.#magnitude;
|
|
467
|
+
this.#xy[0] = m * -sin(phi);
|
|
468
|
+
this.#xy[1] = m * cos(phi);
|
|
469
|
+
this.#computeMagnitude();
|
|
470
|
+
}
|
|
471
|
+
/**
|
|
472
|
+
* Gets the magnitude (length) of the vector.
|
|
473
|
+
* @returns The magnitude of the vector.
|
|
474
|
+
*/
|
|
475
|
+
get magnitude() {
|
|
476
|
+
return this.#magnitude;
|
|
477
|
+
}
|
|
478
|
+
/**
|
|
479
|
+
* Sets the magnitude (length) of the vector, maintaining its direction.
|
|
480
|
+
* @param m - The new magnitude.
|
|
481
|
+
*/
|
|
482
|
+
set magnitude(m) {
|
|
483
|
+
const M = this.#magnitude;
|
|
484
|
+
this.#xy[0] = (this.#xy[0] / M) * m;
|
|
485
|
+
this.#xy[1] = (this.#xy[1] / M) * m;
|
|
486
|
+
this.#computeMagnitude();
|
|
487
|
+
}
|
|
488
|
+
/**
|
|
489
|
+
* Gets the squared magnitude of the vector.
|
|
490
|
+
* This is faster to compute than the actual magnitude and is useful for comparisons.
|
|
491
|
+
* @returns The squared magnitude of the vector.
|
|
492
|
+
*/
|
|
493
|
+
get magnitudeSq() {
|
|
494
|
+
return this.#magnitude ** 2;
|
|
495
|
+
}
|
|
496
|
+
/**
|
|
497
|
+
* Adds another vector to this vector.
|
|
498
|
+
* @param v - The vector to add.
|
|
499
|
+
* @returns This Vec2 instance for method chaining.
|
|
500
|
+
*/
|
|
501
|
+
add(v) {
|
|
502
|
+
this.#xy[0] += v.#xy[0];
|
|
503
|
+
this.#xy[1] += v.#xy[1];
|
|
504
|
+
this.#computeMagnitude();
|
|
505
|
+
return this;
|
|
506
|
+
}
|
|
507
|
+
/**
|
|
508
|
+
* Subtracts another vector from this vector.
|
|
509
|
+
* @param v - The vector to subtract.
|
|
510
|
+
* @returns This Vec2 instance for method chaining.
|
|
511
|
+
*/
|
|
512
|
+
subtract(v) {
|
|
513
|
+
this.#xy[0] -= v.#xy[0];
|
|
514
|
+
this.#xy[1] -= v.#xy[1];
|
|
515
|
+
this.#computeMagnitude();
|
|
516
|
+
return this;
|
|
517
|
+
}
|
|
518
|
+
/**
|
|
519
|
+
* Multiplies this vector with another vector.
|
|
520
|
+
* @param v - The vector to multiply with.
|
|
521
|
+
* @returns This Vec2 instance for method chaining.
|
|
522
|
+
*/
|
|
523
|
+
multiply(v) {
|
|
524
|
+
this.#xy[0] *= v.#xy[0];
|
|
525
|
+
this.#xy[1] *= v.#xy[1];
|
|
526
|
+
this.#computeMagnitude();
|
|
527
|
+
return this;
|
|
528
|
+
}
|
|
529
|
+
/**
|
|
530
|
+
* Divides this vector with another vector.
|
|
531
|
+
* @param v - The vector to divide with.
|
|
532
|
+
* @returns This Vec2 instance for method chaining.
|
|
533
|
+
*/
|
|
534
|
+
divide(v) {
|
|
535
|
+
this.#xy[0] = v.#xy[0] === 0 ? Number.POSITIVE_INFINITY : this.#xy[0] / v.#xy[0];
|
|
536
|
+
this.#xy[1] = v.#xy[1] === 0 ? Number.POSITIVE_INFINITY : this.#xy[1] / v.#xy[1];
|
|
537
|
+
this.#computeMagnitude();
|
|
538
|
+
return this;
|
|
539
|
+
}
|
|
540
|
+
/**
|
|
541
|
+
* Calculates the angle between this vector and another vector.
|
|
542
|
+
* @param v - The other vector.
|
|
543
|
+
* @returns The angle between the vectors in radians.
|
|
544
|
+
*/
|
|
545
|
+
angleBetween(v) {
|
|
546
|
+
const x = this.#xy[0];
|
|
547
|
+
const y = this.#xy[1];
|
|
548
|
+
const vX = v.#xy[0];
|
|
549
|
+
const vY = v.#xy[1];
|
|
550
|
+
return atan2(x * vY - y * vX, x * vX + y * vY);
|
|
551
|
+
}
|
|
552
|
+
/**
|
|
553
|
+
* Clamps the magnitude of this vector between a minimum and maximum value.
|
|
554
|
+
* @param min - The minimum magnitude.
|
|
555
|
+
* @param max - The maximum magnitude.
|
|
556
|
+
* @returns This Vec2 instance for method chaining.
|
|
557
|
+
*/
|
|
558
|
+
clamp(min, max) {
|
|
559
|
+
const m = this.#magnitude;
|
|
560
|
+
if (m > max) {
|
|
561
|
+
this.#xy[0] = (this.#xy[0] / m) * max;
|
|
562
|
+
this.#xy[1] = (this.#xy[1] / m) * max;
|
|
563
|
+
this.#computeMagnitude();
|
|
564
|
+
}
|
|
565
|
+
else if (m < min) {
|
|
566
|
+
this.#xy[0] = (this.#xy[0] / m) * min;
|
|
567
|
+
this.#xy[1] = (this.#xy[1] / m) * min;
|
|
568
|
+
this.#computeMagnitude();
|
|
569
|
+
}
|
|
570
|
+
return this;
|
|
571
|
+
}
|
|
572
|
+
/**
|
|
573
|
+
* Creates a copy of this vector.
|
|
574
|
+
* @returns A new Vec2 instance with the same components.
|
|
575
|
+
*/
|
|
576
|
+
clone() {
|
|
577
|
+
return new Vec2(this.#xy[0], this.#xy[1]);
|
|
578
|
+
}
|
|
579
|
+
/**
|
|
580
|
+
* Copies the components of another vector to this vector.
|
|
581
|
+
* @param v - The vector to copy from.
|
|
582
|
+
* @returns This Vec2 instance for method chaining.
|
|
583
|
+
*/
|
|
584
|
+
copy(v) {
|
|
585
|
+
this.#xy[0] = v.#xy[0];
|
|
586
|
+
this.#xy[1] = v.#xy[1];
|
|
587
|
+
this.#computeMagnitude();
|
|
588
|
+
return this;
|
|
589
|
+
}
|
|
590
|
+
/**
|
|
591
|
+
* Calculates the distance between this vector and another vector.
|
|
592
|
+
* @param v - The other vector.
|
|
593
|
+
* @returns The distance between the vectors.
|
|
594
|
+
*/
|
|
595
|
+
distance(v) {
|
|
596
|
+
return sqrt((this.#xy[0] - v.#xy[0]) ** 2 + (this.#xy[1] - v.#xy[1]) ** 2);
|
|
597
|
+
}
|
|
598
|
+
/**
|
|
599
|
+
* Calculates the Chebyshev distance between this vector and another vector.
|
|
600
|
+
* @param v - The other vector.
|
|
601
|
+
* @returns The Chebyshev distance between the vectors.
|
|
602
|
+
*/
|
|
603
|
+
distanceChebyshev(v) {
|
|
604
|
+
const absX = abs(this.#xy[0] - v.#xy[0]);
|
|
605
|
+
const absY = abs(this.#xy[1] - v.#xy[1]);
|
|
606
|
+
return absX >= absY ? absX : absY;
|
|
607
|
+
}
|
|
608
|
+
/**
|
|
609
|
+
* Calculates the Manhattan distance between this vector and another vector.
|
|
610
|
+
* @param v - The other vector.
|
|
611
|
+
* @returns The Manhattan distance between the vectors.
|
|
612
|
+
*/
|
|
613
|
+
distanceManhattan(v) {
|
|
614
|
+
return abs(this.#xy[0] - v.#xy[0]) + abs(this.#xy[1] - v.#xy[1]);
|
|
615
|
+
}
|
|
616
|
+
/**
|
|
617
|
+
* Calculates the Minkowski distance between this vector and another vector.
|
|
618
|
+
* @param v - The other vector.
|
|
619
|
+
* @param p - The order of the Minkowski distance.
|
|
620
|
+
* @returns The Minkowski distance between the vectors.
|
|
621
|
+
*/
|
|
622
|
+
distanceMinkowski(v, p) {
|
|
623
|
+
return (abs(this.#xy[0] - v.#xy[0]) ** p + abs(this.#xy[1] - v.#xy[1]) ** p) ** (1 / p);
|
|
624
|
+
}
|
|
625
|
+
/**
|
|
626
|
+
* Calculates the squared distance between this vector and another vector.
|
|
627
|
+
* @param v - The other vector.
|
|
628
|
+
* @returns The squared distance between the vectors.
|
|
629
|
+
*/
|
|
630
|
+
distanceSq(v) {
|
|
631
|
+
return (this.#xy[0] - v.#xy[0]) ** 2 + (this.#xy[1] - v.#xy[1]) ** 2;
|
|
632
|
+
}
|
|
633
|
+
/**
|
|
634
|
+
* Calculates the dot product of this vector with another vector.
|
|
635
|
+
* @param v - The other vector.
|
|
636
|
+
* @returns The dot product of the vectors.
|
|
637
|
+
*/
|
|
638
|
+
dot(v) {
|
|
639
|
+
return this.#xy[0] * v.#xy[0] + this.#xy[1] * v.#xy[1];
|
|
640
|
+
}
|
|
641
|
+
/**
|
|
642
|
+
* Calculates the cross product of this vector with another vector.
|
|
643
|
+
* @param v - The other vector.
|
|
644
|
+
* @returns The cross product of the vectors.
|
|
645
|
+
*/
|
|
646
|
+
cross(v) {
|
|
647
|
+
return this.#xy[0] * v.#xy[1] - this.#xy[1] * v.#xy[0];
|
|
648
|
+
}
|
|
649
|
+
/**
|
|
650
|
+
* Reflects this vector across a normal vector.
|
|
651
|
+
* @param normal - The normal vector to reflect across (must be normalized).
|
|
652
|
+
* @returns A new Vec2 instance representing the reflected vector.
|
|
653
|
+
*/
|
|
654
|
+
reflect(normal) {
|
|
655
|
+
const dot = this.dot(normal);
|
|
656
|
+
return new Vec2(this.#xy[0] - 2 * dot * normal.#xy[0], this.#xy[1] - 2 * dot * normal.#xy[1]);
|
|
657
|
+
}
|
|
658
|
+
/**
|
|
659
|
+
* Checks if this vector has infinite components.
|
|
660
|
+
* @returns True if the vector has infinite components, false otherwise.
|
|
661
|
+
*/
|
|
662
|
+
isInfinite() {
|
|
663
|
+
const x = this.#xy[0];
|
|
664
|
+
const y = this.#xy[1];
|
|
665
|
+
return (x === Number.POSITIVE_INFINITY ||
|
|
666
|
+
x === Number.NEGATIVE_INFINITY ||
|
|
667
|
+
y === Number.POSITIVE_INFINITY ||
|
|
668
|
+
y === Number.NEGATIVE_INFINITY);
|
|
669
|
+
}
|
|
670
|
+
/**
|
|
671
|
+
* Checks if this vector has NaN components.
|
|
672
|
+
* @returns True if the vector has NaN components, false otherwise.
|
|
673
|
+
*/
|
|
674
|
+
isNaN() {
|
|
675
|
+
return Number.isNaN(this.#xy[0]) || Number.isNaN(this.#xy[1]);
|
|
676
|
+
}
|
|
677
|
+
/**
|
|
678
|
+
* Checks if this vector is zero.
|
|
679
|
+
* @returns True if the vector is zero, false otherwise.
|
|
680
|
+
*/
|
|
681
|
+
isZero() {
|
|
682
|
+
return this.#xy[0] === 0 && this.#xy[1] === 0;
|
|
683
|
+
}
|
|
684
|
+
/**
|
|
685
|
+
* Limits the maximum magnitude of this vector.
|
|
686
|
+
* @param max - The maximum magnitude.
|
|
687
|
+
* @returns This Vec2 instance for method chaining.
|
|
688
|
+
*/
|
|
689
|
+
limitMax(max) {
|
|
690
|
+
const m = this.#magnitude;
|
|
691
|
+
if (m > max) {
|
|
692
|
+
this.#xy[0] = (this.#xy[0] / m) * max;
|
|
693
|
+
this.#xy[1] = (this.#xy[1] / m) * max;
|
|
694
|
+
this.#computeMagnitude();
|
|
695
|
+
}
|
|
696
|
+
return this;
|
|
697
|
+
}
|
|
698
|
+
/**
|
|
699
|
+
* Limits the minimum magnitude of this vector.
|
|
700
|
+
* @param min - The minimum magnitude.
|
|
701
|
+
* @returns This Vec2 instance for method chaining.
|
|
702
|
+
*/
|
|
703
|
+
limitMin(min) {
|
|
704
|
+
const m = this.#magnitude;
|
|
705
|
+
if (m < min) {
|
|
706
|
+
this.#xy[0] = (this.#xy[0] / m) * min;
|
|
707
|
+
this.#xy[1] = (this.#xy[1] / m) * min;
|
|
708
|
+
this.#computeMagnitude();
|
|
709
|
+
}
|
|
710
|
+
return this;
|
|
711
|
+
}
|
|
712
|
+
/**
|
|
713
|
+
* Sets this vector to point towards another vector.
|
|
714
|
+
* @param v - The vector to look at.
|
|
715
|
+
* @returns This Vec2 instance for method chaining.
|
|
716
|
+
*/
|
|
717
|
+
lookAt(v) {
|
|
718
|
+
const m = this.#magnitude;
|
|
719
|
+
const vM = v.#magnitude;
|
|
720
|
+
this.#xy[0] = (v.#xy[0] / vM) * m;
|
|
721
|
+
this.#xy[1] = (v.#xy[1] / vM) * m;
|
|
722
|
+
this.#computeMagnitude();
|
|
723
|
+
return this;
|
|
724
|
+
}
|
|
725
|
+
/**
|
|
726
|
+
* Negates this vector.
|
|
727
|
+
* @returns This Vec2 instance for method chaining.
|
|
728
|
+
*/
|
|
729
|
+
negate() {
|
|
730
|
+
this.#xy[0] *= -1;
|
|
731
|
+
this.#xy[1] *= -1;
|
|
732
|
+
this.#computeMagnitude();
|
|
733
|
+
return this;
|
|
734
|
+
}
|
|
735
|
+
/**
|
|
736
|
+
* Normalizes this vector.
|
|
737
|
+
* @returns This Vec2 instance for method chaining.
|
|
738
|
+
*/
|
|
739
|
+
normalize() {
|
|
740
|
+
const m = this.#magnitude;
|
|
741
|
+
this.#xy[0] /= m;
|
|
742
|
+
this.#xy[1] /= m;
|
|
743
|
+
this.#computeMagnitude();
|
|
744
|
+
return this;
|
|
745
|
+
}
|
|
746
|
+
/**
|
|
747
|
+
* Projects this vector onto another vector.
|
|
748
|
+
* @param v - The vector to project onto.
|
|
749
|
+
* @returns This Vec2 instance for method chaining.
|
|
750
|
+
*/
|
|
751
|
+
project(v) {
|
|
752
|
+
const x = this.#xy[0];
|
|
753
|
+
const y = this.#xy[1];
|
|
754
|
+
const vX = v.#xy[0];
|
|
755
|
+
const vY = v.#xy[1];
|
|
756
|
+
const vM = v.#magnitude;
|
|
757
|
+
const f = this.#magnitude * cos(atan2(x * vY - y * vX, x * vX + y * vY));
|
|
758
|
+
this.#xy[0] = (vX / vM) * f;
|
|
759
|
+
this.#xy[1] = (vY / vM) * f;
|
|
760
|
+
this.#computeMagnitude();
|
|
761
|
+
return this;
|
|
762
|
+
}
|
|
763
|
+
/**
|
|
764
|
+
* Sets this vector to a random direction with the same magnitude.
|
|
765
|
+
* @param random - A function that returns a random number between 0 and 1.
|
|
766
|
+
* @returns This Vec2 instance for method chaining.
|
|
767
|
+
*/
|
|
768
|
+
random(random = Math.random) {
|
|
769
|
+
const phi = random() * PI2;
|
|
770
|
+
const m = this.#magnitude;
|
|
771
|
+
this.#xy[0] = m * cos(phi);
|
|
772
|
+
this.#xy[1] = m * sin(phi);
|
|
773
|
+
this.#computeMagnitude();
|
|
774
|
+
return this;
|
|
775
|
+
}
|
|
776
|
+
/**
|
|
777
|
+
* Rotates this vector around the Z-axis.
|
|
778
|
+
* @param phi - The angle of rotation in radians.
|
|
779
|
+
* @returns This Vec2 instance for method chaining.
|
|
780
|
+
*/
|
|
781
|
+
rotateZ(phi) {
|
|
782
|
+
const cosPhi = cos(phi);
|
|
783
|
+
const sinPhi = sin(phi);
|
|
784
|
+
const x = this.#xy[0];
|
|
785
|
+
const y = this.#xy[1];
|
|
786
|
+
this.#xy[0] = x * cosPhi - y * sinPhi;
|
|
787
|
+
this.#xy[1] = x * sinPhi + y * cosPhi;
|
|
788
|
+
this.#computeMagnitude();
|
|
789
|
+
return this;
|
|
790
|
+
}
|
|
791
|
+
/**
|
|
792
|
+
* Checks if this vector is equal to another vector.
|
|
793
|
+
* @param v - The other vector.
|
|
794
|
+
* @returns True if the vectors are equal, false otherwise.
|
|
795
|
+
*/
|
|
796
|
+
satisfyEquality(v) {
|
|
797
|
+
return this.#xy[0] === v.#xy[0] && this.#xy[1] === v.#xy[1];
|
|
798
|
+
}
|
|
799
|
+
/**
|
|
800
|
+
* Checks if this vector is opposite to another vector.
|
|
801
|
+
* @param v - The other vector.
|
|
802
|
+
* @returns True if the vectors are opposite, false otherwise.
|
|
803
|
+
*/
|
|
804
|
+
satisfyOpposition(v) {
|
|
805
|
+
return this.#xy[0] === -v.#xy[0] && this.#xy[1] === -v.#xy[1];
|
|
806
|
+
}
|
|
807
|
+
/**
|
|
808
|
+
* Compares this vector with another vector using an epsilon value for floating-point comparison.
|
|
809
|
+
* @param v - The vector to compare with.
|
|
810
|
+
* @param epsilon - The maximum difference between components to consider them equal.
|
|
811
|
+
* @returns True if the vectors are equal within epsilon, false otherwise.
|
|
812
|
+
*/
|
|
813
|
+
equals(v, epsilon = Number.EPSILON) {
|
|
814
|
+
return abs(this.#xy[0] - v.#xy[0]) <= epsilon && abs(this.#xy[1] - v.#xy[1]) <= epsilon;
|
|
815
|
+
}
|
|
816
|
+
/**
|
|
817
|
+
* Scales this vector by a scalar value.
|
|
818
|
+
* @param c - The scalar value.
|
|
819
|
+
* @returns This Vec2 instance for method chaining.
|
|
820
|
+
*/
|
|
821
|
+
scale(c) {
|
|
822
|
+
this.#xy[0] *= c;
|
|
823
|
+
this.#xy[1] *= c;
|
|
824
|
+
this.#computeMagnitude();
|
|
825
|
+
return this;
|
|
826
|
+
}
|
|
827
|
+
/**
|
|
828
|
+
* Rotates this vector 90 degrees to the left.
|
|
829
|
+
* @returns This Vec2 instance for method chaining.
|
|
830
|
+
*/
|
|
831
|
+
turnLeft() {
|
|
832
|
+
const x = this.#xy[0];
|
|
833
|
+
this.#xy[0] = -this.#xy[1];
|
|
834
|
+
this.#xy[1] = x;
|
|
835
|
+
this.#computeMagnitude();
|
|
836
|
+
return this;
|
|
837
|
+
}
|
|
838
|
+
/**
|
|
839
|
+
* Rotates this vector 90 degrees to the right.
|
|
840
|
+
* @returns This Vec2 instance for method chaining.
|
|
841
|
+
*/
|
|
842
|
+
turnRight() {
|
|
843
|
+
const x = this.#xy[0];
|
|
844
|
+
this.#xy[0] = this.#xy[1];
|
|
845
|
+
this.#xy[1] = -x;
|
|
846
|
+
this.#computeMagnitude();
|
|
847
|
+
return this;
|
|
848
|
+
}
|
|
849
|
+
/**
|
|
850
|
+
* Sets this vector to zero.
|
|
851
|
+
* @returns This Vec2 instance for method chaining.
|
|
852
|
+
*/
|
|
853
|
+
zero() {
|
|
854
|
+
this.#xy[0] = 0;
|
|
855
|
+
this.#xy[1] = 0;
|
|
856
|
+
this.#computeMagnitude();
|
|
857
|
+
return this;
|
|
858
|
+
}
|
|
859
|
+
/**
|
|
860
|
+
* Makes the Vec2 instance iterable.
|
|
861
|
+
* @yields The x and y components of the vector.
|
|
862
|
+
*/
|
|
863
|
+
*[Symbol.iterator]() {
|
|
864
|
+
yield this.#xy[0];
|
|
865
|
+
yield this.#xy[1];
|
|
866
|
+
}
|
|
867
|
+
/**
|
|
868
|
+
* Returns a string representation of the vector.
|
|
869
|
+
* @returns A string in the format "Vec2(x, y)".
|
|
870
|
+
*/
|
|
871
|
+
toString() {
|
|
872
|
+
return `Vec2(${this.#xy[0]}, ${this.#xy[1]})`;
|
|
873
|
+
}
|
|
874
|
+
/**
|
|
875
|
+
* Converts the vector to a plain object.
|
|
876
|
+
* @returns An object with x and y properties.
|
|
877
|
+
*/
|
|
878
|
+
toObject() {
|
|
879
|
+
return { x: this.#xy[0], y: this.#xy[1] };
|
|
880
|
+
}
|
|
881
|
+
/**
|
|
882
|
+
* Serializes the vector to a JSON-friendly format.
|
|
883
|
+
* @returns A JSON-friendly object representation of the vector.
|
|
884
|
+
*/
|
|
885
|
+
toJSON() {
|
|
886
|
+
return this.toObject();
|
|
887
|
+
}
|
|
888
|
+
}
|
|
889
|
+
exports.Vec2 = Vec2;
|