Introduction
Many communities pay close attention to the lunar calendar next to the solar calendar, so I looked at many sites on the internet to know how to calculate the age of the moon on any given day. I found many sites offering different ways, I took what I found to give results closer to the truth.
I've noticed that most sites agree on the expense of the Julian date but do not agree to calculate the age of the moon, and found the difference between these sites up to one day, and when the moon's age is 30 days, the result is zero in some sites.
In this program, I calculated the approximate age of the moon in days and did not give attention to the parts of the day of the hours and minutes.
In order for the program would be more useful, I add PictureBox
control to display the lighted part of the moon and darkness part of the moon commensurate with the age of the moon.
Background
I created two projects, I wrote code of one in C# (2003) and wrote another in VB.NET (2003).
The MoonPhase
project has one form (frmMoon
) with the following controls:
MonthCalendar
control (MyCalendar
)
Button
control (btnToDay
)
Button
control (btnClose
)
PictureBox
control (PicMoon
)
Label
control (lblAge
)
About the Code
Convert date to Julian date:
private int JulianDate(int d, int m, int y)
{
int mm, yy;
int k1, k2, k3;
int j;
yy = y - (int)((12 - m) / 10);
mm = m + 9;
if (mm >= 12)
{
mm = mm - 12;
}
k1 = (int)(365.25 * (yy + 4712));
k2 = (int)(30.6001 * mm + 0.5);
k3 = (int)((int)((yy / 100) + 49) * 0.75) - 38;
j = k1 + k2 + d + 59;
if (j > 2299160)
{
j = j - k3; }
return j;
}
Calculate the approximate moon's age in days:
private double MoonAge(int d, int m, int y)
{
int j = JulianDate(d, m, y);
ip = (j + 4.867) / 29.53059;
ip = ip - Math.Floor(ip);
if(ip < 0.5)
ag = ip * 29.53059 + 29.53059 / 2;
else
ag = ip * 29.53059 - 29.53059 / 2;
ag = Math.Floor(ag) + 1;
return ag;
}
Draw moon:
private void DrawMoon()
{
int Xpos, Ypos, Rpos;
int Xpos1, Xpos2;
double Phase;
Phase = ip;
int PageWidth = PicMoon.Width;
int PageHeight = PicMoon.Height;
Bitmap ImageToDraw = new Bitmap(PageWidth, PageHeight);
Graphics newGraphics = Graphics.FromImage(ImageToDraw);
Pen PenB = new Pen(Color.Black); Pen PenW = new Pen(Color.White);
for (Ypos=0; Ypos<= 45; Ypos++)
{
Xpos = (int)(Math.Sqrt(45*45 - Ypos*Ypos));
Point pB1 = new Point(90-Xpos, Ypos+90);
Point pB2 = new Point(Xpos+90, Ypos+90);
Point pB3 = new Point(90-Xpos, 90-Ypos);
Point pB4 = new Point(Xpos+90, 90-Ypos);
newGraphics.DrawLine(PenB, pB1, pB2);
newGraphics.DrawLine(PenB, pB3, pB4);
Rpos = 2 * Xpos;
if (Phase < 0.5)
{
Xpos1 = - Xpos;
Xpos2 = (int)(Rpos - 2*Phase*Rpos - Xpos);
}
else
{
Xpos1 = Xpos;
Xpos2 = (int)(Xpos - 2*Phase*Rpos + Rpos);
}
Point pW1 = new Point(Xpos1+90, 90-Ypos);
Point pW2 = new Point(Xpos2+90, 90-Ypos);
Point pW3 = new Point(Xpos1+90, Ypos+90);
Point pW4 = new Point(Xpos2+90, Ypos+90);
newGraphics.DrawLine(PenW, pW1, pW2);
newGraphics.DrawLine(PenW, pW3, pW4);
}
PicMoon.Image = ImageToDraw;
PenB.Dispose();
PenW.Dispose();
newGraphics.Dispose();
ImageToDraw = null;
}
You can go back to the source file to read the VB.NET code after you extract Moon_VB.zip file.
Final Words
If you have any idea or find another code to calculate the age of the moon, please tell me. Thanks to Code Project and thanks to all.
Mostafa Kaisoun
m_kaisoun@hotmail.com