mithengesun.frink

Download or view mithengesun.frink in plain text format


// Program to calculate sun 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 and Ken Olum for various data.
//
// 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

printall=false

if ARGS.contains["--html"]
{
   sep = "<TD>"
   preamble = "<TR><TD>"
   html = true
}

if ARGS.contains["--printall"]
   printall = true

out = ["degrees", "arcmin", "arcsec"]
dateOut = ### yyyy-MM-dd hh:mm:ss a zzz ###

tz = "US/Eastern"

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

while (date <= enddate)
{
   date = sunSecantAzimuth[date, lat, long, corridorAzimuthMeeus, temperature, pressure]
   // Now refine with temperature for that time of day.
   temperature = cambridgeTemp[date]
   date = sunSecantAzimuth[date, lat, long, corridorAzimuthMeeus, temperature, pressure]
   
   [azimuth, altitude] = refractedSunAzimuthAltitude[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"]
   print[format[F[temperature],1,0]]
   radiusAngle = sunRadiusAngle[date]
   if printall or (altitude < (0.91 degrees + radiusAngle) and altitude > -radiusAngle)
   {
      if !html
         print["$sep*"]
      [f1,f2,f3] = drawSuns[date, lat, long, temperature, pressure, corridorAzimuth]
      if html
         println["$sep\n     $sep<A HREF=\"images/$f1\">\n      <IMG SRC=\"images/$f2\" WIDTH=100 HEIGHT=80></A>\n     $sep<A HREF=\"images/$f3\">[SVG]</A>"]
   }

   println[]

   date = date + 1 day
}

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

   d1 = date - 2 min
   do
   {
      [az, alt] = refractedSunAzimuthAltitude[d1, lat, long, temperature, pressure]
      drawSun[g, d1, lat, long, temperature, pressure]
      d1 = d1 - 2 min
   } while alt < 1.2 degrees

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

   drawSun[g, date, lat, long, temperature, pressure, true]

   // Draw doorway aperture
   g.color[0,0,0,.7]
   g.drawRectSides[corridorAzimuth - .5 degrees, 0 degrees, corridorAzimuth + .5degrees, -.91 degrees]

   // Draw vertical centerline
   g.line[corridorAzimuth, 0 degrees, corridorAzimuth, -.91 degrees]

   // 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]

   // Render files
   sd = ###yyyy-MM-dd###
   f1 = "sun" + (date->[sd, tz]) + ".png"
   g.write[f1, 640, 480]
   f2 = "sunthumb" + (date->[sd, tz]) + ".png"
   g.write[f2, 100, 80]
   f3 = "sun" + (date->[sd, tz]) + ".svg"
   g.write[f3, 640, 480]
//   g.show[]
   return [f1,f2,f3]
}

// Draw a single sun image with time/date stamp.
drawSun[g, date, lat, long, temperature, pressure, yellow=false] :=
{
   tz = "US/Eastern"
   shortDate = ###hh:mm:ss a###
   [azimuth, altitude] = refractedSunAzimuthAltitude[date, lat, long, temperature, pressure]
   
   trueAz = (azimuth + 180 degrees) mod circle
//   println["True azimuth at $date is " + (trueAz->degrees)]
   ra = sunRadiusAngle[date]
   da = 2 ra
//   println["Radius angle is " + (ra->"degrees")]

   // Draw the sun
   if yellow
   {
      g.color[1,1,0,0.7]
      g.fillEllipseCenter[trueAz, -altitude, da, da]
   }
      
   g.color[0,0,0]
   g.drawEllipseCenter[trueAz, -altitude, da, da]
   g.text[(date -> [shortDate, tz]), trueAz, -altitude]

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


Download or view mithengesun.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 19966 days, 7 hours, 26 minutes ago.