UNPKG

12.8 kBJavaScriptView Raw
1function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
2
3function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
4
5function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
6
7/**
8 * @copyright 2013 Sonia Keys
9 * @copyright 2016 commenthol
10 * @license MIT
11 * @module sexagesimal
12 */
13/**
14 * Sexagesimal functions
15 */
16
17/**
18 * Angle represents a general purpose angle.
19 * Unit is radians.
20 */
21export var Angle = function () {
22 /**
23 * constructs a new Angle value from sign, degree, minute, and second
24 * components.
25 * __One argument__
26 * @param {Number} angle - (float) angle in radians
27 * __Four arguments__
28 * @param {Boolean} neg - sign, true if negative (required to attribute -0°30')
29 * @param {Number} d - (int) degree
30 * @param {Number} m - (int) minute
31 * @param {Number} s - (float) second
32 */
33 function Angle(neg, d, m, s) {
34 _classCallCheck(this, Angle);
35
36 if (arguments.length === 1) {
37 this.angle = neg;
38 } else {
39 this.setDMS(neg, d, m, s);
40 }
41 }
42
43 /**
44 * SetDMS sets the value of an FAngle from sign, degree, minute, and second
45 * components.
46 * The receiver is returned as a convenience.
47 * @param {Boolean} neg - sign, true if negative
48 * @param {Number} d - (int) degree
49 * @param {Number} m - (int) minute
50 * @param {Number} s - (float) second
51 * @returns {Angle}
52 */
53
54
55 Angle.prototype.setDMS = function setDMS() {
56 var neg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
57 var d = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
58 var m = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
59 var s = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0.0;
60
61 this.angle = DMSToDeg(neg, d, m, s) * Math.PI / 180;
62 return this;
63 };
64
65 /**
66 * sets angle
67 * @param {Number} angle - (float) angle in radians
68 * @returns {Angle}
69 */
70
71
72 Angle.prototype.setAngle = function setAngle(rad) {
73 this.angle = rad;
74 return this;
75 };
76
77 /**
78 * Rad returns the angle in radians.
79 * @returns {Number} angle in radians
80 */
81
82
83 Angle.prototype.rad = function rad() {
84 return this.angle;
85 };
86
87 /**
88 * Deg returns the angle in degrees.
89 * @returns {Number} angle in degree
90 */
91
92
93 Angle.prototype.deg = function deg() {
94 return this.angle * 180 / Math.PI;
95 };
96
97 /**
98 * toDMS converts to parsed sexagesimal angle component.
99 */
100
101
102 Angle.prototype.toDMS = function toDMS() {
103 return degToDMS(this.deg());
104 };
105
106 /**
107 * Print angle in degree using `d°m´s.ss″`
108 * @param {Number} precision - precision of `s.ss`
109 * @returns {String}
110 */
111
112
113 Angle.prototype.toString = function toString(precision) {
114 var _toDMS = this.toDMS(),
115 neg = _toDMS[0],
116 d = _toDMS[1],
117 m = _toDMS[2],
118 s = _toDMS[3];
119
120 s = round(s, precision).toString().replace(/^0\./, '.');
121 var str = (neg ? '-' : '') + (d + '°') + (m + '′') + (s + '″');
122 return str;
123 };
124
125 /**
126 * Print angle in degree using `d°.ff`
127 * @param {Number} precision - precision of `.ff`
128 * @returns {String}
129 */
130
131
132 Angle.prototype.toDegString = function toDegString(precision) {
133 var _modf = modf(this.deg()),
134 i = _modf[0],
135 s = _modf[1];
136
137 s = round(s, precision).toString().replace(/^0\./, '.');
138 var str = i + '°' + s;
139 return str;
140 };
141
142 return Angle;
143}();
144
145/**
146 * HourAngle represents an angle corresponding to angular rotation of
147 * the Earth in a specified time.
148 *
149 * Unit is radians.
150 */
151export var HourAngle = function (_Angle) {
152 _inherits(HourAngle, _Angle);
153
154 function HourAngle() {
155 _classCallCheck(this, HourAngle);
156
157 return _possibleConstructorReturn(this, _Angle.apply(this, arguments));
158 }
159
160 /**
161 * NewHourAngle constructs a new HourAngle value from sign, hour, minute,
162 * and second components.
163 * @param {Boolean} neg
164 * @param {Number} h - (int)
165 * @param {Number} m - (int)
166 * @param {Number} s - (float)
167 */
168 // constructor (neg, h, m, s) {
169 // super(neg, h, m, s)
170 // }
171
172 /**
173 * SetDMS sets the value of an FAngle from sign, degree, minute, and second
174 * components.
175 * The receiver is returned as a convenience.
176 * @param {Boolean} neg - sign, true if negative
177 * @param {Number} h - (int) hour
178 * @param {Number} m - (int) minute
179 * @param {Number} s - (float) second
180 * @returns {Angle}
181 */
182 HourAngle.prototype.setDMS = function setDMS() {
183 var neg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
184 var h = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
185 var m = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
186 var s = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0.0;
187
188 this.angle = DMSToDeg(neg, h, m, s) * 15 * Math.PI / 180;
189 return this;
190 };
191
192 /**
193 * Hour returns the hour angle as hours of time.
194 * @returns hour angle
195 */
196
197
198 HourAngle.prototype.hour = function hour() {
199 return this.angle * 12 / Math.PI; // 12 = 180 / 15
200 };
201
202 HourAngle.prototype.deg = function deg() {
203 return this.hour();
204 };
205
206 /**
207 * Print angle in `HʰMᵐs.ssˢ`
208 * @param {Number} precision - precision of `s.ss`
209 * @returns {String}
210 */
211
212
213 HourAngle.prototype.toString = function toString(precision) {
214 var _toDMS2 = this.toDMS(),
215 neg = _toDMS2[0],
216 h = _toDMS2[1],
217 m = _toDMS2[2],
218 s = _toDMS2[3];
219
220 s = round(s, precision).toString().replace(/^0\./, '.');
221 var str = (neg ? '-' : '') + (h + 'ʰ') + (m + 'ᵐ') + (s + 'ˢ');
222 return str;
223 };
224
225 return HourAngle;
226}(Angle);
227
228/**
229 * DMSToDeg converts from parsed sexagesimal angle components to decimal
230 * degrees.
231 * @param {Boolean} neg - sign, true if negative
232 * @param {Number} d - (int) degree
233 * @param {Number} m - (int) minute
234 * @param {Number} s - (float) second
235 * @returns {Number} angle in degree
236 */
237export function DMSToDeg(neg, d, m, s) {
238 s = ((d * 60 + m) * 60 + s) / 3600;
239 if (neg) {
240 return -s;
241 }
242 return s;
243}
244
245/**
246 * DegToDMS converts from decimal degrees to parsed sexagesimal angle component.
247 * @param {Number} deg - angle in degree
248 * @returns {Array} [neg, d, m, s]
249 * {Boolean} neg - sign, true if negative
250 * {Number} d - (int) degree
251 * {Number} m - (int) minute
252 * {Number} s - (float) second
253 */
254export function degToDMS(deg) {
255 var neg = deg < 0;
256 deg = Math.abs(deg);
257
258 var _modf2 = modf(deg % 360),
259 d = _modf2[0],
260 s = _modf2[1];
261
262 var _modf3 = modf(s * 60),
263 m = _modf3[0],
264 s1 = _modf3[1];
265
266 s = round(s1 * 60); // may introduce an error < 1e13
267 return [neg, d, m, s];
268}
269
270/**
271 * TODO
272 */
273export var RA = function (_HourAngle) {
274 _inherits(RA, _HourAngle);
275
276 /**
277 * constructs a new RA value from hour, minute, and second components.
278 * Negative values are not supported, RA wraps values larger than 24
279 * to the range [0,24) hours.
280 * @param {Number} h - (int) hour
281 * @param {Number} m - (int) minute
282 * @param {Number} s - (float) second
283 */
284 function RA() {
285 var h = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
286 var m = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
287 var s = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
288
289 _classCallCheck(this, RA);
290
291 var _this2 = _possibleConstructorReturn(this, _HourAngle.call(this));
292
293 var args = [].slice.call(arguments);
294 if (args.length === 1) {
295 _this2.angle = h;
296 } else {
297 var hr = DMSToDeg(false, h, m, s) % 24;
298 _this2.angle = hr * 15 * Math.PI / 180;
299 }
300 return _this2;
301 }
302
303 RA.prototype.hour = function hour() {
304 var h = this.angle * 12 / Math.PI;
305 return (24 + h % 24) % 24;
306 };
307
308 return RA;
309}(HourAngle);
310
311/**
312 * Time Angle
313 * Unit is time in seconds.
314 */
315export var Time = function () {
316 /**
317 * @param {Boolean} neg - set `true` if negative
318 * @param {Number} h - (int) hour
319 * @param {Number} m - (int) minute
320 * @param {Number} s - (float) second
321 */
322 function Time(neg, h, m, s) {
323 _classCallCheck(this, Time);
324
325 if (arguments.length === 1) {
326 this.time = neg;
327 } else {
328 this.setHMS(neg, h, m, s);
329 }
330 }
331
332 Time.prototype.setHMS = function setHMS() {
333 var neg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
334 var h = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
335 var m = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
336 var s = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
337
338 s += (h * 60 + m) * 60;
339 if (neg) {
340 s = -s;
341 }
342 this.time = s;
343 };
344
345 /**
346 * @returns {Number} time in seconds.
347 */
348
349
350 Time.prototype.sec = function sec() {
351 return this.time;
352 };
353
354 /**
355 * @returns {Number} time in minutes.
356 */
357
358
359 Time.prototype.min = function min() {
360 return this.time / 60;
361 };
362
363 /**
364 * @returns {Number} time in hours.
365 */
366
367
368 Time.prototype.hour = function hour() {
369 return this.time / 3600;
370 };
371
372 /**
373 * @returns {Number} time in days.
374 */
375
376
377 Time.prototype.day = function day() {
378 return this.time / 3600 / 24;
379 };
380
381 /**
382 * @returns {Number} time in radians, where 1 day = 2 Pi radians.
383 */
384
385
386 Time.prototype.rad = function rad() {
387 return this.time * Math.PI / 12 / 3600;
388 };
389
390 /**
391 * convert time to HMS
392 * @returns {Array} [neg, h, m, s]
393 * {Boolean} neg - sign, true if negative
394 * {Number} h - (int) hour
395 * {Number} m - (int) minute
396 * {Number} s - (float) second
397 */
398
399
400 Time.prototype.toHMS = function toHMS() {
401 var t = this.time;
402 var neg = t < 0;
403 t = neg ? -t : t;
404 var h = Math.trunc(t / 3600);
405 t = t - h * 3600;
406 var m = Math.trunc(t / 60);
407 var s = t - m * 60;
408 return [neg, h, m, s];
409 };
410
411 /**
412 * Print time using `HʰMᵐsˢ.ss`
413 * @param {Number} precision - precision of `.ss`
414 * @returns {String}
415 */
416
417
418 Time.prototype.toString = function toString(precision) {
419 var _toHMS = this.toHMS(),
420 neg = _toHMS[0],
421 h = _toHMS[1],
422 m = _toHMS[2],
423 s = _toHMS[3];
424
425 var _modf4 = modf(s),
426 si = _modf4[0],
427 sf = _modf4[1];
428
429 if (precision === 0) {
430 si = round(s, 0);
431 sf = 0;
432 } else {
433 sf = round(sf, precision).toString().substr(1);
434 }
435 var str = (neg ? '-' : '') + (h + 'ʰ') + (m + 'ᵐ') + (si + 'ˢ') + (sf || '');
436 return str;
437 };
438
439 return Time;
440}();
441
442// units
443export var angleFromDeg = function angleFromDeg(deg) {
444 return deg * Math.PI / 180;
445};
446export var angleFromMin = function angleFromMin(min) {
447 return min / 60 * Math.PI / 180;
448};
449export var angleFromSec = function angleFromSec(sec) {
450 return sec / 3600 * Math.PI / 180;
451};
452export var degFromAngle = function degFromAngle(angle) {
453 return angle * 180 / Math.PI;
454};
455export var secFromAngle = function secFromAngle(angle) {
456 return angle * 3600 * 180 / Math.PI;
457};
458export var secFromHourAngle = function secFromHourAngle(ha) {
459 return ha * 240 * 180 / Math.PI;
460};
461
462/**
463 * separate fix `i` from fraction `f`
464 * @private
465 * @param {Number} float
466 * @returns {Array} [i, f]
467 * {Number} i - (int) fix value
468 * {Number} f - (float) fractional portion; always > 1
469 */
470function modf(float) {
471 var i = Math.trunc(float);
472 var f = Math.abs(float - i);
473 return [i, f];
474}
475
476/**
477 * Rounds `float` value by precision
478 * @private
479 * @param {Number} float - value to round
480 * @param {Number} precision - (int) number of post decimal positions
481 * @return {Number} rounded `float`
482 */
483function round(float, precision) {
484 precision = precision === undefined ? 10 : precision;
485 return parseFloat(float.toFixed(precision), 10);
486}
487
488export default {
489 Angle: Angle,
490 HourAngle: HourAngle,
491 DMSToDeg: DMSToDeg,
492 degToDMS: degToDMS,
493 RA: RA,
494 Time: Time,
495 angleFromDeg: angleFromDeg,
496 angleFromMin: angleFromMin,
497 angleFromSec: angleFromSec,
498 degFromAngle: degFromAngle,
499 secFromAngle: secFromAngle,
500 secFromHourAngle: secFromHourAngle
501};
\No newline at end of file