@interstellar-tools/equations 0.1.2 → 0.3.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.
Files changed (191) hide show
  1. package/dist/__tests__/circular-speed.spec.d.ts +2 -0
  2. package/dist/__tests__/circular-speed.spec.d.ts.map +1 -0
  3. package/dist/__tests__/circular-speed.spec.js +69 -0
  4. package/dist/__tests__/circular-speed.spec.js.map +1 -0
  5. package/dist/__tests__/compute-angle.int.spec.js +2 -2
  6. package/dist/__tests__/compute-angle.int.spec.js.map +1 -1
  7. package/dist/__tests__/eccentric-to-true-anomaly.spec.js +1 -1
  8. package/dist/__tests__/eccentric-to-true-anomaly.spec.js.map +1 -1
  9. package/dist/__tests__/escape-speed.spec.d.ts +2 -0
  10. package/dist/__tests__/escape-speed.spec.d.ts.map +1 -0
  11. package/dist/__tests__/escape-speed.spec.js +79 -0
  12. package/dist/__tests__/escape-speed.spec.js.map +1 -0
  13. package/dist/__tests__/gravitational-acceleration-on1-by2.int.spec.d.ts +2 -0
  14. package/dist/__tests__/gravitational-acceleration-on1-by2.int.spec.d.ts.map +1 -0
  15. package/dist/__tests__/gravitational-acceleration-on1-by2.int.spec.js +86 -0
  16. package/dist/__tests__/gravitational-acceleration-on1-by2.int.spec.js.map +1 -0
  17. package/dist/__tests__/gravitational-force-on1-by2.int.spec.d.ts +2 -0
  18. package/dist/__tests__/gravitational-force-on1-by2.int.spec.d.ts.map +1 -0
  19. package/dist/__tests__/gravitational-force-on1-by2.int.spec.js +106 -0
  20. package/dist/__tests__/gravitational-force-on1-by2.int.spec.js.map +1 -0
  21. package/dist/__tests__/gravitational-force.spec.d.ts +2 -0
  22. package/dist/__tests__/gravitational-force.spec.d.ts.map +1 -0
  23. package/dist/__tests__/gravitational-force.spec.js +105 -0
  24. package/dist/__tests__/gravitational-force.spec.js.map +1 -0
  25. package/dist/__tests__/gravitational-parameters.spec.d.ts +2 -0
  26. package/dist/__tests__/gravitational-parameters.spec.d.ts.map +1 -0
  27. package/dist/__tests__/gravitational-parameters.spec.js +75 -0
  28. package/dist/__tests__/gravitational-parameters.spec.js.map +1 -0
  29. package/dist/__tests__/helpers/index.d.ts +9 -0
  30. package/dist/__tests__/helpers/index.d.ts.map +1 -0
  31. package/dist/__tests__/helpers/index.js +31 -0
  32. package/dist/__tests__/helpers/index.js.map +1 -0
  33. package/dist/__tests__/kepler-period.spec.d.ts +2 -0
  34. package/dist/__tests__/kepler-period.spec.d.ts.map +1 -0
  35. package/dist/__tests__/kepler-period.spec.js +72 -0
  36. package/dist/__tests__/kepler-period.spec.js.map +1 -0
  37. package/dist/__tests__/mean-to-eccentric-anomaly.spec.d.ts +2 -0
  38. package/dist/__tests__/mean-to-eccentric-anomaly.spec.d.ts.map +1 -0
  39. package/dist/__tests__/{compute-mean-anomaly.int.spec.js → mean-to-eccentric-anomaly.spec.js} +49 -27
  40. package/dist/__tests__/mean-to-eccentric-anomaly.spec.js.map +1 -0
  41. package/dist/__tests__/peri-apoapsis-radii.spec.d.ts +2 -0
  42. package/dist/__tests__/peri-apoapsis-radii.spec.d.ts.map +1 -0
  43. package/dist/__tests__/peri-apoapsis-radii.spec.js +74 -0
  44. package/dist/__tests__/peri-apoapsis-radii.spec.js.map +1 -0
  45. package/dist/__tests__/solve-kepler-bisection.spec.js +1 -1
  46. package/dist/__tests__/solve-kepler-bisection.spec.js.map +1 -1
  47. package/dist/__tests__/solve-kepler-high-eccentricity.spec.js +1 -1
  48. package/dist/__tests__/solve-kepler-high-eccentricity.spec.js.map +1 -1
  49. package/dist/__tests__/solve-kepler-newton-raphson.spec.js +1 -1
  50. package/dist/__tests__/solve-kepler-newton-raphson.spec.js.map +1 -1
  51. package/dist/__tests__/solve-kepler.int.spec.js +1 -1
  52. package/dist/__tests__/solve-kepler.int.spec.js.map +1 -1
  53. package/dist/__tests__/specific-angular-momentum-from-elements.spec.d.ts +2 -0
  54. package/dist/__tests__/specific-angular-momentum-from-elements.spec.d.ts.map +1 -0
  55. package/dist/__tests__/specific-angular-momentum-from-elements.spec.js +86 -0
  56. package/dist/__tests__/specific-angular-momentum-from-elements.spec.js.map +1 -0
  57. package/dist/__tests__/specific-angular-momentum.spec.d.ts +2 -0
  58. package/dist/__tests__/specific-angular-momentum.spec.d.ts.map +1 -0
  59. package/dist/__tests__/specific-angular-momentum.spec.js +84 -0
  60. package/dist/__tests__/specific-angular-momentum.spec.js.map +1 -0
  61. package/dist/__tests__/specific-mechanical-energy.spec.d.ts +2 -0
  62. package/dist/__tests__/specific-mechanical-energy.spec.d.ts.map +1 -0
  63. package/dist/__tests__/specific-mechanical-energy.spec.js +81 -0
  64. package/dist/__tests__/specific-mechanical-energy.spec.js.map +1 -0
  65. package/dist/__tests__/true-to-mean-anomaly.spec.d.ts +2 -0
  66. package/dist/__tests__/true-to-mean-anomaly.spec.d.ts.map +1 -0
  67. package/dist/__tests__/{true-anomaly-to-mean-anomaly.int.spec.js → true-to-mean-anomaly.spec.js} +13 -13
  68. package/dist/__tests__/true-to-mean-anomaly.spec.js.map +1 -0
  69. package/dist/__tests__/vis-viva-speed.spec.d.ts +2 -0
  70. package/dist/__tests__/vis-viva-speed.spec.d.ts.map +1 -0
  71. package/dist/__tests__/vis-viva-speed.spec.js +80 -0
  72. package/dist/__tests__/vis-viva-speed.spec.js.map +1 -0
  73. package/dist/__tests__/wrap-angle.spec.js +1 -1
  74. package/dist/__tests__/wrap-angle.spec.js.map +1 -1
  75. package/dist/{compute-angle.d.ts → categories/angle/compute-angle.d.ts} +1 -1
  76. package/dist/categories/angle/compute-angle.d.ts.map +1 -0
  77. package/dist/{compute-angle.js → categories/angle/compute-angle.js} +5 -5
  78. package/dist/categories/angle/compute-angle.js.map +1 -0
  79. package/dist/{wrap-angle.d.ts → categories/angle/wrap-angle.d.ts} +1 -1
  80. package/dist/categories/angle/wrap-angle.d.ts.map +1 -0
  81. package/dist/{wrap-angle.js → categories/angle/wrap-angle.js} +1 -1
  82. package/dist/categories/angle/wrap-angle.js.map +1 -0
  83. package/dist/{eccentric-to-true-anomaly.d.ts → categories/anomalies/eccentric-to-true-anomaly.d.ts} +2 -2
  84. package/dist/categories/anomalies/eccentric-to-true-anomaly.d.ts.map +1 -0
  85. package/dist/{eccentric-to-true-anomaly.js → categories/anomalies/eccentric-to-true-anomaly.js} +2 -2
  86. package/dist/categories/anomalies/eccentric-to-true-anomaly.js.map +1 -0
  87. package/dist/{compute-mean-anomaly.d.ts → categories/anomalies/mean-to-eccentric-anomaly.d.ts} +6 -6
  88. package/dist/categories/anomalies/mean-to-eccentric-anomaly.d.ts.map +1 -0
  89. package/dist/{compute-mean-anomaly.js → categories/anomalies/mean-to-eccentric-anomaly.js} +12 -21
  90. package/dist/categories/anomalies/mean-to-eccentric-anomaly.js.map +1 -0
  91. package/dist/{true-anomaly-to-mean-anomaly.d.ts → categories/anomalies/true-to-mean-anomaly.d.ts} +6 -6
  92. package/dist/categories/anomalies/true-to-mean-anomaly.d.ts.map +1 -0
  93. package/dist/{true-anomaly-to-mean-anomaly.js → categories/anomalies/true-to-mean-anomaly.js} +7 -7
  94. package/dist/categories/anomalies/true-to-mean-anomaly.js.map +1 -0
  95. package/dist/categories/anomalies/utils/are-equal.d.ts +10 -0
  96. package/dist/categories/anomalies/utils/are-equal.d.ts.map +1 -0
  97. package/dist/categories/anomalies/utils/are-equal.js +13 -0
  98. package/dist/categories/anomalies/utils/are-equal.js.map +1 -0
  99. package/dist/categories/gravity/acceleration-on1-by2.d.ts +66 -0
  100. package/dist/categories/gravity/acceleration-on1-by2.d.ts.map +1 -0
  101. package/dist/categories/gravity/acceleration-on1-by2.js +75 -0
  102. package/dist/categories/gravity/acceleration-on1-by2.js.map +1 -0
  103. package/dist/categories/gravity/force-on1-by2.d.ts +87 -0
  104. package/dist/categories/gravity/force-on1-by2.d.ts.map +1 -0
  105. package/dist/categories/gravity/force-on1-by2.js +96 -0
  106. package/dist/categories/gravity/force-on1-by2.js.map +1 -0
  107. package/dist/categories/gravity/gravitational-force.d.ts +94 -0
  108. package/dist/categories/gravity/gravitational-force.d.ts.map +1 -0
  109. package/dist/categories/gravity/gravitational-force.js +119 -0
  110. package/dist/categories/gravity/gravitational-force.js.map +1 -0
  111. package/dist/categories/gravity/gravitational-parameter.d.ts +49 -0
  112. package/dist/categories/gravity/gravitational-parameter.d.ts.map +1 -0
  113. package/dist/categories/gravity/gravitational-parameter.js +61 -0
  114. package/dist/categories/gravity/gravitational-parameter.js.map +1 -0
  115. package/dist/{solve-kepler-bisection.d.ts → categories/kepler/solve-kepler-bisection.d.ts} +1 -1
  116. package/dist/categories/kepler/solve-kepler-bisection.d.ts.map +1 -0
  117. package/dist/{solve-kepler-bisection.js → categories/kepler/solve-kepler-bisection.js} +1 -1
  118. package/dist/categories/kepler/solve-kepler-bisection.js.map +1 -0
  119. package/dist/{solve-kepler-high-eccentricity.d.ts → categories/kepler/solve-kepler-high-eccentricity.d.ts} +2 -8
  120. package/dist/categories/kepler/solve-kepler-high-eccentricity.d.ts.map +1 -0
  121. package/dist/{solve-kepler-high-eccentricity.js → categories/kepler/solve-kepler-high-eccentricity.js} +5 -9
  122. package/dist/categories/kepler/solve-kepler-high-eccentricity.js.map +1 -0
  123. package/dist/{solve-kepler-newton-raphson.d.ts → categories/kepler/solve-kepler-newton-raphson.d.ts} +1 -1
  124. package/dist/categories/kepler/solve-kepler-newton-raphson.d.ts.map +1 -0
  125. package/dist/{solve-kepler-newton-raphson.js → categories/kepler/solve-kepler-newton-raphson.js} +1 -1
  126. package/dist/categories/kepler/solve-kepler-newton-raphson.js.map +1 -0
  127. package/dist/{solve-kepler.d.ts → categories/kepler/solve-kepler.d.ts} +1 -1
  128. package/dist/categories/kepler/solve-kepler.d.ts.map +1 -0
  129. package/dist/{solve-kepler.js → categories/kepler/solve-kepler.js} +2 -2
  130. package/dist/categories/kepler/solve-kepler.js.map +1 -0
  131. package/dist/categories/orbits/circular-speed.d.ts +42 -0
  132. package/dist/categories/orbits/circular-speed.d.ts.map +1 -0
  133. package/dist/categories/orbits/circular-speed.js +50 -0
  134. package/dist/categories/orbits/circular-speed.js.map +1 -0
  135. package/dist/categories/orbits/escape-speed.d.ts +50 -0
  136. package/dist/categories/orbits/escape-speed.d.ts.map +1 -0
  137. package/dist/categories/orbits/escape-speed.js +58 -0
  138. package/dist/categories/orbits/escape-speed.js.map +1 -0
  139. package/dist/categories/orbits/kepler-period.d.ts +45 -0
  140. package/dist/categories/orbits/kepler-period.d.ts.map +1 -0
  141. package/dist/categories/orbits/kepler-period.js +54 -0
  142. package/dist/categories/orbits/kepler-period.js.map +1 -0
  143. package/dist/categories/orbits/peri-apoapsis-radii.d.ts +46 -0
  144. package/dist/categories/orbits/peri-apoapsis-radii.d.ts.map +1 -0
  145. package/dist/categories/orbits/peri-apoapsis-radii.js +85 -0
  146. package/dist/categories/orbits/peri-apoapsis-radii.js.map +1 -0
  147. package/dist/categories/orbits/specific-angular-momentum-from-elements.d.ts +60 -0
  148. package/dist/categories/orbits/specific-angular-momentum-from-elements.d.ts.map +1 -0
  149. package/dist/categories/orbits/specific-angular-momentum-from-elements.js +76 -0
  150. package/dist/categories/orbits/specific-angular-momentum-from-elements.js.map +1 -0
  151. package/dist/categories/orbits/specific-angular-momentum.d.ts +55 -0
  152. package/dist/categories/orbits/specific-angular-momentum.d.ts.map +1 -0
  153. package/dist/categories/orbits/specific-angular-momentum.js +76 -0
  154. package/dist/categories/orbits/specific-angular-momentum.js.map +1 -0
  155. package/dist/categories/orbits/specific-mechanical-energy.d.ts +49 -0
  156. package/dist/categories/orbits/specific-mechanical-energy.d.ts.map +1 -0
  157. package/dist/categories/orbits/specific-mechanical-energy.js +57 -0
  158. package/dist/categories/orbits/specific-mechanical-energy.js.map +1 -0
  159. package/dist/categories/orbits/vis-viva-speed.d.ts +42 -0
  160. package/dist/categories/orbits/vis-viva-speed.d.ts.map +1 -0
  161. package/dist/categories/orbits/vis-viva-speed.js +70 -0
  162. package/dist/categories/orbits/vis-viva-speed.js.map +1 -0
  163. package/dist/index.d.ts +20 -10
  164. package/dist/index.d.ts.map +1 -1
  165. package/dist/index.js +25 -10
  166. package/dist/index.js.map +1 -1
  167. package/package.json +77 -5
  168. package/dist/__tests__/compute-mean-anomaly.int.spec.d.ts +0 -2
  169. package/dist/__tests__/compute-mean-anomaly.int.spec.d.ts.map +0 -1
  170. package/dist/__tests__/compute-mean-anomaly.int.spec.js.map +0 -1
  171. package/dist/__tests__/true-anomaly-to-mean-anomaly.int.spec.d.ts +0 -2
  172. package/dist/__tests__/true-anomaly-to-mean-anomaly.int.spec.d.ts.map +0 -1
  173. package/dist/__tests__/true-anomaly-to-mean-anomaly.int.spec.js.map +0 -1
  174. package/dist/compute-angle.d.ts.map +0 -1
  175. package/dist/compute-angle.js.map +0 -1
  176. package/dist/compute-mean-anomaly.d.ts.map +0 -1
  177. package/dist/compute-mean-anomaly.js.map +0 -1
  178. package/dist/eccentric-to-true-anomaly.d.ts.map +0 -1
  179. package/dist/eccentric-to-true-anomaly.js.map +0 -1
  180. package/dist/solve-kepler-bisection.d.ts.map +0 -1
  181. package/dist/solve-kepler-bisection.js.map +0 -1
  182. package/dist/solve-kepler-high-eccentricity.d.ts.map +0 -1
  183. package/dist/solve-kepler-high-eccentricity.js.map +0 -1
  184. package/dist/solve-kepler-newton-raphson.d.ts.map +0 -1
  185. package/dist/solve-kepler-newton-raphson.js.map +0 -1
  186. package/dist/solve-kepler.d.ts.map +0 -1
  187. package/dist/solve-kepler.js.map +0 -1
  188. package/dist/true-anomaly-to-mean-anomaly.d.ts.map +0 -1
  189. package/dist/true-anomaly-to-mean-anomaly.js.map +0 -1
  190. package/dist/wrap-angle.d.ts.map +0 -1
  191. package/dist/wrap-angle.js.map +0 -1
