stellafane.js 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. /**
  6. The following code is brought to you by:
  7. <!--
  8. Stellafane Equinox & Solsticew Calculator for http://www.Stellafane.com
  9. 2004-Mar-07 KHS Created by Ken Slater
  10. 2006-Jun-15 KHS: New page format
  11. 2008-Mar-21 KHS: Fixed to work with Safari
  12. 2012-Feb-04 KHS: Updated to HTML5
  13. Copyright 1999-2012 The Springfield Telescope Makers, Inc., All Rights Reserved.
  14. -->
  15. It's been modified in 2015 by Berkeley Churchill for the Badi Calendar app
  16. */
  17. var EquinoxCalc = {
  18. vernal_equinox: function vernal_equinox(year) {
  19. return EquinoxCalc.calcEquiSol(1, year);
  20. },
  21. //-----Utility Funtions------------------------------------------------------------
  22. INT: function INT(n) {
  23. return Math.floor(n);
  24. }, // Emulates BASIC's INT Funtion
  25. POW2: function POW2(n) {
  26. return Math.pow(n, 2);
  27. }, // Square a number
  28. POW3: function POW3(n) {
  29. return Math.pow(n, 3);
  30. }, // Cube a number
  31. POW4: function POW4(n) {
  32. return Math.pow(n, 4);
  33. }, // Number to the 4th power
  34. COS: function COS(deg) {
  35. // Cosine function with degrees as input
  36. return Math.cos(deg * Math.PI / 180);
  37. },
  38. //-----Calculate and Display a single event for a single year (Either a Equiniox or Solstice)
  39. // Meeus Astronmical Algorithms Chapter 27
  40. calcEquiSol: function calcEquiSol(i, year) {
  41. var k = i - 1;
  42. var str;
  43. var JDE0 = EquinoxCalc.calcInitial(k, year); // Initial estimate of date of event
  44. var T = (JDE0 - 2451545.0) / 36525;
  45. var W = 35999.373 * T - 2.47;
  46. var dL = 1 + 0.0334 * EquinoxCalc.COS(W) + 0.0007 * EquinoxCalc.COS(2 * W);
  47. var S = EquinoxCalc.periodic24(T);
  48. var JDE = JDE0 + 0.00001 * S / dL; // This is the answer in Julian Emphemeris Days
  49. var TDT = EquinoxCalc.fromJDtoUTC(JDE); // Convert Julian Days to TDT in a Date Object
  50. var UTC = EquinoxCalc.fromTDTtoUTC(TDT); // Correct TDT to UTC, both as Date Objects
  51. return UTC;
  52. }, // End calcEquiSol
  53. //-----Calcualte an initial guess as the JD of the Equinox or Solstice of a Given Year
  54. // Meeus Astronmical Algorithms Chapter 27
  55. calcInitial: function calcInitial(k, year) {
  56. // Valid for years 1000 to 3000
  57. var JDE0 = 0,
  58. Y = (year - 2000) / 1000;
  59. switch (k) {
  60. case 0:
  61. JDE0 = 2451623.80984 + 365242.37404 * Y + 0.05169 * EquinoxCalc.POW2(Y) - 0.00411 * EquinoxCalc.POW3(Y) - 0.00057 * EquinoxCalc.POW4(Y);break;
  62. case 1:
  63. JDE0 = 2451716.56767 + 365241.62603 * Y + 0.00325 * EquinoxCalc.POW2(Y) + 0.00888 * EquinoxCalc.POW3(Y) - 0.00030 * EquinoxCalc.POW4(Y);break;
  64. case 2:
  65. JDE0 = 2451810.21715 + 365242.01767 * Y - 0.11575 * EquinoxCalc.POW2(Y) + 0.00337 * EquinoxCalc.POW3(Y) + 0.00078 * EquinoxCalc.POW4(Y);break;
  66. case 3:
  67. JDE0 = 2451900.05952 + 365242.74049 * Y - 0.06223 * EquinoxCalc.POW2(Y) - 0.00823 * EquinoxCalc.POW3(Y) + 0.00032 * EquinoxCalc.POW4(Y);break;
  68. }
  69. return JDE0;
  70. }, // End calcInitial
  71. //-----Calculate 24 Periodic Terms----------------------------------------------------
  72. // Meeus Astronmical Algorithms Chapter 27
  73. periodic24: function periodic24(T) {
  74. var A = new Array(485, 203, 199, 182, 156, 136, 77, 74, 70, 58, 52, 50, 45, 44, 29, 18, 17, 16, 14, 12, 12, 12, 9, 8);
  75. var B = new Array(324.96, 337.23, 342.08, 27.85, 73.14, 171.52, 222.54, 296.72, 243.58, 119.81, 297.17, 21.02, 247.54, 325.15, 60.93, 155.12, 288.79, 198.04, 199.76, 95.39, 287.11, 320.81, 227.73, 15.45);
  76. var C = new Array(1934.136, 32964.467, 20.186, 445267.112, 45036.886, 22518.443, 65928.934, 3034.906, 9037.513, 33718.147, 150.678, 2281.226, 29929.562, 31555.956, 4443.417, 67555.328, 4562.452, 62894.029, 31436.921, 14577.848, 31931.756, 34777.259, 1222.114, 16859.074);
  77. var S = 0;
  78. for (var i = 0; i < 24; i++) {
  79. S += A[i] * EquinoxCalc.COS(B[i] + C[i] * T);
  80. }
  81. return S;
  82. },
  83. //-----Correct TDT to UTC----------------------------------------------------------------
  84. fromTDTtoUTC: function fromTDTtoUTC(tobj) {
  85. // from Meeus Astronmical Algroithms Chapter 10
  86. // Correction lookup table has entry for every even year between TBLfirst and TBLlast
  87. var TBLfirst = 1620,
  88. TBLlast = 2002; // Range of years in lookup table
  89. var TBL = new Array( // Corrections in Seconds
  90. /*1620*/121, 112, 103, 95, 88, 82, 77, 72, 68, 63, 60, 56, 53, 51, 48, 46, 44, 42, 40, 38,
  91. /*1660*/35, 33, 31, 29, 26, 24, 22, 20, 18, 16, 14, 12, 11, 10, 9, 8, 7, 7, 7, 7,
  92. /*1700*/7, 7, 8, 8, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11,
  93. /*1740*/11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 15, 16, 16,
  94. /*1780*/16, 16, 16, 16, 16, 16, 15, 15, 14, 13,
  95. /*1800*/13.1, 12.5, 12.2, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 11.9, 11.6, 11.0, 10.2, 9.2, 8.2,
  96. /*1830*/7.1, 6.2, 5.6, 5.4, 5.3, 5.4, 5.6, 5.9, 6.2, 6.5, 6.8, 7.1, 7.3, 7.5, 7.6,
  97. /*1860*/7.7, 7.3, 6.2, 5.2, 2.7, 1.4, -1.2, -2.8, -3.8, -4.8, -5.5, -5.3, -5.6, -5.7, -5.9,
  98. /*1890*/-6.0, -6.3, -6.5, -6.2, -4.7, -2.8, -0.1, 2.6, 5.3, 7.7, 10.4, 13.3, 16.0, 18.2, 20.2,
  99. /*1920*/21.1, 22.4, 23.5, 23.8, 24.3, 24.0, 23.9, 23.9, 23.7, 24.0, 24.3, 25.3, 26.2, 27.3, 28.2,
  100. /*1950*/29.1, 30.0, 30.7, 31.4, 32.2, 33.1, 34.0, 35.0, 36.5, 38.3, 40.2, 42.2, 44.5, 46.5, 48.5,
  101. /*1980*/50.5, 52.5, 53.8, 54.9, 55.8, 56.9, 58.3, 60.0, 61.6, 63.0, 63.8, 64.3); /*2002 last entry*/
  102. // Values for Delta T for 2000 thru 2002 from NASA
  103. var deltaT = 0; // deltaT = TDT - UTC (in Seconds)
  104. var Year = tobj.getUTCFullYear();
  105. var t = (Year - 2000) / 100; // Centuries from the epoch 2000.0
  106. if (Year >= TBLfirst && Year <= TBLlast) {
  107. // Find correction in table
  108. if (Year % 2) {
  109. // Odd year - interpolate
  110. deltaT = (TBL[(Year - TBLfirst - 1) / 2] + TBL[(Year - TBLfirst + 1) / 2]) / 2;
  111. } else {
  112. // Even year - direct table lookup
  113. deltaT = TBL[(Year - TBLfirst) / 2];
  114. }
  115. } else if (Year < 948) {
  116. deltaT = 2177 + 497 * t + 44.1 * EquinoxCalc.POW2(t);
  117. } else if (Year >= 948) {
  118. deltaT = 102 + 102 * t + 25.3 * EquinoxCalc.POW2(t);
  119. if (Year >= 2000 && Year <= 2100) {
  120. // Special correction to avoid discontinurity in 2000
  121. deltaT += 0.37 * (Year - 2100);
  122. }
  123. } else {
  124. alert("Error: TDT to UTC correction not computed");
  125. }
  126. return new Date(tobj.getTime() - deltaT * 1000); // JavaScript native time is in milliseonds
  127. }, // End fromTDTtoUTC
  128. //-----Julian Date to UTC Date Object----------------------------------------------------
  129. // Meeus Astronmical Algorithms Chapter 7
  130. fromJDtoUTC: function fromJDtoUTC(JD) {
  131. // JD = Julian Date, possible with fractional days
  132. // Output is a JavaScript UTC Date Object
  133. var A, alpha;
  134. var Z = EquinoxCalc.INT(JD + 0.5); // Integer JD's
  135. var F = JD + 0.5 - Z; // Fractional JD's
  136. if (Z < 2299161) {
  137. A = Z;
  138. } else {
  139. alpha = EquinoxCalc.INT((Z - 1867216.25) / 36524.25);
  140. A = Z + 1 + alpha - EquinoxCalc.INT(alpha / 4);
  141. }
  142. var B = A + 1524;
  143. var C = EquinoxCalc.INT((B - 122.1) / 365.25);
  144. var D = EquinoxCalc.INT(365.25 * C);
  145. var E = EquinoxCalc.INT((B - D) / 30.6001);
  146. var DT = B - D - EquinoxCalc.INT(30.6001 * E) + F; // Day of Month with decimals for time
  147. var Mon = E - (E < 13.5 ? 1 : 13); // Month Number
  148. var Yr = C - (Mon > 2.5 ? 4716 : 4715); // Year
  149. var Day = EquinoxCalc.INT(DT); // Day of Month without decimals for time
  150. var H = 24 * (DT - Day); // Hours and fractional hours
  151. var Hr = EquinoxCalc.INT(H); // Integer Hours
  152. var M = 60 * (H - Hr); // Minutes and fractional minutes
  153. var Min = EquinoxCalc.INT(M); // Integer Minutes
  154. var Sec = EquinoxCalc.INT(60 * (M - Min)); // Integer Seconds (Milliseconds discarded)
  155. //Create and set a JavaScript Date Object and return it
  156. var theDate = new Date(0);
  157. theDate.setUTCFullYear(Yr, Mon - 1, Day);
  158. theDate.setUTCHours(Hr, Min, Sec);
  159. return theDate;
  160. } //End fromJDtoUTC
  161. };
  162. exports.default = EquinoxCalc;