@interstellar-tools/equations 0.18.0 → 0.20.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 (364) hide show
  1. package/dist/__tests__/helpers/index.d.ts +3 -9
  2. package/dist/__tests__/helpers/index.d.ts.map +1 -1
  3. package/dist/__tests__/helpers/index.js +15 -21
  4. package/dist/__tests__/helpers/index.js.map +1 -1
  5. package/dist/categories/angle/__tests__/compute-angle.int.spec.d.ts.map +1 -0
  6. package/dist/{__tests__ → categories/angle/__tests__}/compute-angle.int.spec.js +2 -2
  7. package/dist/categories/angle/__tests__/compute-angle.int.spec.js.map +1 -0
  8. package/dist/categories/angle/__tests__/wrap-angle.spec.d.ts.map +1 -0
  9. package/dist/{__tests__ → categories/angle/__tests__}/wrap-angle.spec.js +1 -1
  10. package/dist/categories/angle/__tests__/wrap-angle.spec.js.map +1 -0
  11. package/dist/categories/anomalies/__tests__/eccentric-to-true-anomaly.spec.d.ts.map +1 -0
  12. package/dist/{__tests__ → categories/anomalies/__tests__}/eccentric-to-true-anomaly.spec.js +1 -1
  13. package/dist/categories/anomalies/__tests__/eccentric-to-true-anomaly.spec.js.map +1 -0
  14. package/dist/categories/anomalies/__tests__/mean-to-eccentric-anomaly.spec.d.ts.map +1 -0
  15. package/dist/{__tests__ → categories/anomalies/__tests__}/mean-to-eccentric-anomaly.spec.js +3 -3
  16. package/dist/categories/anomalies/__tests__/mean-to-eccentric-anomaly.spec.js.map +1 -0
  17. package/dist/categories/anomalies/__tests__/true-to-mean-anomaly.spec.d.ts.map +1 -0
  18. package/dist/{__tests__ → categories/anomalies/__tests__}/true-to-mean-anomaly.spec.js +2 -2
  19. package/dist/categories/anomalies/__tests__/true-to-mean-anomaly.spec.js.map +1 -0
  20. package/dist/categories/anomalies/eccentric-to-true-anomaly.d.ts +1 -1
  21. package/dist/categories/anomalies/eccentric-to-true-anomaly.d.ts.map +1 -1
  22. package/dist/categories/anomalies/true-to-mean-anomaly.d.ts +1 -1
  23. package/dist/categories/anomalies/true-to-mean-anomaly.d.ts.map +1 -1
  24. package/dist/categories/cartography/__tests__/body-fixed-from-inertial-dcm-iau.int.spec.d.ts +2 -0
  25. package/dist/categories/cartography/__tests__/body-fixed-from-inertial-dcm-iau.int.spec.d.ts.map +1 -0
  26. package/dist/categories/cartography/__tests__/body-fixed-from-inertial-dcm-iau.int.spec.js +56 -0
  27. package/dist/categories/cartography/__tests__/body-fixed-from-inertial-dcm-iau.int.spec.js.map +1 -0
  28. package/dist/categories/cartography/__tests__/eccentricity-squared-oblate-spheroid.spec.d.ts +2 -0
  29. package/dist/categories/cartography/__tests__/eccentricity-squared-oblate-spheroid.spec.d.ts.map +1 -0
  30. package/dist/categories/cartography/__tests__/eccentricity-squared-oblate-spheroid.spec.js +60 -0
  31. package/dist/categories/cartography/__tests__/eccentricity-squared-oblate-spheroid.spec.js.map +1 -0
  32. package/dist/categories/cartography/__tests__/flattening-oblate-spheroid.spec.d.ts +2 -0
  33. package/dist/categories/cartography/__tests__/flattening-oblate-spheroid.spec.d.ts.map +1 -0
  34. package/dist/categories/cartography/__tests__/flattening-oblate-spheroid.spec.js +60 -0
  35. package/dist/categories/cartography/__tests__/flattening-oblate-spheroid.spec.js.map +1 -0
  36. package/dist/categories/cartography/__tests__/is-on-triaxial-ellipsoid-surface.spec.d.ts +2 -0
  37. package/dist/categories/cartography/__tests__/is-on-triaxial-ellipsoid-surface.spec.d.ts.map +1 -0
  38. package/dist/categories/cartography/__tests__/is-on-triaxial-ellipsoid-surface.spec.js +73 -0
  39. package/dist/categories/cartography/__tests__/is-on-triaxial-ellipsoid-surface.spec.js.map +1 -0
  40. package/dist/categories/cartography/__tests__/planetocentric-latitude.spec.d.ts +2 -0
  41. package/dist/categories/cartography/__tests__/planetocentric-latitude.spec.d.ts.map +1 -0
  42. package/dist/categories/cartography/__tests__/planetocentric-latitude.spec.js +69 -0
  43. package/dist/categories/cartography/__tests__/planetocentric-latitude.spec.js.map +1 -0
  44. package/dist/categories/cartography/__tests__/planetographic-latitude-oblate.spec.d.ts +2 -0
  45. package/dist/categories/cartography/__tests__/planetographic-latitude-oblate.spec.d.ts.map +1 -0
  46. package/dist/categories/cartography/__tests__/planetographic-latitude-oblate.spec.js +103 -0
  47. package/dist/categories/cartography/__tests__/planetographic-latitude-oblate.spec.js.map +1 -0
  48. package/dist/categories/cartography/body-fixed-from-inertial-dcm-iau.d.ts +50 -0
  49. package/dist/categories/cartography/body-fixed-from-inertial-dcm-iau.d.ts.map +1 -0
  50. package/dist/categories/cartography/body-fixed-from-inertial-dcm-iau.js +64 -0
  51. package/dist/categories/cartography/body-fixed-from-inertial-dcm-iau.js.map +1 -0
  52. package/dist/categories/cartography/eccentricity-squared-oblate-spheroid.d.ts +40 -0
  53. package/dist/categories/cartography/eccentricity-squared-oblate-spheroid.d.ts.map +1 -0
  54. package/dist/categories/cartography/eccentricity-squared-oblate-spheroid.js +50 -0
  55. package/dist/categories/cartography/eccentricity-squared-oblate-spheroid.js.map +1 -0
  56. package/dist/categories/cartography/flattening-oblate-spheroid.d.ts +40 -0
  57. package/dist/categories/cartography/flattening-oblate-spheroid.d.ts.map +1 -0
  58. package/dist/categories/cartography/flattening-oblate-spheroid.js +50 -0
  59. package/dist/categories/cartography/flattening-oblate-spheroid.js.map +1 -0
  60. package/dist/categories/cartography/is-on-triaxial-ellipsoid-surface.d.ts +54 -0
  61. package/dist/categories/cartography/is-on-triaxial-ellipsoid-surface.d.ts.map +1 -0
  62. package/dist/categories/cartography/is-on-triaxial-ellipsoid-surface.js +77 -0
  63. package/dist/categories/cartography/is-on-triaxial-ellipsoid-surface.js.map +1 -0
  64. package/dist/categories/cartography/planetocentric-latitude.d.ts +38 -0
  65. package/dist/categories/cartography/planetocentric-latitude.d.ts.map +1 -0
  66. package/dist/categories/cartography/planetocentric-latitude.js +47 -0
  67. package/dist/categories/cartography/planetocentric-latitude.js.map +1 -0
  68. package/dist/categories/cartography/planetographic-latitude-oblate.d.ts +19 -0
  69. package/dist/categories/cartography/planetographic-latitude-oblate.d.ts.map +1 -0
  70. package/dist/categories/cartography/planetographic-latitude-oblate.js +44 -0
  71. package/dist/categories/cartography/planetographic-latitude-oblate.js.map +1 -0
  72. package/dist/categories/gravity/__tests__/gravitational-acceleration-on1-by2.int.spec.d.ts.map +1 -0
  73. package/dist/{__tests__ → categories/gravity/__tests__}/gravitational-acceleration-on1-by2.int.spec.js +3 -2
  74. package/dist/categories/gravity/__tests__/gravitational-acceleration-on1-by2.int.spec.js.map +1 -0
  75. package/dist/categories/gravity/__tests__/gravitational-force-on1-by2.int.spec.d.ts.map +1 -0
  76. package/dist/{__tests__ → categories/gravity/__tests__}/gravitational-force-on1-by2.int.spec.js +3 -2
  77. package/dist/categories/gravity/__tests__/gravitational-force-on1-by2.int.spec.js.map +1 -0
  78. package/dist/categories/gravity/__tests__/gravitational-force.spec.d.ts.map +1 -0
  79. package/dist/{__tests__ → categories/gravity/__tests__}/gravitational-force.spec.js +3 -2
  80. package/dist/categories/gravity/__tests__/gravitational-force.spec.js.map +1 -0
  81. package/dist/categories/gravity/__tests__/gravitational-parameters.spec.d.ts.map +1 -0
  82. package/dist/{__tests__ → categories/gravity/__tests__}/gravitational-parameters.spec.js +2 -2
  83. package/dist/categories/gravity/__tests__/gravitational-parameters.spec.js.map +1 -0
  84. package/dist/categories/helpers/__tests__/apply-matrix-3.spec.d.ts +2 -0
  85. package/dist/categories/helpers/__tests__/apply-matrix-3.spec.d.ts.map +1 -0
  86. package/dist/categories/helpers/__tests__/apply-matrix-3.spec.js +79 -0
  87. package/dist/categories/helpers/__tests__/apply-matrix-3.spec.js.map +1 -0
  88. package/dist/categories/helpers/__tests__/det-3.spec.d.ts +2 -0
  89. package/dist/categories/helpers/__tests__/det-3.spec.d.ts.map +1 -0
  90. package/dist/categories/helpers/__tests__/det-3.spec.js +73 -0
  91. package/dist/categories/helpers/__tests__/det-3.spec.js.map +1 -0
  92. package/dist/categories/helpers/__tests__/mat-mul3.spec.d.ts +2 -0
  93. package/dist/categories/helpers/__tests__/mat-mul3.spec.d.ts.map +1 -0
  94. package/dist/categories/helpers/__tests__/mat-mul3.spec.js +86 -0
  95. package/dist/categories/helpers/__tests__/mat-mul3.spec.js.map +1 -0
  96. package/dist/categories/helpers/__tests__/misc.spec.d.ts +2 -0
  97. package/dist/categories/helpers/__tests__/misc.spec.d.ts.map +1 -0
  98. package/dist/categories/helpers/__tests__/misc.spec.js +101 -0
  99. package/dist/categories/helpers/__tests__/misc.spec.js.map +1 -0
  100. package/dist/categories/helpers/__tests__/radians.spec.d.ts +2 -0
  101. package/dist/categories/helpers/__tests__/radians.spec.d.ts.map +1 -0
  102. package/dist/categories/helpers/__tests__/radians.spec.js +37 -0
  103. package/dist/categories/helpers/__tests__/radians.spec.js.map +1 -0
  104. package/dist/categories/helpers/__tests__/rot-1.spec.d.ts +2 -0
  105. package/dist/categories/helpers/__tests__/rot-1.spec.d.ts.map +1 -0
  106. package/dist/categories/helpers/__tests__/rot-1.spec.js +59 -0
  107. package/dist/categories/helpers/__tests__/rot-1.spec.js.map +1 -0
  108. package/dist/categories/helpers/__tests__/rot-3.spec.d.ts +2 -0
  109. package/dist/categories/helpers/__tests__/rot-3.spec.d.ts.map +1 -0
  110. package/dist/categories/helpers/__tests__/rot-3.spec.js +65 -0
  111. package/dist/categories/helpers/__tests__/rot-3.spec.js.map +1 -0
  112. package/dist/categories/helpers/apply-matrix-3.d.ts +38 -0
  113. package/dist/categories/helpers/apply-matrix-3.d.ts.map +1 -0
  114. package/dist/categories/helpers/apply-matrix-3.js +44 -0
  115. package/dist/categories/helpers/apply-matrix-3.js.map +1 -0
  116. package/dist/categories/helpers/det-3.d.ts +52 -0
  117. package/dist/categories/helpers/det-3.d.ts.map +1 -0
  118. package/dist/categories/helpers/det-3.js +62 -0
  119. package/dist/categories/helpers/det-3.js.map +1 -0
  120. package/dist/categories/helpers/mat-mul3.d.ts +46 -0
  121. package/dist/categories/helpers/mat-mul3.d.ts.map +1 -0
  122. package/dist/categories/helpers/mat-mul3.js +52 -0
  123. package/dist/categories/helpers/mat-mul3.js.map +1 -0
  124. package/dist/categories/helpers/misc.d.ts +118 -0
  125. package/dist/categories/helpers/misc.d.ts.map +1 -0
  126. package/dist/categories/helpers/misc.js +131 -0
  127. package/dist/categories/helpers/misc.js.map +1 -0
  128. package/dist/categories/helpers/radians.d.ts +41 -0
  129. package/dist/categories/helpers/radians.d.ts.map +1 -0
  130. package/dist/categories/helpers/radians.js +40 -0
  131. package/dist/categories/helpers/radians.js.map +1 -0
  132. package/dist/categories/helpers/rot-1.d.ts +38 -0
  133. package/dist/categories/helpers/rot-1.d.ts.map +1 -0
  134. package/dist/categories/helpers/rot-1.js +47 -0
  135. package/dist/categories/helpers/rot-1.js.map +1 -0
  136. package/dist/categories/helpers/rot-3.d.ts +38 -0
  137. package/dist/categories/helpers/rot-3.d.ts.map +1 -0
  138. package/dist/categories/helpers/rot-3.js +47 -0
  139. package/dist/categories/helpers/rot-3.js.map +1 -0
  140. package/dist/categories/helpers/transpose-3.d.ts +51 -0
  141. package/dist/categories/helpers/transpose-3.d.ts.map +1 -0
  142. package/dist/categories/helpers/transpose-3.js +54 -0
  143. package/dist/categories/helpers/transpose-3.js.map +1 -0
  144. package/dist/categories/kepler/__tests__/solve-kepler-bisection.spec.d.ts.map +1 -0
  145. package/dist/{__tests__ → categories/kepler/__tests__}/solve-kepler-bisection.spec.js +3 -2
  146. package/dist/categories/kepler/__tests__/solve-kepler-bisection.spec.js.map +1 -0
  147. package/dist/categories/kepler/__tests__/solve-kepler-high-eccentricity.spec.d.ts.map +1 -0
  148. package/dist/{__tests__ → categories/kepler/__tests__}/solve-kepler-high-eccentricity.spec.js +1 -1
  149. package/dist/categories/kepler/__tests__/solve-kepler-high-eccentricity.spec.js.map +1 -0
  150. package/dist/categories/kepler/__tests__/solve-kepler-newton-raphson.spec.d.ts.map +1 -0
  151. package/dist/{__tests__ → categories/kepler/__tests__}/solve-kepler-newton-raphson.spec.js +1 -1
  152. package/dist/categories/kepler/__tests__/solve-kepler-newton-raphson.spec.js.map +1 -0
  153. package/dist/categories/kepler/__tests__/solve-kepler.int.spec.d.ts.map +1 -0
  154. package/dist/{__tests__ → categories/kepler/__tests__}/solve-kepler.int.spec.js +1 -1
  155. package/dist/categories/kepler/__tests__/solve-kepler.int.spec.js.map +1 -0
  156. package/dist/categories/kepler/solve-kepler-bisection.d.ts +1 -1
  157. package/dist/categories/kepler/solve-kepler-bisection.d.ts.map +1 -1
  158. package/dist/categories/kepler/solve-kepler-high-eccentricity.d.ts +1 -1
  159. package/dist/categories/kepler/solve-kepler-high-eccentricity.d.ts.map +1 -1
  160. package/dist/categories/kepler/solve-kepler-newton-raphson.d.ts +1 -1
  161. package/dist/categories/kepler/solve-kepler-newton-raphson.d.ts.map +1 -1
  162. package/dist/categories/kepler/solve-kepler-newton-raphson.js +1 -1
  163. package/dist/categories/kepler/solve-kepler.d.ts +1 -1
  164. package/dist/categories/kepler/solve-kepler.d.ts.map +1 -1
  165. package/dist/categories/manoeuvres/__tests__/combine-burns-delta-v.spec.d.ts.map +1 -0
  166. package/dist/{__tests__ → categories/manoeuvres/__tests__}/combine-burns-delta-v.spec.js +3 -2
  167. package/dist/categories/manoeuvres/__tests__/combine-burns-delta-v.spec.js.map +1 -0
  168. package/dist/categories/manoeuvres/__tests__/gravity-assist-turning-angle.spec.d.ts.map +1 -0
  169. package/dist/{__tests__ → categories/manoeuvres/__tests__}/gravity-assist-turning-angle.spec.js +2 -2
  170. package/dist/categories/manoeuvres/__tests__/gravity-assist-turning-angle.spec.js.map +1 -0
  171. package/dist/categories/manoeuvres/__tests__/hohmann-transfer.spec.d.ts.map +1 -0
  172. package/dist/{__tests__ → categories/manoeuvres/__tests__}/hohmann-transfer.spec.js +2 -2
  173. package/dist/categories/manoeuvres/__tests__/hohmann-transfer.spec.js.map +1 -0
  174. package/dist/categories/manoeuvres/__tests__/oberth-energy-gain.spec.d.ts.map +1 -0
  175. package/dist/{__tests__ → categories/manoeuvres/__tests__}/oberth-energy-gain.spec.js +2 -2
  176. package/dist/categories/manoeuvres/__tests__/oberth-energy-gain.spec.js.map +1 -0
  177. package/dist/categories/manoeuvres/__tests__/plane-change-delta-v.spec.d.ts.map +1 -0
  178. package/dist/{__tests__ → categories/manoeuvres/__tests__}/plane-change-delta-v.spec.js +3 -2
  179. package/dist/categories/manoeuvres/__tests__/plane-change-delta-v.spec.js.map +1 -0
  180. package/dist/categories/manoeuvres/__tests__/rocket-delta-v-from-isp.spec.d.ts +2 -0
  181. package/dist/categories/manoeuvres/__tests__/rocket-delta-v-from-isp.spec.d.ts.map +1 -0
  182. package/dist/categories/manoeuvres/__tests__/rocket-delta-v-from-isp.spec.js +84 -0
  183. package/dist/categories/manoeuvres/__tests__/rocket-delta-v-from-isp.spec.js.map +1 -0
  184. package/dist/categories/manoeuvres/__tests__/rocket-delta-v-from-ve.spec.d.ts +2 -0
  185. package/dist/categories/manoeuvres/__tests__/rocket-delta-v-from-ve.spec.d.ts.map +1 -0
  186. package/dist/categories/manoeuvres/__tests__/rocket-delta-v-from-ve.spec.js +65 -0
  187. package/dist/categories/manoeuvres/__tests__/rocket-delta-v-from-ve.spec.js.map +1 -0
  188. package/dist/categories/manoeuvres/rocket-delta-v-from-isp.d.ts +46 -0
  189. package/dist/categories/manoeuvres/rocket-delta-v-from-isp.d.ts.map +1 -0
  190. package/dist/categories/manoeuvres/rocket-delta-v-from-isp.js +67 -0
  191. package/dist/categories/manoeuvres/rocket-delta-v-from-isp.js.map +1 -0
  192. package/dist/categories/manoeuvres/rocket-delta-v-from-ve.d.ts +44 -0
  193. package/dist/categories/manoeuvres/rocket-delta-v-from-ve.d.ts.map +1 -0
  194. package/dist/categories/manoeuvres/rocket-delta-v-from-ve.js +62 -0
  195. package/dist/categories/manoeuvres/rocket-delta-v-from-ve.js.map +1 -0
  196. package/dist/categories/orbits/__tests__/atmospheric-drag-acceleration.spec.d.ts +2 -0
  197. package/dist/categories/orbits/__tests__/atmospheric-drag-acceleration.spec.d.ts.map +1 -0
  198. package/dist/categories/orbits/__tests__/atmospheric-drag-acceleration.spec.js +71 -0
  199. package/dist/categories/orbits/__tests__/atmospheric-drag-acceleration.spec.js.map +1 -0
  200. package/dist/categories/orbits/__tests__/characteristic-energy-c3.spec.d.ts.map +1 -0
  201. package/dist/{__tests__ → categories/orbits/__tests__}/characteristic-energy-c3.spec.js +2 -2
  202. package/dist/categories/orbits/__tests__/characteristic-energy-c3.spec.js.map +1 -0
  203. package/dist/categories/orbits/__tests__/circular-speed.spec.d.ts.map +1 -0
  204. package/dist/{__tests__ → categories/orbits/__tests__}/circular-speed.spec.js +2 -2
  205. package/dist/categories/orbits/__tests__/circular-speed.spec.js.map +1 -0
  206. package/dist/categories/orbits/__tests__/cw-hill-derivatives.spec.d.ts.map +1 -0
  207. package/dist/{__tests__ → categories/orbits/__tests__}/cw-hill-derivatives.spec.js +2 -2
  208. package/dist/categories/orbits/__tests__/cw-hill-derivatives.spec.js.map +1 -0
  209. package/dist/categories/orbits/__tests__/escape-speed.spec.d.ts.map +1 -0
  210. package/dist/{__tests__ → categories/orbits/__tests__}/escape-speed.spec.js +2 -2
  211. package/dist/categories/orbits/__tests__/escape-speed.spec.js.map +1 -0
  212. package/dist/categories/orbits/__tests__/flight-path-angle-from-true-anomaly.spec.d.ts.map +1 -0
  213. package/dist/{__tests__ → categories/orbits/__tests__}/flight-path-angle-from-true-anomaly.spec.js +2 -2
  214. package/dist/categories/orbits/__tests__/flight-path-angle-from-true-anomaly.spec.js.map +1 -0
  215. package/dist/categories/orbits/__tests__/hyperbolic-periapsis-speed.spec.d.ts.map +1 -0
  216. package/dist/{__tests__ → categories/orbits/__tests__}/hyperbolic-periapsis-speed.spec.js +2 -2
  217. package/dist/categories/orbits/__tests__/hyperbolic-periapsis-speed.spec.js.map +1 -0
  218. package/dist/categories/orbits/__tests__/j2-argument-of-perigee-rate.spec.d.ts +2 -0
  219. package/dist/categories/orbits/__tests__/j2-argument-of-perigee-rate.spec.d.ts.map +1 -0
  220. package/dist/categories/orbits/__tests__/j2-argument-of-perigee-rate.spec.js +104 -0
  221. package/dist/categories/orbits/__tests__/j2-argument-of-perigee-rate.spec.js.map +1 -0
  222. package/dist/categories/orbits/__tests__/j2-nodal-precession-rate.spec.d.ts +2 -0
  223. package/dist/categories/orbits/__tests__/j2-nodal-precession-rate.spec.d.ts.map +1 -0
  224. package/dist/categories/orbits/__tests__/j2-nodal-precession-rate.spec.js +99 -0
  225. package/dist/categories/orbits/__tests__/j2-nodal-precession-rate.spec.js.map +1 -0
  226. package/dist/categories/orbits/__tests__/kepler-period.spec.d.ts.map +1 -0
  227. package/dist/{__tests__ → categories/orbits/__tests__}/kepler-period.spec.js +2 -2
  228. package/dist/categories/orbits/__tests__/kepler-period.spec.js.map +1 -0
  229. package/dist/categories/orbits/__tests__/mean-motion.spec.d.ts.map +1 -0
  230. package/dist/{__tests__ → categories/orbits/__tests__}/mean-motion.spec.js +2 -2
  231. package/dist/categories/orbits/__tests__/mean-motion.spec.js.map +1 -0
  232. package/dist/categories/orbits/__tests__/peri-apoapsis-radii.spec.d.ts.map +1 -0
  233. package/dist/{__tests__ → categories/orbits/__tests__}/peri-apoapsis-radii.spec.js +2 -2
  234. package/dist/categories/orbits/__tests__/peri-apoapsis-radii.spec.js.map +1 -0
  235. package/dist/categories/orbits/__tests__/specific-angular-momentum-from-elements.spec.d.ts.map +1 -0
  236. package/dist/{__tests__ → categories/orbits/__tests__}/specific-angular-momentum-from-elements.spec.js +2 -2
  237. package/dist/categories/orbits/__tests__/specific-angular-momentum-from-elements.spec.js.map +1 -0
  238. package/dist/categories/orbits/__tests__/specific-angular-momentum.spec.d.ts.map +1 -0
  239. package/dist/{__tests__ → categories/orbits/__tests__}/specific-angular-momentum.spec.js +3 -2
  240. package/dist/categories/orbits/__tests__/specific-angular-momentum.spec.js.map +1 -0
  241. package/dist/categories/orbits/__tests__/specific-mechanical-energy.spec.d.ts.map +1 -0
  242. package/dist/{__tests__ → categories/orbits/__tests__}/specific-mechanical-energy.spec.js +2 -2
  243. package/dist/categories/orbits/__tests__/specific-mechanical-energy.spec.js.map +1 -0
  244. package/dist/categories/orbits/__tests__/sphere-of-influence-radius.spec.d.ts.map +1 -0
  245. package/dist/{__tests__ → categories/orbits/__tests__}/sphere-of-influence-radius.spec.js +2 -2
  246. package/dist/categories/orbits/__tests__/sphere-of-influence-radius.spec.js.map +1 -0
  247. package/dist/categories/orbits/__tests__/vis-viva-speed.spec.d.ts.map +1 -0
  248. package/dist/{__tests__ → categories/orbits/__tests__}/vis-viva-speed.spec.js +2 -2
  249. package/dist/categories/orbits/__tests__/vis-viva-speed.spec.js.map +1 -0
  250. package/dist/categories/orbits/atmospheric-drag-acceleration.d.ts +40 -0
  251. package/dist/categories/orbits/atmospheric-drag-acceleration.d.ts.map +1 -0
  252. package/dist/categories/orbits/atmospheric-drag-acceleration.js +63 -0
  253. package/dist/categories/orbits/atmospheric-drag-acceleration.js.map +1 -0
  254. package/dist/categories/orbits/flight-path-angle-from-true-anomaly.d.ts +1 -1
  255. package/dist/categories/orbits/flight-path-angle-from-true-anomaly.d.ts.map +1 -1
  256. package/dist/categories/orbits/j2-argument-of-perigee-rate.d.ts +53 -0
  257. package/dist/categories/orbits/j2-argument-of-perigee-rate.d.ts.map +1 -0
  258. package/dist/categories/orbits/j2-argument-of-perigee-rate.js +84 -0
  259. package/dist/categories/orbits/j2-argument-of-perigee-rate.js.map +1 -0
  260. package/dist/categories/orbits/j2-nodal-precession-rate.d.ts +52 -0
  261. package/dist/categories/orbits/j2-nodal-precession-rate.d.ts.map +1 -0
  262. package/dist/categories/orbits/j2-nodal-precession-rate.js +82 -0
  263. package/dist/categories/orbits/j2-nodal-precession-rate.js.map +1 -0
  264. package/dist/index.d.ts +18 -0
  265. package/dist/index.d.ts.map +1 -1
  266. package/dist/index.js +20 -0
  267. package/dist/index.js.map +1 -1
  268. package/package.json +1 -1
  269. package/dist/__tests__/characteristic-energy-c3.spec.d.ts.map +0 -1
  270. package/dist/__tests__/characteristic-energy-c3.spec.js.map +0 -1
  271. package/dist/__tests__/circular-speed.spec.d.ts.map +0 -1
  272. package/dist/__tests__/circular-speed.spec.js.map +0 -1
  273. package/dist/__tests__/combine-burns-delta-v.spec.d.ts.map +0 -1
  274. package/dist/__tests__/combine-burns-delta-v.spec.js.map +0 -1
  275. package/dist/__tests__/compute-angle.int.spec.d.ts.map +0 -1
  276. package/dist/__tests__/compute-angle.int.spec.js.map +0 -1
  277. package/dist/__tests__/cw-hill-derivatives.spec.d.ts.map +0 -1
  278. package/dist/__tests__/cw-hill-derivatives.spec.js.map +0 -1
  279. package/dist/__tests__/eccentric-to-true-anomaly.spec.d.ts.map +0 -1
  280. package/dist/__tests__/eccentric-to-true-anomaly.spec.js.map +0 -1
  281. package/dist/__tests__/escape-speed.spec.d.ts.map +0 -1
  282. package/dist/__tests__/escape-speed.spec.js.map +0 -1
  283. package/dist/__tests__/flight-path-angle-from-true-anomaly.spec.d.ts.map +0 -1
  284. package/dist/__tests__/flight-path-angle-from-true-anomaly.spec.js.map +0 -1
  285. package/dist/__tests__/gravitational-acceleration-on1-by2.int.spec.d.ts.map +0 -1
  286. package/dist/__tests__/gravitational-acceleration-on1-by2.int.spec.js.map +0 -1
  287. package/dist/__tests__/gravitational-force-on1-by2.int.spec.d.ts.map +0 -1
  288. package/dist/__tests__/gravitational-force-on1-by2.int.spec.js.map +0 -1
  289. package/dist/__tests__/gravitational-force.spec.d.ts.map +0 -1
  290. package/dist/__tests__/gravitational-force.spec.js.map +0 -1
  291. package/dist/__tests__/gravitational-parameters.spec.d.ts.map +0 -1
  292. package/dist/__tests__/gravitational-parameters.spec.js.map +0 -1
  293. package/dist/__tests__/gravity-assist-turning-angle.spec.d.ts.map +0 -1
  294. package/dist/__tests__/gravity-assist-turning-angle.spec.js.map +0 -1
  295. package/dist/__tests__/hohmann-transfer.spec.d.ts.map +0 -1
  296. package/dist/__tests__/hohmann-transfer.spec.js.map +0 -1
  297. package/dist/__tests__/hyperbolic-periapsis-speed.spec.d.ts.map +0 -1
  298. package/dist/__tests__/hyperbolic-periapsis-speed.spec.js.map +0 -1
  299. package/dist/__tests__/kepler-period.spec.d.ts.map +0 -1
  300. package/dist/__tests__/kepler-period.spec.js.map +0 -1
  301. package/dist/__tests__/mean-motion.spec.d.ts.map +0 -1
  302. package/dist/__tests__/mean-motion.spec.js.map +0 -1
  303. package/dist/__tests__/mean-to-eccentric-anomaly.spec.d.ts.map +0 -1
  304. package/dist/__tests__/mean-to-eccentric-anomaly.spec.js.map +0 -1
  305. package/dist/__tests__/oberth-energy-gain.spec.d.ts.map +0 -1
  306. package/dist/__tests__/oberth-energy-gain.spec.js.map +0 -1
  307. package/dist/__tests__/peri-apoapsis-radii.spec.d.ts.map +0 -1
  308. package/dist/__tests__/peri-apoapsis-radii.spec.js.map +0 -1
  309. package/dist/__tests__/plane-change-delta-v.spec.d.ts.map +0 -1
  310. package/dist/__tests__/plane-change-delta-v.spec.js.map +0 -1
  311. package/dist/__tests__/solve-kepler-bisection.spec.d.ts.map +0 -1
  312. package/dist/__tests__/solve-kepler-bisection.spec.js.map +0 -1
  313. package/dist/__tests__/solve-kepler-high-eccentricity.spec.d.ts.map +0 -1
  314. package/dist/__tests__/solve-kepler-high-eccentricity.spec.js.map +0 -1
  315. package/dist/__tests__/solve-kepler-newton-raphson.spec.d.ts.map +0 -1
  316. package/dist/__tests__/solve-kepler-newton-raphson.spec.js.map +0 -1
  317. package/dist/__tests__/solve-kepler.int.spec.d.ts.map +0 -1
  318. package/dist/__tests__/solve-kepler.int.spec.js.map +0 -1
  319. package/dist/__tests__/specific-angular-momentum-from-elements.spec.d.ts.map +0 -1
  320. package/dist/__tests__/specific-angular-momentum-from-elements.spec.js.map +0 -1
  321. package/dist/__tests__/specific-angular-momentum.spec.d.ts.map +0 -1
  322. package/dist/__tests__/specific-angular-momentum.spec.js.map +0 -1
  323. package/dist/__tests__/specific-mechanical-energy.spec.d.ts.map +0 -1
  324. package/dist/__tests__/specific-mechanical-energy.spec.js.map +0 -1
  325. package/dist/__tests__/sphere-of-influence-radius.spec.d.ts.map +0 -1
  326. package/dist/__tests__/sphere-of-influence-radius.spec.js.map +0 -1
  327. package/dist/__tests__/true-to-mean-anomaly.spec.d.ts.map +0 -1
  328. package/dist/__tests__/true-to-mean-anomaly.spec.js.map +0 -1
  329. package/dist/__tests__/vis-viva-speed.spec.d.ts.map +0 -1
  330. package/dist/__tests__/vis-viva-speed.spec.js.map +0 -1
  331. package/dist/__tests__/wrap-angle.spec.d.ts.map +0 -1
  332. package/dist/__tests__/wrap-angle.spec.js.map +0 -1
  333. /package/dist/{__tests__ → categories/angle/__tests__}/compute-angle.int.spec.d.ts +0 -0
  334. /package/dist/{__tests__ → categories/angle/__tests__}/wrap-angle.spec.d.ts +0 -0
  335. /package/dist/{__tests__ → categories/anomalies/__tests__}/eccentric-to-true-anomaly.spec.d.ts +0 -0
  336. /package/dist/{__tests__ → categories/anomalies/__tests__}/mean-to-eccentric-anomaly.spec.d.ts +0 -0
  337. /package/dist/{__tests__ → categories/anomalies/__tests__}/true-to-mean-anomaly.spec.d.ts +0 -0
  338. /package/dist/{__tests__ → categories/gravity/__tests__}/gravitational-acceleration-on1-by2.int.spec.d.ts +0 -0
  339. /package/dist/{__tests__ → categories/gravity/__tests__}/gravitational-force-on1-by2.int.spec.d.ts +0 -0
  340. /package/dist/{__tests__ → categories/gravity/__tests__}/gravitational-force.spec.d.ts +0 -0
  341. /package/dist/{__tests__ → categories/gravity/__tests__}/gravitational-parameters.spec.d.ts +0 -0
  342. /package/dist/{__tests__ → categories/kepler/__tests__}/solve-kepler-bisection.spec.d.ts +0 -0
  343. /package/dist/{__tests__ → categories/kepler/__tests__}/solve-kepler-high-eccentricity.spec.d.ts +0 -0
  344. /package/dist/{__tests__ → categories/kepler/__tests__}/solve-kepler-newton-raphson.spec.d.ts +0 -0
  345. /package/dist/{__tests__ → categories/kepler/__tests__}/solve-kepler.int.spec.d.ts +0 -0
  346. /package/dist/{__tests__ → categories/manoeuvres/__tests__}/combine-burns-delta-v.spec.d.ts +0 -0
  347. /package/dist/{__tests__ → categories/manoeuvres/__tests__}/gravity-assist-turning-angle.spec.d.ts +0 -0
  348. /package/dist/{__tests__ → categories/manoeuvres/__tests__}/hohmann-transfer.spec.d.ts +0 -0
  349. /package/dist/{__tests__ → categories/manoeuvres/__tests__}/oberth-energy-gain.spec.d.ts +0 -0
  350. /package/dist/{__tests__ → categories/manoeuvres/__tests__}/plane-change-delta-v.spec.d.ts +0 -0
  351. /package/dist/{__tests__ → categories/orbits/__tests__}/characteristic-energy-c3.spec.d.ts +0 -0
  352. /package/dist/{__tests__ → categories/orbits/__tests__}/circular-speed.spec.d.ts +0 -0
  353. /package/dist/{__tests__ → categories/orbits/__tests__}/cw-hill-derivatives.spec.d.ts +0 -0
  354. /package/dist/{__tests__ → categories/orbits/__tests__}/escape-speed.spec.d.ts +0 -0
  355. /package/dist/{__tests__ → categories/orbits/__tests__}/flight-path-angle-from-true-anomaly.spec.d.ts +0 -0
  356. /package/dist/{__tests__ → categories/orbits/__tests__}/hyperbolic-periapsis-speed.spec.d.ts +0 -0
  357. /package/dist/{__tests__ → categories/orbits/__tests__}/kepler-period.spec.d.ts +0 -0
  358. /package/dist/{__tests__ → categories/orbits/__tests__}/mean-motion.spec.d.ts +0 -0
  359. /package/dist/{__tests__ → categories/orbits/__tests__}/peri-apoapsis-radii.spec.d.ts +0 -0
  360. /package/dist/{__tests__ → categories/orbits/__tests__}/specific-angular-momentum-from-elements.spec.d.ts +0 -0
  361. /package/dist/{__tests__ → categories/orbits/__tests__}/specific-angular-momentum.spec.d.ts +0 -0
  362. /package/dist/{__tests__ → categories/orbits/__tests__}/specific-mechanical-energy.spec.d.ts +0 -0
  363. /package/dist/{__tests__ → categories/orbits/__tests__}/sphere-of-influence-radius.spec.d.ts +0 -0
  364. /package/dist/{__tests__ → categories/orbits/__tests__}/vis-viva-speed.spec.d.ts +0 -0
