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 17596 days, 19 hours, 45 minutes ago.