@@ -0,0 +1,50 @@
1
+ /**
2
+ * **Escape speed** ($ v_{\text{esc}} $) - minimum speed to escape a central body's gravity from radius ($ r $) (ignoring drag/perturbations).
3
+ *
4
+ * **Definition**
5
+ *
6
+ * $$
7
+ * v_{\text{esc}}=\sqrt{\frac{2\mu}{r}}
8
+ * $$
9
+ *
10
+ * where ($ \mu $) is the standard gravitational parameter and ($ r $) is the distance
11
+ * from the central body's center.
12
+ *
13
+ * **Units**
14
+ * - Inputs: ($ r $) in **meters (m)**, ($ \mu $) in **m³/s²**.
15
+ * - Output: ($ v_{\text{esc}} $) in **m/s**.
16
+ *
17
+ * ::: info
18
+ *
19
+ * - Relationship to circular speed ($ v_c $): ($ v_{\text{esc}}=\sqrt{2}\,v_c $).
20
+ * - This corresponds to **parabolic** specific energy (($ \varepsilon = 0 $)).
21
+ * - For general (non-escape) orbital speed use `visVivaSpeed(r, a, mu)`.
22
+ *
23
+ * :::
24
+ *
25
+ * @param {number} r Radius ($ r $) (m), distance from the central body’s center (must be finite and **> 0**).
26
+ * @param {number} mu Gravitational parameter ($ \mu $) (m³/s²), must be finite and **≥ 0**.
27
+ * @returns {number} Escape speed ($ v_{\text{esc}} $) (m/s).
28
+ * @throws {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error | Error}
29
+ * If inputs are non-finite or out of domain.
30
+ *
31
+ * @example
32
+ * ```ts
33
+ * // Near Earth's surface (approx.)
34
+ * const muEarth = 3.986004418e14; // m^3/s^2
35
+ * const rSurface = 6378e3; // m
36
+ * const vEsc = escapeSpeed(rSurface, muEarth); // ≈ 11186 m/s
37
+ * ```
38
+ *
39
+ * @example
40
+ * ```ts
41
+ * // LEO ~400 km altitude: r = R_E + 400 km
42
+ * const muEarth = 3.986004418e14;
43
+ * const rLEO = 6378e3 + 400e3;
44
+ * const vEsc = escapeSpeed(rLEO, muEarth); // ≈ 10860 m/s
45
+ * ```
46
+ *
47
+ * @group Orbits
48
+ */
49
+ export declare const escapeSpeed: (r: number, mu: number) => number;
50
+ //# sourceMappingURL=escape-speed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escape-speed.d.ts","sourceRoot":"","sources":["../../../src/categories/orbits/escape-speed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,eAAO,MAAM,WAAW,GAAI,GAAG,MAAM,EAAE,IAAI,MAAM,KAAG,MAUnD,CAAC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * **Escape speed** ($ v_{\text{esc}} $) - minimum speed to escape a central body's gravity from radius ($ r $) (ignoring drag/perturbations).
3
+ *
4
+ * **Definition**
5
+ *
6
+ * $$
7
+ * v_{\text{esc}}=\sqrt{\frac{2\mu}{r}}
8
+ * $$
9
+ *
10
+ * where ($ \mu $) is the standard gravitational parameter and ($ r $) is the distance
11
+ * from the central body's center.
12
+ *
13
+ * **Units**
14
+ * - Inputs: ($ r $) in **meters (m)**, ($ \mu $) in **m³/s²**.
15
+ * - Output: ($ v_{\text{esc}} $) in **m/s**.
16
+ *
17
+ * ::: info
18
+ *
19
+ * - Relationship to circular speed ($ v_c $): ($ v_{\text{esc}}=\sqrt{2}\,v_c $).
20
+ * - This corresponds to **parabolic** specific energy (($ \varepsilon = 0 $)).
21
+ * - For general (non-escape) orbital speed use `visVivaSpeed(r, a, mu)`.
22
+ *
23
+ * :::
24
+ *
25
+ * @param {number} r Radius ($ r $) (m), distance from the central body’s center (must be finite and **> 0**).
26
+ * @param {number} mu Gravitational parameter ($ \mu $) (m³/s²), must be finite and **≥ 0**.
27
+ * @returns {number} Escape speed ($ v_{\text{esc}} $) (m/s).
28
+ * @throws {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error | Error}
29
+ * If inputs are non-finite or out of domain.
30
+ *
31
+ * @example
32
+ * ```ts
33
+ * // Near Earth's surface (approx.)
34
+ * const muEarth = 3.986004418e14; // m^3/s^2
35
+ * const rSurface = 6378e3; // m
36
+ * const vEsc = escapeSpeed(rSurface, muEarth); // ≈ 11186 m/s
37
+ * ```
38
+ *
39
+ * @example
40
+ * ```ts
41
+ * // LEO ~400 km altitude: r = R_E + 400 km
42
+ * const muEarth = 3.986004418e14;
43
+ * const rLEO = 6378e3 + 400e3;
44
+ * const vEsc = escapeSpeed(rLEO, muEarth); // ≈ 10860 m/s
45
+ * ```
46
+ *
47
+ * @group Orbits
48
+ */
49
+ export const escapeSpeed = (r, mu) => {
50
+ if (!Number.isFinite(r) || r <= 0) {
51
+ throw new Error('r must be a finite, positive number (m).');
52
+ }
53
+ if (!Number.isFinite(mu) || mu < 0) {
54
+ throw new Error('mu must be a finite, non-negative number (m^3/s^2).');
55
+ }
56
+ return Math.sqrt((2 * mu) / r);
57
+ };
58
+ //# sourceMappingURL=escape-speed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escape-speed.js","sourceRoot":"","sources":["../../../src/categories/orbits/escape-speed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAS,EAAE,EAAU,EAAU,EAAE;IAC3D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IAED,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * **Kepler's 3rd law** - orbital period ($ T $) from semi-major axis ($ a $) and gravitational parameter ($ \mu $).
3
+ *
4
+ * **Definition**
5
+ *
6
+ * $$
7
+ * T = 2\pi \sqrt{\frac{a^3}{\mu}}
8
+ * $$
9
+ *
10
+ * **Units**
11
+ * - Inputs: ($ a $) in **meters (m)**, ($ \mu $) in **m³/s²**.
12
+ * - Output: ($ T $) in **seconds (s)**.
13
+ *
14
+ * ::: info
15
+ *
16
+ * - Valid for **Keplerian (two-body) bound orbits** with ($ a>0 $) (ellipses). Not defined for parabolic/hyperbolic trajectories.
17
+ * - ($ \mu $) is the **standard gravitational parameter** of the central body (e.g., Earth ($ \approx 3.986004418\times10^{14}\ \text{m}^3/\text{s}^2 $)).
18
+ *
19
+ * :::
20
+ *
21
+ * @param {number} a Semi-major axis (m), must be finite and **> 0**.
22
+ * @param {number} mu Gravitational parameter (m³/s²), must be finite and **> 0**.
23
+ * @returns {number} Orbital period ($ T $) (s).
24
+ * @throws {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error | Error} If inputs are non-finite or out of domain.
25
+ *
26
+ * @example
27
+ * ```ts
28
+ * // GEO: a ≈ 42,164 km → T ≈ 86,164 s (one sidereal day)
29
+ * const a = 42164e3; // m
30
+ * const muEarth = 3.986004418e14; // m^3/s^2
31
+ * const T = keplerPeriod(a, muEarth); // ≈ 86164 s
32
+ * ```
33
+ *
34
+ * @example
35
+ * ```ts
36
+ * // LEO-ish circular: a ≈ Earth radius + 400 km
37
+ * const a = 6378e3 + 400e3; // m
38
+ * const muEarth = 3.986004418e14; // m^3/s^2
39
+ * const T = keplerPeriod(a, muEarth); // ≈ 5550 s (~92.5 min)
40
+ * ```
41
+ *
42
+ * @group Orbits
43
+ */
44
+ export declare const keplerPeriod: (a: number, mu: number) => number;
45
+ //# sourceMappingURL=kepler-period.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kepler-period.d.ts","sourceRoot":"","sources":["../../../src/categories/orbits/kepler-period.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,eAAO,MAAM,YAAY,GAAI,GAAG,MAAM,EAAE,IAAI,MAAM,KAAG,MAYpD,CAAC"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * **Kepler's 3rd law** - orbital period ($ T $) from semi-major axis ($ a $) and gravitational parameter ($ \mu $).
3
+ *
4
+ * **Definition**
5
+ *
6
+ * $$
7
+ * T = 2\pi \sqrt{\frac{a^3}{\mu}}
8
+ * $$
9
+ *
10
+ * **Units**
11
+ * - Inputs: ($ a $) in **meters (m)**, ($ \mu $) in **m³/s²**.
12
+ * - Output: ($ T $) in **seconds (s)**.
13
+ *
14
+ * ::: info
15
+ *
16
+ * - Valid for **Keplerian (two-body) bound orbits** with ($ a>0 $) (ellipses). Not defined for parabolic/hyperbolic trajectories.
17
+ * - ($ \mu $) is the **standard gravitational parameter** of the central body (e.g., Earth ($ \approx 3.986004418\times10^{14}\ \text{m}^3/\text{s}^2 $)).
18
+ *
19
+ * :::
20
+ *
21
+ * @param {number} a Semi-major axis (m), must be finite and **> 0**.
22
+ * @param {number} mu Gravitational parameter (m³/s²), must be finite and **> 0**.
23
+ * @returns {number} Orbital period ($ T $) (s).
24
+ * @throws {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error | Error} If inputs are non-finite or out of domain.
25
+ *
26
+ * @example
27
+ * ```ts
28
+ * // GEO: a ≈ 42,164 km → T ≈ 86,164 s (one sidereal day)
29
+ * const a = 42164e3; // m
30
+ * const muEarth = 3.986004418e14; // m^3/s^2
31
+ * const T = keplerPeriod(a, muEarth); // ≈ 86164 s
32
+ * ```
33
+ *
34
+ * @example
35
+ * ```ts
36
+ * // LEO-ish circular: a ≈ Earth radius + 400 km
37
+ * const a = 6378e3 + 400e3; // m
38
+ * const muEarth = 3.986004418e14; // m^3/s^2
39
+ * const T = keplerPeriod(a, muEarth); // ≈ 5550 s (~92.5 min)
40
+ * ```
41
+ *
42
+ * @group Orbits
43
+ */
44
+ export const keplerPeriod = (a, mu) => {
45
+ if (!Number.isFinite(a) || a <= 0) {
46
+ throw new Error('a must be a finite, positive number (meters).');
47
+ }
48
+ if (!Number.isFinite(mu) || mu <= 0) {
49
+ throw new Error('mu must be a finite, positive number (m^3/s^2).');
50
+ }
51
+ const a3 = a * a * a; // a^3
52
+ return 2 * Math.PI * Math.sqrt(a3 / mu);
53
+ };
54
+ //# sourceMappingURL=kepler-period.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kepler-period.js","sourceRoot":"","sources":["../../../src/categories/orbits/kepler-period.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAS,EAAE,EAAU,EAAU,EAAE;IAC5D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM;IAE5B,OAAO,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;AAC1C,CAAC,CAAC"}
@@ -0,0 +1,46 @@
1
+ import { PeriApoRadiiType } from '@interstellar-tools/types';
2
+ /**
3
+ * **Peri/apoapsis radii** from semi-major axis ($ a $) and eccentricity ($ e $).
4
+ *
5
+ * **Definitions**
6
+ *
7
+ * $$
8
+ * r_p = a(1-e),\qquad r_a = a(1+e)
9
+ * $$
10
+ *
11
+ * **Conic validity**
12
+ * - **Elliptic / circular**: ($ a>0,\; 0\le e<1 $) → ($ r_p>0 $) and ($ r_a>0 $).
13
+ * - **Hyperbolic**: ($ a<0,\; e>1 $) → ($ r_p = a(1-e) = |a|(e-1) > 0 $), **no apoapsis** (unbounded), so ($ r_a = null $).
14
+ * - **Parabolic**: ($ e=1 $) is **not** defined with finite ($ a $). Use the parabolic form (e.g. ($ r_p = \tfrac{p}{2} $)) or state vectors.
15
+ *
16
+ * **Units**
17
+ * - Inputs: ($ a $) in **meters (m)**, ($ e $) dimensionless.
18
+ * - Output: ($ r_p, r_a $) in **meters (m)**.
19
+ *
20
+ * @param {number} a Semi-major axis ($ a $) (m). Must be finite and **≠ 0**.
21
+ * @param {number} e Eccentricity ($ e $) (dimensionless). Must be finite and **≥ 0**.
22
+ * @returns {{ rp: number; ra: number | null }} Object with periapsis `rp` and apoapsis `ra` (or `null` if undefined for hyperbolic).
23
+ *
24
+ * @throws {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error | Error}
25
+ * If inputs are invalid or the ($ (a,e) $) pair does not correspond to an ellipse/circle or hyperbola with finite ($ a $).
26
+ *
27
+ * @example
28
+ * ```ts
29
+ * // Elliptic example (LEO-like)
30
+ * const a = 7000e3; // m
31
+ * const e = 0.01;
32
+ * const { rp, ra } = periApoapsisRadii(a, e); // rp ≈ 6930 km, ra ≈ 7070 km
33
+ * ```
34
+ *
35
+ * @example
36
+ * ```ts
37
+ * // Hyperbolic flyby (no apoapsis)
38
+ * const a = -50_000e3; // m
39
+ * const e = 1.2;
40
+ * const { rp, ra } = periApoapsisRadii(a, e); // rp = |a|(e-1) = 10,000 km, ra = null
41
+ * ```
42
+ *
43
+ * @group Orbits
44
+ */
45
+ export declare const periApoapsisRadii: (a: number, e: number) => PeriApoRadiiType;
46
+ //# sourceMappingURL=peri-apoapsis-radii.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"peri-apoapsis-radii.d.ts","sourceRoot":"","sources":["../../../src/categories/orbits/peri-apoapsis-radii.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAG7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH,eAAO,MAAM,iBAAiB,GAAI,GAAG,MAAM,EAAE,GAAG,MAAM,KAAG,gBAsDxD,CAAC"}
@@ -0,0 +1,85 @@
1
+ /* node:coverage disable */
2
+ /**
3
+ * **Peri/apoapsis radii** from semi-major axis ($ a $) and eccentricity ($ e $).
4
+ *
5
+ * **Definitions**
6
+ *
7
+ * $$
8
+ * r_p = a(1-e),\qquad r_a = a(1+e)
9
+ * $$
10
+ *
11
+ * **Conic validity**
12
+ * - **Elliptic / circular**: ($ a>0,\; 0\le e<1 $) → ($ r_p>0 $) and ($ r_a>0 $).
13
+ * - **Hyperbolic**: ($ a<0,\; e>1 $) → ($ r_p = a(1-e) = |a|(e-1) > 0 $), **no apoapsis** (unbounded), so ($ r_a = null $).
14
+ * - **Parabolic**: ($ e=1 $) is **not** defined with finite ($ a $). Use the parabolic form (e.g. ($ r_p = \tfrac{p}{2} $)) or state vectors.
15
+ *
16
+ * **Units**
17
+ * - Inputs: ($ a $) in **meters (m)**, ($ e $) dimensionless.
18
+ * - Output: ($ r_p, r_a $) in **meters (m)**.
19
+ *
20
+ * @param {number} a Semi-major axis ($ a $) (m). Must be finite and **≠ 0**.
21
+ * @param {number} e Eccentricity ($ e $) (dimensionless). Must be finite and **≥ 0**.
22
+ * @returns {{ rp: number; ra: number | null }} Object with periapsis `rp` and apoapsis `ra` (or `null` if undefined for hyperbolic).
23
+ *
24
+ * @throws {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error | Error}
25
+ * If inputs are invalid or the ($ (a,e) $) pair does not correspond to an ellipse/circle or hyperbola with finite ($ a $).
26
+ *
27
+ * @example
28
+ * ```ts
29
+ * // Elliptic example (LEO-like)
30
+ * const a = 7000e3; // m
31
+ * const e = 0.01;
32
+ * const { rp, ra } = periApoapsisRadii(a, e); // rp ≈ 6930 km, ra ≈ 7070 km
33
+ * ```
34
+ *
35
+ * @example
36
+ * ```ts
37
+ * // Hyperbolic flyby (no apoapsis)
38
+ * const a = -50_000e3; // m
39
+ * const e = 1.2;
40
+ * const { rp, ra } = periApoapsisRadii(a, e); // rp = |a|(e-1) = 10,000 km, ra = null
41
+ * ```
42
+ *
43
+ * @group Orbits
44
+ */
45
+ /* node:coverage enable */
46
+ export const periApoapsisRadii = (a, e) => {
47
+ if (!Number.isFinite(a) || a === 0) {
48
+ throw new Error('a must be finite and non-zero (meters).');
49
+ }
50
+ if (!Number.isFinite(e) || e < 0) {
51
+ throw new Error('e must be finite and ≥ 0.');
52
+ }
53
+ // Elliptic / circular
54
+ if (a > 0) {
55
+ if (e >= 1) {
56
+ if (e === 1) {
57
+ throw new Error('Parabolic (e=1) is not defined with finite a. Use parabolic relations (e.g., rp = p/2) or state vectors.');
58
+ }
59
+ throw new Error('For a>0 (elliptic/circular), eccentricity must satisfy 0 ≤ e < 1.');
60
+ }
61
+ const rp = a * (1 - e);
62
+ const ra = a * (1 + e);
63
+ // Both must be positive for a valid ellipse
64
+ if (!(rp > 0 && ra > 0)) {
65
+ throw new Error('Computed radii are non-physical for the given (a,e).');
66
+ }
67
+ return { rp, ra };
68
+ }
69
+ // Hyperbolic
70
+ // a < 0 requires e > 1 for a valid hyperbola
71
+ if (e <= 1) {
72
+ throw new Error('For a<0 (hyperbolic), eccentricity must satisfy e > 1.');
73
+ }
74
+ const rp = a * (1 - e); // = |a|(e-1) > 0
75
+ if (!(rp > 0)) {
76
+ // tiny negatives due to FP?
77
+ const tol = Math.abs(1e-14 * Math.abs(a));
78
+ if (rp > -tol) {
79
+ return { rp: 0, ra: null };
80
+ }
81
+ throw new Error('Computed periapsis radius is non-physical (≤ 0).');
82
+ }
83
+ return { rp, ra: null };
84
+ };
85
+ //# sourceMappingURL=peri-apoapsis-radii.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"peri-apoapsis-radii.js","sourceRoot":"","sources":["../../../src/categories/orbits/peri-apoapsis-radii.ts"],"names":[],"mappings":"AAEA,2BAA2B;AAC3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,0BAA0B;AAC1B,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAS,EAAE,CAAS,EAAoB,EAAE;IAC1E,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC/C,CAAC;IAED,sBAAsB;IACtB,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACV,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CACb,0GAA0G,CAC3G,CAAC;YACJ,CAAC;YAED,MAAM,IAAI,KAAK,CACb,mEAAmE,CACpE,CAAC;QACJ,CAAC;QAED,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACvB,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAEvB,4CAA4C;QAC5C,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAC1E,CAAC;QAED,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IACpB,CAAC;IAED,aAAa;IACb,6CAA6C;IAC7C,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,iBAAiB;IAEzC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;QACd,4BAA4B;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAE1C,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QAC7B,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AAC1B,CAAC,CAAC"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * **Specific angular momentum** ($ h $) from **orbital elements**.
3
+ *
4
+ * **Definition**
5
+ *
6
+ * $$
7
+ * h=\sqrt{\mu\,a\,(1-e^2)}
8
+ * $$
9
+ *
10
+ * where ($ a $) is the semi-major axis, ($ e $) the eccentricity, and ($ \mu $) the gravitational parameter.
11
+ *
12
+ * **Validity by conic**
13
+ * - **Elliptic**: ($ a>0,\; 0\le e<1 $) → ($ 1-e^2>0 $) ⇒ radicand ($ >0 $).
14
+ * - **Hyperbolic**: ($ a<0,\; e>1 $) → ($ 1-e^2<0 $) and ($ a<0 $) ⇒ product still ($ >0 $).
15
+ * - **Parabolic**: ($ e=1 $) is not represented by finite ($ a $). Use state vectors or
16
+ * ($ h=\sqrt{2\mu r_p} $) (with periapsis radius ($ r_p $)).
17
+ *
18
+ * **Units**
19
+ * - Inputs: ($ a $) in **m**, ($ e $) dimensionless, ($ \mu $) in **m³/s²**.
20
+ * - Output: ($ h $) in **m²/s**.
21
+ *
22
+ * ::: info
23
+ *
24
+ * - This returns the **magnitude** of ($ \mathbf h = \mathbf r \times \mathbf v $).
25
+ * - For numerical robustness, tiny negative radicands from FP cancellation are clamped to zero.
26
+ *
27
+ * :::
28
+ *
29
+ * @param {number} a Semi-major axis ($ a $) (m). Must be finite and **≠ 0** (elliptic ($ a>0 $), hyperbolic ($ a<0 $)).
30
+ * @param {number} e Eccentricity ($ e $) (dimensionless). Must be finite and **≥ 0**.
31
+ * @param {number} mu Gravitational parameter ($ \mu $) (m³/s²). Must be finite and **≥ 0**.
32
+ * @returns {number} Specific angular momentum ($ h $) (m²/s).
33
+ *
34
+ * @throws {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error | Error}
35
+ * If ($ a $) is non-finite or zero; if ($ e $) is non-finite or negative; if ($ \mu $) is non-finite or negative; or if
36
+ * ($ \mu\,a\,(1-e^2) < 0 $) beyond a tiny FP tolerance (invalid element set for this formula).
37
+ *
38
+ * @example
39
+ * ```ts
40
+ * // Near-circular LEO-like elements
41
+ * const muEarth = 3.986004418e14; // m^3/s^2
42
+ * const a = 6778e3; // m
43
+ * const e = 0.001;
44
+ * const h = specificAngularMomentumFromElements(a, e, muEarth); // ≈ sqrt(μ a)
45
+ * ```
46
+ *
47
+ * @example
48
+ * ```ts
49
+ * // Hyperbolic flyby example
50
+ * const muEarth = 3.986004418e14; // m^3/s^2
51
+ * const a = -50000e3; // m (negative for hyperbola)
52
+ * const e = 1.2;
53
+ * const h = specificAngularMomentumFromElements(a, e, muEarth);
54
+ * ```
55
+ *
56
+ * @see {@link specificAngularMomentum} - compute ($ h $) from state vectors ($ (\mathbf r,\mathbf v) $).
57
+ * @group Orbits
58
+ */
59
+ export declare const specificAngularMomentumFromElements: (a: number, e: number, mu: number) => number;
60
+ //# sourceMappingURL=specific-angular-momentum-from-elements.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specific-angular-momentum-from-elements.d.ts","sourceRoot":"","sources":["../../../src/categories/orbits/specific-angular-momentum-from-elements.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AACH,eAAO,MAAM,mCAAmC,GAC9C,GAAG,MAAM,EACT,GAAG,MAAM,EACT,IAAI,MAAM,KACT,MAwBF,CAAC"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * **Specific angular momentum** ($ h $) from **orbital elements**.
3
+ *
4
+ * **Definition**
5
+ *
6
+ * $$
7
+ * h=\sqrt{\mu\,a\,(1-e^2)}
8
+ * $$
9
+ *
10
+ * where ($ a $) is the semi-major axis, ($ e $) the eccentricity, and ($ \mu $) the gravitational parameter.
11
+ *
12
+ * **Validity by conic**
13
+ * - **Elliptic**: ($ a>0,\; 0\le e<1 $) → ($ 1-e^2>0 $) ⇒ radicand ($ >0 $).
14
+ * - **Hyperbolic**: ($ a<0,\; e>1 $) → ($ 1-e^2<0 $) and ($ a<0 $) ⇒ product still ($ >0 $).
15
+ * - **Parabolic**: ($ e=1 $) is not represented by finite ($ a $). Use state vectors or
16
+ * ($ h=\sqrt{2\mu r_p} $) (with periapsis radius ($ r_p $)).
17
+ *
18
+ * **Units**
19
+ * - Inputs: ($ a $) in **m**, ($ e $) dimensionless, ($ \mu $) in **m³/s²**.
20
+ * - Output: ($ h $) in **m²/s**.
21
+ *
22
+ * ::: info
23
+ *
24
+ * - This returns the **magnitude** of ($ \mathbf h = \mathbf r \times \mathbf v $).
25
+ * - For numerical robustness, tiny negative radicands from FP cancellation are clamped to zero.
26
+ *
27
+ * :::
28
+ *
29
+ * @param {number} a Semi-major axis ($ a $) (m). Must be finite and **≠ 0** (elliptic ($ a>0 $), hyperbolic ($ a<0 $)).
30
+ * @param {number} e Eccentricity ($ e $) (dimensionless). Must be finite and **≥ 0**.
31
+ * @param {number} mu Gravitational parameter ($ \mu $) (m³/s²). Must be finite and **≥ 0**.
32
+ * @returns {number} Specific angular momentum ($ h $) (m²/s).
33
+ *
34
+ * @throws {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error | Error}
35
+ * If ($ a $) is non-finite or zero; if ($ e $) is non-finite or negative; if ($ \mu $) is non-finite or negative; or if
36
+ * ($ \mu\,a\,(1-e^2) < 0 $) beyond a tiny FP tolerance (invalid element set for this formula).
37
+ *
38
+ * @example
39
+ * ```ts
40
+ * // Near-circular LEO-like elements
41
+ * const muEarth = 3.986004418e14; // m^3/s^2
42
+ * const a = 6778e3; // m
43
+ * const e = 0.001;
44
+ * const h = specificAngularMomentumFromElements(a, e, muEarth); // ≈ sqrt(μ a)
45
+ * ```
46
+ *
47
+ * @example
48
+ * ```ts
49
+ * // Hyperbolic flyby example
50
+ * const muEarth = 3.986004418e14; // m^3/s^2
51
+ * const a = -50000e3; // m (negative for hyperbola)
52
+ * const e = 1.2;
53
+ * const h = specificAngularMomentumFromElements(a, e, muEarth);
54
+ * ```
55
+ *
56
+ * @see {@link specificAngularMomentum} - compute ($ h $) from state vectors ($ (\mathbf r,\mathbf v) $).
57
+ * @group Orbits
58
+ */
59
+ export const specificAngularMomentumFromElements = (a, e, mu) => {
60
+ if (!Number.isFinite(a) || a === 0)
61
+ throw new Error('a must be finite and non-zero (meters).');
62
+ if (!Number.isFinite(e) || e < 0)
63
+ throw new Error('e must be finite and ≥ 0.');
64
+ if (!Number.isFinite(mu) || mu < 0)
65
+ throw new Error('mu must be finite and ≥ 0 (m^3/s^2).');
66
+ const radicand = mu * a * (1 - e * e);
67
+ if (radicand < 0) {
68
+ // Allow tiny negatives due to FP cancellation
69
+ const tol = Math.abs(1e-14 * mu * Math.abs(a));
70
+ if (radicand > -tol)
71
+ return 0;
72
+ throw new Error(`Invalid (a,e) for this formula: μ·a·(1-e²) < 0 (μ=${mu}, a=${a}, e=${e}).`);
73
+ }
74
+ return Math.sqrt(radicand);
75
+ };
76
+ //# sourceMappingURL=specific-angular-momentum-from-elements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specific-angular-momentum-from-elements.js","sourceRoot":"","sources":["../../../src/categories/orbits/specific-angular-momentum-from-elements.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AACH,MAAM,CAAC,MAAM,mCAAmC,GAAG,CACjD,CAAS,EACT,CAAS,EACT,EAAU,EACF,EAAE;IACV,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAE7D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAE/C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAE1D,MAAM,QAAQ,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAEtC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QACjB,8CAA8C;QAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAE/C,IAAI,QAAQ,GAAG,CAAC,GAAG;YAAE,OAAO,CAAC,CAAC;QAE9B,MAAM,IAAI,KAAK,CACb,qDAAqD,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAC5E,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC7B,CAAC,CAAC"}
@@ -0,0 +1,55 @@
1
+ import { Vector3DTupleType } from '@interstellar-tools/types';
2
+ /**
3
+ * **Specific angular momentum** ($ h $) (scalar magnitude).
4
+ *
5
+ * **Definitions**
6
+ *
7
+ * $$
8
+ * h = \lVert \mathbf r \times \mathbf v \rVert
9
+ * $$
10
+ *
11
+ * Useful identities:
12
+ *
13
+ * $$
14
+ * h = r\,v_{\perp},\qquad
15
+ * \text{(circular)}\ \ v_\perp=\sqrt{\mu/r}\Rightarrow h=\sqrt{\mu r}
16
+ * $$
17
+ *
18
+ * (For orbital elements, one also has ($ h=\sqrt{\mu\,a\,(1-e^2)} $), not used here.)
19
+ *
20
+ * **Units**
21
+ * - Inputs: ($ \mathbf r $) in **meters (m)**, ($ \mathbf v $) in **m/s**.
22
+ * - Output: ($ h $) in **m²/s**.
23
+ *
24
+ * ::: info
25
+ *
26
+ * - Returns the **magnitude** of ($ \mathbf h = \mathbf r \times \mathbf v $) (not the vector).
27
+ * - ($ h = 0 $) iff ($ \mathbf r \parallel \mathbf v $) (purely radial motion) or ($ \mathbf v=\mathbf 0 $).
28
+ * - In a two-body Keplerian model, ($ h $) is constant along the orbit.
29
+ *
30
+ * :::
31
+ *
32
+ * **Invariants (floating-point tolerance aside)**
33
+ * - ($ h \ge 0 $)
34
+ * - ($ \mathbf h \perp \mathbf r $) and ($ \mathbf h \perp \mathbf v $) (directional property; this function returns only ($ \lVert\mathbf h\rVert $)).
35
+ *
36
+ * @param {Vector3DTupleType} r Inertial position vector ($ \mathbf r=[x,y,z] $) (m).
37
+ * @param {Vector3DTupleType} v Inertial velocity vector ($ \mathbf v=[v_x,v_y,v_z] $) (m/s).
38
+ * @returns {number} Specific angular momentum ($ h $) (m²/s).
39
+ *
40
+ * @throws {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error | Error} If any component of `r`/`v` is non-finite; if `r` has zero length; or if `v` is invalid (NaN).
41
+ *
42
+ * @example
43
+ * ```ts
44
+ * // LEO-like state: r ⟂ v
45
+ * const r: [number, number, number] = [6778e3, 0, 0]; // m
46
+ * const v: [number, number, number] = [0, 7.67e3, 0]; // m/s
47
+ * const h = specificAngularMomentum(r, v); // ≈ 5.20e10 m^2/s
48
+ * ```
49
+ *
50
+ * @see {@link https://en.wikipedia.org/wiki/Specific_angular_momentum}
51
+ * @see {@link specificAngularMomentumFromElements} (if you compute from ($ a,e,\mu $))
52
+ * @group Orbits
53
+ */
54
+ export declare const specificAngularMomentum: (r: Vector3DTupleType, v: Vector3DTupleType) => number;
55
+ //# sourceMappingURL=specific-angular-momentum.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specific-angular-momentum.d.ts","sourceRoot":"","sources":["../../../src/categories/orbits/specific-angular-momentum.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAG9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AAEH,eAAO,MAAM,uBAAuB,GAClC,GAAG,iBAAiB,EACpB,GAAG,iBAAiB,KACnB,MAqBF,CAAC"}
@@ -0,0 +1,76 @@
1
+ /* node:coverage disable */
2
+ /**
3
+ * **Specific angular momentum** ($ h $) (scalar magnitude).
4
+ *
5
+ * **Definitions**
6
+ *
7
+ * $$
8
+ * h = \lVert \mathbf r \times \mathbf v \rVert
9
+ * $$
10
+ *
11
+ * Useful identities:
12
+ *
13
+ * $$
14
+ * h = r\,v_{\perp},\qquad
15
+ * \text{(circular)}\ \ v_\perp=\sqrt{\mu/r}\Rightarrow h=\sqrt{\mu r}
16
+ * $$
17
+ *
18
+ * (For orbital elements, one also has ($ h=\sqrt{\mu\,a\,(1-e^2)} $), not used here.)
19
+ *
20
+ * **Units**
21
+ * - Inputs: ($ \mathbf r $) in **meters (m)**, ($ \mathbf v $) in **m/s**.
22
+ * - Output: ($ h $) in **m²/s**.
23
+ *
24
+ * ::: info
25
+ *
26
+ * - Returns the **magnitude** of ($ \mathbf h = \mathbf r \times \mathbf v $) (not the vector).
27
+ * - ($ h = 0 $) iff ($ \mathbf r \parallel \mathbf v $) (purely radial motion) or ($ \mathbf v=\mathbf 0 $).
28
+ * - In a two-body Keplerian model, ($ h $) is constant along the orbit.
29
+ *
30
+ * :::
31
+ *
32
+ * **Invariants (floating-point tolerance aside)**
33
+ * - ($ h \ge 0 $)
34
+ * - ($ \mathbf h \perp \mathbf r $) and ($ \mathbf h \perp \mathbf v $) (directional property; this function returns only ($ \lVert\mathbf h\rVert $)).
35
+ *
36
+ * @param {Vector3DTupleType} r Inertial position vector ($ \mathbf r=[x,y,z] $) (m).
37
+ * @param {Vector3DTupleType} v Inertial velocity vector ($ \mathbf v=[v_x,v_y,v_z] $) (m/s).
38
+ * @returns {number} Specific angular momentum ($ h $) (m²/s).
39
+ *
40
+ * @throws {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error | Error} If any component of `r`/`v` is non-finite; if `r` has zero length; or if `v` is invalid (NaN).
41
+ *
42
+ * @example
43
+ * ```ts
44
+ * // LEO-like state: r ⟂ v
45
+ * const r: [number, number, number] = [6778e3, 0, 0]; // m
46
+ * const v: [number, number, number] = [0, 7.67e3, 0]; // m/s
47
+ * const h = specificAngularMomentum(r, v); // ≈ 5.20e10 m^2/s
48
+ * ```
49
+ *
50
+ * @see {@link https://en.wikipedia.org/wiki/Specific_angular_momentum}
51
+ * @see {@link specificAngularMomentumFromElements} (if you compute from ($ a,e,\mu $))
52
+ * @group Orbits
53
+ */
54
+ /* node:coverage enable */
55
+ export const specificAngularMomentum = (r, v) => {
56
+ // Validate inputs
57
+ for (const x of r)
58
+ if (!Number.isFinite(x))
59
+ throw new Error('r must be finite (meters).');
60
+ for (const x of v)
61
+ if (!Number.isFinite(x))
62
+ throw new Error('v must be finite (m/s).');
63
+ const r2 = r[0] * r[0] + r[1] * r[1] + r[2] * r[2];
64
+ const v2 = v[0] * v[0] + v[1] * v[1] + v[2] * v[2];
65
+ if (!(r2 > 0))
66
+ throw new Error('r must be non-zero (meters).');
67
+ if (!(v2 >= 0))
68
+ throw new Error('v must be valid (m/s).');
69
+ // h⃗ = r × v
70
+ const hx = r[1] * v[2] - r[2] * v[1];
71
+ const hy = r[2] * v[0] - r[0] * v[2];
72
+ const hz = r[0] * v[1] - r[1] * v[0];
73
+ const h = Math.hypot(hx, hy, hz); // m^2/s
74
+ return h;
75
+ };
76
+ //# sourceMappingURL=specific-angular-momentum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specific-angular-momentum.js","sourceRoot":"","sources":["../../../src/categories/orbits/specific-angular-momentum.ts"],"names":[],"mappings":"AAEA,2BAA2B;AAC3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AACH,0BAA0B;AAC1B,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,CAAoB,EACpB,CAAoB,EACZ,EAAE;IACV,kBAAkB;IAClB,KAAK,MAAM,CAAC,IAAI,CAAC;QACf,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IACzE,KAAK,MAAM,CAAC,IAAI,CAAC;QACf,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAEtE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnD,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAE/D,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAE1D,aAAa;IACb,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ;IAE1C,OAAO,CAAC,CAAC;AACX,CAAC,CAAC"}