Komponens elkészítése
A komponenst úgy valósítottuk meg, hogy az egyes tulajdonságokat property-kkel szolgáltassa. A property-k lekérdezésekor az eredményt belső metódusok számítják ki.
Mielőtt belekezdenénk a számításokba, szükségünk lesz két konstans értékre. Az egyik a Holdciklus ideje. Ez a számítások szerint 29,53058867 nap. Ezen kívül szükségünk lesz az egy nap alatt eltelt milliszekundumok számára is, ami 24*60*60*1000-rel, vagyis 86400000-rel egyenlő.
A számítás lényege: veszünk egy kiindulási dátumot, amelytől kezdve számíthatjuk az eltelt Holdciklusokat. Ebben az esetben ez 2003. január 2-a, 21 óra 23 perc. Ekkor biztosan Újhold állapotában volt a Hold. Persze választhatunk bármely időpontot, a lényeg az, hogy Újhold legyen az adott napon. Ezután kiszámoljuk a mai dátum és a kiindulási dátum között eltelt milliszekundumokat, majd elosztjuk a Holdciklus milliszekundumban kifejezett értékével, ez után pedig, hogy %-os értéket kapjunk, megszorozzuk 100-al a kapott értéket. Az eredményt addig csökkentjük, míg 100 alatti számot nem kapunk. Ekkor megkapjuk az Újhold óta eltelt időt százalékban. A kiindulási és az aktuális dátum közti különbséget a GetDateDifference függvény szolgáltatja.
A függvény által szolgáltatott értéket arra fogjuk felhasználni, hogy kiszámítsuk, hány % telt már el a Holdciklusból. Mindezt a GetPhasePercent függvény valósítja meg.
private double GetPhasePercent()
{
double dateDiff = GetDateDifference();
if (dateDiff < 0)
{
dateDiff = Math.Abs(dateDiff);
}
A phase változóban kapott értéket mindaddig csökkentjük, míg az 100 alatti nem lesz. A kapott szám az eltelt Holdciklus %-os értéke.
double phase = dateDiff/(MoonCycle*DaySeconds)*100;
while (phase > 100)
{
phase -= 100;
}
return phase;
}
A kapott értéket megvizsgálva megállapíthatjuk, hogy a Hold mely fázisában jár éppen. A GetPhaseName függvénnyel valósítjuk meg mindezt, mely a Holdfázis nevével tér vissza.
private string GetPhaseName()
{
double phasepercent = GetPhasePercent();
string name = "";
if (phasepercent >= 0 && phasepercent <= 2.49)
{
name = "Újhold";
}
...
A GetVisibility metódusban kiszámítjuk, hogy a Hold hány százaléka látható, attól függően, hogy a Telihold előtti vagy utáni állapotban van a Holdciklus.
double phase = GetPhasePercent();
double vy = 0;
if (phase <= 50)
{
vy = phase*2;
}
else
{
vy = (100-phase)*2;
}
return vy;
A Telihold, illetve az Újhold újbóli bekövetkezéséig hátralévő napok számát a GetDaysTillNew, illetve a GetDaysTillFull metódusokkal számítjuk ki.
private double GetDaysTillNew()
{
double phase = GetPhasePercent();
double dtn = (1-phase/100)*MoonCycle;
dtn = Math.Round(dtn,2);
return dtn;
}
Illetve:
private double GetDaysTillFull()
{
double vy = GetVisibility();
double dtf = (1-vy/100)*MoonCycle;
dtf = Math.Round(dtf,2);
return dtf;
}
A kapott értékeket felhasználva a dátumokat is megkaphatjuk a GetNextNew és a GetNextFull függvényekkel.
DateTime newDate = DateTime.Now.AddDays(GetDaysTillNew());
...
DateTime fullDate = DateTime.Now.AddDays(GetDaysTillFull());
Alkalmazás elkészítése
A projekt lefordítása után a komponens a ToolBox-ra tehető, ahonnan egyszerűen felhasználható. Az alkalmazásban – annak indulásakor – lekérdezzük a komponens property-jeit, majd az eredményeket megjelenítjük a Label címkéken.
label3.Text = "Az Újhold óta eltelt idő %-ban: " + moonPhaseComponent1.PhasePercent + " %";
...
A könnyebb érthetőség kedvéért egy-egy képet is megjelenítünk a Form-on. A képeket az assembly erőforrásaiból olvassuk ki a DrawPicture metódusban.
private void DrawPicture(string phasename)
{
Bitmap bmp = null;
if (phasename == "Újhold")
{
bmp = new Bitmap(GetType().Assembly.GetManifestResourceStream(GetType(),"ujhold.bmp"));
}
...