mithengemoon.frink

Download or view 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 https://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 = #2019#
dateOut = ### yyyy-MM-dd hh:mm:ss a zzz ###
dateShort = ### yyyy-MM-dd ###
tz = "US/Eastern"

date = beginningOfYear[now[], tz]
enddate = beginningOfYearPlus[date, 2, tz]
temperature = cambridgeTemp[date]

while (date <= enddate)
{
   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, tz]) + "$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, tz]
         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>"]
      }
//      println["\n$date, $lat, $long, $temperature, $pressure, $corridorAzimuth"]
      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] :=
{
   tz = "US/Eastern"
   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,tz]), 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, tz]) + ".png", 640, 480]
   g.write["moonthumb" + (date->[sd, tz]) + ".png", 100, 80]
   g.write["moon" + (date->[sd, tz]) + ".svg", 640, 480]
//   g.show[]
}

// Draw a single moon image with time/date stamp.
drawMoon[g, date, lat, long, temperature, pressure] :=
{
   tz = "US/Eastern"
   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, tz]), trueAz - ra - .03 degree, -altitude, "right", "center"]

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


Download or view 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 20136 days, 4 hours, 8 minutes ago.