Hallo,
mir war mal wieder etwas langweilig und da ich mich noch vor 20 Jahren etwas
mit Astronomie auseinandergesetzt habe, mußte ich doch mal probieren
eine Sache in Autoit umzusetzten. Nunja, hier das Ergebnis - wer's gebrauchen kann?
Spoiler anzeigen
#cs ----------------------------------------------------------------------------
AutoIt Version: 3.2.10.0
Author: trallala
Script Function:
Template AutoIt script.
#ce ----------------------------------------------------------------------------
#NoTrayIcon
#include <GUIConstants.au3>
#include <GuiListView.au3>
$Form1 = GUICreate("Mondphasen", 520, 250, -1, -1,$WS_POPUPWINDOW,$WS_EX_TOOLWINDOW)
GUISetBkColor(0x151843)
$Label01 = GUICtrlCreateLabel("Mondphasen für das Jahr:", 8, 8, 140, 17)
GUICtrlSetColor(-1, 0xC0C0FF)
$ListView1 = GUICtrlCreateListView("Neumond |Erstes Viertel |Vollmond |Letztes Viertel ",10,30,500,210, $BS_FLAT)
GUICtrlSetColor(-1, 0xC0C0FF)
GUICtrlSetBkColor(-1, 0x151843)
;
$wert = GUICtrlCreateInput("", 175, 8, 35, 17, BitOR($ES_AUTOHSCROLL,$ES_NUMBER))
GUICtrlSetData($wert,@YEAR)
GUICtrlSetLimit ($wert , 4)
$runter = GUICtrlCreateButton("-", 145, 8, 25, 17, $BS_FLAT)
$hoch = GUICtrlCreateButton("+", 215, 8, 25, 17, $BS_FLAT)
$Start = GUICtrlCreateButton("Ok",250,8,25,17, $BS_FLAT)
$Beenden = GUICtrlCreateButton("X",495,8,15,15, $BS_FLAT)
GUISetState(@SW_SHOW)
;
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Beenden
Exit
Case $runter
GUICtrlSetData($wert, GUICtrlRead($wert) - 1)
Case $hoch
GUICtrlSetData($wert, GUICtrlRead($wert) + 1)
Case $Start
$jahr = GUICtrlRead($wert)
_Mondph($jahr)
EndSwitch
WEnd
;
Func _Mondph(ByRef $jahr)
DIM $dQ[4],$A[14],$Q[4]
DIM $dQx[2]=[2451550.09766,29.530588861]
Dim $Qx[16]=[0.00111,0.00057,0.00056,0.00042,0.00038,0.00034,0.00032,0.00028, _
0.00027,0.00024,0.00017,0.00007,0.00005,0.00004,0.00003,0.00002]
DIM $Ph[4]=[0.00,0.25,0.50,0.75],$PI=3.1415926531, $Color
DIM $Par[4][2]=[[2.5534,29.1053567],[201.5643,385.81693528], _
[160.7108,390.67050284],[124.7746,1.56375588]]
DIM $Ax[14][2]=[[299.77,0.107408],[251.88,0.016321],[251.83,26.651886],[349.42,36.412478], _
[84.66,18.206239],[141.74,53.303771],[207.14,2.453732],[154.84,7.30686],[34.52,27.261239], _
[207.19,0.121824],[291.34,1.844379],[161.72,24.198154],[239.56,25.513099],[331.55,3.592518]]
Global $Farbe1[2] = [0xDCDCDC, 0xC0C0FF]
_GUICtrlListView_DeleteAllItems(ControlGetHandle("", "", $ListView1))
;Korrektur Dynamical Time (Td)
$tx=($jahr-2000)/100
If $jahr<948 Then
$deltaTd=2177+497*$tx+44.1*$tx^2
ElseIf $jahr<=1600 Or $jahr>2100 Then
$deltaTd=102+102*$tx+25.3*$tx^2
ElseIf $jahr<2000 Then
$deltaTd=-183.5343-0.1472927*$jahr-0.00003856419*$jahr^2+0.00000008706996*$jahr^3
ElseIf $jahr>=2000 Then
$deltaTd=102+102*$tx+25.3*$tx^2
$deltaTd=$deltaTd+0.37*($jahr-2100)
EndIf
$deltaTd=$deltaTd/86400
;jeder Monat wird einmal durchlaufen
For $x1=0 to 12
$Date1=_DateToJd(0,$x1,$jahr,0,0,0)
$Date2=_DateToJd(0,0,$jahr,0,0,0)
$DateDiff=$Date1-$Date2
$k =Int(($jahr-2000+($DateDiff)/365.25)*12.3685)
$T =$k/1236.85
$dQ1=0.00015437*$T^2-0.00000015*$T^3+0.00000000073*$T^4
;--> 4 Phasen
For $x2=0 to 3
$dQ[$x2]=$dQx[0]+$dQx[1]*($k+$Ph[$x2])+$dQ1
$T=($Date1-2451545)/36525
$E=1+$T*(-0.002516-0.0000074*$T)
;---> Planeten-Agumente (Störungen berücksichtigen)
;-> Agumente: 1 von 14
$A[0]=($Ax[0][0]+$Ax[0][1]*$k-0.009173*$T^2)*$PI/180
;-> Agumente: 2 bis 14
For $x3=1 To 13
$A[$x3]=($Ax[$x3][0]+$Ax[$x3][1]*$k)*$PI/180
Next
$M0_tmp=0.0000014*$T^2-0.00000011*$T^3
$M1_tmp=0.0107582*$T^2+0.00001238*$T^3-0.000000058*$T^4
$F_tmp=0.0016118*$T^2-0.00000227*$T^3+0.000000011*$T^4
$O_tmp=0.0020672*$T^2+0.00000215*$T^3
;Mittlere Anomalie der Sonne
$M=$Par[0][0]+$Par[0][1]*($k+0.25+(0.25*($x2-1)))-$M0_tmp
_360Grad($M)
$M=$M*$PI/180
;Mittlere Anomalie des Mondes
$M1=$Par[1][0]+$Par[1][1]*($k+0.25+(0.25*($x2-1)))+$M1_tmp
_360Grad($M1)
$M1=$M1*$PI/180
;Agument der Breite des Mondes
$F=$Par[2][0]+$Par[2][1]*($k+0.25+(0.25*($x2-1)))-$F_tmp
_360Grad($F)
$F=$F*$PI/180
;Länge des aufsteigenden Knoten der Mondbahn
$Omega=$Par[3][0]-$Par[3][1]*($k+0.25+(0.25*($x2-1)))+$O_tmp
_360Grad($Omega)
$Omega=$Omega*$PI/180
If $x2=0 Then
;Neumond
$dQ[$x2]=$dQ[$x2]-0.4072*Sin($M1)+0.17241*$E*Sin($M)+0.01608*Sin(2*$M1) _
+0.01039*(Sin(2*$F))+0.00739*$E*Sin(($M1-$M))-0.00514*$E*Sin($M1+$M) _
+0.00208*$E^2*Sin(2*$M)-$Qx[0]*Sin($M1-2*$F)-$Qx[1]*Sin($M1+2*$F) _
+$Qx[2]*$E*Sin(2*$M1+$M)-$Qx[3]*Sin(3*$M1)+$Qx[3]*$E*Sin($M+2*$F) _
+$Qx[4]*$E*Sin($M-2*$F)-$Qx[9]*$E*Sin(2*$M1-$M)-$Qx[10]*Sin($Omega) _
-$Qx[11]*Sin($M1+2*$M)+$Qx[13]*Sin(2*$M1-2*$F)+$Qx[13]*Sin(3*$M) _
+$Qx[14]*Sin($M1+$M-2*$F)+$Qx[14]*Sin(2*$M1+2*$F)-$Qx[14]*Sin($M1+$M+2*$F) _
+$Qx[14]*Sin($M1-$M+2*$F)-$Qx[15]*Sin($M1-$M-2*$F)-$Qx[15]*Sin(3*$M1+$M) _
+$Qx[15]*Sin(4*$M1)
EndIf
If $x2=1 or $x2=3 Then
;erstes und letztes Viertel
$dQ[$x2]=$dQ[$x2]-0.62801*Sin($M1)+0.17172*$E*Sin($M)-0.01183*$E*Sin($M1+$M) _
+0.00862*Sin(2*$M1)+0.00804*Sin(2*$F)+0.00454*$E*Sin($M1-$M)+0.00204*$E^2*Sin(2*$M) _
-0.0018*Sin($M1-2*$F)-$Qx[11]*Sin($M1+2*$F)-$Qx[13]*Sin(3*$M1)-$Qx[5]*$E*Sin(2*$M1-$M) _
+$Qx[6]*$E*Sin($M+2*$F)+$Qx[6]*$E*Sin($M-2*$F)-$Qx[7]*$E^2*Sin($M1+2*$M) _
+$Qx[8]*$E*Sin(2*$M1+$M)-$Qx[11]*Sin($Omega)-$Qx[12]*Sin($M1-$M-2*$F)+$Qx[13]*Sin(2*$M1+2*$F) _
-$Qx[13]*Sin($M1+$M+2*$F)+$Qx[13]*Sin($M1-2*$M)+$Qx[14]*Sin($M1+$M-2*$F)+$Qx[14]*Sin(3*$M) _
+$Qx[15]*Sin(2*$M1-2*$F)+$Qx[15]*Sin($M1-$M+2*$F)-$Qx[15]*Sin(3*$M1+$M)
;Korrektur für erstes und letztes Viertel
$W=0.00306-0.00038*$E*Cos($M)+0.00026*Cos($M1)-$Qx[15]*Cos($M1-$M) _
+$Qx[15]*Cos($M1+$M)+$Qx[15]*Cos(2*$F)
If $x2=1 Then
;erstes Viertel
$dQ[$x2]=$dQ[$x2]+$W
ElseIf $x2=3 Then
;letztes Viertel
$dQ[$x2]=$dQ[$x2]-$W
EndIf
EndIf
If $x2=2 Then
;Vollmond
$dQ[$x2]=$dQ[$x2]-0.40614*Sin($M1)+0.17302*$E*Sin($M)+0.01614*Sin(2*$M1) _
+0.01043*Sin(2*$F)+0.00734*$E*Sin($M1-$M)-0.00515*$E*Sin($M1+$M)+0.00209*$E^2*Sin(2*$M) _
-$Qx[0]*Sin($M1-2*$F)-$Qx[1]*Sin($M1+2*$F)+$Qx[2]*$E*Sin(2*$M1+$M)-$Qx[3]*Sin(3*$M1) _
+$Qx[3]*$E*Sin($M+2*$F)+$Qx[4]*$E*Sin($M-2*$F)-$Qx[9]*$E*Sin(2*$M1-$M)-$Qx[10]*Sin($Omega) _
-$Qx[11]*Sin($M1+2*$M)+$Qx[13]*Sin(2*$M1-2*$F)+$Qx[13]*Sin(3*$M) _
+$Qx[14]*Sin($M1+$M-2*$F)+$Qx[14]*Sin(2*$M1+2*$F)-$Qx[14]*Sin($M1+$M+2*$F) _
+$Qx[14]*Sin($M1-$M+2*$F)-$Qx[15]*Sin($M1-$M-2*$F)-$Qx[15]*Sin(3*$M1+$M) _
+$Qx[15]*Sin(4*$M1)
EndIf
;Korrektur für alle Phasen
;(Störungen der Planeten berücksichtigen)
$dQ[$x2]=$dQ[$x2]+0.000325*Sin($A[0])+0.000165*Sin($A[1])+0.000164*Sin($A[2])+0.000126*Sin($A[3]) _
+0.00011*Sin($A[4])+0.000062*Sin($A[5])+0.00006*Sin($A[6])+0.000056*Sin($A[7])+0.000047*Sin($A[8]) _
+0.000042*Sin($A[9])+0.00004*Sin($A[10])+0.000037*Sin($A[11])+0.000035*Sin($A[12])+0.000023*Sin($A[13])
;Termine
$Q[$x2]=_JdToDate($dQ[$x2]-$deltaTd)
if StringMid($Q[$x2], 7, 4)<$jahr or StringMid($Q[$x2], 7, 4)>$jahr Then
$Q[$x2]=""
Continueloop
EndIf
Next
;Ausgabe
$inhalt1 = $Q[0] & "|" & $Q[1] & "|" & $Q[2] & "|" & $Q[3]
GUICtrlCreateListViewItem($inhalt1, $ListView1)
GUICtrlSetColor(-1, $Farbe1[Mod($x1,2)])
If $x1=0 and $inhalt1= "" & "|" & "" & "|" & "" & "|" & "" then
_GUICtrlListView_DeleteAllItems(ControlGetHandle("", "", $ListView1))
EndIf
Next
EndFunc
;
Func _DateToJd($tag,$monat,$jahr,$stunde,$minute,$sekunde)
$a=$jahr
$b=$monat
If $monat<= 2 Then
$a=$jahr-1
$b=$monat+12
EndIf
$c=Int($a/100)
$d=Int($c/4)
$e=2 - $c+$d
$f=Int(1461*($a+4716)/4)
$g=Int(153*($b+1)/5)
$Jd0=$tag+$e+$f+$g-1524.5
Return $Jd0+$stunde/24+$minute/1440+$sekunde/86400
EndFunc
;
Func _JdToDate($Jd1)
$a=$Jd1+0.5
$b=int($a)
$c=$a-$b
If $b<299161 Then
$d=$b
Else
$d=int(($b-1867216.25)/36524.25)
EndIf
$e=$b+1+$d-int($d/4)
$f=$e+1524
$g=int(($f-122.1)/365.25)
$h=int(365.25*$g)
$i=int(($f-$h)/30.6001)
$j=$f-$h-int(30.6001*$i)
if $i<13.5 then
$k=$i-1
Else
$k=$i-13
EndIf
if $k>2.5 Then
$l=$g-4716
Else
$l=$g-4715
EndIf
$m=24*$c
$n=($m-int($m))*60
$o=($n-int($n))*60
$k=StringFormat("%02d", $k)
$j=StringFormat("%02d", $j)
$m=StringFormat("%02d", $m)
$n=StringFormat("%02d", $n)
$o=StringFormat("%02d", $o)
Return $j & "." & $k & "." & $l & " - " & $m & ":" & $n & ":" & $o
EndFunc
;
Func _360Grad($Grad)
Return $Grad-360*int($Grad/360)
EndFunc
Edit: Ich habe noch ein paar Reparaturen vorgenommen (u.a. funktioniert es jetzt auch mit Autoit 3.2.10.0).
MfG
trallala