tauqeet-js 1.0.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.
package/dist/index.js ADDED
@@ -0,0 +1,1062 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __export = (target, all) => {
3
+ for (var name in all)
4
+ __defProp(target, name, { get: all[name], enumerable: true });
5
+ };
6
+
7
+ // src/core/math.ts
8
+ var DTR = Math.PI / 180;
9
+ var RTD = 180 / Math.PI;
10
+ function sind(x) {
11
+ return Math.sin(DTR * x);
12
+ }
13
+ function cosd(x) {
14
+ return Math.cos(DTR * x);
15
+ }
16
+ function tand(x) {
17
+ return Math.tan(DTR * x);
18
+ }
19
+ function asind(x) {
20
+ return Math.asin(x) * RTD;
21
+ }
22
+ function acosd(x) {
23
+ return Math.acos(x) * RTD;
24
+ }
25
+ function atan2d(y, x) {
26
+ return Math.atan2(y, x) * RTD;
27
+ }
28
+ function norm360(x) {
29
+ let res = x % 360;
30
+ if (res < 0) res += 360;
31
+ return res;
32
+ }
33
+ function norm24(x) {
34
+ let res = x % 24;
35
+ if (res < 0) res += 24;
36
+ return res;
37
+ }
38
+
39
+ // src/core/time.ts
40
+ function getJulianDate(date) {
41
+ let year = date.getUTCFullYear();
42
+ let month = date.getUTCMonth() + 1;
43
+ const day = date.getUTCDate();
44
+ const hour = date.getUTCHours();
45
+ const minute = date.getUTCMinutes();
46
+ const second = date.getUTCSeconds();
47
+ const ms = date.getUTCMilliseconds();
48
+ if (month <= 2) {
49
+ year -= 1;
50
+ month += 12;
51
+ }
52
+ const A = Math.floor(year / 100);
53
+ const B = 2 - A + Math.floor(A / 4);
54
+ const dayFraction = (hour + minute / 60 + (second + ms / 1e3) / 3600) / 24;
55
+ return Math.floor(365.25 * (year + 4716)) + Math.floor(30.6001 * (month + 1)) + day + B - 1524.5 + dayFraction;
56
+ }
57
+ function getJulianCenturies(jd) {
58
+ return (jd - 2451545) / 36525;
59
+ }
60
+ function getJulianMillennia(jc) {
61
+ return 0.1 * jc;
62
+ }
63
+ function getDeltaT(year) {
64
+ if (year < -500) {
65
+ const u2 = (year - 1820) / 100;
66
+ return -20 + 32 * u2 * u2;
67
+ }
68
+ if (year < 500) {
69
+ const u2 = year / 100;
70
+ return 10583.6 - 1014.41 * u2 + 33.7831 * u2 * u2 - 5.95205 * u2 * u2 * u2 - 0.179848 * u2 ** 4 + 0.0221741 * u2 ** 5 + 903165e-8 * u2 ** 6;
71
+ }
72
+ if (year < 1600) {
73
+ const u2 = (year - 1e3) / 100;
74
+ return 1570 - 157.42 * u2 - 51.5205 * u2 * u2 + 17.5101 * u2 * u2 * u2 - 0.720364 * u2 ** 4 + 0.01633 * u2 ** 5 - 0.113063 * u2 ** 6;
75
+ }
76
+ if (year < 1700) {
77
+ const t = year - 1600;
78
+ return 120 - 0.9808 * t - 0.01532 * t * t + t * t * t / 7129;
79
+ }
80
+ if (year < 1800) {
81
+ const t = year - 1700;
82
+ return 8.83 + 0.1603 * t - 59285e-7 * t * t + 13336e-8 * t * t * t - t ** 4 / 1174e3;
83
+ }
84
+ if (year < 1860) {
85
+ const t = year - 1800;
86
+ return 13.72 - 0.332447 * t + 68612e-7 * t * t + 41116e-7 * t * t * t - t ** 4 / 1022e3 + t ** 5 / 2616e4 - t ** 6 / 2e8;
87
+ }
88
+ if (year < 1900) {
89
+ const t = year - 1860;
90
+ return 7.62 + 0.5737 * t - 0.251754 * t * t + 0.0168066 * t * t * t - t ** 4 / 328e3 + t ** 5 / 212e5;
91
+ }
92
+ if (year < 1920) {
93
+ const t = year - 1900;
94
+ return -2.73 + 0.1218 * t - 0.034114 * t * t + 398787e-8 * t * t * t;
95
+ }
96
+ if (year < 1941) {
97
+ const t = year - 1920;
98
+ return 21.2 + 0.84493 * t - 0.0761 * t * t + 20936e-7 * t * t * t;
99
+ }
100
+ if (year < 1961) {
101
+ const t = year - 1950;
102
+ return 29.07 + 0.407 * t - t * t / 233 + t * t * t / 2547;
103
+ }
104
+ if (year < 1986) {
105
+ const t = year - 1975;
106
+ return 45.45 + 1.067 * t - t * t / 260 - t * t * t / 718;
107
+ }
108
+ if (year < 2005) {
109
+ const t = year - 2e3;
110
+ return 63.86 + 0.3345 * t - 0.060374 * t * t + 17275e-7 * t * t * t + 653935e-9 * t ** 4 + 237359e-10 * t ** 5;
111
+ }
112
+ if (year < 2050) {
113
+ const t = year - 2e3;
114
+ return 62.92 + 0.32217 * t + 5589e-6 * t * t;
115
+ }
116
+ if (year < 2150) {
117
+ return -20 + 32 * ((year - 1820) / 100) ** 2 - 0.5628 * (2150 - year);
118
+ }
119
+ const u = (year - 1820) / 100;
120
+ return -20 + 32 * u * u;
121
+ }
122
+
123
+ // src/astronomy/index.ts
124
+ var astronomy_exports = {};
125
+ __export(astronomy_exports, {
126
+ Astronomy: () => Astronomy
127
+ });
128
+
129
+ // src/algorithms/nutation.ts
130
+ var RAW_NUT_DATA = [
131
+ " 0 0 0 0 1-171996-174.2 92025 8.9 ",
132
+ " 0 0 2-2 2 -13187 -1.6 5736-3.1 ",
133
+ " 0 0 2 0 2 -2274 -0.2 977-0.5 ",
134
+ " 0 0 0 0 2 2062 0.2 -895 0.5 ",
135
+ " 0-1 0 0 0 -1426 3.4 54-0.1 ",
136
+ " 1 0 0 0 0 712 0.1 -7 0.0 ",
137
+ " 0 1 2-2 2 -517 1.2 224-0.6 ",
138
+ " 0 0 2 0 1 -386 -0.4 200 0.0 ",
139
+ " 1 0 2 0 2 -301 0.0 129-0.1 ",
140
+ " 0-1 2-2 2 217 -0.5 -95 0.3 ",
141
+ "-1 0 0 2 0 158 0.0 -1 0.0 ",
142
+ " 0 0 2-2 1 129 0.1 -70 0.0 ",
143
+ "-1 0 2 0 2 123 0.0 -53 0.0 ",
144
+ " 1 0 0 0 1 63 0.1 -33 0.0 ",
145
+ " 0 0 0 2 0 63 0.0 -2 0.0 ",
146
+ "-1 0 2 2 2 -59 0.0 26 0.0 ",
147
+ "-1 0 0 0 1 -58 -0.1 32 0.0 ",
148
+ " 1 0 2 0 1 -51 0.0 27 0.0 ",
149
+ "-2 0 0 2 0 -48 0.0 1 0.0 ",
150
+ "-2 0 2 0 1 46 0.0 -24 0.0 ",
151
+ " 0 0 2 2 2 -38 0.0 16 0.0 ",
152
+ " 2 0 2 0 2 -31 0.0 13 0.0 ",
153
+ " 2 0 0 0 0 29 0.0 -1 0.0 ",
154
+ " 1 0 2-2 2 29 0.0 -12 0.0 ",
155
+ " 0 0 2 0 0 26 0.0 -1 0.0 ",
156
+ " 0 0 2-2 0 -22 0.0 0 0.0 ",
157
+ "-1 0 2 0 1 21 0.0 -10 0.0 ",
158
+ " 0 2 0 0 0 17 -0.1 0 0.0 ",
159
+ " 0 2 2-2 2 -16 0.1 7 0.0 ",
160
+ "-1 0 0 2 1 16 0.0 -8 0.0 ",
161
+ " 0 1 0 0 1 -15 0.0 9 0.0 ",
162
+ " 1 0 0-2 1 -13 0.0 7 0.0 ",
163
+ " 0-1 0 0 1 -12 0.0 6 0.0 ",
164
+ " 2 0-2 0 0 11 0.0 0 0.0 ",
165
+ "-1 0 2 2 1 -10 0.0 5 0.0 ",
166
+ " 1 0 2 2 2 -8 0.0 3 0.0 ",
167
+ " 0-1 2 0 2 -7 0.0 3 0.0 ",
168
+ " 0 0 2 2 1 -7 0.0 3 0.0 ",
169
+ " 1 1 0-2 0 -7 0.0 0 0.0 ",
170
+ " 0 1 2 0 2 7 0.0 -3 0.0 ",
171
+ "-2 0 0 2 1 -6 0.0 3 0.0 ",
172
+ " 0 0 0 2 1 -6 0.0 3 0.0 ",
173
+ " 2 0 2-2 2 6 0.0 -3 0.0 ",
174
+ " 1 0 0 2 0 6 0.0 0 0.0 ",
175
+ " 1 0 2-2 1 6 0.0 -3 0.0 ",
176
+ " 0 0 0-2 1 -5 0.0 3 0.0 ",
177
+ " 0-1 2-2 1 -5 0.0 3 0.0 ",
178
+ " 2 0 2 0 1 -5 0.0 3 0.0 ",
179
+ " 1-1 0 0 0 5 0.0 0 0.0 ",
180
+ " 1 0 0-1 0 -4 0.0 0 0.0 ",
181
+ " 0 0 0 1 0 -4 0.0 0 0.0 ",
182
+ " 0 1 0-2 0 -4 0.0 0 0.0 ",
183
+ " 1 0-2 0 0 4 0.0 0 0.0 ",
184
+ " 2 0 0-2 1 4 0.0 -2 0.0 ",
185
+ " 0 1 2-2 1 4 0.0 -2 0.0 ",
186
+ " 1 1 0 0 0 -3 0.0 0 0.0 ",
187
+ " 1-1 0-1 0 -3 0.0 0 0.0 ",
188
+ "-1-1 2 2 2 -3 0.0 1 0.0 ",
189
+ " 0-1 2 2 2 -3 0.0 1 0.0 ",
190
+ " 1-1 2 0 2 -3 0.0 1 0.0 ",
191
+ " 3 0 2 0 2 -3 0.0 1 0.0 ",
192
+ "-2 0 2 0 2 -3 0.0 1 0.0 ",
193
+ " 1 0 2 0 0 3 0.0 0 0.0 ",
194
+ "-1 0 2 4 2 -2 0.0 1 0.0 ",
195
+ " 1 0 0 0 2 -2 0.0 1 0.0 ",
196
+ "-1 0 2-2 1 -2 0.0 1 0.0 ",
197
+ " 0-2 2-2 1 -2 0.0 1 0.0 ",
198
+ "-2 0 0 0 1 -2 0.0 1 0.0 ",
199
+ " 2 0 0 0 1 2 0.0 -1 0.0 ",
200
+ " 3 0 0 0 0 2 0.0 0 0.0 ",
201
+ " 1 1 2 0 2 2 0.0 -1 0.0 ",
202
+ " 0 0 2 1 2 2 0.0 -1 0.0 ",
203
+ " 1 0 0 2 1 -1 0.0 0 0.0 ",
204
+ " 1 0 2 2 1 -1 0.0 1 0.0 ",
205
+ " 1 1 0-2 1 -1 0.0 0 0.0 ",
206
+ " 0 1 0 2 0 -1 0.0 0 0.0 ",
207
+ " 0 1 2-2 0 -1 0.0 0 0.0 ",
208
+ " 0 1-2 2 0 -1 0.0 0 0.0 ",
209
+ " 1 0-2 2 0 -1 0.0 0 0.0 ",
210
+ " 1 0-2-2 0 -1 0.0 0 0.0 ",
211
+ " 1 0 2-2 0 -1 0.0 0 0.0 ",
212
+ " 1 0 0-4 0 -1 0.0 0 0.0 ",
213
+ " 2 0 0-4 0 -1 0.0 0 0.0 ",
214
+ " 0 0 2 4 2 -1 0.0 0 0.0 ",
215
+ " 0 0 2-1 2 -1 0.0 0 0.0 ",
216
+ "-2 0 2 4 2 -1 0.0 1 0.0 ",
217
+ " 2 0 2 2 2 -1 0.0 0 0.0 ",
218
+ " 0-1 2 0 1 -1 0.0 0 0.0 ",
219
+ " 0 0-2 0 1 -1 0.0 0 0.0 ",
220
+ " 0 0 4-2 2 1 0.0 0 0.0 ",
221
+ " 0 1 0 0 2 1 0.0 0 0.0 ",
222
+ " 1 1 2-2 2 1 0.0 -1 0.0 ",
223
+ " 3 0 2-2 2 1 0.0 0 0.0 ",
224
+ "-2 0 2 2 2 1 0.0 -1 0.0 ",
225
+ "-1 0 0 0 2 1 0.0 -1 0.0 ",
226
+ " 0 0-2 2 1 1 0.0 0 0.0 ",
227
+ " 0 1 2 0 1 1 0.0 0 0.0 ",
228
+ "-1 0 4 0 2 1 0.0 0 0.0 ",
229
+ " 2 1 0-2 0 1 0.0 0 0.0 ",
230
+ " 2 0 0 2 0 1 0.0 0 0.0 ",
231
+ " 2 0 2-2 1 1 0.0 -1 0.0 ",
232
+ " 2 0-2 0 1 1 0.0 0 0.0 ",
233
+ " 1-1 0-2 0 1 0.0 0 0.0 ",
234
+ "-1 0 0 1 1 1 0.0 0 0.0 ",
235
+ "-1-1 0 2 1 1 0.0 0 0.0 ",
236
+ " 0 1 0 1 0 1 0.0 0 0.0 "
237
+ ];
238
+ function calculateNutation(TE) {
239
+ const TE2 = TE * TE;
240
+ const TE3 = TE2 * TE;
241
+ let localMm = 134.962981389 + 198.867398056 * TE + norm360(477e3 * TE) + 0.008697222222 * TE2 + TE3 / 56250;
242
+ let localM = 357.527723333 + 359.05034 * TE + norm360(35640 * TE) - 1602777778e-13 * TE2 - TE3 / 3e5;
243
+ let localF = 93.271910277 + 82.017538055 * TE + norm360(483120 * TE) - 36825e-7 * TE2 + TE3 / 327272.7273;
244
+ let localD = 297.850363055 + 307.11148 * TE + norm360(444960 * TE) - 0.001914166667 * TE2 + TE3 / 189473.6842;
245
+ let localOmega = 125.044522222 - 134.136260833 * TE - norm360(1800 * TE) + 0.002070833333 * TE2 + TE3 / 45e4;
246
+ const Mm_rad = norm360(localMm) * DTR;
247
+ const M_rad = norm360(localM) * DTR;
248
+ const F_rad = norm360(localF) * DTR;
249
+ const D_rad = norm360(localD) * DTR;
250
+ const omega_rad = norm360(localOmega) * DTR;
251
+ let dp = 0;
252
+ let de = 0;
253
+ for (const entry of RAW_NUT_DATA) {
254
+ const fMm = parseInt(entry.substring(0, 2).trim(), 10);
255
+ const fM = parseInt(entry.substring(2, 4).trim(), 10);
256
+ const fF = parseInt(entry.substring(4, 6).trim(), 10);
257
+ const fD = parseInt(entry.substring(6, 8).trim(), 10);
258
+ const f_omega = parseInt(entry.substring(8, 10).trim(), 10);
259
+ const term1 = parseInt(entry.substring(10, 17).trim(), 10);
260
+ const term1t = parseFloat(entry.substring(17, 23).trim()) || 0;
261
+ const term2 = parseInt(entry.substring(23, 29).trim(), 10);
262
+ const term2t = parseFloat(entry.substring(29, 33).trim()) || 0;
263
+ const arg = fD * D_rad + fM * M_rad + fMm * Mm_rad + fF * F_rad + f_omega * omega_rad;
264
+ dp += (term1 + TE * term1t) * Math.sin(arg);
265
+ de += (term2 + TE * term2t) * Math.cos(arg);
266
+ }
267
+ const deltaPsi = dp / 36e6;
268
+ const deltaEps = de / 36e6;
269
+ const eps0 = (84381.448 - 46.815 * TE - 59e-5 * TE2 + 1813e-6 * TE3) / 3600;
270
+ const eps = eps0 + deltaEps;
271
+ return { deltaPsi, deltaEps, eps0, eps };
272
+ }
273
+
274
+ // src/algorithms/solar.ts
275
+ function calculateSolar(jd, deltaPsi, eps, TE, Tau, T) {
276
+ const { cos, sin, atan2, asin } = Math;
277
+ let L0 = 175347046;
278
+ L0 += 3341656 * cos(4.6692568 + 6283.07585 * Tau);
279
+ L0 += 34894 * cos(4.6261 + 12566.1517 * Tau);
280
+ L0 += 3497 * cos(2.7441 + 5753.3849 * Tau);
281
+ L0 += 3418 * cos(2.8289 + 3.5231 * Tau);
282
+ L0 += 3136 * cos(3.6277 + 77713.7715 * Tau);
283
+ L0 += 2676 * cos(4.4181 + 7860.4194 * Tau);
284
+ L0 += 2343 * cos(6.1352 + 3930.2097 * Tau);
285
+ L0 += 1324 * cos(0.7425 + 11506.7698 * Tau);
286
+ L0 += 1273 * cos(2.0371 + 529.691 * Tau);
287
+ L0 += 1199 * cos(1.1096 + 1577.3435 * Tau);
288
+ L0 += 990 * cos(5.233 + 5884.927 * Tau);
289
+ L0 += 902 * cos(2.045 + 26.298 * Tau);
290
+ L0 += 857 * cos(3.508 + 398.149 * Tau);
291
+ L0 += 780 * cos(1.179 + 5223.694 * Tau);
292
+ L0 += 753 * cos(2.533 + 5507.553 * Tau);
293
+ L0 += 505 * cos(4.583 + 18849.228 * Tau);
294
+ L0 += 492 * cos(4.205 + 775.523 * Tau);
295
+ L0 += 357 * cos(2.92 + 0.067 * Tau);
296
+ L0 += 317 * cos(5.849 + 11790.629 * Tau);
297
+ L0 += 284 * cos(1.899 + 796.298 * Tau);
298
+ L0 += 271 * cos(0.315 + 10977.079 * Tau);
299
+ L0 += 243 * cos(0.345 + 5486.778 * Tau);
300
+ L0 += 206 * cos(4.806 + 2544.314 * Tau);
301
+ L0 += 205 * cos(1.869 + 5573.143 * Tau);
302
+ L0 += 202 * cos(2.458 + 6069.777 * Tau);
303
+ L0 += 156 * cos(0.833 + 213.299 * Tau);
304
+ L0 += 132 * cos(3.411 + 2942.463 * Tau);
305
+ L0 += 126 * cos(1.083 + 20.775 * Tau);
306
+ L0 += 115 * cos(0.645 + 0.98 * Tau);
307
+ L0 += 103 * cos(0.636 + 4694.003 * Tau);
308
+ L0 += 102 * cos(0.976 + 15720.839 * Tau);
309
+ L0 += 102 * cos(4.267 + 7.114 * Tau);
310
+ L0 += 99 * cos(6.21 + 2146.17 * Tau);
311
+ L0 += 98 * cos(0.68 + 155.42 * Tau);
312
+ L0 += 86 * cos(5.98 + 161000.69 * Tau);
313
+ L0 += 85 * cos(1.3 + 6275.96 * Tau);
314
+ L0 += 85 * cos(3.67 + 71430.7 * Tau);
315
+ L0 += 80 * cos(1.81 + 17260.15 * Tau);
316
+ L0 += 79 * cos(3.04 + 12036.46 * Tau);
317
+ L0 += 75 * cos(1.76 + 5088.63 * Tau);
318
+ L0 += 74 * cos(3.5 + 3154.69 * Tau);
319
+ L0 += 74 * cos(4.68 + 801.82 * Tau);
320
+ L0 += 70 * cos(0.83 + 9437.76 * Tau);
321
+ L0 += 62 * cos(3.98 + 8827.39 * Tau);
322
+ L0 += 61 * cos(1.82 + 7084.9 * Tau);
323
+ L0 += 57 * cos(2.78 + 6286.6 * Tau);
324
+ L0 += 56 * cos(4.39 + 14143.5 * Tau);
325
+ L0 += 56 * cos(3.47 + 6279.55 * Tau);
326
+ L0 += 52 * cos(0.19 + 12139.55 * Tau);
327
+ L0 += 52 * cos(1.33 + 1748.02 * Tau);
328
+ L0 += 51 * cos(0.28 + 5856.48 * Tau);
329
+ L0 += 49 * cos(0.49 + 1194.45 * Tau);
330
+ L0 += 41 * cos(5.37 + 8429.24 * Tau);
331
+ L0 += 41 * cos(2.4 + 19651.05 * Tau);
332
+ L0 += 39 * cos(6.17 + 10447.39 * Tau);
333
+ L0 += 37 * cos(6.04 + 10213.29 * Tau);
334
+ L0 += 37 * cos(2.57 + 1059.38 * Tau);
335
+ L0 += 36 * cos(1.71 + 2352.87 * Tau);
336
+ L0 += 36 * cos(1.78 + 6812.77 * Tau);
337
+ L0 += 33 * cos(0.59 + 17789.85 * Tau);
338
+ L0 += 30 * cos(0.44 + 83996.85 * Tau);
339
+ L0 += 30 * cos(2.74 + 1349.87 * Tau);
340
+ L0 += 25 * cos(3.16 + 4690.48 * Tau);
341
+ let L1 = 628331966747;
342
+ L1 += 206059 * cos(2.678235 + 6283.07585 * Tau);
343
+ L1 += 4303 * cos(2.6351 + 12566.1517 * Tau);
344
+ L1 += 425 * cos(1.59 + 3.523 * Tau);
345
+ L1 += 119 * cos(5.796 + 26.298 * Tau);
346
+ L1 += 109 * cos(2.966 + 1577.344 * Tau);
347
+ L1 += 93 * cos(2.59 + 18849.23 * Tau);
348
+ L1 += 72 * cos(1.14 + 529.69 * Tau);
349
+ L1 += 68 * cos(1.87 + 398.15 * Tau);
350
+ L1 += 67 * cos(4.41 + 5507.55 * Tau);
351
+ L1 += 59 * cos(2.89 + 5223.69 * Tau);
352
+ L1 += 56 * cos(2.17 + 155.42 * Tau);
353
+ L1 += 45 * cos(0.4 + 796.3 * Tau);
354
+ L1 += 36 * cos(0.47 + 775.52 * Tau);
355
+ L1 += 29 * cos(2.65 + 7.11 * Tau);
356
+ L1 += 21 * cos(5.34 + 0.98 * Tau);
357
+ L1 += 19 * cos(1.85 + 5486.78 * Tau);
358
+ L1 += 19 * cos(4.97 + 213.3 * Tau);
359
+ L1 += 17 * cos(2.99 + 6275.96 * Tau);
360
+ L1 += 16 * cos(0.03 + 2544.31 * Tau);
361
+ L1 += 16 * cos(1.43 + 2146.17 * Tau);
362
+ L1 += 15 * cos(1.21 + 10977.08 * Tau);
363
+ L1 += 12 * cos(2.83 + 1748.02 * Tau);
364
+ L1 += 12 * cos(3.26 + 5088.63 * Tau);
365
+ L1 += 12 * cos(5.27 + 1194.45 * Tau);
366
+ L1 += 12 * cos(2.08 + 4694 * Tau);
367
+ L1 += 11 * cos(0.77 + 553.57 * Tau);
368
+ L1 += 10 * cos(1.3 + 6286.6 * Tau);
369
+ L1 += 10 * cos(4.24 + 1349.87 * Tau);
370
+ L1 += 9 * cos(2.7 + 242.73 * Tau);
371
+ L1 += 9 * cos(5.64 + 951.72 * Tau);
372
+ L1 += 8 * cos(5.3 + 2352.87 * Tau);
373
+ L1 += 6 * cos(2.65 + 9437.76 * Tau);
374
+ L1 += 6 * cos(4.67 + 4690.48 * Tau);
375
+ let L2 = 52919;
376
+ L2 += 8720 * cos(1.0721 + 6283.0758 * Tau);
377
+ L2 += 309 * cos(0.867 + 12566.152 * Tau);
378
+ L2 += 27 * cos(0.05 + 3.52 * Tau);
379
+ L2 += 16 * cos(5.19 + 26.3 * Tau);
380
+ L2 += 16 * cos(3.68 + 155.42 * Tau);
381
+ L2 += 10 * cos(0.76 + 18849.23 * Tau);
382
+ L2 += 9 * cos(2.06 + 77713.77 * Tau);
383
+ L2 += 7 * cos(0.83 + 775.52 * Tau);
384
+ L2 += 5 * cos(4.66 + 1577.34 * Tau);
385
+ L2 += 4 * cos(1.03 + 7.11 * Tau);
386
+ L2 += 4 * cos(3.44 + 5573.14 * Tau);
387
+ L2 += 3 * cos(5.14 + 796.3 * Tau);
388
+ L2 += 3 * cos(6.05 + 5507.55 * Tau);
389
+ L2 += 3 * cos(1.19 + 242.73 * Tau);
390
+ L2 += 3 * cos(6.12 + 529.69 * Tau);
391
+ L2 += 3 * cos(0.31 + 398.15 * Tau);
392
+ L2 += 3 * cos(2.28 + 553.57 * Tau);
393
+ L2 += 2 * cos(4.38 + 5223.69 * Tau);
394
+ L2 += 2 * cos(3.75 + 0.98 * Tau);
395
+ let L3 = 289 * cos(5.844 + 6283.076 * Tau);
396
+ L3 += 35;
397
+ L3 += 17 * cos(5.49 + 12566.15 * Tau);
398
+ L3 += 3 * cos(5.2 + 155.42 * Tau);
399
+ L3 += 1 * cos(4.72 + 3.52 * Tau);
400
+ L3 += 1 * cos(5.3 + 18849.23 * Tau);
401
+ L3 += 1 * cos(5.97 + 242.73 * Tau);
402
+ let L4 = 114 * cos(3.142);
403
+ L4 += 8 * cos(4.13 + 6283.08 * Tau);
404
+ L4 += 1 * cos(3.84 + 12566.15 * Tau);
405
+ let L5 = 1 * cos(3.14 + 0 * Tau);
406
+ const Tau2 = Tau * Tau;
407
+ const Tau3 = Tau2 * Tau;
408
+ const Tau4 = Tau3 * Tau;
409
+ const Tau5 = Tau4 * Tau;
410
+ const Lhelioc = norm360((L0 + L1 * Tau + L2 * Tau2 + L3 * Tau3 + L4 * Tau4 + L5 * Tau5) / 1e8 / (Math.PI / 180));
411
+ const LsunTrue = norm360(Lhelioc + 180 - 25e-6);
412
+ let B0 = 280 * cos(3.199 + 84334.662 * Tau);
413
+ B0 += 102 * cos(5.422 + 5507.553 * Tau);
414
+ B0 += 80 * cos(3.88 + 5223.69 * Tau);
415
+ B0 += 44 * cos(3.7 + 2352.87 * Tau);
416
+ B0 += 32 * cos(4 + 1577.34 * Tau);
417
+ let B1 = 9 * cos(3.9 + 5507.55 * Tau);
418
+ B1 += 6 * cos(1.73 + 5223.69 * Tau);
419
+ const B = (B0 + B1 * Tau) / 1e8 / (Math.PI / 180);
420
+ let beta = norm360(-B);
421
+ if (beta > 180) beta -= 360;
422
+ let R0 = 100013989;
423
+ R0 += 1670700 * cos(3.0984635 + 6283.07585 * Tau);
424
+ R0 += 13956 * cos(3.05525 + 12566.1517 * Tau);
425
+ R0 += 3084 * cos(5.1985 + 77713.7715 * Tau);
426
+ R0 += 1628 * cos(1.1739 + 5753.3849 * Tau);
427
+ R0 += 1576 * cos(2.8469 + 7860.4194 * Tau);
428
+ R0 += 925 * cos(5.453 + 11506.77 * Tau);
429
+ R0 += 542 * cos(4.564 + 3930.21 * Tau);
430
+ R0 += 472 * cos(3.661 + 5884.927 * Tau);
431
+ R0 += 346 * cos(0.964 + 5507.553 * Tau);
432
+ R0 += 329 * cos(5.9 + 5223.694 * Tau);
433
+ R0 += 307 * cos(0.299 + 5573.143 * Tau);
434
+ R0 += 243 * cos(4.273 + 11790.629 * Tau);
435
+ R0 += 212 * cos(5.847 + 1577.344 * Tau);
436
+ R0 += 186 * cos(5.022 + 10977.079 * Tau);
437
+ R0 += 175 * cos(3.012 + 18849.228 * Tau);
438
+ R0 += 110 * cos(5.055 + 5486.778 * Tau);
439
+ R0 += 98 * cos(0.89 + 6069.78 * Tau);
440
+ R0 += 86 * cos(5.69 + 15720.84 * Tau);
441
+ R0 += 86 * cos(1.27 + 161000.69 * Tau);
442
+ R0 += 65 * cos(0.27 + 17260.15 * Tau);
443
+ R0 += 63 * cos(0.92 + 529.69 * Tau);
444
+ R0 += 57 * cos(2.01 + 83996.85 * Tau);
445
+ R0 += 56 * cos(5.24 + 71430.7 * Tau);
446
+ R0 += 49 * cos(3.25 + 2544.31 * Tau);
447
+ R0 += 47 * cos(2.58 + 775.52 * Tau);
448
+ R0 += 45 * cos(5.54 + 9437.76 * Tau);
449
+ R0 += 43 * cos(6.01 + 6275.96 * Tau);
450
+ R0 += 39 * cos(5.36 + 4694 * Tau);
451
+ R0 += 38 * cos(2.39 + 8827.39 * Tau);
452
+ R0 += 37 * cos(0.83 + 19651.05 * Tau);
453
+ R0 += 37 * cos(4.9 + 12139.55 * Tau);
454
+ R0 += 36 * cos(1.67 + 12036.46 * Tau);
455
+ R0 += 35 * cos(1.84 + 2942.46 * Tau);
456
+ R0 += 33 * cos(0.24 + 7084.9 * Tau);
457
+ R0 += 32 * cos(0.18 + 5088.63 * Tau);
458
+ R0 += 32 * cos(1.78 + 398.15 * Tau);
459
+ R0 += 28 * cos(1.21 + 6286.6 * Tau);
460
+ R0 += 28 * cos(1.9 + 6279.55 * Tau);
461
+ R0 += 26 * cos(4.59 + 10447.39 * Tau);
462
+ let R1 = 103019 * cos(1.10749 + 6283.07585 * Tau);
463
+ R1 += 1721 * cos(1.0644 + 12566.1517 * Tau);
464
+ R1 += 702 * cos(3.142);
465
+ R1 += 32 * cos(1.02 + 18849.23 * Tau);
466
+ R1 += 31 * cos(2.84 + 5507.55 * Tau);
467
+ R1 += 25 * cos(1.32 + 5223.69 * Tau);
468
+ R1 += 18 * cos(1.42 + 1577.34 * Tau);
469
+ R1 += 10 * cos(5.91 + 10977.08 * Tau);
470
+ R1 += 9 * cos(1.42 + 6275.96 * Tau);
471
+ R1 += 9 * cos(0.27 + 5486.78 * Tau);
472
+ let R2 = 4359 * cos(5.7846 + 6283.0758 * Tau);
473
+ R2 += 124 * cos(5.579 + 12566.152 * Tau);
474
+ R2 += 12 * cos(3.14);
475
+ R2 += 9 * cos(3.63 + 77713.77 * Tau);
476
+ R2 += 6 * cos(1.87 + 5573.14 * Tau);
477
+ R2 += 3 * cos(5.47 + 18849.23 * Tau);
478
+ let R3 = 145 * cos(4.273 + 6283.076 * Tau);
479
+ R3 += 7 * cos(3.92 + 12566.15 * Tau);
480
+ let R4 = 4 * cos(2.56 + 6283.08 * Tau);
481
+ const R = (R0 + R1 * Tau + R2 * Tau2 + R3 * Tau3 + R4 * Tau4) / 1e8;
482
+ const TE2 = TE * TE;
483
+ const LsunPrime = norm360(Lhelioc + 180 - 1.397 * TE - 31e-5 * TE2);
484
+ const betaCorrected = beta + 11e-6 * (cosd(LsunPrime) - sind(LsunPrime));
485
+ const lambda = norm360(LsunTrue + deltaPsi - 5691611e-9 / R);
486
+ const RA = norm360(atan2d(sind(lambda) * cosd(eps) - tand(betaCorrected) * sind(eps), cosd(lambda)));
487
+ const SHA = norm360(360 - RA);
488
+ const DEC = asind(sind(betaCorrected) * cosd(eps) + cosd(betaCorrected) * sind(eps) * sind(lambda));
489
+ const T2 = T * T;
490
+ const T3 = T2 * T;
491
+ const GHAAmean = norm360(280.46061837 + 360.98564736629 * (jd - 2451545) + 387933e-9 * T2 - T3 / 3871e4);
492
+ const GHAAtrue = norm360(GHAAmean + deltaPsi * cosd(eps));
493
+ const GHA = norm360(GHAAtrue - RA);
494
+ const SD = 959.63 / R;
495
+ const HP = 8.794 / R;
496
+ const dayfraction = (jd + 0.5) % 1;
497
+ let EOT = 4 * GHA + 720 - 1440 * dayfraction;
498
+ if (EOT > 20) EOT -= 1440;
499
+ if (EOT < -20) EOT += 1440;
500
+ return { RA, DEC, GHA, SHA, SD, HP, EOT, distance: R };
501
+ }
502
+
503
+ // src/algorithms/moon.ts
504
+ function calculateMoon(jd, TE, deltaPsi, eps, GHAAtrue, sunLambda, sunRA, sunDec) {
505
+ const { abs, round, sin, cos, atan2, asin, floor } = Math;
506
+ const Lmoon_mean = norm360(218.3164591 + 481267.88134236 * TE - 13268e-7 * TE ** 2 + TE ** 3 / 538841 - TE ** 4 / 65194e3);
507
+ const D = norm360(297.8502042 + 445267.1115168 * TE - 163e-5 * TE ** 2 + TE ** 3 / 545868 - TE ** 4 / 113065e3);
508
+ const Msun_mean = norm360(357.5291092 + 35999.0502909 * TE - 1536e-7 * TE ** 2 + TE ** 3 / 2449e4);
509
+ const Mmoon_mean = norm360(134.9634114 + 477198.8676313 * TE + 8997e-6 * TE ** 2 + TE ** 3 / 69699 - TE ** 4 / 14712e3);
510
+ const F = norm360(93.2720993 + 483202.0175273 * TE - 34029e-7 * TE ** 2 - TE ** 3 / 3526e3 + TE ** 4 / 86331e4);
511
+ let A1 = norm360(119.75 + 131.849 * TE);
512
+ let A2 = norm360(53.09 + 479264.29 * TE);
513
+ let A3 = norm360(313.45 + 481266.484 * TE);
514
+ const fE = 1 - 2516e-6 * TE - 74e-7 * TE ** 2;
515
+ const fE2 = fE * fE;
516
+ const terms = [
517
+ { d: 0, ms: 0, mm: 1, f: 0, s: 6288774, c: -20905355 },
518
+ { d: 2, ms: 0, mm: -1, f: 0, s: 1274027, c: -3699111 },
519
+ { d: 2, ms: 0, mm: 0, f: 0, s: 658314, c: -2955968 },
520
+ { d: 0, ms: 0, mm: 2, f: 0, s: 213618, c: -569925 },
521
+ { d: 0, ms: 1, mm: 0, f: 0, s: -185116, c: 48888 },
522
+ { d: 0, ms: 0, mm: 0, f: 2, s: -114332, c: -3149 },
523
+ { d: 2, ms: 0, mm: -2, f: 0, s: 58793, c: 246158 },
524
+ { d: 2, ms: -1, mm: -1, f: 0, s: 57066, c: -152138 },
525
+ { d: 2, ms: 0, mm: 1, f: 0, s: 53322, c: -170733 },
526
+ { d: 2, ms: -1, mm: 0, f: 0, s: 45758, c: -204586 },
527
+ { d: 0, ms: 1, mm: -1, f: 0, s: -40923, c: -129620 },
528
+ { d: 1, ms: 0, mm: 0, f: 0, s: -34720, c: 108743 },
529
+ { d: 0, ms: 1, mm: 1, f: 0, s: -30383, c: 104755 },
530
+ { d: 2, ms: 0, mm: 0, f: -2, s: 15327, c: 10321 },
531
+ { d: 0, ms: 0, mm: 1, f: 2, s: -12528, c: 0 },
532
+ { d: 0, ms: 0, mm: 1, f: -2, s: 10980, c: 79661 },
533
+ { d: 4, ms: 0, mm: -1, f: 0, s: 10675, c: -34782 },
534
+ { d: 0, ms: 0, mm: 3, f: 0, s: 10034, c: -23210 },
535
+ { d: 4, ms: 0, mm: -2, f: 0, s: 8548, c: -21636 },
536
+ { d: 2, ms: 1, mm: -1, f: 0, s: -7888, c: 24208 },
537
+ { d: 2, ms: 1, mm: 0, f: 0, s: -6766, c: 30824 },
538
+ { d: 1, ms: 0, mm: -1, f: 0, s: -5163, c: -8379 },
539
+ { d: 1, ms: 1, mm: 0, f: 0, s: 4987, c: -16675 },
540
+ { d: 2, ms: -1, mm: 1, f: 0, s: 4036, c: -12831 },
541
+ { d: 2, ms: 0, mm: 2, f: 0, s: 3994, c: -10445 },
542
+ { d: 4, ms: 0, mm: 0, f: 0, s: 3861, c: -11650 },
543
+ { d: 2, ms: 0, mm: -3, f: 0, s: 3665, c: 14403 },
544
+ { d: 0, ms: 1, mm: -2, f: 0, s: -2689, c: -7003 },
545
+ { d: 2, ms: 0, mm: -1, f: 2, s: -2602, c: 0 },
546
+ { d: 2, ms: -1, mm: -2, f: 0, s: 2390, c: 10056 },
547
+ { d: 1, ms: 0, mm: 1, f: 0, s: -2348, c: 6322 },
548
+ { d: 2, ms: -2, mm: 0, f: 0, s: 2236, c: -9884 },
549
+ { d: 0, ms: 1, mm: 2, f: 0, s: -2120, c: 5751 },
550
+ { d: 0, ms: 2, mm: 0, f: 0, s: -2069, c: 0 },
551
+ { d: 2, ms: -2, mm: -1, f: 0, s: 2048, c: -4950 },
552
+ { d: 2, ms: 0, mm: 1, f: -2, s: -1773, c: 4130 },
553
+ { d: 2, ms: 0, mm: 0, f: 2, s: -1595, c: 0 },
554
+ { d: 4, ms: -1, mm: -1, f: 0, s: 1215, c: -3958 },
555
+ { d: 0, ms: 0, mm: 2, f: 2, s: -1110, c: 0 },
556
+ { d: 3, ms: 0, mm: -1, f: 0, s: -892, c: 3258 },
557
+ { d: 2, ms: 1, mm: 1, f: 0, s: -810, c: 2616 },
558
+ { d: 4, ms: -1, mm: -2, f: 0, s: 759, c: -1897 },
559
+ { d: 0, ms: 2, mm: -1, f: 0, s: -713, c: -2117 },
560
+ { d: 2, ms: 2, mm: -1, f: 0, s: -700, c: 2354 },
561
+ { d: 2, ms: 1, mm: -2, f: 0, s: 691, c: 0 },
562
+ { d: 2, ms: -1, mm: 0, f: -2, s: 596, c: 0 },
563
+ { d: 4, ms: 0, mm: 1, f: 0, s: 549, c: -1423 },
564
+ { d: 0, ms: 0, mm: 4, f: 0, s: 537, c: -1117 },
565
+ { d: 4, ms: -1, mm: 0, f: 0, s: 520, c: -1571 },
566
+ { d: 1, ms: 0, mm: -2, f: 0, s: -487, c: -1739 },
567
+ { d: 2, ms: 1, mm: 0, f: -2, s: -399, c: 0 },
568
+ { d: 0, ms: 0, mm: 2, f: -2, s: -381, c: -4421 },
569
+ { d: 1, ms: 1, mm: 1, f: 0, s: 351, c: 0 },
570
+ { d: 3, ms: 0, mm: -2, f: 0, s: -340, c: 0 },
571
+ { d: 4, ms: 0, mm: -3, f: 0, s: 330, c: 0 },
572
+ { d: 2, ms: -1, mm: 2, f: 0, s: 327, c: 0 },
573
+ { d: 0, ms: 2, mm: 1, f: 0, s: -323, c: 1165 },
574
+ { d: 1, ms: 1, mm: -1, f: 0, s: 299, c: 0 },
575
+ { d: 2, ms: 0, mm: 3, f: 0, s: 294, c: 0 },
576
+ { d: 2, ms: 0, mm: -1, f: -2, s: 0, c: 8752 }
577
+ ];
578
+ let sumL = 0;
579
+ let sumR = 0;
580
+ for (const term of terms) {
581
+ let f = 1;
582
+ if (abs(term.ms) === 1) f = fE;
583
+ if (abs(term.ms) === 2) f = fE2;
584
+ const arg = term.d * D + term.ms * Msun_mean + term.mm * Mmoon_mean + term.f * F;
585
+ sumL += f * term.s * sind(arg);
586
+ sumR += f * term.c * cosd(arg);
587
+ }
588
+ const latTerms = [
589
+ { d: 0, ms: 0, mm: 0, f: 1, s: 5128122 },
590
+ { d: 0, ms: 0, mm: 1, f: 1, s: 280602 },
591
+ { d: 0, ms: 0, mm: 1, f: -1, s: 277693 },
592
+ { d: 2, ms: 0, mm: 0, f: -1, s: 173237 },
593
+ { d: 2, ms: 0, mm: -1, f: 1, s: 55413 },
594
+ { d: 2, ms: 0, mm: -1, f: -1, s: 46271 },
595
+ { d: 2, ms: 0, mm: 0, f: 1, s: 32573 },
596
+ { d: 0, ms: 0, mm: 2, f: 1, s: 17198 },
597
+ { d: 2, ms: 0, mm: 1, f: -1, s: 9266 },
598
+ { d: 0, ms: 0, mm: 2, f: -1, s: 8822 },
599
+ { d: 2, ms: -1, mm: 0, f: -1, s: 8216 },
600
+ { d: 2, ms: 0, mm: -2, f: -1, s: 4324 },
601
+ { d: 2, ms: 0, mm: 1, f: 1, s: 4200 },
602
+ { d: 2, ms: 1, mm: 0, f: -1, s: -3359 },
603
+ { d: 2, ms: -1, mm: -1, f: 1, s: 2463 },
604
+ { d: 2, ms: -1, mm: 0, f: 1, s: 2211 },
605
+ { d: 2, ms: -1, mm: -1, f: -1, s: 2065 },
606
+ { d: 0, ms: 1, mm: -1, f: -1, s: -1870 },
607
+ { d: 4, ms: 0, mm: -1, f: -1, s: 1828 },
608
+ { d: 0, ms: 1, mm: 0, f: 1, s: -1794 },
609
+ { d: 0, ms: 0, mm: 0, f: 3, s: -1749 },
610
+ { d: 0, ms: 1, mm: -1, f: 1, s: -1565 },
611
+ { d: 1, ms: 0, mm: 0, f: 1, s: -1491 },
612
+ { d: 0, ms: 1, mm: 1, f: 1, s: -1475 },
613
+ { d: 0, ms: 1, mm: 1, f: -1, s: -1410 },
614
+ { d: 0, ms: 1, mm: 0, f: -1, s: -1344 },
615
+ { d: 1, ms: 0, mm: 0, f: -1, s: -1335 },
616
+ { d: 0, ms: 0, mm: 3, f: 1, s: 1107 },
617
+ { d: 4, ms: 0, mm: 0, f: -1, s: 1021 },
618
+ { d: 4, ms: 0, mm: -1, f: 1, s: 833 },
619
+ { d: 0, ms: 0, mm: 1, f: -3, s: 777 },
620
+ { d: 4, ms: 0, mm: -2, f: 1, s: 671 },
621
+ { d: 2, ms: 0, mm: 0, f: -3, s: 607 },
622
+ { d: 2, ms: 0, mm: 2, f: -1, s: 596 },
623
+ { d: 2, ms: -1, mm: 1, f: -1, s: 491 },
624
+ { d: 2, ms: 0, mm: -2, f: 1, s: -451 },
625
+ { d: 0, ms: 0, mm: 3, f: -1, s: 439 },
626
+ { d: 2, ms: 0, mm: 2, f: 1, s: 422 },
627
+ { d: 2, ms: 0, mm: -3, f: -1, s: 421 },
628
+ { d: 2, ms: 1, mm: -1, f: 1, s: -366 },
629
+ { d: 2, ms: 1, mm: 0, f: 1, s: -351 },
630
+ { d: 4, ms: 0, mm: 0, f: 1, s: 331 },
631
+ { d: 2, ms: -1, mm: 1, f: 1, s: 315 },
632
+ { d: 2, ms: -2, mm: 0, f: -1, s: 302 },
633
+ { d: 0, ms: 0, mm: 1, f: 3, s: -283 },
634
+ { d: 2, ms: 1, mm: 1, f: -1, s: -229 },
635
+ { d: 1, ms: 1, mm: 0, f: -1, s: 223 },
636
+ { d: 1, ms: 1, mm: 0, f: 1, s: 223 },
637
+ { d: 0, ms: 1, mm: -2, f: -1, s: -220 },
638
+ { d: 2, ms: 1, mm: -1, f: -1, s: -220 },
639
+ { d: 1, ms: 0, mm: 1, f: 1, s: -185 },
640
+ { d: 2, ms: -1, mm: -2, f: -1, s: 181 },
641
+ { d: 0, ms: 1, mm: 2, f: 1, s: -177 },
642
+ { d: 4, ms: 0, mm: -2, f: -1, s: 176 },
643
+ { d: 4, ms: -1, mm: -1, f: -1, s: 166 },
644
+ { d: 1, ms: 0, mm: 1, f: -1, s: -164 },
645
+ { d: 4, ms: 0, mm: 1, f: -1, s: 132 },
646
+ { d: 1, ms: 0, mm: -1, f: -1, s: -119 },
647
+ { d: 4, ms: -1, mm: 0, f: -1, s: 115 },
648
+ { d: 2, ms: -2, mm: 0, f: 1, s: 107 }
649
+ ];
650
+ let sumB = 0;
651
+ for (const term of latTerms) {
652
+ let f = 1;
653
+ if (abs(term.ms) === 1) f = fE;
654
+ if (abs(term.ms) === 2) f = fE2;
655
+ const arg = term.d * D + term.ms * Msun_mean + term.mm * Mmoon_mean + term.f * F;
656
+ sumB += f * term.s * sind(arg);
657
+ }
658
+ sumL = sumL + 3958 * sind(A1) + 1962 * sind(Lmoon_mean - F) + 318 * sind(A2);
659
+ sumB = sumB - 2235 * sind(Lmoon_mean) + 382 * sind(A3) + 175 * sind(A1 - F) + 175 * sind(A1 + F) + 127 * sind(Lmoon_mean - Mmoon_mean) - 115 * sind(Lmoon_mean + Mmoon_mean);
660
+ const lambdaM = norm360(Lmoon_mean + sumL / 1e6);
661
+ const betaM = sumB / 1e6;
662
+ const dEM = 385000.56 + sumR / 1e3;
663
+ const lambdaMapp = lambdaM + deltaPsi;
664
+ const RA = norm360(atan2d(sind(lambdaMapp) * cosd(eps) - tand(betaM) * sind(eps), cosd(lambdaMapp)));
665
+ const SHA = norm360(360 - RA);
666
+ const DEC = asind(sind(betaM) * cosd(eps) + cosd(betaM) * sind(eps) * sind(lambdaMapp));
667
+ const GHA = norm360(GHAAtrue - RA);
668
+ const HP = 3600 * asind(6378.14 / dEM);
669
+ const SD = 3600 * asind(1738 / dEM);
670
+ let phaseAngle = lambdaMapp - sunLambda;
671
+ const illumination = 100 * (1 - cosd(phaseAngle)) / 2;
672
+ const xMoon = norm360(phaseAngle);
673
+ const isWaxing = xMoon > 0 && xMoon < 180;
674
+ return {
675
+ RA,
676
+ DEC,
677
+ GHA,
678
+ SHA,
679
+ SD,
680
+ HP,
681
+ illumination: round(10 * illumination) / 10,
682
+ isWaxing,
683
+ distance: dEM
684
+ };
685
+ }
686
+
687
+ // src/algorithms/polaris.ts
688
+ function calculatePolaris(TE, GHAAtrue, eps, deltaPsi, sunLambda) {
689
+ const { atan2, asin, sin, cos, tan } = Math;
690
+ const RApol0 = 37.95293333;
691
+ const DECpol0 = 89.26408889;
692
+ const dRApol = 2.98155 / 3600;
693
+ const dDECpol = -0.0152 / 3600;
694
+ const RApol1 = RApol0 + 100 * TE * dRApol;
695
+ const DECpol1 = DECpol0 + 100 * TE * dDECpol;
696
+ const eps0_2000 = 23.439291111;
697
+ const lambdapol1 = atan2d(sind(RApol1) * cosd(eps0_2000) + tand(DECpol1) * sind(eps0_2000), cosd(RApol1));
698
+ const betapol1 = asind(sind(DECpol1) * cosd(eps0_2000) - cosd(DECpol1) * sind(eps0_2000) * sind(RApol1));
699
+ const eta = (47.0029 * TE - 0.03302 * TE ** 2 + 6e-5 * TE ** 3) / 3600 * (Math.PI / 180);
700
+ const PI0 = (174.876384 - (869.8089 * TE + 0.03536 * TE ** 2) / 3600) * (Math.PI / 180);
701
+ const p0 = (5029.0966 * TE + 1.11113 * TE ** 2 - 6e-7 * TE ** 3) / 3600 * (Math.PI / 180);
702
+ const A1 = cos(eta) * cosd(betapol1) * sin(PI0 - lambdapol1 * (Math.PI / 180)) - sin(eta) * sind(betapol1);
703
+ const B1 = cosd(betapol1) * cos(PI0 - lambdapol1 * (Math.PI / 180));
704
+ const C1 = cos(eta) * sind(betapol1) + sin(eta) * cosd(betapol1) * sin(PI0 - lambdapol1 * (Math.PI / 180));
705
+ let lambdapol2 = (p0 + PI0 - atan2(A1, B1)) / (Math.PI / 180);
706
+ let betapol2 = asin(C1) / (Math.PI / 180);
707
+ lambdapol2 += deltaPsi;
708
+ const kappa = 20.49552 / 3600;
709
+ const pi0 = 102.93735 + 1.71953 * TE + 46e-5 * TE ** 2;
710
+ const e = 0.016708617 - 42037e-9 * TE - 1236e-10 * TE ** 2;
711
+ const dlambdapol = (e * kappa * cosd(pi0 - lambdapol2) - kappa * cosd(sunLambda - lambdapol2)) / cosd(betapol2);
712
+ const dbetapol = -kappa * sind(betapol2) * (sind(sunLambda - lambdapol2) - e * sind(pi0 - lambdapol2));
713
+ lambdapol2 += dlambdapol;
714
+ betapol2 += dbetapol;
715
+ const RApol2 = atan2d(sind(lambdapol2) * cosd(eps) - tand(betapol2) * sind(eps), cosd(lambdapol2));
716
+ const DECpol2 = asind(sind(betapol2) * cosd(eps) + cosd(betapol2) * sind(eps) * sind(lambdapol2));
717
+ return {
718
+ GHA: norm360(GHAAtrue - RApol2),
719
+ SHA: norm360(360 - RApol2),
720
+ DEC: DECpol2
721
+ };
722
+ }
723
+
724
+ // src/astronomy/index.ts
725
+ var Astronomy = class {
726
+ _jd;
727
+ _jde;
728
+ _t;
729
+ // JD-based centuries
730
+ _te;
731
+ // JDE-based centuries
732
+ _tau;
733
+ // JDE-based millennia
734
+ _nutation;
735
+ _solar;
736
+ _moon;
737
+ _polaris;
738
+ constructor(date = /* @__PURE__ */ new Date(), deltaT) {
739
+ this._jd = getJulianDate(date);
740
+ const dt = deltaT !== void 0 ? deltaT : getDeltaT(date.getUTCFullYear());
741
+ this._jde = this._jd + dt / 86400;
742
+ this._t = (this._jd - 2451545) / 36525;
743
+ this._te = (this._jde - 2451545) / 36525;
744
+ this._tau = 0.1 * this._te;
745
+ this._nutation = calculateNutation(this._te);
746
+ }
747
+ get jd() {
748
+ return this._jd;
749
+ }
750
+ get jde() {
751
+ return this._jde;
752
+ }
753
+ get t() {
754
+ return this._t;
755
+ }
756
+ get te() {
757
+ return this._te;
758
+ }
759
+ get tau() {
760
+ return this._tau;
761
+ }
762
+ get nutation() {
763
+ return this._nutation;
764
+ }
765
+ get sun() {
766
+ if (!this._solar) {
767
+ this._solar = calculateSolar(
768
+ this._jd,
769
+ this._nutation.deltaPsi,
770
+ this._nutation.eps,
771
+ this._te,
772
+ this._tau,
773
+ this._t
774
+ );
775
+ }
776
+ return this._solar;
777
+ }
778
+ get moon() {
779
+ if (!this._moon) {
780
+ const sunResult = this.sun;
781
+ const t2 = this._t * this._t;
782
+ const t3 = t2 * this._t;
783
+ const ghaaMean = (280.46061837 + 360.98564736629 * (this._jd - 2451545) + 387933e-9 * t2 - t3 / 3871e4) % 360;
784
+ const ghaaTrue = (ghaaMean + this._nutation.deltaPsi * Math.cos(this._nutation.eps * Math.PI / 180)) % 360;
785
+ this._moon = calculateMoon(
786
+ this._jd,
787
+ this._te,
788
+ this._nutation.deltaPsi,
789
+ this._nutation.eps,
790
+ ghaaTrue,
791
+ 0,
792
+ // Should use apparent longitude of sun
793
+ sunResult.RA,
794
+ sunResult.DEC
795
+ );
796
+ }
797
+ return this._moon;
798
+ }
799
+ get polaris() {
800
+ if (!this._polaris) {
801
+ const sunResult = this.sun;
802
+ const t2 = this._t * this._t;
803
+ const t3 = t2 * this._t;
804
+ const ghaaMean = (280.46061837 + 360.98564736629 * (this._jd - 2451545) + 387933e-9 * t2 - t3 / 3871e4) % 360;
805
+ const ghaaTrue = (ghaaMean + this._nutation.deltaPsi * Math.cos(this._nutation.eps * Math.PI / 180)) % 360;
806
+ this._polaris = calculatePolaris(
807
+ this._te,
808
+ ghaaTrue,
809
+ this._nutation.eps,
810
+ this._nutation.deltaPsi,
811
+ 0
812
+ // sunLambda
813
+ );
814
+ }
815
+ return this._polaris;
816
+ }
817
+ };
818
+
819
+ // src/prayer/index.ts
820
+ var prayer_exports = {};
821
+ __export(prayer_exports, {
822
+ PRESETS: () => PRESETS,
823
+ PrayerEngine: () => PrayerEngine,
824
+ getPrayerTimes: () => getPrayerTimes
825
+ });
826
+
827
+ // src/prayer/types.ts
828
+ var PRESETS = {
829
+ MWL: { fajrAngle: 18, ishaAngle: 17 },
830
+ ISNA: { fajrAngle: 15, ishaAngle: 15 },
831
+ Egypt: { fajrAngle: 19.5, ishaAngle: 17.5 },
832
+ Makkah: { fajrAngle: 18.5, ishaInterval: 90 },
833
+ Karachi: { fajrAngle: 18, ishaAngle: 18 },
834
+ Tehran: { fajrAngle: 17.7, ishaAngle: 14, maghribAngle: 4.5 },
835
+ Jafari: { fajrAngle: 16, ishaAngle: 14, maghribAngle: 4 }
836
+ };
837
+
838
+ // src/prayer/engine.ts
839
+ var PrayerEngine = class {
840
+ constructor(coords, method = "Karachi") {
841
+ this.coords = coords;
842
+ this.method = method;
843
+ }
844
+ coords;
845
+ method;
846
+ calculate(date, asrFactor = 2) {
847
+ console.log(`--- ENGINE DEBUG: ${date.toDateString()} ---`);
848
+ console.log(`Coords: ${this.coords.latitude}, ${this.coords.longitude}`);
849
+ const dhuhr = this.calculateTransit(date);
850
+ console.log(`Solar Noon (Dhuhr): ${dhuhr.toISOString()} (${dhuhr.toString()})`);
851
+ const params = PRESETS[this.method];
852
+ const fajr = this.solveIteratively(date, params.fajrAngle, "morning");
853
+ console.log(`Fajr: ${isNaN(fajr.getTime()) ? "No Occurrence" : fajr.toISOString()}`);
854
+ const sunrise = this.solvePhenomenonIteratively(date, "morning");
855
+ console.log(`Sunrise: ${isNaN(sunrise.getTime()) ? "No Occurrence" : sunrise.toISOString()}`);
856
+ const maghrib = params.maghribInterval ? new Date(sunrise.getTime() + params.maghribInterval * 6e4) : params.maghribAngle ? this.solveIteratively(date, params.maghribAngle, "evening") : this.solvePhenomenonIteratively(date, "evening");
857
+ console.log(`Maghrib: ${isNaN(maghrib.getTime()) ? "No Occurrence" : maghrib.toISOString()}`);
858
+ const isha = params.ishaInterval ? new Date(maghrib.getTime() + params.ishaInterval * 6e4) : this.solveIteratively(date, params.ishaAngle || 18, "evening");
859
+ console.log(`Isha: ${isNaN(isha.getTime()) ? "No Occurrence" : isha.toISOString()}`);
860
+ const asr = this.solveAsrIteratively(date, asrFactor);
861
+ console.log(`Asr: ${isNaN(asr.getTime()) ? "No Occurrence" : asr.toISOString()}`);
862
+ const dhahwaKubra = new Date((fajr.getTime() + maghrib.getTime()) / 2);
863
+ console.log(`Dhahwa Kubra: ${isNaN(dhahwaKubra.getTime()) ? "No Occurrence" : dhahwaKubra.toISOString()}`);
864
+ return {
865
+ fajr,
866
+ sunrise,
867
+ dhahwaKubra,
868
+ dhuhr,
869
+ asr,
870
+ maghrib,
871
+ isha
872
+ };
873
+ }
874
+ getSolarAt(date) {
875
+ const jd = getJulianDate(date);
876
+ const dt = 70;
877
+ const jde = jd + dt / 86400;
878
+ const t = (jd - 2451545) / 36525;
879
+ const te = (jde - 2451545) / 36525;
880
+ const tau = 0.1 * te;
881
+ const nut = calculateNutation(te);
882
+ const solar = calculateSolar(jd, nut.deltaPsi, nut.eps, te, tau, t);
883
+ console.log(`[jd=${jd.toFixed(6)}] GHA=${solar.GHA.toFixed(4)}, DEC=${solar.DEC.toFixed(4)}, EOT=${solar.EOT.toFixed(4)}`);
884
+ return { solar, jd };
885
+ }
886
+ calculateTransit(date) {
887
+ let currentUtcTime = 12 - this.coords.longitude / 15;
888
+ for (let i = 0; i < 3; i++) {
889
+ const checkDate = this.toDate(date, currentUtcTime);
890
+ const { solar } = this.getSolarAt(checkDate);
891
+ currentUtcTime = 12 - this.coords.longitude / 15 - solar.EOT / 60;
892
+ }
893
+ return this.toDate(date, currentUtcTime);
894
+ }
895
+ /**
896
+ * Successive Approximation loop for target Zenith angle.
897
+ * Stops when refinement is < 1 second.
898
+ */
899
+ solveIteratively(date, angleBelowHorizon, side) {
900
+ let prevTime = side === "morning" ? 6 : 18;
901
+ let currentUtcTime = prevTime;
902
+ const MAX_ITER = 5;
903
+ for (let i = 0; i < MAX_ITER; i++) {
904
+ const checkDate = this.toDate(date, currentUtcTime);
905
+ const { solar } = this.getSolarAt(checkDate);
906
+ const denominator = cosd(this.coords.latitude) * cosd(solar.DEC);
907
+ if (Math.abs(denominator) < 1e-10) {
908
+ return /* @__PURE__ */ new Date(NaN);
909
+ }
910
+ const cosH = (sind(-angleBelowHorizon) - sind(this.coords.latitude) * sind(solar.DEC)) / denominator;
911
+ if (cosH > 1 || cosH < -1) return /* @__PURE__ */ new Date(NaN);
912
+ const H = acosd(cosH) / 15;
913
+ const transit = 12 - this.coords.longitude / 15 - solar.EOT / 60;
914
+ currentUtcTime = side === "morning" ? transit - H : transit + H;
915
+ if (Math.abs(currentUtcTime - prevTime) * 3600 < 1) break;
916
+ prevTime = currentUtcTime;
917
+ }
918
+ return this.toDate(date, currentUtcTime);
919
+ }
920
+ /**
921
+ * Successive Approximation for Sunrise/Maghrib.
922
+ * Formula: 90 + 34' (Refraction) + SD - HP
923
+ */
924
+ solvePhenomenonIteratively(date, side) {
925
+ let prevTime = side === "morning" ? 6 : 18;
926
+ let currentUtcTime = prevTime;
927
+ for (let i = 0; i < 5; i++) {
928
+ const checkDate = this.toDate(date, currentUtcTime);
929
+ const { solar } = this.getSolarAt(checkDate);
930
+ const refraction = 34 / 60;
931
+ const sd_deg = solar.SD / 3600;
932
+ const hp_deg = solar.HP / 3600;
933
+ const elevation = this.coords.elevation || 0;
934
+ const dip = 0.02933333 * Math.sqrt(elevation);
935
+ const targetZenith = 90 + refraction + sd_deg - hp_deg + dip;
936
+ const denominator = cosd(this.coords.latitude) * cosd(solar.DEC);
937
+ if (Math.abs(denominator) < 1e-10) {
938
+ return /* @__PURE__ */ new Date(NaN);
939
+ }
940
+ const cosH = (cosd(targetZenith) - sind(this.coords.latitude) * sind(solar.DEC)) / denominator;
941
+ if (cosH > 1 || cosH < -1) return /* @__PURE__ */ new Date(NaN);
942
+ const H = acosd(cosH) / 15;
943
+ const transit = 12 - this.coords.longitude / 15 - solar.EOT / 60;
944
+ currentUtcTime = side === "morning" ? transit - H : transit + H;
945
+ if (Math.abs(currentUtcTime - prevTime) * 3600 < 1) break;
946
+ prevTime = currentUtcTime;
947
+ }
948
+ return this.toDate(date, currentUtcTime);
949
+ }
950
+ solveAsrIteratively(date, factor) {
951
+ let prevTime = 15;
952
+ let currentUtcTime = prevTime;
953
+ for (let i = 0; i < 5; i++) {
954
+ const checkDate = this.toDate(date, currentUtcTime);
955
+ const { solar } = this.getSolarAt(checkDate);
956
+ const alt = factor + tand(Math.abs(this.coords.latitude - solar.DEC));
957
+ const h = atan2d(1, alt);
958
+ const denominator = cosd(this.coords.latitude) * cosd(solar.DEC);
959
+ if (Math.abs(denominator) < 1e-10) {
960
+ return /* @__PURE__ */ new Date(NaN);
961
+ }
962
+ const cosH = (sind(h) - sind(this.coords.latitude) * sind(solar.DEC)) / denominator;
963
+ if (cosH > 1 || cosH < -1) return /* @__PURE__ */ new Date(NaN);
964
+ const H = acosd(cosH) / 15;
965
+ const transit = 12 - this.coords.longitude / 15 - solar.EOT / 60;
966
+ currentUtcTime = transit + H;
967
+ if (Math.abs(currentUtcTime - prevTime) * 3600 < 1) break;
968
+ prevTime = currentUtcTime;
969
+ }
970
+ return this.toDate(date, currentUtcTime);
971
+ }
972
+ toDate(baseDate, utcHours) {
973
+ const d = new Date(Date.UTC(baseDate.getUTCFullYear(), baseDate.getUTCMonth(), baseDate.getUTCDate(), 0, 0, 0));
974
+ const totalSeconds = Math.round(utcHours * 3600);
975
+ d.setUTCSeconds(totalSeconds);
976
+ return d;
977
+ }
978
+ };
979
+
980
+ // src/prayer/index.ts
981
+ function getPrayerTimes(arg1, arg2, arg3, arg4, arg5, arg6) {
982
+ let config;
983
+ if (typeof arg1 === "number") {
984
+ config = {
985
+ location: { latitude: arg1, longitude: arg2 || 0 },
986
+ method: arg3 || "Karachi",
987
+ madhab: typeof arg4 === "number" ? arg4 === 2 ? "Hanafi" : "Shafi" : arg4 || "Hanafi",
988
+ date: arg5 || /* @__PURE__ */ new Date(),
989
+ elevation: arg6
990
+ };
991
+ } else {
992
+ config = arg1;
993
+ }
994
+ const {
995
+ date = /* @__PURE__ */ new Date(),
996
+ location,
997
+ method = "Karachi",
998
+ madhab = "Hanafi",
999
+ elevation = config.location.elevation || 0,
1000
+ elevationUnit = "m"
1001
+ } = config;
1002
+ const elevationMeters = elevationUnit === "ft" ? elevation * 0.3048 : elevation;
1003
+ const engine = new PrayerEngine({ ...location, elevation: elevationMeters }, method);
1004
+ const factor = madhab === "Hanafi" ? 2 : 1;
1005
+ return engine.calculate(date, factor);
1006
+ }
1007
+
1008
+ // src/qibla/index.ts
1009
+ var qibla_exports = {};
1010
+ __export(qibla_exports, {
1011
+ calculateQibla: () => calculateQibla
1012
+ });
1013
+ var MAKKAH_LAT = 21.4225;
1014
+ var MAKKAH_LNG = 39.8262;
1015
+ function calculateQibla(coords) {
1016
+ const phi = coords.latitude;
1017
+ const lambda = coords.longitude;
1018
+ const y = sind(MAKKAH_LNG - lambda);
1019
+ const x = cosd(phi) * tand(MAKKAH_LAT) - sind(phi) * cosd(MAKKAH_LNG - lambda);
1020
+ let qibla = atan2d(y, x);
1021
+ if (qibla < 0) qibla += 360;
1022
+ const dPhi = Math.log(tand(MAKKAH_LAT / 2 + 45) / tand(phi / 2 + 45));
1023
+ const dLon = (MAKKAH_LNG - lambda) * Math.PI / 180;
1024
+ let rhumb = atan2d(dLon, dPhi);
1025
+ if (rhumb < 0) rhumb += 360;
1026
+ const R = 6371;
1027
+ const dLat = (MAKKAH_LAT - phi) * Math.PI / 180;
1028
+ const dl = (MAKKAH_LNG - lambda) * Math.PI / 180;
1029
+ const a = Math.sin(dLat / 2) ** 2 + Math.cos(phi * Math.PI / 180) * Math.cos(MAKKAH_LAT * Math.PI / 180) * Math.sin(dl / 2) ** 2;
1030
+ const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
1031
+ const distance = R * c;
1032
+ return {
1033
+ bearing: qibla,
1034
+ rhumbLine: rhumb,
1035
+ distance
1036
+ };
1037
+ }
1038
+ export {
1039
+ astronomy_exports as Astronomy,
1040
+ Astronomy as AstronomyClass,
1041
+ DTR,
1042
+ PRESETS,
1043
+ PrayerEngine,
1044
+ prayer_exports as PrayerTimes,
1045
+ qibla_exports as Qibla,
1046
+ RTD,
1047
+ acosd,
1048
+ asind,
1049
+ atan2d,
1050
+ getPrayerTimes as calculate,
1051
+ calculateQibla,
1052
+ cosd,
1053
+ getDeltaT,
1054
+ getJulianCenturies,
1055
+ getJulianDate,
1056
+ getJulianMillennia,
1057
+ getPrayerTimes,
1058
+ norm24,
1059
+ norm360,
1060
+ sind,
1061
+ tand
1062
+ };