home *** CD-ROM | disk | FTP | other *** search
/ Sky at Night 2005 November / SAN CD 11-2005 CD-ROM 6.iso / pc / media / Bonus content / mars.js < prev    next >
Encoding:
Text File  |  2005-09-19  |  6.8 KB  |  240 lines

  1. /*
  2. Mars graphics, JavaScript and DHTML
  3. copyright (c) Adrian R. Ashford,  18 September 2005.
  4.  
  5. Parts of the computational engine
  6. based on MARS.BAS
  7. by Roger W. Sinnott.
  8.  
  9. JavaScript(s) used with permission by BBC Sky at Night magazine.
  10. */
  11.  
  12. myImage = new Array("graphics/0.jpg","graphics/5.jpg","graphics/10.jpg","graphics/15.jpg","graphics/20.jpg","graphics/25.jpg","graphics/30.jpg","graphics/35.jpg","graphics/40.jpg","graphics/45.jpg","graphics/50.jpg","graphics/55.jpg","graphics/60.jpg","graphics/65.jpg","graphics/70.jpg","graphics/75.jpg","graphics/80.jpg","graphics/85.jpg","graphics/90.jpg","graphics/95.jpg","graphics/100.jpg","graphics/105.jpg","graphics/110.jpg","graphics/115.jpg","graphics/120.jpg","graphics/125.jpg","graphics/130.jpg","graphics/135.jpg","graphics/140.jpg","graphics/145.jpg","graphics/150.jpg","graphics/155.jpg","graphics/160.jpg","graphics/165.jpg","graphics/170.jpg","graphics/175.jpg","graphics/180.jpg","graphics/185.jpg","graphics/190.jpg","graphics/195.jpg","graphics/200.jpg","graphics/205.jpg","graphics/210.jpg","graphics/215.jpg","graphics/220.jpg","graphics/225.jpg","graphics/230.jpg","graphics/235.jpg","graphics/240.jpg","graphics/245.jpg","graphics/250.jpg","graphics/255.jpg","graphics/260.jpg","graphics/265.jpg","graphics/270.jpg","graphics/275.jpg","graphics/280.jpg","graphics/285.jpg","graphics/290.jpg","graphics/295.jpg","graphics/300.jpg","graphics/305.jpg","graphics/310.jpg","graphics/315.jpg","graphics/320.jpg","graphics/325.jpg","graphics/330.jpg","graphics/335.jpg","graphics/340.jpg","graphics/345.jpg","graphics/350.jpg","graphics/355.jpg");
  13. thisImage = 0;
  14. images = myImage.length - 1;
  15.  
  16. function proper_ang(big)
  17. {
  18. with (Math)
  19. {
  20. var tmp = 0;
  21. if (big > 0)
  22. {
  23. tmp = big / 360.0;
  24. tmp = (tmp - floor(tmp)) * 360.0;
  25. }
  26. else
  27. {
  28. tmp = ceil(abs(big / 360.0));
  29. tmp = big + tmp * 360.0;
  30. }
  31. }
  32. return tmp;
  33. }
  34.  
  35. function proper_ang_rad(big)
  36. {
  37. with (Math)
  38. {
  39. var tmp = 0;
  40. if (big > 0)
  41. {
  42. tmp = big / 2 / PI;
  43. tmp = (tmp - floor(tmp)) * 2 * PI;
  44. }
  45. else
  46. {
  47. tmp = ceil(abs(big / 2 / PI));
  48. tmp = big + tmp * 2 * PI;
  49. }
  50. }
  51. return tmp;
  52. }
  53.  
  54. function round_10(num)
  55. {
  56. return Math.floor((num + 0.05) * 10) / 10;
  57. }
  58.  
  59. function round_100(num)
  60. {
  61. return Math.floor((num + 0.005) * 100) / 100;
  62. }
  63.  
  64. function round_1000(num)
  65. {
  66. return Math.floor((num + 0.0005) * 1000) / 1000;
  67. }
  68.  
  69. function julian_date(day,month)
  70. {
  71. var yy = 2005;
  72. var yyy, mmm, a, b;
  73.  
  74. with (Math) {
  75. var yyy = yy;
  76. var mmm = month;
  77. if (month < 3)
  78. {
  79. yyy = yy - 1;
  80. mmm = month + 12;
  81. }
  82. a = floor(yyy/100);
  83. b = 2 - a + floor(a/4);
  84.  
  85. return floor(365.25*yyy) + floor(30.6001*(mmm+1)) + day + 1720994.5 + b;
  86. }
  87. }
  88.  
  89. function mars_maps()
  90. {
  91.  
  92. with (Math)
  93. {
  94. var dt = 65;
  95. var p2 = 2 * PI;
  96. var RAD = 180 / PI;
  97.  
  98. var day = eval(document.mars.day.value);
  99. var hours = eval(document.mars.hours.value);
  100. var minutes = eval(document.mars.minutes.value);
  101. var month = eval(document.mars.month.value);
  102.  
  103. if (month == "11" && day == "31")
  104. {
  105. alert("November doesn't have 31 days! Please select another date.");
  106. }
  107.  
  108. var jd = julian_date(day,month);
  109.  
  110. var ut_hrs = hours;
  111. var ut_mns = minutes;
  112. var frac_day = ut_hrs / 24.0 + ut_mns / 1440.0;
  113.  
  114. var day_start = jd - 2451545.0 + dt / 86400;
  115.  
  116. var days = day_start + frac_day;
  117.  
  118. var d = days;
  119.  
  120. var t = d/36525 + 1;
  121.  
  122. var l0 = 0.779072 + 0.00273790931 * d;
  123. var g0 = 0.993126 + 0.0027377785 * d;
  124. var l4 = 0.987353 + 0.00145575328 * d;
  125. var g4 = 0.053856 + 0.00145561327 * d;
  126. var f4 = 0.849694 + 0.00145569465 * d;
  127. var l5 = 0.089608 + 0.00023080893 * d;
  128. var g5 = 0.056531 + 0.00023080893 * d;
  129. var g6 = 0.882987 + 9.294371E-05 * d;
  130. l0 = (l0 - floor(l0)) * p2;
  131. g0 = (g0 - floor(g0)) * p2;
  132. l4 = (l4 - floor(l4)) * p2;
  133. g4 = (g4 - floor(g4)) * p2;
  134. f4 = (f4 - floor(f4)) * p2;
  135. l5 = (l5 - floor(l5)) * p2;
  136. g5 = (g5 - floor(g5)) * p2;
  137. g6 = (g6 - floor(g6)) * p2;
  138. var l = 6910 * sin(g0) + 72 * sin(2*g0) - 17 * t * sin(g0) - 7 * cos(g0-g5);
  139. var r = 1.00014 - 0.01675 * cos(g0) - 0.00014 * cos(2*g0);
  140. l = l0 + l / 206264.8;
  141. var m = 38451 * sin(g4) + 2238 * sin(2*g4) + 181 * sin(3*g4) - 52 * sin(2*f4);
  142. m = m + 37 * t * sin(g4) - 22 * cos(g4-2*g5) - 19 * sin(g4-g5) + 17 * cos(g4-g5);
  143. m = m + 17 * sin(4*g4) - 16 * cos(2*g4-2*g5) + 13 * cos(g0-2*g4);
  144. m = m - 10 * sin(g4-2*f4) + 7 * cos(g0-g4) - 7 * cos(2*g0-3*g4);
  145. var b = 6603 * sin(f4) + 622 * sin(g4-f4) + 615 * sin(g4+f4) + 64 * sin(2*g4+f4);
  146. var r4 = 1.53031 - 0.1417 * cos(g4) - 0.0066 * cos(2*g4) - 0.00047 * cos(3*g4);
  147. l4 = l4 + m / 206264.8;
  148. var b4 = b / 206264.8;
  149. var n9 = r4 * cos(b4) * sin(l4-l);
  150. var d9 = r4 * cos(b4) * cos(l4-l) + r;
  151. var l1 = atan(n9/d9);
  152. if (d9 < 0) l1 += PI;
  153. ll = l1 + l;
  154. var v = n9 * n9 + d9 * d9;
  155. var s = r4 * sin(b4);
  156. var rr = sqrt(v+s*s);
  157. s = s / rr;
  158. var bb = atan(s/sqrt(1-s*s));
  159. var e = (84428 - 47 * t) / 206264.8;
  160. n9 = sin(ll) * cos(e) - tan(bb) * sin(e);
  161. d9 = cos(ll);
  162. var a5 = atan(n9/d9);
  163. if (d9 < 0) a5 += PI;
  164. s = sin(bb) * cos(e) + cos(bb) * sin(e) * sin(ll);
  165. var d5 = atan(s/sqrt(1-s*s));
  166. t = t - 1;
  167. var a1 = proper_ang(317.681 + 0.678 * t) / RAD;
  168. var d1 = proper_ang(52.886 + 0.352 * t) / RAD;
  169. d9 = cos(d5) * sin(a1-a5);
  170. n9 = sin(d1) * cos(d5) * cos(a1-a5) -cos(d1) * sin(d5);
  171. var k = RAD * atan(n9/d9);
  172. if (d9 < 0) k += 180;
  173. c = proper_ang(176.655 + 350.8919830 * (d - 0.0057755 * rr) + 0.62 * t - k);
  174. var sd = -sin(d1) * sin(d5) - cos(d1) * cos(d5) * cos(a1-a5);
  175. de = RAD * atan(sd/sqrt(1-sd*sd));
  176. var sp = cos(d1) * sin(a1-a5);
  177. var cp = sin(d1) * cos(d5) - cos(d1) * sin(d5) * cos(a1-a5);
  178. var pa = RAD * atan(sp/cp);
  179. if (cp < 0) pa += 180;
  180. if (pa < 0) pa += 360;
  181. if (pa >= 360) pa -= 360;
  182. var k4 = (pow(r4+rr,2) - r * r)/(4 * r4 * rr);
  183. var ci = (r4 * r4 + rr * rr - r * r)/(2 * r4 * rr);
  184. var i = RAD * atan(sqrt(1-ci*ci)/ci);
  185. var m4 = -1.52 + 0.016 * i + 5 * log(rr*r4)/log(10);
  186. var ad = 9.36 / rr;
  187. var elongation = floor(acos(cos(bb) * cos(l - ll)) * RAD + 0.5);
  188. var days_to_opp = 2453681.5 - jd;
  189. var mars_millions = rr * 92.955800;
  190.  
  191. var mars_info = "The Red Planet is now " + round_1000(rr) + " astronomical units, or " + round_10(mars_millions) + " million miles (" + round_10(mars_millions * 1.609344) + " million km.) from Earth. Opposition ";
  192.  
  193. if (days_to_opp > 0)
  194. {
  195. mars_info += "is " + days_to_opp + " day(s) away.";
  196. }
  197. if (days_to_opp == 0)
  198. {
  199. mars_info += "is today!";
  200. }
  201. if (days_to_opp < 0)
  202. {
  203. mars_info += "was " + abs(days_to_opp) + " day(s) ago."
  204. }
  205. if (days_to_opp == 8)
  206. {
  207. mars_info += " Mars is closest to Earth today!";
  208. }
  209.  
  210. if (k4 < 0.95)
  211. {
  212. mars_info += " The phase of Mars is now noticeable.";
  213. }
  214.  
  215. document.mars.info.value = mars_info;
  216.  
  217. document.mars.meridian.value = floor(c + 0.5);
  218. /*
  219. document.mars.position_angle.value = floor(pa + 0.5);
  220. document.mars.dist_earth.value = round_100(rr);
  221. */
  222. document.mars.angular_diameter.value = round_10(ad);
  223. document.mars.phase.value = floor(k4 * 100 + 0.5);
  224. document.mars.magnitude.value = round_10(m4);
  225. /*
  226. document.mars.mars_elong.value = elongation;
  227. document.mars.days_opp.value = days_to_opp;
  228. */
  229.  
  230. thisImage = floor(c / 5 + 0.5);
  231.  
  232. if (thisImage > 71)
  233. {
  234. thisImage = 0;
  235. }
  236.  
  237. document.myPicture.src = myImage[thisImage];
  238.  
  239. }
  240. }