transit3.frink

Download or view transit3.frink in plain text format


// This program draws the transit of Venus (easily adapted for Mercury)
// across the sun, taking into account a lot of effects.

use planets.frink
use sun.frink

timezone = "Mountain"
lat = 39.58560 degrees North
long = 104.89598 degrees West

/*lat = DMS[40, 33, 35.84]  North
long = DMS[105,04,57.64]  West*/



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

g = new graphics

//for planet = [Planet.Mercury, Planet.Venus]
planet = Planet.Venus
startdate = #2012-06-05 04:04 PM#
enddate =   sunset[startdate, lat, long]
println["Sunset is $enddate"]

g = new graphics
g.backgroundColor[.8, .8, 1]
// Draw the sun
g.color[1,1,0]  // Yellow
azsun = 40 deg
altsun = 10 deg

[azsun, altsun] = refractedSunAzimuthAltitude[startdate, lat, long]
sunRadius =   sunRadiusAngle[startdate]
g.fillEllipseCenter[(azsun-azsun) cos[-altsun], -(altsun-altsun), 2 sunRadius, 2 sunRadius]
g.color[0,0,0]
win = g.show[]
g.font["SansSerif", 0.01 degree]
dateformat = ###h:mm a###

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

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

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

   flag =""
   if separation < sunRadius + venusRadius
   {
      flag = "*"
      
      if separation < sunRadius - venusRadius
         flag = "**"
   }

   azp = (azp + 180 degrees) mod circle
   azsun = (azsun + 180 degrees) mod circle
   azsep = (azp-azsun) mod (360 degrees)
   if azsep > 180 degrees
      azsep = azsep - circle
   // Draw Venus
   // How much more black could it be?  The answer is none.  None more black.
   x = azsep cos[-altp]
   y = -(altp-altsun)
   g.fillEllipseCenter[x, y, 2 venusRadius, 2 venusRadius]
   
   g.text[d -> [dateformat, timezone], x -  venusRadius, y +  venusRadius, "right", "center", 45 deg]
//      g.add[planet.drawPolygonRelativeToZenith[d, lat, long, azp, -altp, venusRadius, true]]
   win.repaint[]
   
   println[(d->timezone) + "\t" + format[separation,"deg", 5] + "\t" + format[azsep,"deg",2] + "\t$flag" ]
}

g.write["venusChart.svg", 1024, 768]
g.write["venusChart.png", 1024, 768]
g.write["venusChart.html", 1024, 768]


Download or view transit3.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 19945 days, 2 hours, 25 minutes ago.