moonPositionAngle.frink

Download or view moonPositionAngle.frink in plain text format


/** Program to test this interesting tweet:

    https://twitter.com/isislovecruft/status/1693836333226336453

    "what is your favourite celestial navigation fact?

    "i’ll start: drawing a line connecting the two points of a crescent moon
    points to true south in the northern hemisphere and points to true north
    in the southern hemisphere"

    The result is that this statement is only approximately correct.  The
    angle between the points and true north/south oscillates somewhat strongly
    around zero degrees, but with a rather large typical amplitude error of
    20-25 degrees, which goes to 90 degrees at times.  The RMS error in the
    original statement is about 22.7 degrees, as found by this program.

    Result tweet:
    https://twitter.com/Frinklang/status/1694626851669540918

    See the following graphs (which are produced by this program):
     https://futureboy.us/temp/nav.svg
     https://futureboy.us/temp/nav.html
     https://futureboy.us/temp/nav.png
*/


use sun.frink
use Grid.frink

start = beginningOfYear[now[]]
end =   beginningOfYearPlus[now[], 1]

g = new graphics
p = new polyline

points = 0
sum = 0 deg^2
for d = start to end step hour
{
   points = points + 1
   a = moonPositionAngle[d]
   a1 = abs[a] - (90 deg)
   sum = sum + a1^2
   p.addPoint[MJD[d]-MJD[start], a1]
   println["$d\t" + (a -> degrees)]
}

RMS = sqrt[sum/points]
println["RMS is " + format[RMS, "deg", 3]]

g.add[p]

// Add semi-automatic grid lines to the graph
grid = new Grid
grid.setUnits[day, degree]
grid.auto[g]
g.add[grid.getGrid[]]

// Draw horizontal red line indicating where the original tweet
// is correct.
g.color[1,0,0,.5]
g.line[0 day, 0 deg, 365 day, 0 deg]

g.show[]
g.write["nav.png", 1000,800]
g.write["nav.svg", 1000,800]
g.write["nav.html", 1000,800]


Download or view moonPositionAngle.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 19975 days, 22 hours, 36 minutes ago.