Moonphase

How to calculate Moon phases

Contributor: ALAN GRAFF

{
As Robert Forbes said to All on 25 Apr 94...

 RF> Anyone have any idea how to make an algorithm to
 RF> calculate the moonphase given the date?

Here ya go:

TYPE DATETYPE = record
     day:WORD;
     MONTH:WORD;
     YEAR:WORD;
     dow:word;
     end;

{=================================================================}

Procedure GregorianToJulianDN(Year, Month, Day:Integer;
                              var JulianDN :LongInt);
var
  Century,
  XYear : LongInt;

begin {GregorianToJulianDN}
  If Month <= 2 then begin
    Year := pred(Year);
    Month := Month + 12;
    end;
  Month := Month - 3;
  Century := Year div 100;
  XYear := Year mod 100;
  Century := (Century * D1) shr 2;
  XYear := (XYear * D0) shr 2;
  JulianDN := ((((Month * 153) + 2) div 5) + Day) + D2


                                    + XYear + Century;
  end; {GregorianToJulianDN}

{=================================================================}

Function MoonPhase(Date:Datetype):Real;

  (***************************************************************)
  (* *)
  (* Determines APPROXIMATE phase of the moon (percentage lit) *)
  (* 0.00 = New moon, 1.00 = Full moon *)
  (* Due to rounding, full values may possibly never be reached *)
  (* Valid from Oct. 15, 1582 to Feb. 28, 4000 *)
  (* Calculations and BASIC program found in *)
  (* "119 Practical Programs For The TRS-80 Pocket Computer" by *)
  (* John Clark Craig, TAB Books, 1982 *)
  (* Conversion to Turbo Pascal by Alan Graff, Wheelersburg, OH *)
  (* *)
  (***************************************************************)

var
j:longint; m:real;

Begin
  GregorianToJulianDN(Date.Year,Date.Month,Date.Day,J);
  M:=(J+4.867)/ 29.53058;
  M:=2*(M-Int(m))-1;
  MoonPhase:=Abs(M);
end;

 

Share this article!

Follow us!

Find more helpful articles: