HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Holdfázis jellemzőit kiszámító komponens készítése


Példaprogram letöltése

38121 bájt

Találkozhatunk olyan naptárakkal, melyekben fel vannak tüntetve a dátumok mellett az egyes Holdfázisok nevei és időpontja is. Cikkünkben elkészítünk egy olyan komponenst, mely az aktuális Holdfázisról különböző információkat szolgáltat. Segítségével megtudhatjuk, hogy a Holdciklusból jelenleg hány % telt el, a Hold hány %-a látható, milyen fázisban van, valamint kiszámítja a következő Újhold és Telihold várható időpontját is.

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"));
  }
  ...

Cikksorozat

#IDKategóriaCikk címeSorozat
3643DelphiFormEditor1. rész
3689DelphiProject és modul információk2. rész
3719DelphiMegnyitás, mentés3. rész
3749DelphiKódszerkesztő4. rész
3778DelphiForráskód írása, olvasása5. rész
3809DelphiInterfész a kódszerkesztő ablakhoz6. rész
3839DelphiKijelölt blokkok7. rész
3869DelphiA buffer beállításai8. rész
3899DelphiKörnyezeti és Project opciók9. rész
3929DelphiKurzor a kódszerkesztőben10. rész
3959DelphiKeresés és csere beállításai11. rész


Könyv
Ez a cikk megtalálható ebben a könyvben: C# Software Offline 2003 évkönyv 684. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |