MercuryTransit.frink

View or download MercuryTransit.frink in plain text format


// This program animates the transit of Mercury across the sun

use planets.frink
use sun.frink

timezone = "US/Mountain"
lat = 40 degrees North
long = 105 degrees West

df = ### yyyy-MM-dd-HH:mm ###
datef = ### yyyy-MM-dd ###
tf = ### HH:mm ###

g = new graphics
g.font["Monospaced", .008 degree]
anim = new Animation[.3 s]
win = g.show[]

//for planet = [Planet.Mercury, Planet.Venus]
planet = Planet.Mercury
startdate = #2016-05-09 08:00 AM#
startdate = sunrise[startdate, lat, long]
enddate = sunset[startdate, lat, long]

println["Sunrise is " + (startdate->timezone)]
println["Sunset  is " + (enddate->timezone)]

frame = 0
staticsteps = 5
g2 = new graphics
g2.font["Monospaced", .008 degree]
g2.backgroundColor[.8, .8, 1]
// Draw the sun
g2.color[1,1,0]  // Yellow
sunRadius =   sunRadiusAngle[startdate]
g2.fillEllipseCenter[0, 0, 2 sunRadius, 2 sunRadius]

for d = startdate to enddate step 5 min
{
   [azsun, altsun] = refractedSunAzimuthAltitude[d, lat, long]
   [azp, altp]     = planet.refractedAzimuthAltitude[d, lat, long]

   separation = angularSeparation[azsun, altsun, azp, altp]

   sunRadius =   sunRadiusAngle[d]
   mercuryRadius = planet.radiusAngle[d]
   //println[mercuryRadius -> [0, "deg", "arcmin", "arcsec"]]

   flag = ""
   if separation < sunRadius + mercuryRadius // Touching sun?
   {
      flag = "*"
      
      if separation < sunRadius - mercuryRadius  // Fully inside sun?
         flag = "**"

      g = new graphics
      [skyr,skyg,skyb] = skyDarkness[d, lat, long, [[.1,.1,.1], [.1,.1,.2], [.1,.1,.3], [.1,.1,.4], [.8,.8,1]]]
      g.backgroundColor[skyr, skyg, skyb]
      
      // Draw the sun
      g.color[1,1,0]  // Yellow
      g.fillEllipseCenter[(azsun-azsun) cos[-altsun], -(altsun-altsun), 2 sunRadius, 2 sunRadius]

      // Draw Mercury
      // How much more black could it be?  The answer is none.  None more black.
      g.color[0,0,0]
      g.fillEllipseCenter[(azp-azsun) cos[-altp], -(altp-altsun), 2 mercuryRadius, 2 mercuryRadius]
//      g.add[planet.drawPolygonRelativeToZenith[d, lat, long, azp, -altp, mercuryRadius, true]]
      g.text[d->[tf, timezone], (azp-azsun) cos[-altp], -(altp-altsun), "center", "top"]
      win.replaceGraphics[g]
      anim.add[g]
      
      if frame mod staticsteps == 0  OR  flag == "*"   // Step every 5 steps or when just touching
      {
         g2.color[0,0,0]
         g2.fillEllipseCenter[(azp-azsun) cos[-altp], -(altp-altsun), 2 mercuryRadius, 2 mercuryRadius]
         g2.text[d->[tf, timezone], (azp-azsun) cos[-altp], -(altp-altsun), "center", "top"]
      }
   }
   
   println[(d->timezone) + "\t" + format[separation,"deg", 5] + "\t$flag" ]

   frame = frame + 1
}

g2.show[]
filename = "mercurytransit" + (startdate -> datef) + "_$timezone"
filename =~ %s/\//_/g  // Turn slashes into underscores in filemane.
anim.write["$filename.gif", 700, 700]

g2.write["$filename.png", 1024, 1024]
g2.write["$filename.svg", 1024, 1024]
g2.write["$filename.html", 1024, 1024]
browse["file:$filename.gif"]


View or download MercuryTransit.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 17628 days, 11 hours, 57 minutes ago.