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 20145 days, 13 hours, 10 minutes ago.