UNPKG

7.42 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.march = march;
7exports.june = june;
8exports.september = september;
9exports.december = december;
10exports.march2 = march2;
11exports.june2 = june2;
12exports.september2 = september2;
13exports.december2 = december2;
14exports.longitude = longitude;
15
16var _base = require('./base');
17
18var _base2 = _interopRequireDefault(_base);
19
20var _solar = require('./solar');
21
22var _solar2 = _interopRequireDefault(_solar);
23
24function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
25
26/**
27 * @copyright 2013 Sonia Keys
28 * @copyright 2016 commenthol
29 * @license MIT
30 * @module solstice
31 */
32/**
33 * Solstice: Chapter 27: Equinoxes and Solstices.
34 */
35
36var abs = Math.abs,
37 cos = Math.cos,
38 sin = Math.sin;
39
40var D2R = Math.PI / 180;
41
42// table 27.a - for years from -1000 to +1000
43var mc0 = [1721139.29189, 365242.13740, 0.06134, 0.00111, -0.00071];
44var jc0 = [1721233.25401, 365241.72562, -0.05232, 0.00907, 0.00025];
45var sc0 = [1721325.70455, 365242.49558, -0.11677, -0.00297, 0.00074];
46var dc0 = [1721414.39987, 365242.88257, -0.00769, -0.00933, -0.00006];
47
48// table 27.b - for years from +1000 to +3000
49var mc2 = [2451623.80984, 365242.37404, 0.05169, -0.00411, -0.00057];
50var jc2 = [2451716.56767, 365241.62603, 0.00325, 0.00888, -0.00030];
51var sc2 = [2451810.21715, 365242.01767, -0.11575, 0.00337, 0.00078];
52var dc2 = [2451900.05952, 365242.74049, -0.06223, -0.00823, 0.00032];
53
54// table 27.c
55var terms = function () {
56 var term = [[485, 324.96, 1934.136], [203, 337.23, 32964.467], [199, 342.08, 20.186], [182, 27.85, 445267.112], [156, 73.14, 45036.886], [136, 171.52, 22518.443], [77, 222.54, 65928.934], [74, 296.72, 3034.906], [70, 243.58, 9037.513], [58, 119.81, 33718.147], [52, 297.17, 150.678], [50, 21.02, 2281.226], [45, 247.54, 29929.562], [44, 325.15, 31555.956], [29, 60.93, 4443.417], [18, 155.12, 67555.328], [17, 288.79, 4562.452], [16, 198.04, 62894.029], [14, 199.76, 31436.921], [12, 95.39, 14577.848], [12, 287.11, 31931.756], [12, 320.81, 34777.259], [9, 227.73, 1222.114], [8, 15.45, 16859.074]];
57 return term.map(function (t) {
58 return {
59 a: t[0],
60 b: t[1],
61 c: t[2]
62 };
63 });
64}();
65
66/**
67 * March returns the JDE of the March equinox for the given year.
68 *
69 * Results are valid for the years -1000 to +3000.
70 *
71 * Accuracy is within one minute of time for the years 1951-2050.
72 * @param {Number} y - (int) year
73 * @returns {Number} JDE
74 */
75function march(y) {
76 if (y < 1000) {
77 return eq(y, mc0);
78 }
79 return eq(y - 2000, mc2);
80}
81
82/**
83 * June returns the JDE of the June solstice for the given year.
84 *
85 * Results are valid for the years -1000 to +3000.
86 *
87 * Accuracy is within one minute of time for the years 1951-2050.
88 * @param {Number} y - (int) year
89 * @returns {Number} JDE
90 */
91function june(y) {
92 if (y < 1000) {
93 return eq(y, jc0);
94 }
95 return eq(y - 2000, jc2);
96}
97
98/**
99 * September returns the JDE of the September equinox for the given year.
100 *
101 * Results are valid for the years -1000 to +3000.
102 *
103 * Accuracy is within one minute of time for the years 1951-2050.
104 * @param {Number} y - (int) year
105 * @returns {Number} JDE
106 */
107function september(y) {
108 if (y < 1000) {
109 return eq(y, sc0);
110 }
111 return eq(y - 2000, sc2);
112}
113
114/**
115 * December returns the JDE of the December solstice for a given year.
116 *
117 * Results are valid for the years -1000 to +3000.
118 *
119 * Accuracy is within one minute of time for the years 1951-2050.
120 * @param {Number} y - (int) year
121 * @returns {Number} JDE
122 */
123function december(y) {
124 if (y < 1000) {
125 return eq(y, dc0);
126 }
127 return eq(y - 2000, dc2);
128}
129
130/**
131 * Fast calculation of solstices/ equinoxes
132 * Accuracy is within one minute of time for the years 1951-2050.
133 *
134 * @param {Number} y - (int) year
135 * @param {Array} c - term from table 27.a / 27.b
136 * @returns {Number} JDE
137 */
138function eq(y, c) {
139 var J0 = _base2.default.horner(y * 0.001, c);
140 var T = _base2.default.J2000Century(J0);
141 var W = 35999.373 * D2R * T - 2.47 * D2R;
142 var Δλ = 1 + 0.0334 * cos(W) + 0.0007 * cos(2 * W);
143 var S = 0;
144 for (var i = terms.length - 1; i >= 0; i--) {
145 var t = terms[i];
146 S += t.a * cos((t.b + t.c * T) * D2R);
147 }
148 return J0 + 0.00001 * S / Δλ;
149}
150
151/**
152 * March2 returns a more accurate JDE of the March equinox.
153 *
154 * Result is accurate to one second of time.
155 *
156 * @param {Number} year - (int) year
157 * @param {planetposition.Planet} planet - must be a V87Planet object representing Earth, obtained with
158 * the package planetposition
159 * @returns {Number} JDE
160 */
161function march2(year, planet) {
162 return longitude(year, planet, 0);
163}
164
165/**
166 * June2 returns a more accurate JDE of the June solstice.
167 *
168 * Result is accurate to one second of time.
169 *
170 * @param {Number} year - (int) year
171 * @param {planetposition.Planet} planet - must be a V87Planet object representing Earth, obtained with
172 * the package planetposition
173 * @returns {Number} JDE
174 */
175function june2(year, planet) {
176 return longitude(year, planet, Math.PI / 2);
177}
178
179/**
180 * September2 returns a more accurate JDE of the September equinox.
181 *
182 * Result is accurate to one second of time.
183 *
184 * @param {Number} year - (int) year
185 * @param {planetposition.Planet} planet - must be a V87Planet object representing Earth, obtained with
186 * the package planetposition
187 * @returns {Number} JDE
188 */
189function september2(year, planet) {
190 return longitude(year, planet, Math.PI);
191}
192
193/**
194 * December2 returns a more accurate JDE of the December solstice.
195 *
196 * Result is accurate to one second of time.
197 *
198 * @param {Number} year - (int) year
199 * @param {planetposition.Planet} planet - must be a V87Planet object representing Earth, obtained with
200 * the package planetposition
201 * @returns {Number} JDE
202 */
203function december2(year, planet) {
204 return longitude(year, planet, Math.PI * 3 / 2);
205}
206
207/**
208 * Longitude returns the JDE for a given `year`, VSOP87 Planet `planet` at a
209 * given geocentric solar longitude `lon`
210 * @param {Number} year - (int)
211 * @param {planetposition.Planet} planet
212 * @param {Number} lon - geocentric solar longitude in radians
213 * @returns {Number} JDE
214 */
215function longitude(year, planet, lon) {
216 var c = void 0;
217 var ct = void 0;
218
219 if (year < 1000) {
220 ct = [mc0, jc0, sc0, dc0];
221 } else {
222 ct = [mc2, jc2, sc2, dc2];
223 year -= 2000;
224 }
225
226 lon = lon % (Math.PI * 2);
227
228 if (lon < Math.PI / 2) {
229 c = ct[0];
230 } else if (lon < Math.PI) {
231 c = ct[1];
232 } else if (lon < Math.PI * 3 / 2) {
233 c = ct[2];
234 } else {
235 c = ct[3];
236 }
237
238 return eq2(year, planet, lon, c);
239}
240
241/**
242 * Accurate calculation of solstices/ equinoxes
243 * Result is accurate to one second of time.
244 *
245 * @param {Number} year - (int) year
246 * @param {planetposition.Planet} planet - vsop87 planet
247 * @param {Number} lon - longitude in radians
248 * @param {Array} c - term from table 27.a / 27.b
249 * @returns {Number} JDE
250 */
251function eq2(year, planet, lon, c) {
252 var J0 = _base2.default.horner(year * 0.001, c);
253
254 for (;;) {
255 var a = _solar2.default.apparentVSOP87(planet, J0);
256 var _c = 58 * sin(lon - a.lon); // (27.1) p. 180
257 J0 += _c;
258 if (abs(_c) < 0.000005) {
259 break;
260 }
261 }
262
263 return J0;
264}
265
266exports.default = {
267 march: march,
268 june: june,
269 september: september,
270 december: december,
271 march2: march2,
272 june2: june2,
273 september2: september2,
274 december2: december2,
275 longitude: longitude
276};
\No newline at end of file