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