@interstellar-tools/equations 0.17.0 → 0.19.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/dist/__tests__/helpers/index.d.ts +3 -9
- package/dist/__tests__/helpers/index.d.ts.map +1 -1
- package/dist/__tests__/helpers/index.js +15 -21
- package/dist/__tests__/helpers/index.js.map +1 -1
- package/dist/categories/angle/__tests__/compute-angle.int.spec.d.ts.map +1 -0
- package/dist/{__tests__ → categories/angle/__tests__}/compute-angle.int.spec.js +2 -2
- package/dist/categories/angle/__tests__/compute-angle.int.spec.js.map +1 -0
- package/dist/categories/angle/__tests__/wrap-angle.spec.d.ts.map +1 -0
- package/dist/{__tests__ → categories/angle/__tests__}/wrap-angle.spec.js +1 -1
- package/dist/categories/angle/__tests__/wrap-angle.spec.js.map +1 -0
- package/dist/categories/anomalies/__tests__/eccentric-to-true-anomaly.spec.d.ts.map +1 -0
- package/dist/{__tests__ → categories/anomalies/__tests__}/eccentric-to-true-anomaly.spec.js +1 -1
- package/dist/categories/anomalies/__tests__/eccentric-to-true-anomaly.spec.js.map +1 -0
- package/dist/categories/anomalies/__tests__/mean-to-eccentric-anomaly.spec.d.ts.map +1 -0
- package/dist/{__tests__ → categories/anomalies/__tests__}/mean-to-eccentric-anomaly.spec.js +3 -3
- package/dist/categories/anomalies/__tests__/mean-to-eccentric-anomaly.spec.js.map +1 -0
- package/dist/categories/anomalies/__tests__/true-to-mean-anomaly.spec.d.ts.map +1 -0
- package/dist/{__tests__ → categories/anomalies/__tests__}/true-to-mean-anomaly.spec.js +2 -2
- package/dist/categories/anomalies/__tests__/true-to-mean-anomaly.spec.js.map +1 -0
- package/dist/categories/anomalies/eccentric-to-true-anomaly.d.ts +1 -1
- package/dist/categories/anomalies/eccentric-to-true-anomaly.d.ts.map +1 -1
- package/dist/categories/anomalies/true-to-mean-anomaly.d.ts +1 -1
- package/dist/categories/anomalies/true-to-mean-anomaly.d.ts.map +1 -1
- package/dist/categories/cartography/__tests__/body-fixed-from-inertial-dcm-iau.int.spec.d.ts +2 -0
- package/dist/categories/cartography/__tests__/body-fixed-from-inertial-dcm-iau.int.spec.d.ts.map +1 -0
- package/dist/categories/cartography/__tests__/body-fixed-from-inertial-dcm-iau.int.spec.js +56 -0
- package/dist/categories/cartography/__tests__/body-fixed-from-inertial-dcm-iau.int.spec.js.map +1 -0
- package/dist/categories/cartography/__tests__/eccentricity-squared-oblate-spheroid.spec.d.ts +2 -0
- package/dist/categories/cartography/__tests__/eccentricity-squared-oblate-spheroid.spec.d.ts.map +1 -0
- package/dist/categories/cartography/__tests__/eccentricity-squared-oblate-spheroid.spec.js +60 -0
- package/dist/categories/cartography/__tests__/eccentricity-squared-oblate-spheroid.spec.js.map +1 -0
- package/dist/categories/cartography/__tests__/flattening-oblate-spheroid.spec.d.ts +2 -0
- package/dist/categories/cartography/__tests__/flattening-oblate-spheroid.spec.d.ts.map +1 -0
- package/dist/categories/cartography/__tests__/flattening-oblate-spheroid.spec.js +60 -0
- package/dist/categories/cartography/__tests__/flattening-oblate-spheroid.spec.js.map +1 -0
- package/dist/categories/cartography/__tests__/is-on-triaxial-ellipsoid-surface.spec.d.ts +2 -0
- package/dist/categories/cartography/__tests__/is-on-triaxial-ellipsoid-surface.spec.d.ts.map +1 -0
- package/dist/categories/cartography/__tests__/is-on-triaxial-ellipsoid-surface.spec.js +73 -0
- package/dist/categories/cartography/__tests__/is-on-triaxial-ellipsoid-surface.spec.js.map +1 -0
- package/dist/categories/cartography/__tests__/planetocentric-latitude.spec.d.ts +2 -0
- package/dist/categories/cartography/__tests__/planetocentric-latitude.spec.d.ts.map +1 -0
- package/dist/categories/cartography/__tests__/planetocentric-latitude.spec.js +69 -0
- package/dist/categories/cartography/__tests__/planetocentric-latitude.spec.js.map +1 -0
- package/dist/categories/cartography/__tests__/planetographic-latitude-oblate.spec.d.ts +2 -0
- package/dist/categories/cartography/__tests__/planetographic-latitude-oblate.spec.d.ts.map +1 -0
- package/dist/categories/cartography/__tests__/planetographic-latitude-oblate.spec.js +103 -0
- package/dist/categories/cartography/__tests__/planetographic-latitude-oblate.spec.js.map +1 -0
- package/dist/categories/cartography/body-fixed-from-inertial-dcm-iau.d.ts +50 -0
- package/dist/categories/cartography/body-fixed-from-inertial-dcm-iau.d.ts.map +1 -0
- package/dist/categories/cartography/body-fixed-from-inertial-dcm-iau.js +64 -0
- package/dist/categories/cartography/body-fixed-from-inertial-dcm-iau.js.map +1 -0
- package/dist/categories/cartography/eccentricity-squared-oblate-spheroid.d.ts +40 -0
- package/dist/categories/cartography/eccentricity-squared-oblate-spheroid.d.ts.map +1 -0
- package/dist/categories/cartography/eccentricity-squared-oblate-spheroid.js +50 -0
- package/dist/categories/cartography/eccentricity-squared-oblate-spheroid.js.map +1 -0
- package/dist/categories/cartography/flattening-oblate-spheroid.d.ts +40 -0
- package/dist/categories/cartography/flattening-oblate-spheroid.d.ts.map +1 -0
- package/dist/categories/cartography/flattening-oblate-spheroid.js +50 -0
- package/dist/categories/cartography/flattening-oblate-spheroid.js.map +1 -0
- package/dist/categories/cartography/is-on-triaxial-ellipsoid-surface.d.ts +54 -0
- package/dist/categories/cartography/is-on-triaxial-ellipsoid-surface.d.ts.map +1 -0
- package/dist/categories/cartography/is-on-triaxial-ellipsoid-surface.js +77 -0
- package/dist/categories/cartography/is-on-triaxial-ellipsoid-surface.js.map +1 -0
- package/dist/categories/cartography/planetocentric-latitude.d.ts +38 -0
- package/dist/categories/cartography/planetocentric-latitude.d.ts.map +1 -0
- package/dist/categories/cartography/planetocentric-latitude.js +47 -0
- package/dist/categories/cartography/planetocentric-latitude.js.map +1 -0
- package/dist/categories/cartography/planetographic-latitude-oblate.d.ts +19 -0
- package/dist/categories/cartography/planetographic-latitude-oblate.d.ts.map +1 -0
- package/dist/categories/cartography/planetographic-latitude-oblate.js +44 -0
- package/dist/categories/cartography/planetographic-latitude-oblate.js.map +1 -0
- package/dist/categories/gravity/__tests__/gravitational-acceleration-on1-by2.int.spec.d.ts.map +1 -0
- package/dist/{__tests__ → categories/gravity/__tests__}/gravitational-acceleration-on1-by2.int.spec.js +3 -2
- package/dist/categories/gravity/__tests__/gravitational-acceleration-on1-by2.int.spec.js.map +1 -0
- package/dist/categories/gravity/__tests__/gravitational-force-on1-by2.int.spec.d.ts.map +1 -0
- package/dist/{__tests__ → categories/gravity/__tests__}/gravitational-force-on1-by2.int.spec.js +3 -2
- package/dist/categories/gravity/__tests__/gravitational-force-on1-by2.int.spec.js.map +1 -0
- package/dist/categories/gravity/__tests__/gravitational-force.spec.d.ts.map +1 -0
- package/dist/{__tests__ → categories/gravity/__tests__}/gravitational-force.spec.js +3 -2
- package/dist/categories/gravity/__tests__/gravitational-force.spec.js.map +1 -0
- package/dist/categories/gravity/__tests__/gravitational-parameters.spec.d.ts.map +1 -0
- package/dist/{__tests__ → categories/gravity/__tests__}/gravitational-parameters.spec.js +2 -2
- package/dist/categories/gravity/__tests__/gravitational-parameters.spec.js.map +1 -0
- package/dist/categories/helpers/__tests__/apply-matrix-3.spec.d.ts +2 -0
- package/dist/categories/helpers/__tests__/apply-matrix-3.spec.d.ts.map +1 -0
- package/dist/categories/helpers/__tests__/apply-matrix-3.spec.js +79 -0
- package/dist/categories/helpers/__tests__/apply-matrix-3.spec.js.map +1 -0
- package/dist/categories/helpers/__tests__/det-3.spec.d.ts +2 -0
- package/dist/categories/helpers/__tests__/det-3.spec.d.ts.map +1 -0
- package/dist/categories/helpers/__tests__/det-3.spec.js +73 -0
- package/dist/categories/helpers/__tests__/det-3.spec.js.map +1 -0
- package/dist/categories/helpers/__tests__/mat-mul3.spec.d.ts +2 -0
- package/dist/categories/helpers/__tests__/mat-mul3.spec.d.ts.map +1 -0
- package/dist/categories/helpers/__tests__/mat-mul3.spec.js +86 -0
- package/dist/categories/helpers/__tests__/mat-mul3.spec.js.map +1 -0
- package/dist/categories/helpers/__tests__/misc.spec.d.ts +2 -0
- package/dist/categories/helpers/__tests__/misc.spec.d.ts.map +1 -0
- package/dist/categories/helpers/__tests__/misc.spec.js +101 -0
- package/dist/categories/helpers/__tests__/misc.spec.js.map +1 -0
- package/dist/categories/helpers/__tests__/radians.spec.d.ts +2 -0
- package/dist/categories/helpers/__tests__/radians.spec.d.ts.map +1 -0
- package/dist/categories/helpers/__tests__/radians.spec.js +37 -0
- package/dist/categories/helpers/__tests__/radians.spec.js.map +1 -0
- package/dist/categories/helpers/__tests__/rot-1.spec.d.ts +2 -0
- package/dist/categories/helpers/__tests__/rot-1.spec.d.ts.map +1 -0
- package/dist/categories/helpers/__tests__/rot-1.spec.js +59 -0
- package/dist/categories/helpers/__tests__/rot-1.spec.js.map +1 -0
- package/dist/categories/helpers/__tests__/rot-3.spec.d.ts +2 -0
- package/dist/categories/helpers/__tests__/rot-3.spec.d.ts.map +1 -0
- package/dist/categories/helpers/__tests__/rot-3.spec.js +65 -0
- package/dist/categories/helpers/__tests__/rot-3.spec.js.map +1 -0
- package/dist/categories/helpers/apply-matrix-3.d.ts +38 -0
- package/dist/categories/helpers/apply-matrix-3.d.ts.map +1 -0
- package/dist/categories/helpers/apply-matrix-3.js +44 -0
- package/dist/categories/helpers/apply-matrix-3.js.map +1 -0
- package/dist/categories/helpers/det-3.d.ts +52 -0
- package/dist/categories/helpers/det-3.d.ts.map +1 -0
- package/dist/categories/helpers/det-3.js +62 -0
- package/dist/categories/helpers/det-3.js.map +1 -0
- package/dist/categories/helpers/mat-mul3.d.ts +46 -0
- package/dist/categories/helpers/mat-mul3.d.ts.map +1 -0
- package/dist/categories/helpers/mat-mul3.js +52 -0
- package/dist/categories/helpers/mat-mul3.js.map +1 -0
- package/dist/categories/helpers/misc.d.ts +118 -0
- package/dist/categories/helpers/misc.d.ts.map +1 -0
- package/dist/categories/helpers/misc.js +131 -0
- package/dist/categories/helpers/misc.js.map +1 -0
- package/dist/categories/helpers/radians.d.ts +41 -0
- package/dist/categories/helpers/radians.d.ts.map +1 -0
- package/dist/categories/helpers/radians.js +40 -0
- package/dist/categories/helpers/radians.js.map +1 -0
- package/dist/categories/helpers/rot-1.d.ts +38 -0
- package/dist/categories/helpers/rot-1.d.ts.map +1 -0
- package/dist/categories/helpers/rot-1.js +47 -0
- package/dist/categories/helpers/rot-1.js.map +1 -0
- package/dist/categories/helpers/rot-3.d.ts +38 -0
- package/dist/categories/helpers/rot-3.d.ts.map +1 -0
- package/dist/categories/helpers/rot-3.js +47 -0
- package/dist/categories/helpers/rot-3.js.map +1 -0
- package/dist/categories/helpers/transpose-3.d.ts +51 -0
- package/dist/categories/helpers/transpose-3.d.ts.map +1 -0
- package/dist/categories/helpers/transpose-3.js +54 -0
- package/dist/categories/helpers/transpose-3.js.map +1 -0
- package/dist/categories/kepler/__tests__/solve-kepler-bisection.spec.d.ts.map +1 -0
- package/dist/{__tests__ → categories/kepler/__tests__}/solve-kepler-bisection.spec.js +3 -2
- package/dist/categories/kepler/__tests__/solve-kepler-bisection.spec.js.map +1 -0
- package/dist/categories/kepler/__tests__/solve-kepler-high-eccentricity.spec.d.ts.map +1 -0
- package/dist/{__tests__ → categories/kepler/__tests__}/solve-kepler-high-eccentricity.spec.js +1 -1
- package/dist/categories/kepler/__tests__/solve-kepler-high-eccentricity.spec.js.map +1 -0
- package/dist/categories/kepler/__tests__/solve-kepler-newton-raphson.spec.d.ts.map +1 -0
- package/dist/{__tests__ → categories/kepler/__tests__}/solve-kepler-newton-raphson.spec.js +1 -1
- package/dist/categories/kepler/__tests__/solve-kepler-newton-raphson.spec.js.map +1 -0
- package/dist/categories/kepler/__tests__/solve-kepler.int.spec.d.ts.map +1 -0
- package/dist/{__tests__ → categories/kepler/__tests__}/solve-kepler.int.spec.js +1 -1
- package/dist/categories/kepler/__tests__/solve-kepler.int.spec.js.map +1 -0
- package/dist/categories/kepler/solve-kepler-bisection.d.ts +1 -1
- package/dist/categories/kepler/solve-kepler-bisection.d.ts.map +1 -1
- package/dist/categories/kepler/solve-kepler-high-eccentricity.d.ts +1 -1
- package/dist/categories/kepler/solve-kepler-high-eccentricity.d.ts.map +1 -1
- package/dist/categories/kepler/solve-kepler-newton-raphson.d.ts +1 -1
- package/dist/categories/kepler/solve-kepler-newton-raphson.d.ts.map +1 -1
- package/dist/categories/kepler/solve-kepler-newton-raphson.js +1 -1
- package/dist/categories/kepler/solve-kepler.d.ts +1 -1
- package/dist/categories/kepler/solve-kepler.d.ts.map +1 -1
- package/dist/categories/manoeuvres/__tests__/combine-burns-delta-v.spec.d.ts.map +1 -0
- package/dist/{__tests__ → categories/manoeuvres/__tests__}/combine-burns-delta-v.spec.js +3 -2
- package/dist/categories/manoeuvres/__tests__/combine-burns-delta-v.spec.js.map +1 -0
- package/dist/categories/manoeuvres/__tests__/gravity-assist-turning-angle.spec.d.ts.map +1 -0
- package/dist/{__tests__ → categories/manoeuvres/__tests__}/gravity-assist-turning-angle.spec.js +2 -2
- package/dist/categories/manoeuvres/__tests__/gravity-assist-turning-angle.spec.js.map +1 -0
- package/dist/categories/manoeuvres/__tests__/hohmann-transfer.spec.d.ts.map +1 -0
- package/dist/{__tests__ → categories/manoeuvres/__tests__}/hohmann-transfer.spec.js +2 -2
- package/dist/categories/manoeuvres/__tests__/hohmann-transfer.spec.js.map +1 -0
- package/dist/categories/manoeuvres/__tests__/oberth-energy-gain.spec.d.ts.map +1 -0
- package/dist/{__tests__ → categories/manoeuvres/__tests__}/oberth-energy-gain.spec.js +2 -2
- package/dist/categories/manoeuvres/__tests__/oberth-energy-gain.spec.js.map +1 -0
- package/dist/categories/manoeuvres/__tests__/plane-change-delta-v.spec.d.ts.map +1 -0
- package/dist/{__tests__ → categories/manoeuvres/__tests__}/plane-change-delta-v.spec.js +3 -2
- package/dist/categories/manoeuvres/__tests__/plane-change-delta-v.spec.js.map +1 -0
- package/dist/categories/manoeuvres/__tests__/rocket-delta-v-from-isp.spec.d.ts +2 -0
- package/dist/categories/manoeuvres/__tests__/rocket-delta-v-from-isp.spec.d.ts.map +1 -0
- package/dist/categories/manoeuvres/__tests__/rocket-delta-v-from-isp.spec.js +84 -0
- package/dist/categories/manoeuvres/__tests__/rocket-delta-v-from-isp.spec.js.map +1 -0
- package/dist/categories/manoeuvres/__tests__/rocket-delta-v-from-ve.spec.d.ts +2 -0
- package/dist/categories/manoeuvres/__tests__/rocket-delta-v-from-ve.spec.d.ts.map +1 -0
- package/dist/categories/manoeuvres/__tests__/rocket-delta-v-from-ve.spec.js +65 -0
- package/dist/categories/manoeuvres/__tests__/rocket-delta-v-from-ve.spec.js.map +1 -0
- package/dist/categories/manoeuvres/rocket-delta-v-from-isp.d.ts +46 -0
- package/dist/categories/manoeuvres/rocket-delta-v-from-isp.d.ts.map +1 -0
- package/dist/categories/manoeuvres/rocket-delta-v-from-isp.js +67 -0
- package/dist/categories/manoeuvres/rocket-delta-v-from-isp.js.map +1 -0
- package/dist/categories/manoeuvres/rocket-delta-v-from-ve.d.ts +44 -0
- package/dist/categories/manoeuvres/rocket-delta-v-from-ve.d.ts.map +1 -0
- package/dist/categories/manoeuvres/rocket-delta-v-from-ve.js +62 -0
- package/dist/categories/manoeuvres/rocket-delta-v-from-ve.js.map +1 -0
- package/dist/categories/orbits/__tests__/atmospheric-drag-acceleration.spec.d.ts +2 -0
- package/dist/categories/orbits/__tests__/atmospheric-drag-acceleration.spec.d.ts.map +1 -0
- package/dist/categories/orbits/__tests__/atmospheric-drag-acceleration.spec.js +71 -0
- package/dist/categories/orbits/__tests__/atmospheric-drag-acceleration.spec.js.map +1 -0
- package/dist/categories/orbits/__tests__/characteristic-energy-c3.spec.d.ts.map +1 -0
- package/dist/{__tests__ → categories/orbits/__tests__}/characteristic-energy-c3.spec.js +2 -2
- package/dist/categories/orbits/__tests__/characteristic-energy-c3.spec.js.map +1 -0
- package/dist/categories/orbits/__tests__/circular-speed.spec.d.ts.map +1 -0
- package/dist/{__tests__ → categories/orbits/__tests__}/circular-speed.spec.js +2 -2
- package/dist/categories/orbits/__tests__/circular-speed.spec.js.map +1 -0
- package/dist/categories/orbits/__tests__/cw-hill-derivatives.spec.d.ts.map +1 -0
- package/dist/{__tests__ → categories/orbits/__tests__}/cw-hill-derivatives.spec.js +2 -2
- package/dist/categories/orbits/__tests__/cw-hill-derivatives.spec.js.map +1 -0
- package/dist/categories/orbits/__tests__/escape-speed.spec.d.ts.map +1 -0
- package/dist/{__tests__ → categories/orbits/__tests__}/escape-speed.spec.js +2 -2
- package/dist/categories/orbits/__tests__/escape-speed.spec.js.map +1 -0
- package/dist/categories/orbits/__tests__/flight-path-angle-from-true-anomaly.spec.d.ts.map +1 -0
- package/dist/{__tests__ → categories/orbits/__tests__}/flight-path-angle-from-true-anomaly.spec.js +2 -2
- package/dist/categories/orbits/__tests__/flight-path-angle-from-true-anomaly.spec.js.map +1 -0
- package/dist/categories/orbits/__tests__/hyperbolic-periapsis-speed.spec.d.ts.map +1 -0
- package/dist/{__tests__ → categories/orbits/__tests__}/hyperbolic-periapsis-speed.spec.js +2 -2
- package/dist/categories/orbits/__tests__/hyperbolic-periapsis-speed.spec.js.map +1 -0
- package/dist/categories/orbits/__tests__/j2-argument-of-perigee-rate.spec.d.ts +2 -0
- package/dist/categories/orbits/__tests__/j2-argument-of-perigee-rate.spec.d.ts.map +1 -0
- package/dist/categories/orbits/__tests__/j2-argument-of-perigee-rate.spec.js +104 -0
- package/dist/categories/orbits/__tests__/j2-argument-of-perigee-rate.spec.js.map +1 -0
- package/dist/categories/orbits/__tests__/j2-nodal-precession-rate.spec.d.ts +2 -0
- package/dist/categories/orbits/__tests__/j2-nodal-precession-rate.spec.d.ts.map +1 -0
- package/dist/categories/orbits/__tests__/j2-nodal-precession-rate.spec.js +99 -0
- package/dist/categories/orbits/__tests__/j2-nodal-precession-rate.spec.js.map +1 -0
- package/dist/categories/orbits/__tests__/kepler-period.spec.d.ts.map +1 -0
- package/dist/{__tests__ → categories/orbits/__tests__}/kepler-period.spec.js +2 -2
- package/dist/categories/orbits/__tests__/kepler-period.spec.js.map +1 -0
- package/dist/categories/orbits/__tests__/mean-motion.spec.d.ts.map +1 -0
- package/dist/{__tests__ → categories/orbits/__tests__}/mean-motion.spec.js +2 -2
- package/dist/categories/orbits/__tests__/mean-motion.spec.js.map +1 -0
- package/dist/categories/orbits/__tests__/peri-apoapsis-radii.spec.d.ts.map +1 -0
- package/dist/{__tests__ → categories/orbits/__tests__}/peri-apoapsis-radii.spec.js +2 -2
- package/dist/categories/orbits/__tests__/peri-apoapsis-radii.spec.js.map +1 -0
- package/dist/categories/orbits/__tests__/specific-angular-momentum-from-elements.spec.d.ts.map +1 -0
- package/dist/{__tests__ → categories/orbits/__tests__}/specific-angular-momentum-from-elements.spec.js +2 -2
- package/dist/categories/orbits/__tests__/specific-angular-momentum-from-elements.spec.js.map +1 -0
- package/dist/categories/orbits/__tests__/specific-angular-momentum.spec.d.ts.map +1 -0
- package/dist/{__tests__ → categories/orbits/__tests__}/specific-angular-momentum.spec.js +3 -2
- package/dist/categories/orbits/__tests__/specific-angular-momentum.spec.js.map +1 -0
- package/dist/categories/orbits/__tests__/specific-mechanical-energy.spec.d.ts.map +1 -0
- package/dist/{__tests__ → categories/orbits/__tests__}/specific-mechanical-energy.spec.js +2 -2
- package/dist/categories/orbits/__tests__/specific-mechanical-energy.spec.js.map +1 -0
- package/dist/categories/orbits/__tests__/sphere-of-influence-radius.spec.d.ts.map +1 -0
- package/dist/{__tests__ → categories/orbits/__tests__}/sphere-of-influence-radius.spec.js +2 -2
- package/dist/categories/orbits/__tests__/sphere-of-influence-radius.spec.js.map +1 -0
- package/dist/categories/orbits/__tests__/vis-viva-speed.spec.d.ts.map +1 -0
- package/dist/{__tests__ → categories/orbits/__tests__}/vis-viva-speed.spec.js +2 -2
- package/dist/categories/orbits/__tests__/vis-viva-speed.spec.js.map +1 -0
- package/dist/categories/orbits/atmospheric-drag-acceleration.d.ts +40 -0
- package/dist/categories/orbits/atmospheric-drag-acceleration.d.ts.map +1 -0
- package/dist/categories/orbits/atmospheric-drag-acceleration.js +63 -0
- package/dist/categories/orbits/atmospheric-drag-acceleration.js.map +1 -0
- package/dist/categories/orbits/flight-path-angle-from-true-anomaly.d.ts +1 -1
- package/dist/categories/orbits/flight-path-angle-from-true-anomaly.d.ts.map +1 -1
- package/dist/categories/orbits/j2-argument-of-perigee-rate.d.ts +53 -0
- package/dist/categories/orbits/j2-argument-of-perigee-rate.d.ts.map +1 -0
- package/dist/categories/orbits/j2-argument-of-perigee-rate.js +84 -0
- package/dist/categories/orbits/j2-argument-of-perigee-rate.js.map +1 -0
- package/dist/categories/orbits/j2-nodal-precession-rate.d.ts +52 -0
- package/dist/categories/orbits/j2-nodal-precession-rate.d.ts.map +1 -0
- package/dist/categories/orbits/j2-nodal-precession-rate.js +82 -0
- package/dist/categories/orbits/j2-nodal-precession-rate.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
- package/dist/__tests__/characteristic-energy-c3.spec.d.ts.map +0 -1
- package/dist/__tests__/characteristic-energy-c3.spec.js.map +0 -1
- package/dist/__tests__/circular-speed.spec.d.ts.map +0 -1
- package/dist/__tests__/circular-speed.spec.js.map +0 -1
- package/dist/__tests__/combine-burns-delta-v.spec.d.ts.map +0 -1
- package/dist/__tests__/combine-burns-delta-v.spec.js.map +0 -1
- package/dist/__tests__/compute-angle.int.spec.d.ts.map +0 -1
- package/dist/__tests__/compute-angle.int.spec.js.map +0 -1
- package/dist/__tests__/cw-hill-derivatives.spec.d.ts.map +0 -1
- package/dist/__tests__/cw-hill-derivatives.spec.js.map +0 -1
- package/dist/__tests__/eccentric-to-true-anomaly.spec.d.ts.map +0 -1
- package/dist/__tests__/eccentric-to-true-anomaly.spec.js.map +0 -1
- package/dist/__tests__/escape-speed.spec.d.ts.map +0 -1
- package/dist/__tests__/escape-speed.spec.js.map +0 -1
- package/dist/__tests__/flight-path-angle-from-true-anomaly.spec.d.ts.map +0 -1
- package/dist/__tests__/flight-path-angle-from-true-anomaly.spec.js.map +0 -1
- package/dist/__tests__/gravitational-acceleration-on1-by2.int.spec.d.ts.map +0 -1
- package/dist/__tests__/gravitational-acceleration-on1-by2.int.spec.js.map +0 -1
- package/dist/__tests__/gravitational-force-on1-by2.int.spec.d.ts.map +0 -1
- package/dist/__tests__/gravitational-force-on1-by2.int.spec.js.map +0 -1
- package/dist/__tests__/gravitational-force.spec.d.ts.map +0 -1
- package/dist/__tests__/gravitational-force.spec.js.map +0 -1
- package/dist/__tests__/gravitational-parameters.spec.d.ts.map +0 -1
- package/dist/__tests__/gravitational-parameters.spec.js.map +0 -1
- package/dist/__tests__/gravity-assist-turning-angle.spec.d.ts.map +0 -1
- package/dist/__tests__/gravity-assist-turning-angle.spec.js.map +0 -1
- package/dist/__tests__/hohmann-transfer.spec.d.ts.map +0 -1
- package/dist/__tests__/hohmann-transfer.spec.js.map +0 -1
- package/dist/__tests__/hyperbolic-periapsis-speed.spec.d.ts.map +0 -1
- package/dist/__tests__/hyperbolic-periapsis-speed.spec.js.map +0 -1
- package/dist/__tests__/kepler-period.spec.d.ts.map +0 -1
- package/dist/__tests__/kepler-period.spec.js.map +0 -1
- package/dist/__tests__/mean-motion.spec.d.ts.map +0 -1
- package/dist/__tests__/mean-motion.spec.js.map +0 -1
- package/dist/__tests__/mean-to-eccentric-anomaly.spec.d.ts.map +0 -1
- package/dist/__tests__/mean-to-eccentric-anomaly.spec.js.map +0 -1
- package/dist/__tests__/oberth-energy-gain.spec.d.ts.map +0 -1
- package/dist/__tests__/oberth-energy-gain.spec.js.map +0 -1
- package/dist/__tests__/peri-apoapsis-radii.spec.d.ts.map +0 -1
- package/dist/__tests__/peri-apoapsis-radii.spec.js.map +0 -1
- package/dist/__tests__/plane-change-delta-v.spec.d.ts.map +0 -1
- package/dist/__tests__/plane-change-delta-v.spec.js.map +0 -1
- package/dist/__tests__/solve-kepler-bisection.spec.d.ts.map +0 -1
- package/dist/__tests__/solve-kepler-bisection.spec.js.map +0 -1
- package/dist/__tests__/solve-kepler-high-eccentricity.spec.d.ts.map +0 -1
- package/dist/__tests__/solve-kepler-high-eccentricity.spec.js.map +0 -1
- package/dist/__tests__/solve-kepler-newton-raphson.spec.d.ts.map +0 -1
- package/dist/__tests__/solve-kepler-newton-raphson.spec.js.map +0 -1
- package/dist/__tests__/solve-kepler.int.spec.d.ts.map +0 -1
- package/dist/__tests__/solve-kepler.int.spec.js.map +0 -1
- package/dist/__tests__/specific-angular-momentum-from-elements.spec.d.ts.map +0 -1
- package/dist/__tests__/specific-angular-momentum-from-elements.spec.js.map +0 -1
- package/dist/__tests__/specific-angular-momentum.spec.d.ts.map +0 -1
- package/dist/__tests__/specific-angular-momentum.spec.js.map +0 -1
- package/dist/__tests__/specific-mechanical-energy.spec.d.ts.map +0 -1
- package/dist/__tests__/specific-mechanical-energy.spec.js.map +0 -1
- package/dist/__tests__/sphere-of-influence-radius.spec.d.ts.map +0 -1
- package/dist/__tests__/sphere-of-influence-radius.spec.js.map +0 -1
- package/dist/__tests__/true-to-mean-anomaly.spec.d.ts.map +0 -1
- package/dist/__tests__/true-to-mean-anomaly.spec.js.map +0 -1
- package/dist/__tests__/vis-viva-speed.spec.d.ts.map +0 -1
- package/dist/__tests__/vis-viva-speed.spec.js.map +0 -1
- package/dist/__tests__/wrap-angle.spec.d.ts.map +0 -1
- package/dist/__tests__/wrap-angle.spec.js.map +0 -1
- /package/dist/{__tests__ → categories/angle/__tests__}/compute-angle.int.spec.d.ts +0 -0
- /package/dist/{__tests__ → categories/angle/__tests__}/wrap-angle.spec.d.ts +0 -0
- /package/dist/{__tests__ → categories/anomalies/__tests__}/eccentric-to-true-anomaly.spec.d.ts +0 -0
- /package/dist/{__tests__ → categories/anomalies/__tests__}/mean-to-eccentric-anomaly.spec.d.ts +0 -0
- /package/dist/{__tests__ → categories/anomalies/__tests__}/true-to-mean-anomaly.spec.d.ts +0 -0
- /package/dist/{__tests__ → categories/gravity/__tests__}/gravitational-acceleration-on1-by2.int.spec.d.ts +0 -0
- /package/dist/{__tests__ → categories/gravity/__tests__}/gravitational-force-on1-by2.int.spec.d.ts +0 -0
- /package/dist/{__tests__ → categories/gravity/__tests__}/gravitational-force.spec.d.ts +0 -0
- /package/dist/{__tests__ → categories/gravity/__tests__}/gravitational-parameters.spec.d.ts +0 -0
- /package/dist/{__tests__ → categories/kepler/__tests__}/solve-kepler-bisection.spec.d.ts +0 -0
- /package/dist/{__tests__ → categories/kepler/__tests__}/solve-kepler-high-eccentricity.spec.d.ts +0 -0
- /package/dist/{__tests__ → categories/kepler/__tests__}/solve-kepler-newton-raphson.spec.d.ts +0 -0
- /package/dist/{__tests__ → categories/kepler/__tests__}/solve-kepler.int.spec.d.ts +0 -0
- /package/dist/{__tests__ → categories/manoeuvres/__tests__}/combine-burns-delta-v.spec.d.ts +0 -0
- /package/dist/{__tests__ → categories/manoeuvres/__tests__}/gravity-assist-turning-angle.spec.d.ts +0 -0
- /package/dist/{__tests__ → categories/manoeuvres/__tests__}/hohmann-transfer.spec.d.ts +0 -0
- /package/dist/{__tests__ → categories/manoeuvres/__tests__}/oberth-energy-gain.spec.d.ts +0 -0
- /package/dist/{__tests__ → categories/manoeuvres/__tests__}/plane-change-delta-v.spec.d.ts +0 -0
- /package/dist/{__tests__ → categories/orbits/__tests__}/characteristic-energy-c3.spec.d.ts +0 -0
- /package/dist/{__tests__ → categories/orbits/__tests__}/circular-speed.spec.d.ts +0 -0
- /package/dist/{__tests__ → categories/orbits/__tests__}/cw-hill-derivatives.spec.d.ts +0 -0
- /package/dist/{__tests__ → categories/orbits/__tests__}/escape-speed.spec.d.ts +0 -0
- /package/dist/{__tests__ → categories/orbits/__tests__}/flight-path-angle-from-true-anomaly.spec.d.ts +0 -0
- /package/dist/{__tests__ → categories/orbits/__tests__}/hyperbolic-periapsis-speed.spec.d.ts +0 -0
- /package/dist/{__tests__ → categories/orbits/__tests__}/kepler-period.spec.d.ts +0 -0
- /package/dist/{__tests__ → categories/orbits/__tests__}/mean-motion.spec.d.ts +0 -0
- /package/dist/{__tests__ → categories/orbits/__tests__}/peri-apoapsis-radii.spec.d.ts +0 -0
- /package/dist/{__tests__ → categories/orbits/__tests__}/specific-angular-momentum-from-elements.spec.d.ts +0 -0
- /package/dist/{__tests__ → categories/orbits/__tests__}/specific-angular-momentum.spec.d.ts +0 -0
- /package/dist/{__tests__ → categories/orbits/__tests__}/specific-mechanical-energy.spec.d.ts +0 -0
- /package/dist/{__tests__ → categories/orbits/__tests__}/sphere-of-influence-radius.spec.d.ts +0 -0
- /package/dist/{__tests__ → categories/orbits/__tests__}/vis-viva-speed.spec.d.ts +0 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import test, { describe } from 'node:test';
|
|
3
|
+
import { matRelClose } from 'packages/equations/src/__tests__/helpers';
|
|
4
|
+
import { matMul3 } from '../mat-mul3';
|
|
5
|
+
const I3 = [
|
|
6
|
+
[1, 0, 0],
|
|
7
|
+
[0, 1, 0],
|
|
8
|
+
[0, 0, 1]
|
|
9
|
+
];
|
|
10
|
+
describe('matMul3', () => {
|
|
11
|
+
test('identity is neutral: I*A = A and A*I = A', () => {
|
|
12
|
+
const A = [
|
|
13
|
+
[2, 3, 5],
|
|
14
|
+
[7, 11, 13],
|
|
15
|
+
[17, 19, 23]
|
|
16
|
+
];
|
|
17
|
+
matRelClose(matMul3(I3, A), A);
|
|
18
|
+
matRelClose(matMul3(A, I3), A);
|
|
19
|
+
});
|
|
20
|
+
test('matches a known product (example matrices)', () => {
|
|
21
|
+
const A = [
|
|
22
|
+
[1, 2, 3],
|
|
23
|
+
[0, 1, 4],
|
|
24
|
+
[5, 6, 0]
|
|
25
|
+
];
|
|
26
|
+
const B = [
|
|
27
|
+
[-2, 1, 0],
|
|
28
|
+
[3, 0, 0],
|
|
29
|
+
[4, 5, 1]
|
|
30
|
+
];
|
|
31
|
+
const C = matMul3(A, B);
|
|
32
|
+
// Computed by hand / verified:
|
|
33
|
+
const expected = [
|
|
34
|
+
[16, 16, 3],
|
|
35
|
+
[19, 20, 4],
|
|
36
|
+
[8, 5, 0]
|
|
37
|
+
];
|
|
38
|
+
assert.deepEqual(C, expected);
|
|
39
|
+
});
|
|
40
|
+
test('is associative: (A*B)*C = A*(B*C)', () => {
|
|
41
|
+
const A = [
|
|
42
|
+
[1.5, -2, 0.25],
|
|
43
|
+
[0, 3, 4],
|
|
44
|
+
[-1, 0.5, 2]
|
|
45
|
+
];
|
|
46
|
+
const B = [
|
|
47
|
+
[2, 0, 1],
|
|
48
|
+
[-1, 3, 0],
|
|
49
|
+
[4, -2, 0.5]
|
|
50
|
+
];
|
|
51
|
+
const C = [
|
|
52
|
+
[0.1, 0.2, 0.3],
|
|
53
|
+
[0.4, 0.5, 0.6],
|
|
54
|
+
[0.7, 0.8, 0.9]
|
|
55
|
+
];
|
|
56
|
+
const left = matMul3(matMul3(A, B), C);
|
|
57
|
+
const right = matMul3(A, matMul3(B, C));
|
|
58
|
+
matRelClose(left, right, 1e-12);
|
|
59
|
+
});
|
|
60
|
+
test('distributes over addition: A*(B+C) = A*B + A*C', () => {
|
|
61
|
+
const A = [
|
|
62
|
+
[1, 2, 3],
|
|
63
|
+
[4, 5, 6],
|
|
64
|
+
[7, 8, 9]
|
|
65
|
+
];
|
|
66
|
+
const B = [
|
|
67
|
+
[9, 8, 7],
|
|
68
|
+
[6, 5, 4],
|
|
69
|
+
[3, 2, 1]
|
|
70
|
+
];
|
|
71
|
+
const C = [
|
|
72
|
+
[1, 0, 1],
|
|
73
|
+
[0, 1, 0],
|
|
74
|
+
[2, 0, 2]
|
|
75
|
+
];
|
|
76
|
+
const add = (X, Y) => [
|
|
77
|
+
[X[0][0] + Y[0][0], X[0][1] + Y[0][1], X[0][2] + Y[0][2]],
|
|
78
|
+
[X[1][0] + Y[1][0], X[1][1] + Y[1][1], X[1][2] + Y[1][2]],
|
|
79
|
+
[X[2][0] + Y[2][0], X[2][1] + Y[2][1], X[2][2] + Y[2][2]]
|
|
80
|
+
];
|
|
81
|
+
const left = matMul3(A, add(B, C));
|
|
82
|
+
const right = add(matMul3(A, B), matMul3(A, C));
|
|
83
|
+
matRelClose(left, right, 1e-12);
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
//# sourceMappingURL=mat-mul3.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mat-mul3.spec.js","sourceRoot":"","sources":["../../../../src/categories/helpers/__tests__/mat-mul3.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"misc.spec.d.ts","sourceRoot":"","sources":["../../../../src/categories/helpers/__tests__/misc.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import test, { describe } from 'node:test';
|
|
3
|
+
import { absClose, relClose } from 'packages/equations/src/__tests__/helpers';
|
|
4
|
+
import { dot, norm, norm2pi, residual, scale, sub } from '../misc';
|
|
5
|
+
import { TWO_PI } from '@interstellar-tools/constants';
|
|
6
|
+
describe('misc', () => {
|
|
7
|
+
/* ----------------------------- vector helpers ----------------------------- */
|
|
8
|
+
test('norm computes Euclidean length (matches 3-4-12 triangle)', () => {
|
|
9
|
+
const v = [3, 4, 12];
|
|
10
|
+
assert.equal(norm(v), 13);
|
|
11
|
+
});
|
|
12
|
+
test('norm is homogeneous: norm(k*v) = |k| * norm(v)', () => {
|
|
13
|
+
const v = [1.2, -3.4, 5.6];
|
|
14
|
+
const k = -7.5;
|
|
15
|
+
const kv = scale(v, k);
|
|
16
|
+
relClose(norm(kv), Math.abs(k) * norm(v));
|
|
17
|
+
});
|
|
18
|
+
test('scale multiplies each component by s', () => {
|
|
19
|
+
const v = [1, -2, 3];
|
|
20
|
+
assert.deepEqual(scale(v, 10), [10, -20, 30]);
|
|
21
|
+
});
|
|
22
|
+
test('sub computes a - b component-wise', () => {
|
|
23
|
+
const a = [3, 2, 1];
|
|
24
|
+
const b = [1, 1, 1];
|
|
25
|
+
assert.deepEqual(sub(a, b), [2, 1, 0]);
|
|
26
|
+
});
|
|
27
|
+
test('dot matches known value', () => {
|
|
28
|
+
assert.equal(dot([1, 2, 3], [4, 5, 6]), 32);
|
|
29
|
+
});
|
|
30
|
+
test('dot is symmetric: a·b = b·a', () => {
|
|
31
|
+
const a = [1.2, -3.4, 5.6];
|
|
32
|
+
const b = [-7.8, 9.1, -2.3];
|
|
33
|
+
relClose(dot(a, b), dot(b, a));
|
|
34
|
+
});
|
|
35
|
+
test('dot relates to norm: dot(v,v) = norm(v)^2', () => {
|
|
36
|
+
const v = [1.2, -3.4, 5.6];
|
|
37
|
+
relClose(dot(v, v), Math.pow(norm(v), 2));
|
|
38
|
+
});
|
|
39
|
+
/* ----------------------------- angle helpers ----------------------------- */
|
|
40
|
+
test('norm2pi returns values in [0, 2π)', () => {
|
|
41
|
+
const samples = [
|
|
42
|
+
-10 * TWO_PI - 0.1,
|
|
43
|
+
-TWO_PI,
|
|
44
|
+
-Math.PI,
|
|
45
|
+
-0.1,
|
|
46
|
+
0,
|
|
47
|
+
0.1,
|
|
48
|
+
Math.PI,
|
|
49
|
+
TWO_PI,
|
|
50
|
+
10 * TWO_PI + 0.1
|
|
51
|
+
];
|
|
52
|
+
for (const x of samples) {
|
|
53
|
+
const y = norm2pi(x);
|
|
54
|
+
assert.ok(y >= 0, `expected >= 0, got ${y} for x=${x}`);
|
|
55
|
+
assert.ok(y < TWO_PI, `expected < 2π, got ${y} for x=${x}`);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
test('norm2pi is periodic: norm2pi(x + 2πk) = norm2pi(x)', () => {
|
|
59
|
+
const x = 1.2345;
|
|
60
|
+
const k = 7;
|
|
61
|
+
const y1 = norm2pi(x);
|
|
62
|
+
const y2 = norm2pi(x + k * TWO_PI);
|
|
63
|
+
relClose(y2, y1);
|
|
64
|
+
});
|
|
65
|
+
test('norm2pi maps -π/2 to 3π/2', () => {
|
|
66
|
+
relClose(norm2pi(-Math.PI / 2), (3 * Math.PI) / 2);
|
|
67
|
+
});
|
|
68
|
+
/* ----------------------------- kepler residual ---------------------------- */
|
|
69
|
+
test('residual matches definition: E - e*sin(E) - norm2pi(M)', () => {
|
|
70
|
+
const E = 1.0;
|
|
71
|
+
const e = 0.1;
|
|
72
|
+
const M = 0.9;
|
|
73
|
+
const r = residual(E, e, M);
|
|
74
|
+
const expected = E - e * Math.sin(E) - norm2pi(M);
|
|
75
|
+
relClose(r, expected);
|
|
76
|
+
});
|
|
77
|
+
test('residual(E,e,M) is invariant under adding 2π to M (because M is wrapped)', () => {
|
|
78
|
+
const E = 2.0;
|
|
79
|
+
const e = 0.3;
|
|
80
|
+
const M = 1.5;
|
|
81
|
+
const r1 = residual(E, e, M);
|
|
82
|
+
const r2 = residual(E, e, M + TWO_PI);
|
|
83
|
+
absClose(r1, r2, 1e-12);
|
|
84
|
+
});
|
|
85
|
+
test('when e = 0, residual reduces to E - norm2pi(M)', () => {
|
|
86
|
+
const E = 1.234;
|
|
87
|
+
const e = 0;
|
|
88
|
+
const M = -0.5;
|
|
89
|
+
const r = residual(E, e, M);
|
|
90
|
+
relClose(r, E - norm2pi(M));
|
|
91
|
+
});
|
|
92
|
+
test("for an exact solution of Kepler's equation, residual is ~0", () => {
|
|
93
|
+
// Choose E and e, then define M = E - e*sin(E) (within [0,2π)).
|
|
94
|
+
const E = 1.7;
|
|
95
|
+
const e = 0.2;
|
|
96
|
+
const M = norm2pi(E - e * Math.sin(E));
|
|
97
|
+
const r = residual(E, e, M);
|
|
98
|
+
absClose(r, 0, 1e-12);
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
//# sourceMappingURL=misc.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"misc.spec.js","sourceRoot":"","sources":["../../../../src/categories/helpers/__tests__/misc.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"radians.spec.d.ts","sourceRoot":"","sources":["../../../../src/categories/helpers/__tests__/radians.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import test, { describe } from 'node:test';
|
|
3
|
+
import { absClose, relClose } from 'packages/equations/src/__tests__/helpers';
|
|
4
|
+
import { rad, toRad } from '../radians';
|
|
5
|
+
describe('radians', () => {
|
|
6
|
+
/* ---------------------------------- toRad --------------------------------- */
|
|
7
|
+
test('toRad converts 180° to π', () => {
|
|
8
|
+
const x = toRad(180);
|
|
9
|
+
absClose(x, Math.PI, 1e-12);
|
|
10
|
+
});
|
|
11
|
+
test('toRad converts 90° to π/2', () => {
|
|
12
|
+
const x = toRad(90);
|
|
13
|
+
absClose(x, Math.PI / 2, 1e-12);
|
|
14
|
+
});
|
|
15
|
+
test('toRad converts -90° to -π/2', () => {
|
|
16
|
+
const x = toRad(-90);
|
|
17
|
+
absClose(x, -Math.PI / 2, 1e-12);
|
|
18
|
+
});
|
|
19
|
+
test('toRad is linear: toRad(a + b) = toRad(a) + toRad(b)', () => {
|
|
20
|
+
const a = 12.34;
|
|
21
|
+
const b = -56.78;
|
|
22
|
+
const left = toRad(a + b);
|
|
23
|
+
const right = (toRad(a) + toRad(b));
|
|
24
|
+
relClose(left, right);
|
|
25
|
+
});
|
|
26
|
+
/* ----------------------------------- rad ---------------------------------- */
|
|
27
|
+
test('rad is an identity at runtime (returns the same numeric value)', () => {
|
|
28
|
+
const x = 1.2345;
|
|
29
|
+
const y = rad(x);
|
|
30
|
+
assert.equal(y, x);
|
|
31
|
+
});
|
|
32
|
+
test('rad works with Math constants (π branded as Radians)', () => {
|
|
33
|
+
const x = rad(Math.PI);
|
|
34
|
+
absClose(x, Math.PI, 0);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
//# sourceMappingURL=radians.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"radians.spec.js","sourceRoot":"","sources":["../../../../src/categories/helpers/__tests__/radians.spec.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,0CAA0C,CAAC;AAC9E,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAGxC,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACvB,gFAAgF;IAEhF,IAAI,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACrB,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;QACpB,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QACrB,QAAQ,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC/D,MAAM,CAAC,GAAG,KAAK,CAAC;QAChB,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;QAEjB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1B,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAW,CAAC;QAE9C,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,gFAAgF;IAEhF,IAAI,CAAC,gEAAgE,EAAE,GAAG,EAAE;QAC1E,MAAM,CAAC,GAAG,MAAM,CAAC;QACjB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QAEjB,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAChE,MAAM,CAAC,GAAY,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rot-1.spec.d.ts","sourceRoot":"","sources":["../../../../src/categories/helpers/__tests__/rot-1.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import test, { describe } from 'node:test';
|
|
3
|
+
import { rot1 } from '../rot-1';
|
|
4
|
+
import { absClose, matRelClose } from 'packages/equations/src/__tests__/helpers';
|
|
5
|
+
import { applyMatrix3 } from '../apply-matrix-3';
|
|
6
|
+
import { matMul3 } from '../mat-mul3';
|
|
7
|
+
import { transpose3 } from '../transpose-3';
|
|
8
|
+
import { det3 } from '../det-3';
|
|
9
|
+
const I3 = [
|
|
10
|
+
[1, 0, 0],
|
|
11
|
+
[0, 1, 0],
|
|
12
|
+
[0, 0, 1]
|
|
13
|
+
];
|
|
14
|
+
describe('rot1', () => {
|
|
15
|
+
test('returns identity at theta = 0', () => {
|
|
16
|
+
const R = rot1(0);
|
|
17
|
+
matRelClose(R, I3, 1e-12);
|
|
18
|
+
});
|
|
19
|
+
test('rotates Y to +Z by +90° about +X (right-handed active rotation)', () => {
|
|
20
|
+
const R = rot1((Math.PI / 2));
|
|
21
|
+
const yAxis = [0, 1, 0];
|
|
22
|
+
const out = applyMatrix3(R, yAxis);
|
|
23
|
+
// Expect [0, 0, 1]
|
|
24
|
+
absClose(out[0], 0, 1e-12);
|
|
25
|
+
absClose(out[1], 0, 1e-12);
|
|
26
|
+
absClose(out[2], 1, 1e-12);
|
|
27
|
+
});
|
|
28
|
+
test('rotates Z to -Y by +90° about +X', () => {
|
|
29
|
+
const R = rot1((Math.PI / 2));
|
|
30
|
+
const zAxis = [0, 0, 1];
|
|
31
|
+
const out = applyMatrix3(R, zAxis);
|
|
32
|
+
// Expect [0, -1, 0]
|
|
33
|
+
absClose(out[0], 0, 1e-12);
|
|
34
|
+
absClose(out[1], -1, 1e-12);
|
|
35
|
+
absClose(out[2], 0, 1e-12);
|
|
36
|
+
});
|
|
37
|
+
test('is orthonormal: RᵀR ≈ I', () => {
|
|
38
|
+
const R = rot1(1.234);
|
|
39
|
+
const RtR = matMul3(transpose3(R), R);
|
|
40
|
+
matRelClose(RtR, I3, 1e-12);
|
|
41
|
+
});
|
|
42
|
+
test('has determinant +1 (proper rotation)', () => {
|
|
43
|
+
const R = rot1(0.789);
|
|
44
|
+
absClose(det3(R), 1, 1e-12, `det(R) expected ~1`);
|
|
45
|
+
});
|
|
46
|
+
test('inverse equals rotation by -theta: R(theta) * R(-theta) ≈ I', () => {
|
|
47
|
+
const theta = 0.456;
|
|
48
|
+
const R = rot1(theta);
|
|
49
|
+
const Rinv = rot1(-0.456);
|
|
50
|
+
matRelClose(matMul3(R, Rinv), I3, 1e-12);
|
|
51
|
+
});
|
|
52
|
+
test('throws TypeError when theta is not finite', () => {
|
|
53
|
+
assert.throws(() => rot1(Number.NaN), (err) => err instanceof TypeError &&
|
|
54
|
+
err.message === 'theta must be finite. Received: NaN');
|
|
55
|
+
assert.throws(() => rot1(Number.POSITIVE_INFINITY), (err) => err instanceof TypeError &&
|
|
56
|
+
err.message === 'theta must be finite. Received: Infinity');
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
//# sourceMappingURL=rot-1.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rot-1.spec.js","sourceRoot":"","sources":["../../../../src/categories/helpers/__tests__/rot-1.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rot-3.spec.d.ts","sourceRoot":"","sources":["../../../../src/categories/helpers/__tests__/rot-3.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import test, { describe } from 'node:test';
|
|
3
|
+
import { rot3 } from '../rot-3';
|
|
4
|
+
import { absClose, matRelClose, relClose } from 'packages/equations/src/__tests__/helpers';
|
|
5
|
+
import { applyMatrix3 } from '../apply-matrix-3';
|
|
6
|
+
import { matMul3 } from '../mat-mul3';
|
|
7
|
+
import { det3 } from '../det-3';
|
|
8
|
+
import { transpose3 } from '../transpose-3';
|
|
9
|
+
const I3 = [
|
|
10
|
+
[1, 0, 0],
|
|
11
|
+
[0, 1, 0],
|
|
12
|
+
[0, 0, 1]
|
|
13
|
+
];
|
|
14
|
+
describe('rot3', () => {
|
|
15
|
+
test('returns identity at theta = 0', () => {
|
|
16
|
+
const R = rot3(0);
|
|
17
|
+
matRelClose(R, I3, 1e-12);
|
|
18
|
+
});
|
|
19
|
+
test('rotates +X to +Y by +90° about +Z (right-handed active rotation)', () => {
|
|
20
|
+
const R = rot3((Math.PI / 2));
|
|
21
|
+
const xAxis = [1, 0, 0];
|
|
22
|
+
const out = applyMatrix3(R, xAxis);
|
|
23
|
+
// Expect [0, 1, 0]
|
|
24
|
+
absClose(out[0], 0, 1e-12);
|
|
25
|
+
absClose(out[1], 1, 1e-12);
|
|
26
|
+
absClose(out[2], 0, 1e-12);
|
|
27
|
+
});
|
|
28
|
+
test('rotates +Y to -X by +90° about +Z', () => {
|
|
29
|
+
const R = rot3((Math.PI / 2));
|
|
30
|
+
const yAxis = [0, 1, 0];
|
|
31
|
+
const out = applyMatrix3(R, yAxis);
|
|
32
|
+
// Expect [-1, 0, 0]
|
|
33
|
+
absClose(out[0], -1, 1e-12);
|
|
34
|
+
absClose(out[1], 0, 1e-12);
|
|
35
|
+
absClose(out[2], 0, 1e-12);
|
|
36
|
+
});
|
|
37
|
+
test('leaves Z component unchanged (rotation about Z)', () => {
|
|
38
|
+
const R = rot3(1.234);
|
|
39
|
+
const v = [1, 2, 3];
|
|
40
|
+
const out = applyMatrix3(R, v);
|
|
41
|
+
relClose(out[2], v[2]); // z unchanged
|
|
42
|
+
});
|
|
43
|
+
test('is orthonormal: RᵀR ≈ I', () => {
|
|
44
|
+
const R = rot3(2.345);
|
|
45
|
+
const RtR = matMul3(transpose3(R), R);
|
|
46
|
+
matRelClose(RtR, I3, 1e-12);
|
|
47
|
+
});
|
|
48
|
+
test('has determinant +1 (proper rotation)', () => {
|
|
49
|
+
const R = rot3(0.789);
|
|
50
|
+
absClose(det3(R), 1, 1e-12, `det(R) expected ~1`);
|
|
51
|
+
});
|
|
52
|
+
test('inverse equals rotation by -theta: R(theta) * R(-theta) ≈ I', () => {
|
|
53
|
+
const theta = 0.456;
|
|
54
|
+
const R = rot3(theta);
|
|
55
|
+
const Rinv = rot3(-0.456);
|
|
56
|
+
matRelClose(matMul3(R, Rinv), I3, 1e-12);
|
|
57
|
+
});
|
|
58
|
+
test('throws TypeError when theta is not finite', () => {
|
|
59
|
+
assert.throws(() => rot3(Number.NaN), (err) => err instanceof TypeError &&
|
|
60
|
+
err.message === 'theta must be finite. Received: NaN');
|
|
61
|
+
assert.throws(() => rot3(Number.POSITIVE_INFINITY), (err) => err instanceof TypeError &&
|
|
62
|
+
err.message === 'theta must be finite. Received: Infinity');
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
//# sourceMappingURL=rot-3.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rot-3.spec.js","sourceRoot":"","sources":["../../../../src/categories/helpers/__tests__/rot-3.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { Matrix3x3Type, Vector3DTupleType } from '@interstellar-tools/types';
|
|
2
|
+
/**
|
|
3
|
+
* Apply a **3×3 matrix** to a **3D vector** (matrix–vector multiplication).
|
|
4
|
+
*
|
|
5
|
+
* Computes:
|
|
6
|
+
* $$
|
|
7
|
+
* \mathbf{y} = \mathbf{M}\,\mathbf{v}
|
|
8
|
+
* $$
|
|
9
|
+
*
|
|
10
|
+
* With row-major indexing:
|
|
11
|
+
* - `M[row][col]`
|
|
12
|
+
* - `v = [x, y, z]`
|
|
13
|
+
*
|
|
14
|
+
* This is commonly used for:
|
|
15
|
+
* - Applying a **direction cosine matrix (DCM)** / rotation matrix to transform vectors
|
|
16
|
+
* between frames (e.g., inertial → body-fixed).
|
|
17
|
+
* - Small 3D linear transforms in geometry and mapping pipelines.
|
|
18
|
+
*
|
|
19
|
+
* @param M - 3×3 matrix (row-major) (all finite).
|
|
20
|
+
* @param v - 3D vector `[x, y, z]` (all finite).
|
|
21
|
+
* @returns The transformed vector `M * v` as a 3D tuple.
|
|
22
|
+
* @group Helpers
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```ts
|
|
26
|
+
* const M: Matrix3x3Type = [
|
|
27
|
+
* [1, 0, 0],
|
|
28
|
+
* [0, 0, -1],
|
|
29
|
+
* [0, 1, 0]
|
|
30
|
+
* ];
|
|
31
|
+
*
|
|
32
|
+
* const v: Vector3DTupleType = [1, 2, 3];
|
|
33
|
+
* const out = applyMatrix3(M, v);
|
|
34
|
+
* // out === [1, -3, 2]
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export declare const applyMatrix3: (M: Matrix3x3Type, v: Vector3DTupleType) => Vector3DTupleType;
|
|
38
|
+
//# sourceMappingURL=apply-matrix-3.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply-matrix-3.d.ts","sourceRoot":"","sources":["../../../src/categories/helpers/apply-matrix-3.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE7E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,eAAO,MAAM,YAAY,GACvB,GAAG,aAAa,EAChB,GAAG,iBAAiB,KACnB,iBAQF,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Apply a **3×3 matrix** to a **3D vector** (matrix–vector multiplication).
|
|
3
|
+
*
|
|
4
|
+
* Computes:
|
|
5
|
+
* $$
|
|
6
|
+
* \mathbf{y} = \mathbf{M}\,\mathbf{v}
|
|
7
|
+
* $$
|
|
8
|
+
*
|
|
9
|
+
* With row-major indexing:
|
|
10
|
+
* - `M[row][col]`
|
|
11
|
+
* - `v = [x, y, z]`
|
|
12
|
+
*
|
|
13
|
+
* This is commonly used for:
|
|
14
|
+
* - Applying a **direction cosine matrix (DCM)** / rotation matrix to transform vectors
|
|
15
|
+
* between frames (e.g., inertial → body-fixed).
|
|
16
|
+
* - Small 3D linear transforms in geometry and mapping pipelines.
|
|
17
|
+
*
|
|
18
|
+
* @param M - 3×3 matrix (row-major) (all finite).
|
|
19
|
+
* @param v - 3D vector `[x, y, z]` (all finite).
|
|
20
|
+
* @returns The transformed vector `M * v` as a 3D tuple.
|
|
21
|
+
* @group Helpers
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```ts
|
|
25
|
+
* const M: Matrix3x3Type = [
|
|
26
|
+
* [1, 0, 0],
|
|
27
|
+
* [0, 0, -1],
|
|
28
|
+
* [0, 1, 0]
|
|
29
|
+
* ];
|
|
30
|
+
*
|
|
31
|
+
* const v: Vector3DTupleType = [1, 2, 3];
|
|
32
|
+
* const out = applyMatrix3(M, v);
|
|
33
|
+
* // out === [1, -3, 2]
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export const applyMatrix3 = (M, v) => {
|
|
37
|
+
const [x, y, z] = v;
|
|
38
|
+
return [
|
|
39
|
+
M[0][0] * x + M[0][1] * y + M[0][2] * z,
|
|
40
|
+
M[1][0] * x + M[1][1] * y + M[1][2] * z,
|
|
41
|
+
M[2][0] * x + M[2][1] * y + M[2][2] * z
|
|
42
|
+
];
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=apply-matrix-3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply-matrix-3.js","sourceRoot":"","sources":["../../../src/categories/helpers/apply-matrix-3.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,CAAgB,EAChB,CAAoB,EACD,EAAE;IACrB,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IAEpB,OAAO;QACL,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACvC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACvC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;KAC/B,CAAC;AACb,CAAC,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { Matrix3x3Type } from '@interstellar-tools/types';
|
|
2
|
+
/**
|
|
3
|
+
* Compute the **determinant** of a **3×3** matrix (row-major).
|
|
4
|
+
*
|
|
5
|
+
* For:
|
|
6
|
+
* $$
|
|
7
|
+
* \mathbf{A}=
|
|
8
|
+
* \begin{bmatrix}
|
|
9
|
+
* a & b & c \\
|
|
10
|
+
* d & e & f \\
|
|
11
|
+
* g & h & i
|
|
12
|
+
* \end{bmatrix}
|
|
13
|
+
* $$
|
|
14
|
+
*
|
|
15
|
+
* This returns:
|
|
16
|
+
* $$
|
|
17
|
+
* \det(\mathbf{A}) = a(ei - fh) - b(di - fg) + c(dh - eg)
|
|
18
|
+
* $$
|
|
19
|
+
*
|
|
20
|
+
* Notes:
|
|
21
|
+
* - Matrices are treated as **row-major**: `A[row][col]`.
|
|
22
|
+
* - For a proper rotation matrix / DCM, `det(A) ≈ +1`.
|
|
23
|
+
* - A determinant of `0` indicates the matrix is singular (non-invertible).
|
|
24
|
+
*
|
|
25
|
+
* @param A - 3×3 matrix (row-major).
|
|
26
|
+
* @returns Determinant `det(A)`.
|
|
27
|
+
* @group Helpers
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```ts
|
|
31
|
+
* const I: Matrix3x3Type = [
|
|
32
|
+
* [1, 0, 0],
|
|
33
|
+
* [0, 1, 0],
|
|
34
|
+
* [0, 0, 1]
|
|
35
|
+
* ];
|
|
36
|
+
*
|
|
37
|
+
* det3(I); // 1
|
|
38
|
+
* ```
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```ts
|
|
42
|
+
* const A: Matrix3x3Type = [
|
|
43
|
+
* [1, 2, 3],
|
|
44
|
+
* [0, 1, 4],
|
|
45
|
+
* [5, 6, 0]
|
|
46
|
+
* ];
|
|
47
|
+
*
|
|
48
|
+
* det3(A); // 1
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export declare const det3: (A: Matrix3x3Type) => number;
|
|
52
|
+
//# sourceMappingURL=det-3.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"det-3.d.ts","sourceRoot":"","sources":["../../../src/categories/helpers/det-3.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AACH,eAAO,MAAM,IAAI,GAAI,GAAG,aAAa,KAAG,MAYvC,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compute the **determinant** of a **3×3** matrix (row-major).
|
|
3
|
+
*
|
|
4
|
+
* For:
|
|
5
|
+
* $$
|
|
6
|
+
* \mathbf{A}=
|
|
7
|
+
* \begin{bmatrix}
|
|
8
|
+
* a & b & c \\
|
|
9
|
+
* d & e & f \\
|
|
10
|
+
* g & h & i
|
|
11
|
+
* \end{bmatrix}
|
|
12
|
+
* $$
|
|
13
|
+
*
|
|
14
|
+
* This returns:
|
|
15
|
+
* $$
|
|
16
|
+
* \det(\mathbf{A}) = a(ei - fh) - b(di - fg) + c(dh - eg)
|
|
17
|
+
* $$
|
|
18
|
+
*
|
|
19
|
+
* Notes:
|
|
20
|
+
* - Matrices are treated as **row-major**: `A[row][col]`.
|
|
21
|
+
* - For a proper rotation matrix / DCM, `det(A) ≈ +1`.
|
|
22
|
+
* - A determinant of `0` indicates the matrix is singular (non-invertible).
|
|
23
|
+
*
|
|
24
|
+
* @param A - 3×3 matrix (row-major).
|
|
25
|
+
* @returns Determinant `det(A)`.
|
|
26
|
+
* @group Helpers
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```ts
|
|
30
|
+
* const I: Matrix3x3Type = [
|
|
31
|
+
* [1, 0, 0],
|
|
32
|
+
* [0, 1, 0],
|
|
33
|
+
* [0, 0, 1]
|
|
34
|
+
* ];
|
|
35
|
+
*
|
|
36
|
+
* det3(I); // 1
|
|
37
|
+
* ```
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```ts
|
|
41
|
+
* const A: Matrix3x3Type = [
|
|
42
|
+
* [1, 2, 3],
|
|
43
|
+
* [0, 1, 4],
|
|
44
|
+
* [5, 6, 0]
|
|
45
|
+
* ];
|
|
46
|
+
*
|
|
47
|
+
* det3(A); // 1
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
export const det3 = (A) => {
|
|
51
|
+
const a = A[0][0];
|
|
52
|
+
const b = A[0][1];
|
|
53
|
+
const c = A[0][2];
|
|
54
|
+
const d = A[1][0];
|
|
55
|
+
const e = A[1][1];
|
|
56
|
+
const f = A[1][2];
|
|
57
|
+
const g = A[2][0];
|
|
58
|
+
const h = A[2][1];
|
|
59
|
+
const i = A[2][2];
|
|
60
|
+
return a * (e * i - f * h) - b * (d * i - f * g) + c * (d * h - e * g);
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=det-3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"det-3.js","sourceRoot":"","sources":["../../../src/categories/helpers/det-3.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAgB,EAAU,EAAE;IAC/C,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAElB,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AACzE,CAAC,CAAC"}
|