UNPKG

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