UNPKG

4.45 kBJavaScriptView Raw
1/**
2 * @copyright 2013 Sonia Keys
3 * @copyright 2016 commenthol
4 * @license MIT
5 * @module semidiameter
6 */
7
8/**
9 * Semidiameter: Chapter 55, Semidiameters of the Sun, Moon, and Planets.
10 */
11import base from './base';
12import parallax from './parallax';
13/* eslint-disable no-multi-spaces */
14
15/**
16 * Standard semidiameters at unit distance of 1 AU.
17 * Values are scaled here to radians.
18 */
19
20export var Sun = 959.63 / 3600 * Math.PI / 180;
21export var Mercury = 3.36 / 3600 * Math.PI / 180;
22export var VenusSurface = 8.34 / 3600 * Math.PI / 180;
23export var VenusCloud = 8.41 / 3600 * Math.PI / 180;
24export var Mars = 4.68 / 3600 * Math.PI / 180;
25export var JupiterEquatorial = 98.44 / 3600 * Math.PI / 180;
26export var JupiterPolar = 92.06 / 3600 * Math.PI / 180;
27export var SaturnEquatorial = 82.73 / 3600 * Math.PI / 180;
28export var SaturnPolar = 73.82 / 3600 * Math.PI / 180;
29export var Uranus = 35.02 / 3600 * Math.PI / 180;
30export var Neptune = 33.50 / 3600 * Math.PI / 180;
31export var Pluto = 2.07 / 3600 * Math.PI / 180;
32export var Moon = 358473400 / base.AU / 3600 * Math.PI / 180;
33/* eslint-enable */
34
35/**
36 * Semidiameter returns semidiameter at specified distance.
37 *
38 * When used with S0 values provided, Δ must be observer-body distance in AU.
39 * Result will then be in radians.
40 */
41
42export function semidiameter(s0, Δ) {
43 // (s0, Δ float64) float64
44 return s0 / Δ;
45}
46/**
47 * SaturnApparentPolar returns apparent polar semidiameter of Saturn
48 * at specified distance.
49 *
50 * Argument Δ must be observer-Saturn distance in AU. Argument B is
51 * Saturnicentric latitude of the observer as given by function saturnring.UB()
52 * for example.
53 *
54 * Result is semidiameter in units of package variables SaturnPolar and
55 * SaturnEquatorial, nominally radians.
56 */
57
58export function aaturnApparentPolar(Δ, B) {
59 // (Δ, B float64) float64
60 var k = SaturnPolar / SaturnEquatorial;
61 k = 1 - k * k;
62 var cB = Math.cos(B);
63 return SaturnEquatorial / Δ * Math.sqrt(1 - k * cB * cB);
64}
65/**
66 * MoonTopocentric returns observed topocentric semidiameter of the Moon.
67 *
68 * Δ is distance to Moon in AU.
69 * δ is declination of Moon in radians.
70 * H is hour angle of Moon in radians.
71 * ρsφʹ, ρcφʹ are parallax constants as returned by
72 * globe.Ellipsoid.ParallaxConstants, for example.
73 *
74 * Result is semidiameter in radians.
75 */
76
77export function moonTopocentric(Δ, δ, H, ρsφʹ, ρcφʹ) {
78 // (Δ, δ, H, ρsφʹ, ρcφʹ float64) float64
79 var k = 0.272481;
80 var sπ = Math.sin(parallax.Horizontal(Δ)); // q computed by (40.6, 40.7) p. 280, ch 40.0
81
82 var _base$sincos = base.sincos(δ),
83 sδ = _base$sincos[0],
84 cδ = _base$sincos[1];
85
86 var _base$sincos2 = base.sincos(H),
87 sH = _base$sincos2[0],
88 cH = _base$sincos2[1];
89
90 var A = cδ * sH;
91 var B = cδ * cH - ρcφʹ * sπ;
92 var C = sδ - ρsφʹ * sπ;
93 var q = Math.sqrt(A * A + B * B + C * C);
94 return k / q * sπ;
95}
96/**
97 * MoonTopocentric2 returns observed topocentric semidiameter of the Moon
98 * by a less rigorous method.
99 *
100 * Δ is distance to Moon in AU, h is altitude of the Moon above the observer's
101 * horizon in radians.
102 *
103 * Result is semidiameter in radians.
104 */
105
106export function moonTopocentric2(Δ, h) {
107 // (Δ, h float64) float64
108 return Moon / Δ * (1 + Math.sin(h) * Math.sin(parallax.Horizontal(Δ)));
109}
110/**
111 * AsteroidDiameter returns approximate diameter given absolute magnitude H
112 * and albedo A.
113 *
114 * Result is in km.
115 */
116
117export function asteroidDiameter(H, A) {
118 // (H, A float64) float64
119 return Math.pow(10, 3.12 - 0.2 * H - 0.5 * Math.log10(A));
120}
121/**
122 * Asteroid returns semidiameter of an asteroid with a given diameter
123 * at given distance.
124 *
125 * Argument d is diameter in km, Δ is distance in AU.
126 *
127 * Result is semidiameter in radians.
128 */
129
130export function asteroid(d, Δ) {
131 // (d, Δ float64) float64
132 return 0.0013788 * d / Δ / 3600 * Math.PI / 180;
133}
134export default {
135 Sun: Sun,
136 Mercury: Mercury,
137 VenusSurface: VenusSurface,
138 VenusCloud: VenusCloud,
139 Mars: Mars,
140 JupiterEquatorial: JupiterEquatorial,
141 JupiterPolar: JupiterPolar,
142 SaturnEquatorial: SaturnEquatorial,
143 SaturnPolar: SaturnPolar,
144 Uranus: Uranus,
145 Neptune: Neptune,
146 Pluto: Pluto,
147 Moon: Moon,
148 semidiameter: semidiameter,
149 aaturnApparentPolar: aaturnApparentPolar,
150 moonTopocentric: moonTopocentric,
151 moonTopocentric2: moonTopocentric2,
152 asteroidDiameter: asteroidDiameter,
153 asteroid: asteroid
154};
\No newline at end of file