@interstellar-tools/equations 0.62.0 → 0.63.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/categories/angle/compute-angle.d.ts +5 -4
- package/dist/categories/angle/compute-angle.d.ts.map +1 -1
- package/dist/categories/angle/compute-angle.js +5 -4
- package/dist/categories/angle/compute-angle.js.map +1 -1
- package/dist/categories/anomalies/advance-mean-anomaly.d.ts +15 -12
- package/dist/categories/anomalies/advance-mean-anomaly.d.ts.map +1 -1
- package/dist/categories/anomalies/advance-mean-anomaly.js +18 -29
- package/dist/categories/anomalies/advance-mean-anomaly.js.map +1 -1
- package/dist/categories/anomalies/anomaly-at.d.ts +61 -0
- package/dist/categories/anomalies/anomaly-at.d.ts.map +1 -0
- package/dist/categories/anomalies/anomaly-at.js +81 -0
- package/dist/categories/anomalies/anomaly-at.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
- package/dist/categories/anomalies/utils/are-equal.d.ts +0 -10
- package/dist/categories/anomalies/utils/are-equal.d.ts.map +0 -1
- package/dist/categories/anomalies/utils/are-equal.js +0 -13
- package/dist/categories/anomalies/utils/are-equal.js.map +0 -1
|
@@ -5,7 +5,8 @@ import type { OrbitInterface, Radians, TimeStepInterface } from '@interstellar-t
|
|
|
5
5
|
*
|
|
6
6
|
* The orbit's `angle` is the starting true anomaly. There is no date input:
|
|
7
7
|
* call this once per frame or step, and feed the result back in as the next
|
|
8
|
-
* `angle` to move the body over time.
|
|
8
|
+
* `angle` to move the body over time. To find a body at a given date instead,
|
|
9
|
+
* use {@link trueAnomalyAt}.
|
|
9
10
|
*
|
|
10
11
|
* **Step 1: Mean anomaly after the time step ($M$)**
|
|
11
12
|
*
|
|
@@ -15,9 +16,9 @@ import type { OrbitInterface, Radians, TimeStepInterface } from '@interstellar-t
|
|
|
15
16
|
* - $M_0$ is the mean anomaly at the start, converted from the true anomaly
|
|
16
17
|
* `angle` (equal to it when $e = 0$).
|
|
17
18
|
* - $n$ is the mean motion, from the period $P$ converted to days. The sign of
|
|
18
|
-
* $P$ is ignored, so
|
|
19
|
-
* - $\Delta t$ is `timeStep.value` in days
|
|
20
|
-
*
|
|
19
|
+
* $P$ is ignored, so a positive step always moves the body forward.
|
|
20
|
+
* - $\Delta t$ is `timeStep.value` in days. It can be any length, and negative
|
|
21
|
+
* to go back in time.
|
|
21
22
|
*
|
|
22
23
|
* The result is wrapped to $[0, 2\pi)$.
|
|
23
24
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compute-angle.d.ts","sourceRoot":"","sources":["../../../src/categories/angle/compute-angle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,OAAO,EACP,iBAAiB,EAClB,MAAM,2BAA2B,CAAC;AAMnC
|
|
1
|
+
{"version":3,"file":"compute-angle.d.ts","sourceRoot":"","sources":["../../../src/categories/angle/compute-angle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,OAAO,EACP,iBAAiB,EAClB,MAAM,2BAA2B,CAAC;AAMnC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AACH,eAAO,MAAM,YAAY,GACvB,OAAO,IAAI,CAAC,cAAc,EAAE,GAAG,GAAG,OAAO,GAAG,QAAQ,CAAC,EACrD,UAAU,iBAAiB,KAC1B,OASF,CAAC"}
|
|
@@ -7,7 +7,8 @@ import { solveKepler } from '../kepler/solve-kepler.js';
|
|
|
7
7
|
*
|
|
8
8
|
* The orbit's `angle` is the starting true anomaly. There is no date input:
|
|
9
9
|
* call this once per frame or step, and feed the result back in as the next
|
|
10
|
-
* `angle` to move the body over time.
|
|
10
|
+
* `angle` to move the body over time. To find a body at a given date instead,
|
|
11
|
+
* use {@link trueAnomalyAt}.
|
|
11
12
|
*
|
|
12
13
|
* **Step 1: Mean anomaly after the time step ($M$)**
|
|
13
14
|
*
|
|
@@ -17,9 +18,9 @@ import { solveKepler } from '../kepler/solve-kepler.js';
|
|
|
17
18
|
* - $M_0$ is the mean anomaly at the start, converted from the true anomaly
|
|
18
19
|
* `angle` (equal to it when $e = 0$).
|
|
19
20
|
* - $n$ is the mean motion, from the period $P$ converted to days. The sign of
|
|
20
|
-
* $P$ is ignored, so
|
|
21
|
-
* - $\Delta t$ is `timeStep.value` in days
|
|
22
|
-
*
|
|
21
|
+
* $P$ is ignored, so a positive step always moves the body forward.
|
|
22
|
+
* - $\Delta t$ is `timeStep.value` in days. It can be any length, and negative
|
|
23
|
+
* to go back in time.
|
|
23
24
|
*
|
|
24
25
|
* The result is wrapped to $[0, 2\pi)$.
|
|
25
26
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compute-angle.js","sourceRoot":"","sources":["../../../src/categories/angle/compute-angle.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,2CAA2C,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD
|
|
1
|
+
{"version":3,"file":"compute-angle.js","sourceRoot":"","sources":["../../../src/categories/angle/compute-angle.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,2CAA2C,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,KAAqD,EACrD,QAA2B,EAClB,EAAE;IACX,0CAA0C;IAC1C,MAAM,CAAC,GAAY,kBAAkB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACvD,oDAAoD;IACpD,MAAM,CAAC,GAAY,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3C,oDAAoD;IACpD,MAAM,CAAC,GAAY,sBAAsB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAEtD,OAAO,CAAC,CAAC;AACX,CAAC,CAAC"}
|
|
@@ -3,26 +3,29 @@ import type { OrbitInterface, Radians, TemporalInterface } from '@interstellar-t
|
|
|
3
3
|
* Advances an orbit by a time step and returns its new **mean anomaly** ($M$).
|
|
4
4
|
*
|
|
5
5
|
* The orbit's `angle` (true anomaly) is the starting point. To get the eccentric
|
|
6
|
-
* anomaly from the result, pass it to {@link solveKepler}.
|
|
6
|
+
* anomaly from the result, pass it to {@link solveKepler}. To find a body at a
|
|
7
|
+
* given date, use {@link meanAnomalyAt} or {@link trueAnomalyAt}.
|
|
7
8
|
*
|
|
8
9
|
* **Mathematical Explanation:**
|
|
9
10
|
*
|
|
10
11
|
* The **mean anomaly** is a measure of the position of an orbiting body as if it moved
|
|
11
12
|
* with uniform angular motion along a circular orbit with the same period as the actual
|
|
12
|
-
* elliptical orbit. It
|
|
13
|
+
* elliptical orbit. It grows linearly with time:
|
|
13
14
|
*
|
|
14
|
-
* $$ M = M_0 + n \cdot \Delta T $$
|
|
15
|
+
* $$ M = M_0 + n \cdot \Delta T, \qquad n = \frac{2\pi}{|P|} $$
|
|
15
16
|
*
|
|
16
17
|
* where:
|
|
17
|
-
* - $M_0$ is the **initial mean anomaly
|
|
18
|
-
* - $n$ is the **mean motion**,
|
|
19
|
-
*
|
|
20
|
-
* where $P$ is the orbital period in days.
|
|
18
|
+
* - $M_0$ is the **initial mean anomaly**, converted from the true anomaly `angle`.
|
|
19
|
+
* - $n$ is the **mean motion**, from the period $P$ in days. The sign of $P$ is
|
|
20
|
+
* ignored, so a positive step always moves the body forward along its orbit.
|
|
21
21
|
* - $\Delta T$ is the time step, converted to days from its unit.
|
|
22
22
|
*
|
|
23
|
+
* The step can be any length, from a fraction of a second to many orbits, and
|
|
24
|
+
* negative to go back in time. The result is wrapped to $[0, 2\pi)$.
|
|
25
|
+
*
|
|
23
26
|
* @param {Pick<OrbitInterface, 'e' | 'angle' | 'period'>} orbit - The body's orbit, for example `body.orbit` from a dataset.
|
|
24
|
-
* @param {TemporalInterface} timeStep -
|
|
25
|
-
* @returns {Radians} The
|
|
27
|
+
* @param {TemporalInterface} timeStep - How far to advance, in any temporal unit; negative goes back in time.
|
|
28
|
+
* @returns {Radians} The mean anomaly after the time step, in $[0, 2\pi)$.
|
|
26
29
|
*
|
|
27
30
|
* @throws {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RangeError | RangeError} If the orbit's eccentricity is outside the range $0 \leq e < 1$.
|
|
28
31
|
*
|
|
@@ -36,9 +39,9 @@ import type { OrbitInterface, Radians, TemporalInterface } from '@interstellar-t
|
|
|
36
39
|
* period: { value: 687, unit: 'd' } // Orbital period in days
|
|
37
40
|
* };
|
|
38
41
|
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
+
* advanceMeanAnomaly(marsOrbit, { value: 1, unit: 'd' }); // one day on
|
|
43
|
+
* advanceMeanAnomaly(marsOrbit, { value: 10, unit: 'yr' }); // ten years on
|
|
44
|
+
* advanceMeanAnomaly(marsOrbit, { value: -1, unit: 'd' }); // one day back
|
|
42
45
|
* ```
|
|
43
46
|
*
|
|
44
47
|
* @see {@link solveKepler} to convert the mean anomaly to the eccentric anomaly.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"advance-mean-anomaly.d.ts","sourceRoot":"","sources":["../../../src/categories/anomalies/advance-mean-anomaly.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,cAAc,EACd,OAAO,EACP,iBAAiB,EAClB,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"advance-mean-anomaly.d.ts","sourceRoot":"","sources":["../../../src/categories/anomalies/advance-mean-anomaly.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,cAAc,EACd,OAAO,EACP,iBAAiB,EAClB,MAAM,2BAA2B,CAAC;AAOnC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AAEH,eAAO,MAAM,kBAAkB,GAC7B,OAAO,IAAI,CAAC,cAAc,EAAE,GAAG,GAAG,OAAO,GAAG,QAAQ,CAAC,EACrD,UAAU,iBAAiB,KAC1B,OAiBF,CAAC"}
|
|
@@ -1,33 +1,35 @@
|
|
|
1
1
|
import { TWO_PI } from '@interstellar-tools/constants';
|
|
2
2
|
import { convertTemporalUnit } from '@interstellar-tools/temporal';
|
|
3
|
-
import {
|
|
3
|
+
import { norm2pi } from '../helpers/misc.js';
|
|
4
4
|
import { trueToMeanAnomaly } from './true-to-mean-anomaly.js';
|
|
5
|
-
import { areEqual } from './utils/are-equal.js';
|
|
6
5
|
/* node:coverage disable */
|
|
7
6
|
/**
|
|
8
7
|
* Advances an orbit by a time step and returns its new **mean anomaly** ($M$).
|
|
9
8
|
*
|
|
10
9
|
* The orbit's `angle` (true anomaly) is the starting point. To get the eccentric
|
|
11
|
-
* anomaly from the result, pass it to {@link solveKepler}.
|
|
10
|
+
* anomaly from the result, pass it to {@link solveKepler}. To find a body at a
|
|
11
|
+
* given date, use {@link meanAnomalyAt} or {@link trueAnomalyAt}.
|
|
12
12
|
*
|
|
13
13
|
* **Mathematical Explanation:**
|
|
14
14
|
*
|
|
15
15
|
* The **mean anomaly** is a measure of the position of an orbiting body as if it moved
|
|
16
16
|
* with uniform angular motion along a circular orbit with the same period as the actual
|
|
17
|
-
* elliptical orbit. It
|
|
17
|
+
* elliptical orbit. It grows linearly with time:
|
|
18
18
|
*
|
|
19
|
-
* $$ M = M_0 + n \cdot \Delta T $$
|
|
19
|
+
* $$ M = M_0 + n \cdot \Delta T, \qquad n = \frac{2\pi}{|P|} $$
|
|
20
20
|
*
|
|
21
21
|
* where:
|
|
22
|
-
* - $M_0$ is the **initial mean anomaly
|
|
23
|
-
* - $n$ is the **mean motion**,
|
|
24
|
-
*
|
|
25
|
-
* where $P$ is the orbital period in days.
|
|
22
|
+
* - $M_0$ is the **initial mean anomaly**, converted from the true anomaly `angle`.
|
|
23
|
+
* - $n$ is the **mean motion**, from the period $P$ in days. The sign of $P$ is
|
|
24
|
+
* ignored, so a positive step always moves the body forward along its orbit.
|
|
26
25
|
* - $\Delta T$ is the time step, converted to days from its unit.
|
|
27
26
|
*
|
|
27
|
+
* The step can be any length, from a fraction of a second to many orbits, and
|
|
28
|
+
* negative to go back in time. The result is wrapped to $[0, 2\pi)$.
|
|
29
|
+
*
|
|
28
30
|
* @param {Pick<OrbitInterface, 'e' | 'angle' | 'period'>} orbit - The body's orbit, for example `body.orbit` from a dataset.
|
|
29
|
-
* @param {TemporalInterface} timeStep -
|
|
30
|
-
* @returns {Radians} The
|
|
31
|
+
* @param {TemporalInterface} timeStep - How far to advance, in any temporal unit; negative goes back in time.
|
|
32
|
+
* @returns {Radians} The mean anomaly after the time step, in $[0, 2\pi)$.
|
|
31
33
|
*
|
|
32
34
|
* @throws {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RangeError | RangeError} If the orbit's eccentricity is outside the range $0 \leq e < 1$.
|
|
33
35
|
*
|
|
@@ -41,9 +43,9 @@ import { areEqual } from './utils/are-equal.js';
|
|
|
41
43
|
* period: { value: 687, unit: 'd' } // Orbital period in days
|
|
42
44
|
* };
|
|
43
45
|
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
46
|
+
* advanceMeanAnomaly(marsOrbit, { value: 1, unit: 'd' }); // one day on
|
|
47
|
+
* advanceMeanAnomaly(marsOrbit, { value: 10, unit: 'yr' }); // ten years on
|
|
48
|
+
* advanceMeanAnomaly(marsOrbit, { value: -1, unit: 'd' }); // one day back
|
|
47
49
|
* ```
|
|
48
50
|
*
|
|
49
51
|
* @see {@link solveKepler} to convert the mean anomaly to the eccentric anomaly.
|
|
@@ -61,21 +63,8 @@ export const advanceMeanAnomaly = (orbit, timeStep) => {
|
|
|
61
63
|
const periodInDays = convertTemporalUnit(period, 'd').value;
|
|
62
64
|
const timeStepInDays = convertTemporalUnit(timeStep, 'd').value;
|
|
63
65
|
const meanMotion = TWO_PI / Math.abs(periodInDays);
|
|
64
|
-
// Convert true anomaly (V) to mean anomaly (M0)
|
|
66
|
+
// Convert true anomaly (V) to mean anomaly (M0)
|
|
65
67
|
const M0 = e === 0 ? angle : trueToMeanAnomaly(angle, e);
|
|
66
|
-
|
|
67
|
-
return M0;
|
|
68
|
-
}
|
|
69
|
-
// Clamping small time steps to prevent unnecessary updates
|
|
70
|
-
const minTimeStep = 1e-5; // Minimum allowed time step
|
|
71
|
-
const maxTimeStepFactor = e >= 0.9 ? 1 : 10; // Stricter limit for highly eccentric orbits
|
|
72
|
-
const clampedDeltaT = Math.max(minTimeStep, Math.min(timeStepInDays, maxTimeStepFactor * Math.abs(periodInDays)));
|
|
73
|
-
// Compute new mean anomaly with hysteresis filter and sign preservation
|
|
74
|
-
const prevM = M0;
|
|
75
|
-
let newM = wrapAngle(M0 + meanMotion * clampedDeltaT);
|
|
76
|
-
if (areEqual(newM, prevM)) {
|
|
77
|
-
newM = prevM;
|
|
78
|
-
}
|
|
79
|
-
return newM;
|
|
68
|
+
return norm2pi(M0 + meanMotion * timeStepInDays);
|
|
80
69
|
};
|
|
81
70
|
//# sourceMappingURL=advance-mean-anomaly.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"advance-mean-anomaly.js","sourceRoot":"","sources":["../../../src/categories/anomalies/advance-mean-anomaly.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAOnE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"advance-mean-anomaly.js","sourceRoot":"","sources":["../../../src/categories/anomalies/advance-mean-anomaly.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAOnE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,2BAA2B;AAC3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AACH,0BAA0B;AAC1B,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,KAAqD,EACrD,QAA2B,EAClB,EAAE;IACX,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAEnC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,UAAU,CAClB,yBAAyB,CAAC,6CAA6C,CACxE,CAAC;IACJ,CAAC;IAED,+DAA+D;IAC/D,MAAM,YAAY,GAAG,mBAAmB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC;IAC5D,MAAM,cAAc,GAAG,mBAAmB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC;IAChE,MAAM,UAAU,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACnD,gDAAgD;IAChD,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAEzD,OAAO,OAAO,CAAC,EAAE,GAAG,UAAU,GAAG,cAAc,CAAY,CAAC;AAC9D,CAAC,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { OrbitInterface, Radians } from '@interstellar-tools/types';
|
|
2
|
+
/**
|
|
3
|
+
* The **mean anomaly** ($M$) of an orbit at a given date.
|
|
4
|
+
*
|
|
5
|
+
* Every `orbit.angle` in the datasets is the true anomaly at **J2000**
|
|
6
|
+
* (2000-01-01 12:00 TT), so this advances the orbit from J2000 to `date` with
|
|
7
|
+
* {@link advanceMeanAnomaly}. Dates before J2000 work too.
|
|
8
|
+
*
|
|
9
|
+
* $$ M = M_0 + \frac{2\pi}{|P|} \, (t - t_{J2000}) $$
|
|
10
|
+
*
|
|
11
|
+
* The time is measured in UTC, as JavaScript dates are, against
|
|
12
|
+
* {@link J2000_UTC}. Leap seconds since 2000 are ignored, which moves a body by
|
|
13
|
+
* a few seconds of its orbit at most.
|
|
14
|
+
*
|
|
15
|
+
* @param {Pick<OrbitInterface, 'e' | 'angle' | 'period'>} orbit - An orbit whose `angle` is the true anomaly at J2000, for example `body.orbit` from a dataset.
|
|
16
|
+
* @param {Date} date - The date to find the body at.
|
|
17
|
+
* @returns {Radians} The mean anomaly at `date`, in $[0, 2\pi)$.
|
|
18
|
+
* @throws {TypeError} If `date` is not a valid `Date`.
|
|
19
|
+
* @throws {RangeError} If the orbit's eccentricity is outside $0 \leq e < 1$.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```ts
|
|
23
|
+
* import { PLANETS } from '@interstellar-tools/constants';
|
|
24
|
+
* import { meanAnomalyAt } from '@interstellar-tools/equations';
|
|
25
|
+
*
|
|
26
|
+
* const earth = PLANETS.find((planet) => planet.id === 'earth')!;
|
|
27
|
+
*
|
|
28
|
+
* meanAnomalyAt(earth.orbit!, new Date('2026-10-17T12:00:00Z')); // ≈ 4.934 rad (282.7°)
|
|
29
|
+
* ```
|
|
30
|
+
*
|
|
31
|
+
* @see {@link trueAnomalyAt} for where the body actually is.
|
|
32
|
+
* @group Anomalies
|
|
33
|
+
*/
|
|
34
|
+
export declare const meanAnomalyAt: (orbit: Pick<OrbitInterface, "e" | "angle" | "period">, date: Date) => Radians;
|
|
35
|
+
/**
|
|
36
|
+
* The **true anomaly** ($\nu$) of an orbit at a given date: where the body is.
|
|
37
|
+
*
|
|
38
|
+
* Takes the mean anomaly at `date` from {@link meanAnomalyAt}, solves Kepler's
|
|
39
|
+
* equation with {@link solveKepler}, and converts the result with
|
|
40
|
+
* {@link eccentricToTrueAnomaly}.
|
|
41
|
+
*
|
|
42
|
+
* @param {Pick<OrbitInterface, 'e' | 'angle' | 'period'>} orbit - An orbit whose `angle` is the true anomaly at J2000, for example `body.orbit` from a dataset.
|
|
43
|
+
* @param {Date} date - The date to find the body at.
|
|
44
|
+
* @returns {Radians} The true anomaly at `date`, in $[0, 2\pi)$.
|
|
45
|
+
* @throws {TypeError} If `date` is not a valid `Date`.
|
|
46
|
+
* @throws {RangeError} If the orbit's eccentricity is outside $0 \leq e < 1$.
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```ts
|
|
50
|
+
* import { PLANETS } from '@interstellar-tools/constants';
|
|
51
|
+
* import { trueAnomalyAt } from '@interstellar-tools/equations';
|
|
52
|
+
*
|
|
53
|
+
* const earth = PLANETS.find((planet) => planet.id === 'earth')!;
|
|
54
|
+
*
|
|
55
|
+
* trueAnomalyAt(earth.orbit!, new Date('2026-10-17T12:00:00Z')); // ≈ 4.901 rad (280.8°)
|
|
56
|
+
* ```
|
|
57
|
+
*
|
|
58
|
+
* @group Anomalies
|
|
59
|
+
*/
|
|
60
|
+
export declare const trueAnomalyAt: (orbit: Pick<OrbitInterface, "e" | "angle" | "period">, date: Date) => Radians;
|
|
61
|
+
//# sourceMappingURL=anomaly-at.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anomaly-at.d.ts","sourceRoot":"","sources":["../../../src/categories/anomalies/anomaly-at.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAkBzE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,eAAO,MAAM,aAAa,GACxB,OAAO,IAAI,CAAC,cAAc,EAAE,GAAG,GAAG,OAAO,GAAG,QAAQ,CAAC,EACrD,MAAM,IAAI,KACT,OACoE,CAAC;AAGxE;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,eAAO,MAAM,aAAa,GACxB,OAAO,IAAI,CAAC,cAAc,EAAE,GAAG,GAAG,OAAO,GAAG,QAAQ,CAAC,EACrD,MAAM,IAAI,KACT,OAMF,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { J2000_UTC, MILLISECONDS_PER_DAY } from '@interstellar-tools/constants';
|
|
2
|
+
import { norm2pi } from '../helpers/misc.js';
|
|
3
|
+
import { solveKepler } from '../kepler/solve-kepler.js';
|
|
4
|
+
import { advanceMeanAnomaly } from './advance-mean-anomaly.js';
|
|
5
|
+
import { eccentricToTrueAnomaly } from './eccentric-to-true-anomaly.js';
|
|
6
|
+
/** Days from J2000 to `date`, after checking it's a valid date. */
|
|
7
|
+
const daysSinceJ2000 = (date) => {
|
|
8
|
+
if (!(date instanceof Date) || !Number.isFinite(date.getTime())) {
|
|
9
|
+
throw new TypeError(`date must be a valid Date. Received: ${String(date)}`);
|
|
10
|
+
}
|
|
11
|
+
return (date.getTime() - J2000_UTC.getTime()) / MILLISECONDS_PER_DAY;
|
|
12
|
+
};
|
|
13
|
+
/* node:coverage disable */
|
|
14
|
+
/**
|
|
15
|
+
* The **mean anomaly** ($M$) of an orbit at a given date.
|
|
16
|
+
*
|
|
17
|
+
* Every `orbit.angle` in the datasets is the true anomaly at **J2000**
|
|
18
|
+
* (2000-01-01 12:00 TT), so this advances the orbit from J2000 to `date` with
|
|
19
|
+
* {@link advanceMeanAnomaly}. Dates before J2000 work too.
|
|
20
|
+
*
|
|
21
|
+
* $$ M = M_0 + \frac{2\pi}{|P|} \, (t - t_{J2000}) $$
|
|
22
|
+
*
|
|
23
|
+
* The time is measured in UTC, as JavaScript dates are, against
|
|
24
|
+
* {@link J2000_UTC}. Leap seconds since 2000 are ignored, which moves a body by
|
|
25
|
+
* a few seconds of its orbit at most.
|
|
26
|
+
*
|
|
27
|
+
* @param {Pick<OrbitInterface, 'e' | 'angle' | 'period'>} orbit - An orbit whose `angle` is the true anomaly at J2000, for example `body.orbit` from a dataset.
|
|
28
|
+
* @param {Date} date - The date to find the body at.
|
|
29
|
+
* @returns {Radians} The mean anomaly at `date`, in $[0, 2\pi)$.
|
|
30
|
+
* @throws {TypeError} If `date` is not a valid `Date`.
|
|
31
|
+
* @throws {RangeError} If the orbit's eccentricity is outside $0 \leq e < 1$.
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```ts
|
|
35
|
+
* import { PLANETS } from '@interstellar-tools/constants';
|
|
36
|
+
* import { meanAnomalyAt } from '@interstellar-tools/equations';
|
|
37
|
+
*
|
|
38
|
+
* const earth = PLANETS.find((planet) => planet.id === 'earth')!;
|
|
39
|
+
*
|
|
40
|
+
* meanAnomalyAt(earth.orbit!, new Date('2026-10-17T12:00:00Z')); // ≈ 4.934 rad (282.7°)
|
|
41
|
+
* ```
|
|
42
|
+
*
|
|
43
|
+
* @see {@link trueAnomalyAt} for where the body actually is.
|
|
44
|
+
* @group Anomalies
|
|
45
|
+
*/
|
|
46
|
+
/* node:coverage enable */
|
|
47
|
+
export const meanAnomalyAt = (orbit, date) => advanceMeanAnomaly(orbit, { value: daysSinceJ2000(date), unit: 'd' });
|
|
48
|
+
/* node:coverage disable */
|
|
49
|
+
/**
|
|
50
|
+
* The **true anomaly** ($\nu$) of an orbit at a given date: where the body is.
|
|
51
|
+
*
|
|
52
|
+
* Takes the mean anomaly at `date` from {@link meanAnomalyAt}, solves Kepler's
|
|
53
|
+
* equation with {@link solveKepler}, and converts the result with
|
|
54
|
+
* {@link eccentricToTrueAnomaly}.
|
|
55
|
+
*
|
|
56
|
+
* @param {Pick<OrbitInterface, 'e' | 'angle' | 'period'>} orbit - An orbit whose `angle` is the true anomaly at J2000, for example `body.orbit` from a dataset.
|
|
57
|
+
* @param {Date} date - The date to find the body at.
|
|
58
|
+
* @returns {Radians} The true anomaly at `date`, in $[0, 2\pi)$.
|
|
59
|
+
* @throws {TypeError} If `date` is not a valid `Date`.
|
|
60
|
+
* @throws {RangeError} If the orbit's eccentricity is outside $0 \leq e < 1$.
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* ```ts
|
|
64
|
+
* import { PLANETS } from '@interstellar-tools/constants';
|
|
65
|
+
* import { trueAnomalyAt } from '@interstellar-tools/equations';
|
|
66
|
+
*
|
|
67
|
+
* const earth = PLANETS.find((planet) => planet.id === 'earth')!;
|
|
68
|
+
*
|
|
69
|
+
* trueAnomalyAt(earth.orbit!, new Date('2026-10-17T12:00:00Z')); // ≈ 4.901 rad (280.8°)
|
|
70
|
+
* ```
|
|
71
|
+
*
|
|
72
|
+
* @group Anomalies
|
|
73
|
+
*/
|
|
74
|
+
/* node:coverage enable */
|
|
75
|
+
export const trueAnomalyAt = (orbit, date) => {
|
|
76
|
+
const M = meanAnomalyAt(orbit, date);
|
|
77
|
+
const E = solveKepler(M, orbit.e);
|
|
78
|
+
const nu = eccentricToTrueAnomaly(E, orbit.e);
|
|
79
|
+
return norm2pi(nu);
|
|
80
|
+
};
|
|
81
|
+
//# sourceMappingURL=anomaly-at.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anomaly-at.js","sourceRoot":"","sources":["../../../src/categories/anomalies/anomaly-at.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAGhF,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAExE,mEAAmE;AACnE,MAAM,cAAc,GAAG,CAAC,IAAU,EAAU,EAAE;IAC5C,IAAI,CAAC,CAAC,IAAI,YAAY,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,SAAS,CAAC,wCAAwC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,oBAAoB,CAAC;AACvE,CAAC,CAAC;AAEF,2BAA2B;AAC3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,0BAA0B;AAC1B,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,KAAqD,EACrD,IAAU,EACD,EAAE,CACX,kBAAkB,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,cAAc,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;AAExE,2BAA2B;AAC3B;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,0BAA0B;AAC1B,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,KAAqD,EACrD,IAAU,EACD,EAAE;IACX,MAAM,CAAC,GAAG,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACrC,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,EAAE,GAAG,sBAAsB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAE9C,OAAO,OAAO,CAAC,EAAE,CAAY,CAAC;AAChC,CAAC,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -20,6 +20,7 @@ export * from './categories/helpers/rot-1.js';
|
|
|
20
20
|
export * from './categories/helpers/rot-3.js';
|
|
21
21
|
export * from './categories/helpers/transpose-3.js';
|
|
22
22
|
export * from './categories/anomalies/advance-mean-anomaly.js';
|
|
23
|
+
export * from './categories/anomalies/anomaly-at.js';
|
|
23
24
|
export * from './categories/anomalies/eccentric-to-true-anomaly.js';
|
|
24
25
|
export * from './categories/anomalies/true-to-mean-anomaly.js';
|
|
25
26
|
export * from './categories/kepler/solve-kepler-bisection.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,cAAc,qCAAqC,CAAC;AAEpD,cAAc,kCAAkC,CAAC;AAIjD,cAAc,8DAA8D,CAAC;AAE7E,cAAc,kEAAkE,CAAC;AAEjF,cAAc,wDAAwD,CAAC;AAEvE,cAAc,8DAA8D,CAAC;AAE7E,cAAc,qDAAqD,CAAC;AAEpE,cAAc,4DAA4D,CAAC;AAI3E,cAAc,wCAAwC,CAAC;AAEvD,cAAc,+BAA+B,CAAC;AAE9C,cAAc,kCAAkC,CAAC;AAEjD,cAAc,8BAA8B,CAAC;AAE7C,cAAc,iCAAiC,CAAC;AAEhD,cAAc,+BAA+B,CAAC;AAE9C,cAAc,+BAA+B,CAAC;AAE9C,cAAc,qCAAqC,CAAC;AAIpD,cAAc,gDAAgD,CAAC;AAE/D,cAAc,qDAAqD,CAAC;AAEpE,cAAc,gDAAgD,CAAC;AAI/D,cAAc,+CAA+C,CAAC;AAE9D,cAAc,uDAAuD,CAAC;AAEtE,cAAc,oDAAoD,CAAC;AAEnE,cAAc,qCAAqC,CAAC;AAIpD,cAAc,8CAA8C,CAAC;AAE7D,cAAc,uCAAuC,CAAC;AAEtD,cAAc,6CAA6C,CAAC;AAE5D,cAAc,iDAAiD,CAAC;AAIhE,cAAc,sDAAsD,CAAC;AAErE,cAAc,iDAAiD,CAAC;AAEhE,cAAc,uCAAuC,CAAC;AAEtD,cAAc,4CAA4C,CAAC;AAE3D,cAAc,qCAAqC,CAAC;AAEpD,cAAc,4DAA4D,CAAC;AAE3E,cAAc,mDAAmD,CAAC;AAElE,cAAc,oDAAoD,CAAC;AAEnE,cAAc,iDAAiD,CAAC;AAEhE,cAAc,sCAAsC,CAAC;AAErD,cAAc,oCAAoC,CAAC;AAEnD,cAAc,4CAA4C,CAAC;AAE3D,cAAc,gEAAgE,CAAC;AAE/E,cAAc,kDAAkD,CAAC;AAEjE,cAAc,mDAAmD,CAAC;AAElE,cAAc,mDAAmD,CAAC;AAElE,cAAc,uCAAuC,CAAC;AAItD,cAAc,kDAAkD,CAAC;AAEjE,cAAc,yDAAyD,CAAC;AAExE,cAAc,6CAA6C,CAAC;AAE5D,cAAc,+CAA+C,CAAC;AAE9D,cAAc,iDAAiD,CAAC;AAEhE,cAAc,oDAAoD,CAAC;AAEnE,cAAc,mDAAmD,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,cAAc,qCAAqC,CAAC;AAEpD,cAAc,kCAAkC,CAAC;AAIjD,cAAc,8DAA8D,CAAC;AAE7E,cAAc,kEAAkE,CAAC;AAEjF,cAAc,wDAAwD,CAAC;AAEvE,cAAc,8DAA8D,CAAC;AAE7E,cAAc,qDAAqD,CAAC;AAEpE,cAAc,4DAA4D,CAAC;AAI3E,cAAc,wCAAwC,CAAC;AAEvD,cAAc,+BAA+B,CAAC;AAE9C,cAAc,kCAAkC,CAAC;AAEjD,cAAc,8BAA8B,CAAC;AAE7C,cAAc,iCAAiC,CAAC;AAEhD,cAAc,+BAA+B,CAAC;AAE9C,cAAc,+BAA+B,CAAC;AAE9C,cAAc,qCAAqC,CAAC;AAIpD,cAAc,gDAAgD,CAAC;AAE/D,cAAc,sCAAsC,CAAC;AAErD,cAAc,qDAAqD,CAAC;AAEpE,cAAc,gDAAgD,CAAC;AAI/D,cAAc,+CAA+C,CAAC;AAE9D,cAAc,uDAAuD,CAAC;AAEtE,cAAc,oDAAoD,CAAC;AAEnE,cAAc,qCAAqC,CAAC;AAIpD,cAAc,8CAA8C,CAAC;AAE7D,cAAc,uCAAuC,CAAC;AAEtD,cAAc,6CAA6C,CAAC;AAE5D,cAAc,iDAAiD,CAAC;AAIhE,cAAc,sDAAsD,CAAC;AAErE,cAAc,iDAAiD,CAAC;AAEhE,cAAc,uCAAuC,CAAC;AAEtD,cAAc,4CAA4C,CAAC;AAE3D,cAAc,qCAAqC,CAAC;AAEpD,cAAc,4DAA4D,CAAC;AAE3E,cAAc,mDAAmD,CAAC;AAElE,cAAc,oDAAoD,CAAC;AAEnE,cAAc,iDAAiD,CAAC;AAEhE,cAAc,sCAAsC,CAAC;AAErD,cAAc,oCAAoC,CAAC;AAEnD,cAAc,4CAA4C,CAAC;AAE3D,cAAc,gEAAgE,CAAC;AAE/E,cAAc,kDAAkD,CAAC;AAEjE,cAAc,mDAAmD,CAAC;AAElE,cAAc,mDAAmD,CAAC;AAElE,cAAc,uCAAuC,CAAC;AAItD,cAAc,kDAAkD,CAAC;AAEjE,cAAc,yDAAyD,CAAC;AAExE,cAAc,6CAA6C,CAAC;AAE5D,cAAc,+CAA+C,CAAC;AAE9D,cAAc,iDAAiD,CAAC;AAEhE,cAAc,oDAAoD,CAAC;AAEnE,cAAc,mDAAmD,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -24,6 +24,7 @@ export * from './categories/helpers/rot-3.js';
|
|
|
24
24
|
export * from './categories/helpers/transpose-3.js';
|
|
25
25
|
// categories/anomalies
|
|
26
26
|
export * from './categories/anomalies/advance-mean-anomaly.js';
|
|
27
|
+
export * from './categories/anomalies/anomaly-at.js';
|
|
27
28
|
export * from './categories/anomalies/eccentric-to-true-anomaly.js';
|
|
28
29
|
export * from './categories/anomalies/true-to-mean-anomaly.js';
|
|
29
30
|
// categories/kepler (solvers)
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,mBAAmB;AACnB,cAAc,qCAAqC,CAAC;AAEpD,cAAc,kCAAkC,CAAC;AAEjD,yBAAyB;AAEzB,cAAc,8DAA8D,CAAC;AAE7E,cAAc,kEAAkE,CAAC;AAEjF,cAAc,wDAAwD,CAAC;AAEvE,cAAc,8DAA8D,CAAC;AAE7E,cAAc,qDAAqD,CAAC;AAEpE,cAAc,4DAA4D,CAAC;AAE3E,qBAAqB;AAErB,cAAc,wCAAwC,CAAC;AAEvD,cAAc,+BAA+B,CAAC;AAE9C,cAAc,kCAAkC,CAAC;AAEjD,cAAc,8BAA8B,CAAC;AAE7C,cAAc,iCAAiC,CAAC;AAEhD,cAAc,+BAA+B,CAAC;AAE9C,cAAc,+BAA+B,CAAC;AAE9C,cAAc,qCAAqC,CAAC;AAEpD,uBAAuB;AAEvB,cAAc,gDAAgD,CAAC;AAE/D,cAAc,qDAAqD,CAAC;AAEpE,cAAc,gDAAgD,CAAC;AAE/D,8BAA8B;AAE9B,cAAc,+CAA+C,CAAC;AAE9D,cAAc,uDAAuD,CAAC;AAEtE,cAAc,oDAAoD,CAAC;AAEnE,cAAc,qCAAqC,CAAC;AAEpD,qBAAqB;AAErB,cAAc,8CAA8C,CAAC;AAE7D,cAAc,uCAAuC,CAAC;AAEtD,cAAc,6CAA6C,CAAC;AAE5D,cAAc,iDAAiD,CAAC;AAEhE,oBAAoB;AAEpB,cAAc,sDAAsD,CAAC;AAErE,cAAc,iDAAiD,CAAC;AAEhE,cAAc,uCAAuC,CAAC;AAEtD,cAAc,4CAA4C,CAAC;AAE3D,cAAc,qCAAqC,CAAC;AAEpD,cAAc,4DAA4D,CAAC;AAE3E,cAAc,mDAAmD,CAAC;AAElE,cAAc,oDAAoD,CAAC;AAEnE,cAAc,iDAAiD,CAAC;AAEhE,cAAc,sCAAsC,CAAC;AAErD,cAAc,oCAAoC,CAAC;AAEnD,cAAc,4CAA4C,CAAC;AAE3D,cAAc,gEAAgE,CAAC;AAE/E,cAAc,kDAAkD,CAAC;AAEjE,cAAc,mDAAmD,CAAC;AAElE,cAAc,mDAAmD,CAAC;AAElE,cAAc,uCAAuC,CAAC;AAEtD,wBAAwB;AAExB,cAAc,kDAAkD,CAAC;AAEjE,cAAc,yDAAyD,CAAC;AAExE,cAAc,6CAA6C,CAAC;AAE5D,cAAc,+CAA+C,CAAC;AAE9D,cAAc,iDAAiD,CAAC;AAEhE,cAAc,oDAAoD,CAAC;AAEnE,cAAc,mDAAmD,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,mBAAmB;AACnB,cAAc,qCAAqC,CAAC;AAEpD,cAAc,kCAAkC,CAAC;AAEjD,yBAAyB;AAEzB,cAAc,8DAA8D,CAAC;AAE7E,cAAc,kEAAkE,CAAC;AAEjF,cAAc,wDAAwD,CAAC;AAEvE,cAAc,8DAA8D,CAAC;AAE7E,cAAc,qDAAqD,CAAC;AAEpE,cAAc,4DAA4D,CAAC;AAE3E,qBAAqB;AAErB,cAAc,wCAAwC,CAAC;AAEvD,cAAc,+BAA+B,CAAC;AAE9C,cAAc,kCAAkC,CAAC;AAEjD,cAAc,8BAA8B,CAAC;AAE7C,cAAc,iCAAiC,CAAC;AAEhD,cAAc,+BAA+B,CAAC;AAE9C,cAAc,+BAA+B,CAAC;AAE9C,cAAc,qCAAqC,CAAC;AAEpD,uBAAuB;AAEvB,cAAc,gDAAgD,CAAC;AAE/D,cAAc,sCAAsC,CAAC;AAErD,cAAc,qDAAqD,CAAC;AAEpE,cAAc,gDAAgD,CAAC;AAE/D,8BAA8B;AAE9B,cAAc,+CAA+C,CAAC;AAE9D,cAAc,uDAAuD,CAAC;AAEtE,cAAc,oDAAoD,CAAC;AAEnE,cAAc,qCAAqC,CAAC;AAEpD,qBAAqB;AAErB,cAAc,8CAA8C,CAAC;AAE7D,cAAc,uCAAuC,CAAC;AAEtD,cAAc,6CAA6C,CAAC;AAE5D,cAAc,iDAAiD,CAAC;AAEhE,oBAAoB;AAEpB,cAAc,sDAAsD,CAAC;AAErE,cAAc,iDAAiD,CAAC;AAEhE,cAAc,uCAAuC,CAAC;AAEtD,cAAc,4CAA4C,CAAC;AAE3D,cAAc,qCAAqC,CAAC;AAEpD,cAAc,4DAA4D,CAAC;AAE3E,cAAc,mDAAmD,CAAC;AAElE,cAAc,oDAAoD,CAAC;AAEnE,cAAc,iDAAiD,CAAC;AAEhE,cAAc,sCAAsC,CAAC;AAErD,cAAc,oCAAoC,CAAC;AAEnD,cAAc,4CAA4C,CAAC;AAE3D,cAAc,gEAAgE,CAAC;AAE/E,cAAc,kDAAkD,CAAC;AAEjE,cAAc,mDAAmD,CAAC;AAElE,cAAc,mDAAmD,CAAC;AAElE,cAAc,uCAAuC,CAAC;AAEtD,wBAAwB;AAExB,cAAc,kDAAkD,CAAC;AAEjE,cAAc,yDAAyD,CAAC;AAExE,cAAc,6CAA6C,CAAC;AAE5D,cAAc,+CAA+C,CAAC;AAE9D,cAAc,iDAAiD,CAAC;AAEhE,cAAc,oDAAoD,CAAC;AAEnE,cAAc,mDAAmD,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@interstellar-tools/equations",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.63.1",
|
|
4
4
|
"description": "Curated, well-tested orbital mechanics and dynamics formulas (e.g., Newtonian gravity, vis-viva, Kepler's 3rd law, escape/circular speeds, specific energy, specific angular momentum, peri/apoapsis radii).",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"interstellar",
|
|
@@ -110,9 +110,9 @@
|
|
|
110
110
|
"test:ci": "glob-bin -c \"node --import tsx --test --no-warnings --experimental-test-coverage --test-coverage-exclude='**/__tests__/helpers/**' --test-reporter=cobertura --test-reporter-destination=coverage/cobertura-coverage.xml --test-reporter=spec --test-reporter-destination=stdout\" \"**/__tests__/**/*.spec.ts\""
|
|
111
111
|
},
|
|
112
112
|
"dependencies": {
|
|
113
|
-
"@interstellar-tools/constants": "^0.
|
|
113
|
+
"@interstellar-tools/constants": "^0.62.0",
|
|
114
114
|
"@interstellar-tools/temporal": "^0.60.0",
|
|
115
|
-
"@interstellar-tools/types": "^0.
|
|
115
|
+
"@interstellar-tools/types": "^0.62.0"
|
|
116
116
|
},
|
|
117
117
|
"devDependencies": {
|
|
118
118
|
"@types/node": "^24.19.2",
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Compares two floating-point numbers for equality within a tolerance.
|
|
3
|
-
*
|
|
4
|
-
* @param {number} a - First number to compare.
|
|
5
|
-
* @param {number} b - Second number to compare.
|
|
6
|
-
* @param {number} [epsilon=EPSILON] - Tolerance for floating-point precision.
|
|
7
|
-
* @returns {boolean} `true` if values are approximately equal.
|
|
8
|
-
*/
|
|
9
|
-
export declare const areEqual: (a: number, b: number, epsilon?: number) => boolean;
|
|
10
|
-
//# sourceMappingURL=are-equal.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"are-equal.d.ts","sourceRoot":"","sources":["../../../../src/categories/anomalies/utils/are-equal.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,eAAO,MAAM,QAAQ,GACnB,GAAG,MAAM,EACT,GAAG,MAAM,EACT,UAAS,MAAgB,KACxB,OAEF,CAAC"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
const EPSILON = 1e-15; // Increased tolerance for high eccentricity
|
|
2
|
-
/**
|
|
3
|
-
* Compares two floating-point numbers for equality within a tolerance.
|
|
4
|
-
*
|
|
5
|
-
* @param {number} a - First number to compare.
|
|
6
|
-
* @param {number} b - Second number to compare.
|
|
7
|
-
* @param {number} [epsilon=EPSILON] - Tolerance for floating-point precision.
|
|
8
|
-
* @returns {boolean} `true` if values are approximately equal.
|
|
9
|
-
*/
|
|
10
|
-
export const areEqual = (a, b, epsilon = EPSILON) => {
|
|
11
|
-
return Math.abs(a - b) < epsilon * Math.max(1, Math.abs(a), Math.abs(b));
|
|
12
|
-
};
|
|
13
|
-
//# sourceMappingURL=are-equal.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"are-equal.js","sourceRoot":"","sources":["../../../../src/categories/anomalies/utils/are-equal.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,4CAA4C;AAEnE;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,CAAS,EACT,CAAS,EACT,UAAkB,OAAO,EAChB,EAAE;IACX,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3E,CAAC,CAAC"}
|