mithengemoon.frink

View or download mithengemoon.frink in plain text format


// Program to calculate moon crossing of the Infinite Corridor at MIT
// known as "MIThenge"
//
// More info at also http://web.mit.edu/planning/www/mithenge.html
// Thanks to Keith Winstein, Ken Olum, Lenny Foner, and Matthias Huerlemann
// for various data and surveying assistance.
//
// For worked predictions, see http://futureboy.us/mithenge/
//
// Alan Eliasen, eliasen@mindspring.com

use mithengecorridor.frink
use cambridgetempFourier.frink
use sun.frink

sep = "\t"
preamble = ""
html = false

if length[ARGS] > 0 && ARGS@0 == "--html"
{
   sep = "<TD>"
   preamble = "<TR><TD>"
   html = true
}

date = #2016#
dateOut = ### yyyy-MM-dd hh:mm:ss a zzz ###
dateShort = ### yyyy-MM-dd ###
temperature = cambridgeTemp[date]

while (date <= #2018#)
{
   temperature = cambridgeTemp[date]
   
   date = moonSecantAzimuth[date, lat, long, corridorAzimuthMeeus, temperature, pressure]
   // Now refine with temperature for that time of day.
   temperature = cambridgeTemp[date]
   date = moonSecantAzimuth[date, lat, long, corridorAzimuthMeeus, temperature, pressure]
   
   [azimuth, altitude] = refractedMoonAzimuthAltitude[date, lat, long, temperature, pressure]
   print[preamble]
   print[(date -> [dateOut, "Eastern"]) + "$sep"]
   print[format[JD[date],day,5] + "$sep"]
   print[format[altitude,degrees,2] + "$sep"]
   iFrac = moonIlluminatedFraction[date]
   print[format[iFrac, percent, 1] + "$sep"]
   radiusAngle = moonRadiusAngle[date]
   print[format[F[temperature],1,0]]
   if altitude < (1.16 degrees + radiusAngle) and altitude > -radiusAngle
   {
      if !html
         print["$sep*"]
      else
      {
         f = date -> [dateShort, "Eastern"]
         print["<TD> <TD><A HREF=\"images/moon$f.png\"><IMG SRC=\"images/moonthumb$f.png\" WIDTH=100 HEIGHT=80></A><TD><A HREF=\"images/moon$f.svg\">[SVG]</A>"]
      }
         
      drawMoons[date, lat, long, temperature, pressure, corridorAzimuth]
   }
   println[]
   
   date = date + 25 hours
}

// Function to draw the path of the moon as it crosses the corridor.
drawMoons[date, lat, long, temperature, pressure, corridorAzimuth] :=
{
   g = new graphics
   g.font["SansSerif", .05 deg]

   // Draw doorway aperture
   [skyr,skyg,skyb] = skyDarkness[date, lat, long, [[.1,.1,.1], [.1,.1,.2], [.1,.1,.3], [.1,.1,.4], [.8,.8,1]]]
   
   g.color[skyr,skyg,skyb]
   g.fillRectSides[corridorAzimuth - .5 degrees, 0 degrees, corridorAzimuth + .5degrees, -.91 degrees]
   
   g.color[0,0,0,.7]
   g.drawRectSides[corridorAzimuth - .5 degrees, 0 degrees, corridorAzimuth + .5degrees, -.91 degrees]
   g.line[corridorAzimuth, 0 degrees, corridorAzimuth, -.93 degrees]

   g.color[0,0,0]
   d1 = date - 2 min
   do
   {
      [az, alt] = refractedMoonAzimuthAltitude[d1, lat, long, temperature, pressure]
      drawMoon[g, d1, lat, long, temperature, pressure]
      d1 = d1 - 2 min
   } while alt < 1.2 degrees

   d1 = date + 2 min
   do
   {
      [az, alt] = refractedMoonAzimuthAltitude[d1, lat, long, temperature, pressure]
      drawMoon[g, d1, lat, long, temperature, pressure]
      d1 = d1 + 2 min
   } while alt > 0 degrees
   
   drawMoon[g, date,         lat, long, temperature, pressure]

   g.color[0,0,0,.7]
   // Draw floor
   g.fillRectSides[corridorAzimuth - 1 degree, 0 degrees, corridorAzimuth + 1 degree, .5 degrees]

   // Text description
   g.color[1,1,1]
   df = ###yyyy-MM-dd hh:mm:ss a zzz###
   g.font["SansSerif", "bold", .1 degrees]
   g.text[(date->[df,"Eastern"]), corridorAzimuth, .2 degrees]
   g.text["Illuminated fraction: " + format[moonIlluminatedFraction[date], percent, 1] + "%", corridorAzimuth, .3 degrees]

   // Render files
   sd = ###yyyy-MM-dd###
   g.write["moon" + (date->[sd, "Eastern"]) + ".png", 640, 480]
   g.write["moonthumb" + (date->[sd, "Eastern"]) + ".png", 100, 80]
   g.write["moon" + (date->[sd, "Eastern"]) + ".svg", 640, 480]
//   g.show[]
}

// Draw a single moon image with time/date stamp.
drawMoon[g, date, lat, long, temperature, pressure] :=
{
   shortDate = ###hh:mm:ss a###
   [azimuth, altitude] = refractedMoonAzimuthAltitude[date, lat, long, temperature, pressure]
   
   trueAz = (azimuth + 180 degrees) mod circle
//   println["True azimuth at $date is " + (trueAz->degrees)]
   ra = moonRadiusAngle[date]
//   println["Radius angle is " + (ra->"degrees")]

   // Draw the moon
   g.color[1,1,1,.9]
   g.add[drawMoonPolygonRelativeToZenith[date, lat, long, trueAz, -altitude, ra , true]]
   g.color[0,0,0]
   g.add[drawMoonPolygonRelativeToZenith[date, lat, long, trueAz, -altitude, ra , false]]

   // Draw horizontal line to center of moon
   g.color[.7,.7,.7]
   g.line[trueAz - ra - 0.02 degree, -altitude, trueAz, -altitude]
   g.fillRectCenter[trueAz, -altitude, .02 degree, .02 degree]

   g.color[1,1,1,0.5]
   g.fillRectSides[trueAz - ra - .35 degree, -altitude - 0.025 deg, trueAz - ra - .02 degree, -altitude + 0.025 deg]
   g.color[0,0,0]
   g.text[(date -> [shortDate, "Eastern"]), trueAz - ra - .03 degree, -altitude, "right", "center"]

//    g.text[(date -> [shortDate, "Eastern"]), trueAz, -altitude]
}


View or download mithengemoon.frink in plain text format


This is a program written in the programming language Frink.
For more information, view the Frink Documentation or see More Sample Frink Programs.

Alan Eliasen was born 17418 days, 21 hours, 4 minutes ago.