@@ -0,0 +1,69 @@
1
+ import assert from 'node:assert/strict';
2
+ import test, { describe } from 'node:test';
3
+ import { planetocentricLatitude } from '../planetocentric-latitude';
4
+ import { absClose, relClose } from 'packages/equations/src/__tests__/helpers';
5
+ describe('planetocentricLatitude', () => {
6
+ test('returns 0 on the equatorial plane (z=0, x/y not both 0)', () => {
7
+ const phi1 = planetocentricLatitude(1, 0, 0);
8
+ const phi2 = planetocentricLatitude(0, 2, 0);
9
+ const phi3 = planetocentricLatitude(3, 4, 0);
10
+ absClose(phi1, 0, 1e-12);
11
+ absClose(phi2, 0, 1e-12);
12
+ absClose(phi3, 0, 1e-12);
13
+ });
14
+ test('returns +π/2 on +Z axis and -π/2 on -Z axis', () => {
15
+ absClose(planetocentricLatitude(0, 0, 1), Math.PI / 2, 1e-12);
16
+ absClose(planetocentricLatitude(0, 0, 10), Math.PI / 2, 1e-12);
17
+ absClose(planetocentricLatitude(0, 0, -1), -Math.PI / 2, 1e-12);
18
+ absClose(planetocentricLatitude(0, 0, -10), -Math.PI / 2, 1e-12);
19
+ });
20
+ test('matches atan2(z, hypot(x,y)) identity for a generic point', () => {
21
+ const x = 3;
22
+ const y = -4;
23
+ const z = 5;
24
+ const phi = planetocentricLatitude(x, y, z);
25
+ const expected = Math.atan2(z, Math.hypot(x, y));
26
+ relClose(phi, expected);
27
+ });
28
+ test('is invariant under scaling of (x,y,z) by a positive factor', () => {
29
+ const x = 1.2;
30
+ const y = -3.4;
31
+ const z = 5.6;
32
+ const phi = planetocentricLatitude(x, y, z);
33
+ const phiScaled = planetocentricLatitude(10 * x, 10 * y, 10 * z);
34
+ relClose(phiScaled, phi);
35
+ });
36
+ test('returns within [-π/2, +π/2] for finite inputs', () => {
37
+ const samples = [
38
+ [1, 0, 0],
39
+ [0, 1, 0],
40
+ [1, 1, 1],
41
+ [1, 1, -1],
42
+ [3, -4, 5],
43
+ [3, -4, -5]
44
+ ];
45
+ for (const [x, y, z] of samples) {
46
+ const phi = planetocentricLatitude(x, y, z);
47
+ assert.ok(phi >= -Math.PI / 2 - 1e-15, `phi < -π/2: ${phi}`);
48
+ assert.ok(phi <= Math.PI / 2 + 1e-15, `phi > +π/2: ${phi}`);
49
+ }
50
+ });
51
+ test('handles origin: atan2(0,0) returns 0 in JS', () => {
52
+ // This documents JS behavior; mathematically latitude at origin is undefined,
53
+ // but this function will return 0 due to atan2(0,0) === 0.
54
+ absClose(planetocentricLatitude(0, 0, 0), 0, 0);
55
+ });
56
+ test('throws TypeError when x is not finite', () => {
57
+ assert.throws(() => planetocentricLatitude(Number.NaN, 0, 0), (err) => err instanceof TypeError &&
58
+ err.message === 'x must be finite. Received: NaN');
59
+ });
60
+ test('throws TypeError when y is not finite', () => {
61
+ assert.throws(() => planetocentricLatitude(0, Number.POSITIVE_INFINITY, 0), (err) => err instanceof TypeError &&
62
+ err.message === 'y must be finite. Received: Infinity');
63
+ });
64
+ test('throws TypeError when z is not finite', () => {
65
+ assert.throws(() => planetocentricLatitude(0, 0, Number.NEGATIVE_INFINITY), (err) => err instanceof TypeError &&
66
+ err.message === 'z must be finite. Received: -Infinity');
67
+ });
68
+ });
69
+ //# sourceMappingURL=planetocentric-latitude.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planetocentric-latitude.spec.js","sourceRoot":"","sources":["../../../../src/categories/cartography/__tests__/planetocentric-latitude.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=planetographic-latitude-oblate.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planetographic-latitude-oblate.spec.d.ts","sourceRoot":"","sources":["../../../../src/categories/cartography/__tests__/planetographic-latitude-oblate.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,103 @@
1
+ import assert from 'node:assert/strict';
2
+ import test, { describe } from 'node:test';
3
+ import { planetographicLatitudeOblate } from '../planetographic-latitude-oblate';
4
+ import { absClose, relClose } from 'packages/equations/src/__tests__/helpers';
5
+ describe('planetographicLatitudeOblate', () => {
6
+ test('reduces to planetocentric latitude when a === c (sphere)', () => {
7
+ const a = 10;
8
+ const c = 10;
9
+ const x = 3;
10
+ const y = 4;
11
+ const z = 5;
12
+ const phiG = planetographicLatitudeOblate(x, y, z, a, c);
13
+ const expected = Math.atan2(z, Math.hypot(x, y)); // oneMinusE2 = 1
14
+ relClose(phiG, expected);
15
+ });
16
+ test('returns 0 on the equatorial plane (z=0, x/y not both 0)', () => {
17
+ const a = 6378137.0;
18
+ const c = 6356752.314245;
19
+ absClose(planetographicLatitudeOblate(1, 0, 0, a, c), 0, 1e-12);
20
+ absClose(planetographicLatitudeOblate(0, 2, 0, a, c), 0, 1e-12);
21
+ absClose(planetographicLatitudeOblate(3, 4, 0, a, c), 0, 1e-12);
22
+ });
23
+ test('returns +π/2 on +Z axis and -π/2 on -Z axis (for valid ellipsoid)', () => {
24
+ const a = 10;
25
+ const c = 9;
26
+ absClose(planetographicLatitudeOblate(0, 0, 1, a, c), Math.PI / 2, 1e-12);
27
+ absClose(planetographicLatitudeOblate(0, 0, -1, a, c), -Math.PI / 2, 1e-12);
28
+ });
29
+ test('matches the explicit formula atan2(z/(c^2/a^2), hypot(x,y))', () => {
30
+ const a = 10;
31
+ const c = 9;
32
+ const x = 1.2;
33
+ const y = -3.4;
34
+ const z = 5.6;
35
+ const phi = planetographicLatitudeOblate(x, y, z, a, c);
36
+ const oneMinusE2 = (c * c) / (a * a); // c²/a²
37
+ const expected = Math.atan2(z / oneMinusE2, Math.hypot(x, y));
38
+ relClose(phi, expected);
39
+ });
40
+ test('is invariant under scaling of (x,y,z) by a positive factor', () => {
41
+ const a = 10;
42
+ const c = 9;
43
+ const x = 1.2;
44
+ const y = -3.4;
45
+ const z = 5.6;
46
+ const phi1 = planetographicLatitudeOblate(x, y, z, a, c);
47
+ const phi2 = planetographicLatitudeOblate(10 * x, 10 * y, 10 * z, a, c);
48
+ relClose(phi2, phi1);
49
+ });
50
+ test('for an oblate spheroid (a > c), |φg| > |φc| when z ≠ 0 (same Cartesian point)', () => {
51
+ const a = 10;
52
+ const c = 9;
53
+ const x = 3;
54
+ const y = 4;
55
+ const z = 1;
56
+ const phiC = Math.atan2(z, Math.hypot(x, y)); // planetocentric latitude
57
+ const phiG = planetographicLatitudeOblate(x, y, z, a, c);
58
+ assert.ok(Math.abs(phiG) > Math.abs(phiC), `expected |phiG| > |phiC| for a>c; got phiC=${phiC}, phiG=${phiG}`);
59
+ });
60
+ test('returns within [-π/2, +π/2] for finite inputs', () => {
61
+ const a = 10;
62
+ const c = 9;
63
+ const samples = [
64
+ [1, 0, 0],
65
+ [0, 1, 0],
66
+ [1, 1, 1],
67
+ [1, 1, -1],
68
+ [3, -4, 5],
69
+ [3, -4, -5]
70
+ ];
71
+ for (const [x, y, z] of samples) {
72
+ const phi = planetographicLatitudeOblate(x, y, z, a, c);
73
+ assert.ok(phi >= -Math.PI / 2 - 1e-15, `phi < -π/2: ${phi}`);
74
+ assert.ok(phi <= Math.PI / 2 + 1e-15, `phi > +π/2: ${phi}`);
75
+ }
76
+ });
77
+ test('handles origin: atan2(0,0) returns 0 in JS (documents behavior)', () => {
78
+ const a = 10;
79
+ const c = 9;
80
+ absClose(planetographicLatitudeOblate(0, 0, 0, a, c), 0, 0);
81
+ });
82
+ test('throws TypeError when any input is not finite', () => {
83
+ const a = 10;
84
+ const c = 9;
85
+ assert.throws(() => planetographicLatitudeOblate(Number.NaN, 0, 0, a, c), (err) => err instanceof TypeError &&
86
+ err.message === 'x must be finite. Received: NaN');
87
+ assert.throws(() => planetographicLatitudeOblate(0, Number.POSITIVE_INFINITY, 0, a, c), (err) => err instanceof TypeError &&
88
+ err.message === 'y must be finite. Received: Infinity');
89
+ assert.throws(() => planetographicLatitudeOblate(0, 0, Number.NEGATIVE_INFINITY, a, c), (err) => err instanceof TypeError &&
90
+ err.message === 'z must be finite. Received: -Infinity');
91
+ assert.throws(() => planetographicLatitudeOblate(0, 0, 0, Number.NaN, c), (err) => err instanceof TypeError &&
92
+ err.message === 'a must be finite. Received: NaN');
93
+ assert.throws(() => planetographicLatitudeOblate(0, 0, 0, a, Number.POSITIVE_INFINITY), (err) => err instanceof TypeError &&
94
+ err.message === 'c must be finite. Received: Infinity');
95
+ });
96
+ test('throws RangeError when a <= 0 or c <= 0', () => {
97
+ assert.throws(() => planetographicLatitudeOblate(0, 0, 0, 0, 1), (err) => err instanceof RangeError &&
98
+ err.message === 'a must be > 0. Received: 0');
99
+ assert.throws(() => planetographicLatitudeOblate(0, 0, 0, 1, 0), (err) => err instanceof RangeError &&
100
+ err.message === 'c must be > 0. Received: 0');
101
+ });
102
+ });
103
+ //# sourceMappingURL=planetographic-latitude-oblate.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planetographic-latitude-oblate.spec.js","sourceRoot":"","sources":["../../../../src/categories/cartography/__tests__/planetographic-latitude-oblate.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import { Matrix3x3Type, Radians } from '@interstellar-tools/types';
2
+ /**
3
+ * Build the **IAU-style inertial → body-fixed** direction cosine matrix (DCM).
4
+ *
5
+ * This constructs the 3×3 rotation matrix that transforms a vector expressed in an inertial
6
+ * frame (commonly ICRF/J2000-like) into the body-fixed, planetocentric frame defined by:
7
+ * - the body's north pole right ascension ($ \alpha_p $),
8
+ * - the body's north pole declination ($ \delta_p $),
9
+ * - the prime meridian angle ($ W(t) $).
10
+ *
11
+ * Using the common 3-1-3 sequence:
12
+ *
13
+ * $$
14
+ * \mathbf R_{\text{BF}\leftarrow\text{ICRF}} =
15
+ * \mathbf R_3(W)\,\mathbf R_1\!\left(\frac{\pi}{2}-\delta_p\right)\,\mathbf R_3\!\left(\frac{\pi}{2}+\alpha_p\right)
16
+ * $$
17
+ *
18
+ * ::: info Notes:
19
+ *
20
+ * - All angles are in **radians**.
21
+ * - Matrices are **row-major** (`M[row][col]`).
22
+ * - The returned matrix can be applied to inertial vectors via `applyMatrix3(R, v)`.
23
+ *
24
+ * :::
25
+ *
26
+ * @param alphaP - Right ascension of the north pole ($ \alpha_p $) in radians (finite).
27
+ * @param deltaP - Declination of the north pole ($ \delta_p $) in radians (finite).
28
+ * @param W - Prime meridian angle ($ W(t) $) in radians (finite).
29
+ * @returns {Matrix3x3Type} 3×3 DCM ($ \mathbf R_{\text{BF}\leftarrow\text{ICRF}} $) (row-major).
30
+ * @throws {TypeError} If any input is not a finite number.
31
+ * @group Cartography
32
+ *
33
+ * @example
34
+ * ```ts
35
+ * // Given IAU pole and prime meridian angles (radians):
36
+ * const R = bodyFixedFromInertialDcmIAU(alphaP, deltaP, W);
37
+ *
38
+ * // Transform an inertial vector into body-fixed:
39
+ * const vBF = applyMatrix3(R, vICRF);
40
+ * ```
41
+ *
42
+ * @see {@link applyMatrix3}
43
+ * @see https://naif.jpl.nasa.gov/pub/naif/toolkit_docs/FORTRAN/req/pck.html NAIF SPICE PCK Required Reading (RA, DEC, W orientation model)
44
+ * @see https://naif.jpl.nasa.gov/pub/naif/toolkit_docs/C/req/frames.html NAIF SPICE Frames Required Reading (reference frames and transformations)
45
+ * @see https://naif.jpl.nasa.gov/pub/naif/toolkit_docs/C/cspice/tipbod_c.html SPICE `tipbod_c` (inertial → body-equator-and-prime-meridian rotation)
46
+ * @see https://www.iau.org/WG100/WG100/Home.aspx IAU WGCCRE / WG100 (cartographic coordinates & rotational elements reports)
47
+ * @see https://aa.usno.navy.mil/downloads/reports/Archinaletal2011a.pdf Archinal et al. (2011) IAU WGCCRE report (pole and prime meridian definitions)
48
+ */
49
+ export declare const bodyFixedFromInertialDcmIAU: (alphaP: Radians, deltaP: Radians, W: Radians) => Matrix3x3Type;
50
+ //# sourceMappingURL=body-fixed-from-inertial-dcm-iau.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"body-fixed-from-inertial-dcm-iau.d.ts","sourceRoot":"","sources":["../../../src/categories/cartography/body-fixed-from-inertial-dcm-iau.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAMnE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,eAAO,MAAM,2BAA2B,GACtC,QAAQ,OAAO,EACf,QAAQ,OAAO,EACf,GAAG,OAAO,KACT,aAiBF,CAAC"}
@@ -0,0 +1,64 @@
1
+ import { matMul3 } from '../helpers/mat-mul3';
2
+ import { rot1 } from '../helpers/rot-1';
3
+ import { rot3 } from '../helpers/rot-3';
4
+ /**
5
+ * Build the **IAU-style inertial → body-fixed** direction cosine matrix (DCM).
6
+ *
7
+ * This constructs the 3×3 rotation matrix that transforms a vector expressed in an inertial
8
+ * frame (commonly ICRF/J2000-like) into the body-fixed, planetocentric frame defined by:
9
+ * - the body's north pole right ascension ($ \alpha_p $),
10
+ * - the body's north pole declination ($ \delta_p $),
11
+ * - the prime meridian angle ($ W(t) $).
12
+ *
13
+ * Using the common 3-1-3 sequence:
14
+ *
15
+ * $$
16
+ * \mathbf R_{\text{BF}\leftarrow\text{ICRF}} =
17
+ * \mathbf R_3(W)\,\mathbf R_1\!\left(\frac{\pi}{2}-\delta_p\right)\,\mathbf R_3\!\left(\frac{\pi}{2}+\alpha_p\right)
18
+ * $$
19
+ *
20
+ * ::: info Notes:
21
+ *
22
+ * - All angles are in **radians**.
23
+ * - Matrices are **row-major** (`M[row][col]`).
24
+ * - The returned matrix can be applied to inertial vectors via `applyMatrix3(R, v)`.
25
+ *
26
+ * :::
27
+ *
28
+ * @param alphaP - Right ascension of the north pole ($ \alpha_p $) in radians (finite).
29
+ * @param deltaP - Declination of the north pole ($ \delta_p $) in radians (finite).
30
+ * @param W - Prime meridian angle ($ W(t) $) in radians (finite).
31
+ * @returns {Matrix3x3Type} 3×3 DCM ($ \mathbf R_{\text{BF}\leftarrow\text{ICRF}} $) (row-major).
32
+ * @throws {TypeError} If any input is not a finite number.
33
+ * @group Cartography
34
+ *
35
+ * @example
36
+ * ```ts
37
+ * // Given IAU pole and prime meridian angles (radians):
38
+ * const R = bodyFixedFromInertialDcmIAU(alphaP, deltaP, W);
39
+ *
40
+ * // Transform an inertial vector into body-fixed:
41
+ * const vBF = applyMatrix3(R, vICRF);
42
+ * ```
43
+ *
44
+ * @see {@link applyMatrix3}
45
+ * @see https://naif.jpl.nasa.gov/pub/naif/toolkit_docs/FORTRAN/req/pck.html NAIF SPICE PCK Required Reading (RA, DEC, W orientation model)
46
+ * @see https://naif.jpl.nasa.gov/pub/naif/toolkit_docs/C/req/frames.html NAIF SPICE Frames Required Reading (reference frames and transformations)
47
+ * @see https://naif.jpl.nasa.gov/pub/naif/toolkit_docs/C/cspice/tipbod_c.html SPICE `tipbod_c` (inertial → body-equator-and-prime-meridian rotation)
48
+ * @see https://www.iau.org/WG100/WG100/Home.aspx IAU WGCCRE / WG100 (cartographic coordinates & rotational elements reports)
49
+ * @see https://aa.usno.navy.mil/downloads/reports/Archinaletal2011a.pdf Archinal et al. (2011) IAU WGCCRE report (pole and prime meridian definitions)
50
+ */
51
+ export const bodyFixedFromInertialDcmIAU = (alphaP, deltaP, W) => {
52
+ for (const [name, v] of [
53
+ ['alphaP', alphaP],
54
+ ['deltaP', deltaP],
55
+ ['W', W]
56
+ ]) {
57
+ if (!Number.isFinite(v))
58
+ throw new TypeError(`${name} must be finite. Received: ${v}`);
59
+ }
60
+ const halfPi = (Math.PI / 2);
61
+ // R3(W) * R1(π/2 - δp) * R3(π/2 + αp)
62
+ return matMul3(matMul3(rot3(W), rot1((halfPi - deltaP))), rot3((halfPi + alphaP)));
63
+ };
64
+ //# sourceMappingURL=body-fixed-from-inertial-dcm-iau.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"body-fixed-from-inertial-dcm-iau.js","sourceRoot":"","sources":["../../../src/categories/cartography/body-fixed-from-inertial-dcm-iau.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAExC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CACzC,MAAe,EACf,MAAe,EACf,CAAU,EACK,EAAE;IACjB,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI;QACtB,CAAC,QAAQ,EAAE,MAAM,CAAC;QAClB,CAAC,QAAQ,EAAE,MAAM,CAAC;QAClB,CAAC,GAAG,EAAE,CAAC,CAAC;KACA,EAAE,CAAC;QACX,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YACrB,MAAM,IAAI,SAAS,CAAC,GAAG,IAAI,8BAA8B,CAAC,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAY,CAAC;IAExC,sCAAsC;IACtC,OAAO,OAAO,CACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,GAAG,MAAM,CAAY,CAAC,CAAC,EACpD,IAAI,CAAC,CAAC,MAAM,GAAG,MAAM,CAAY,CAAC,CACnC,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Compute **first eccentricity squared** ($ e^2 $) for an oblate spheroid.
3
+ *
4
+ * The first eccentricity describes how much an oblate spheroid (ellipsoid of revolution)
5
+ * deviates from a perfect sphere. For equatorial radius ($ a $) and polar radius ($ c $):
6
+ *
7
+ * $$
8
+ * e^2 = 1 - \frac{c^2}{a^2}
9
+ * $$
10
+ *
11
+ * ::: info Notes:
12
+ *
13
+ * - ($ e^2 $) is **dimensionless**.
14
+ * - For a physically valid oblate spheroid with ($ a \ge c > 0 $), ($ 0 \le e^2 < 1 $).
15
+ * - This quantity is widely used in geodesy and mapping formulas (e.g., planetographic latitude,
16
+ * geodetic coordinates, map projections).
17
+ *
18
+ * :::
19
+ *
20
+ * @param a - Equatorial radius ($ a $) (finite, > 0).
21
+ * @param c - Polar radius ($ c $) (finite, > 0).
22
+ * @returns First eccentricity squared ($ e^2 $) (dimensionless).
23
+ * @throws {TypeError} If `a` or `c` is not a finite number.
24
+ * @throws {RangeError} If `a <= 0` or `c <= 0`.
25
+ * @group Cartography
26
+ *
27
+ * @example
28
+ * ```ts
29
+ * // Earth (WGS84-ish radii in meters):
30
+ * const a = 6378137.0;
31
+ * const c = 6356752.314245;
32
+ * const e2 = eccentricitySquaredOblateSpheroid(a, c);
33
+ * ```
34
+ *
35
+ * @see https://en.wikipedia.org/wiki/Eccentricity_(mathematics)#Ellipses_and_ellipsoids Eccentricity for ellipses/ellipsoids (includes first eccentricity)
36
+ * @see https://en.wikipedia.org/wiki/Reference_ellipsoid Reference ellipsoid (geodesy context; uses a, b and eccentricity)
37
+ * @see https://epsg.org/guidance-notes.html EPSG Guidance Notes (geodesy reference; ellipsoid parameters and derived quantities)
38
+ */
39
+ export declare const eccentricitySquaredOblateSpheroid: (a: number, c: number) => number;
40
+ //# sourceMappingURL=eccentricity-squared-oblate-spheroid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eccentricity-squared-oblate-spheroid.d.ts","sourceRoot":"","sources":["../../../src/categories/cartography/eccentricity-squared-oblate-spheroid.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,eAAO,MAAM,iCAAiC,GAC5C,GAAG,MAAM,EACT,GAAG,MAAM,KACR,MAYF,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Compute **first eccentricity squared** ($ e^2 $) for an oblate spheroid.
3
+ *
4
+ * The first eccentricity describes how much an oblate spheroid (ellipsoid of revolution)
5
+ * deviates from a perfect sphere. For equatorial radius ($ a $) and polar radius ($ c $):
6
+ *
7
+ * $$
8
+ * e^2 = 1 - \frac{c^2}{a^2}
9
+ * $$
10
+ *
11
+ * ::: info Notes:
12
+ *
13
+ * - ($ e^2 $) is **dimensionless**.
14
+ * - For a physically valid oblate spheroid with ($ a \ge c > 0 $), ($ 0 \le e^2 < 1 $).
15
+ * - This quantity is widely used in geodesy and mapping formulas (e.g., planetographic latitude,
16
+ * geodetic coordinates, map projections).
17
+ *
18
+ * :::
19
+ *
20
+ * @param a - Equatorial radius ($ a $) (finite, > 0).
21
+ * @param c - Polar radius ($ c $) (finite, > 0).
22
+ * @returns First eccentricity squared ($ e^2 $) (dimensionless).
23
+ * @throws {TypeError} If `a` or `c` is not a finite number.
24
+ * @throws {RangeError} If `a <= 0` or `c <= 0`.
25
+ * @group Cartography
26
+ *
27
+ * @example
28
+ * ```ts
29
+ * // Earth (WGS84-ish radii in meters):
30
+ * const a = 6378137.0;
31
+ * const c = 6356752.314245;
32
+ * const e2 = eccentricitySquaredOblateSpheroid(a, c);
33
+ * ```
34
+ *
35
+ * @see https://en.wikipedia.org/wiki/Eccentricity_(mathematics)#Ellipses_and_ellipsoids Eccentricity for ellipses/ellipsoids (includes first eccentricity)
36
+ * @see https://en.wikipedia.org/wiki/Reference_ellipsoid Reference ellipsoid (geodesy context; uses a, b and eccentricity)
37
+ * @see https://epsg.org/guidance-notes.html EPSG Guidance Notes (geodesy reference; ellipsoid parameters and derived quantities)
38
+ */
39
+ export const eccentricitySquaredOblateSpheroid = (a, c) => {
40
+ if (!Number.isFinite(a))
41
+ throw new TypeError(`a must be finite. Received: ${a}`);
42
+ if (!Number.isFinite(c))
43
+ throw new TypeError(`c must be finite. Received: ${c}`);
44
+ if (a <= 0)
45
+ throw new RangeError(`a must be > 0. Received: ${a}`);
46
+ if (c <= 0)
47
+ throw new RangeError(`c must be > 0. Received: ${c}`);
48
+ return 1 - (c * c) / (a * a);
49
+ };
50
+ //# sourceMappingURL=eccentricity-squared-oblate-spheroid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eccentricity-squared-oblate-spheroid.js","sourceRoot":"","sources":["../../../src/categories/cartography/eccentricity-squared-oblate-spheroid.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAC/C,CAAS,EACT,CAAS,EACD,EAAE;IACV,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QACrB,MAAM,IAAI,SAAS,CAAC,+BAA+B,CAAC,EAAE,CAAC,CAAC;IAE1D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QACrB,MAAM,IAAI,SAAS,CAAC,+BAA+B,CAAC,EAAE,CAAC,CAAC;IAE1D,IAAI,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,4BAA4B,CAAC,EAAE,CAAC,CAAC;IAElE,IAAI,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,4BAA4B,CAAC,EAAE,CAAC,CAAC;IAElE,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/B,CAAC,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Compute **flattening** ($ f $) of an oblate spheroid.
3
+ *
4
+ * Flattening quantifies how much an ellipsoid of revolution is "squashed" at the poles,
5
+ * using equatorial radius ($ a $) and polar radius ($ c $):
6
+ *
7
+ * $$
8
+ * f = \frac{a - c}{a}
9
+ * $$
10
+ *
11
+ * ::: info Notes:
12
+ *
13
+ * - ($ f $) is **dimensionless**.
14
+ * - For a physically valid oblate spheroid with ($ a \ge c > 0 $), ($ 0 \le f < 1 $).
15
+ * - Commonly used in geodesy/cartography (e.g., defining reference ellipsoids and deriving
16
+ * related parameters like eccentricity).
17
+ *
18
+ * :::
19
+ *
20
+ * @param a - Equatorial radius ($ a $) (finite, > 0).
21
+ * @param c - Polar radius ($ c $) (finite, > 0).
22
+ * @returns Flattening ($ f $) (dimensionless).
23
+ * @throws {TypeError} If `a` or `c` is not a finite number.
24
+ * @throws {RangeError} If `a <= 0` or `c <= 0`.
25
+ * @group Cartography
26
+ *
27
+ * @example
28
+ * ```ts
29
+ * // Earth (WGS84-ish radii in meters):
30
+ * const a = 6378137.0;
31
+ * const c = 6356752.314245;
32
+ * const f = flatteningOblateSpheroid(a, c);
33
+ * ```
34
+ *
35
+ * @see https://en.wikipedia.org/wiki/Flattening Flattening (definition and geodesy usage)
36
+ * @see https://en.wikipedia.org/wiki/Reference_ellipsoid Reference ellipsoid (a, b/c, and flattening used to define ellipsoids)
37
+ * @see https://epsg.org/guidance-notes.html EPSG Guidance Notes (geodesy reference; ellipsoid parameters and derived quantities)
38
+ */
39
+ export declare const flatteningOblateSpheroid: (a: number, c: number) => number;
40
+ //# sourceMappingURL=flattening-oblate-spheroid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flattening-oblate-spheroid.d.ts","sourceRoot":"","sources":["../../../src/categories/cartography/flattening-oblate-spheroid.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,eAAO,MAAM,wBAAwB,GAAI,GAAG,MAAM,EAAE,GAAG,MAAM,KAAG,MAY/D,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Compute **flattening** ($ f $) of an oblate spheroid.
3
+ *
4
+ * Flattening quantifies how much an ellipsoid of revolution is "squashed" at the poles,
5
+ * using equatorial radius ($ a $) and polar radius ($ c $):
6
+ *
7
+ * $$
8
+ * f = \frac{a - c}{a}
9
+ * $$
10
+ *
11
+ * ::: info Notes:
12
+ *
13
+ * - ($ f $) is **dimensionless**.
14
+ * - For a physically valid oblate spheroid with ($ a \ge c > 0 $), ($ 0 \le f < 1 $).
15
+ * - Commonly used in geodesy/cartography (e.g., defining reference ellipsoids and deriving
16
+ * related parameters like eccentricity).
17
+ *
18
+ * :::
19
+ *
20
+ * @param a - Equatorial radius ($ a $) (finite, > 0).
21
+ * @param c - Polar radius ($ c $) (finite, > 0).
22
+ * @returns Flattening ($ f $) (dimensionless).
23
+ * @throws {TypeError} If `a` or `c` is not a finite number.
24
+ * @throws {RangeError} If `a <= 0` or `c <= 0`.
25
+ * @group Cartography
26
+ *
27
+ * @example
28
+ * ```ts
29
+ * // Earth (WGS84-ish radii in meters):
30
+ * const a = 6378137.0;
31
+ * const c = 6356752.314245;
32
+ * const f = flatteningOblateSpheroid(a, c);
33
+ * ```
34
+ *
35
+ * @see https://en.wikipedia.org/wiki/Flattening Flattening (definition and geodesy usage)
36
+ * @see https://en.wikipedia.org/wiki/Reference_ellipsoid Reference ellipsoid (a, b/c, and flattening used to define ellipsoids)
37
+ * @see https://epsg.org/guidance-notes.html EPSG Guidance Notes (geodesy reference; ellipsoid parameters and derived quantities)
38
+ */
39
+ export const flatteningOblateSpheroid = (a, c) => {
40
+ if (!Number.isFinite(a))
41
+ throw new TypeError(`a must be finite. Received: ${a}`);
42
+ if (!Number.isFinite(c))
43
+ throw new TypeError(`c must be finite. Received: ${c}`);
44
+ if (a <= 0)
45
+ throw new RangeError(`a must be > 0. Received: ${a}`);
46
+ if (c <= 0)
47
+ throw new RangeError(`c must be > 0. Received: ${c}`);
48
+ return (a - c) / a;
49
+ };
50
+ //# sourceMappingURL=flattening-oblate-spheroid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flattening-oblate-spheroid.js","sourceRoot":"","sources":["../../../src/categories/cartography/flattening-oblate-spheroid.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAS,EAAE,CAAS,EAAU,EAAE;IACvE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QACrB,MAAM,IAAI,SAAS,CAAC,+BAA+B,CAAC,EAAE,CAAC,CAAC;IAE1D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QACrB,MAAM,IAAI,SAAS,CAAC,+BAA+B,CAAC,EAAE,CAAC,CAAC;IAE1D,IAAI,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,4BAA4B,CAAC,EAAE,CAAC,CAAC;IAElE,IAAI,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,4BAA4B,CAAC,EAAE,CAAC,CAAC;IAElE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC,CAAC"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Test whether a 3D point lies on the surface of a **triaxial ellipsoid** (within a tolerance).
3
+ *
4
+ * A triaxial ellipsoid centered at the origin with semi-axes ($ a $), ($ b $), ($ c $) aligned to
5
+ * the ($ x $), ($ y $), ($ z $) axes is defined by the implicit surface:
6
+ *
7
+ * $$
8
+ * \frac{x^2}{a^2} + \frac{y^2}{b^2} + \frac{z^2}{c^2} = 1
9
+ * $$
10
+ *
11
+ * This function evaluates the left-hand side and checks whether it is within `eps` of 1.
12
+ *
13
+ * ::: info Notes:
14
+ *
15
+ * - This is a **pure geometric** surface membership test; it does not compute the closest
16
+ * point on the ellipsoid or any geodetic latitude/longitude.
17
+ * - For ellipsoids of revolution (oblate/prolate), you typically have ($ a=b $), but this
18
+ * supports the general triaxial case.
19
+ *
20
+ * :::
21
+ *
22
+ * @param x - X coordinate (finite).
23
+ * @param y - Y coordinate (finite).
24
+ * @param z - Z coordinate (finite).
25
+ * @param a - Semi-axis length along x (finite, > 0).
26
+ * @param b - Semi-axis length along y (finite, > 0).
27
+ * @param c - Semi-axis length along z (finite, > 0).
28
+ * @param eps - Allowed absolute tolerance on the implicit value (finite, >= 0). Defaults to `1e-12`.
29
+ * @returns `true` if the point satisfies the ellipsoid equation within `eps`, otherwise `false`.
30
+ * @throws {TypeError} If any input is not a finite number.
31
+ * @throws {RangeError} If `a <= 0`, `b <= 0`, `c <= 0`, or `eps < 0`.
32
+ * @group Cartography
33
+ *
34
+ * @example
35
+ * ```ts
36
+ * // Ellipsoid with semi-axes a=3, b=2, c=1
37
+ * // Point on +X axis should be on the surface: (x,y,z) = (a,0,0)
38
+ * const onSurface = isOnTriaxialEllipsoidSurface(3, 0, 0, 3, 2, 1);
39
+ * // onSurface === true
40
+ * ```
41
+ *
42
+ * @example
43
+ * ```ts
44
+ * // Slightly off the surface (use a looser eps if needed)
45
+ * const onSurface = isOnTriaxialEllipsoidSurface(3.0000001, 0, 0, 3, 2, 1, 1e-6);
46
+ * // onSurface === true
47
+ * ```
48
+ *
49
+ * @see https://en.wikipedia.org/wiki/Ellipsoid Ellipsoid (general definition and implicit equation)
50
+ * @see https://mathworld.wolfram.com/Ellipsoid.html Wolfram MathWorld — Ellipsoid (properties and equations)
51
+ * @see https://en.wikipedia.org/wiki/Triaxial_ellipsoid Triaxial ellipsoid (special case discussion)
52
+ */
53
+ export declare const isOnTriaxialEllipsoidSurface: (x: number, y: number, z: number, a: number, b: number, c: number, eps?: number) => boolean;
54
+ //# sourceMappingURL=is-on-triaxial-ellipsoid-surface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-on-triaxial-ellipsoid-surface.d.ts","sourceRoot":"","sources":["../../../src/categories/cartography/is-on-triaxial-ellipsoid-surface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AACH,eAAO,MAAM,4BAA4B,GACvC,GAAG,MAAM,EACT,GAAG,MAAM,EACT,GAAG,MAAM,EACT,GAAG,MAAM,EACT,GAAG,MAAM,EACT,GAAG,MAAM,EACT,YAAW,KACV,OAyBF,CAAC"}