На чем пишем?
Именно такая программка уже есть - AstroPlanner.
Если интересуют формулы - вот кусок из моей программы
{Эта функция из Монтенбрука}
Function LMST(MJD,Lambda:Extended):Extended;
Var MJD0,T,UT,GMST:Extended;
Function Frac(X:Extended):Extended;
Begin X:=X-Trunc(X); If X<0 Then X:=X+1; Frac:=X; End;
Begin
MJD0:=Int(MJD);
UT:=(MJD-MJD0)*24.0;
T:=(MJD0-51544.5)/36525.0;
GMST:=6.697374558+1.0027379093*UT
+(8640184.812866+(0.093104-6.2E-6*T)*T)*T/3600.0;
LMST:=24.0*Frac((GMST-Lambda/15.0)/24.0);
End;
Function Atn2(Y,X:Extended):Extended;
Var AX,AY,FI:Extended;
Begin
If ( X = 0.0 ) AND ( Y = 0.0 )
Then Atn2:=0.0
Else
Begin
AX:=Abs(X);
AY:=Abs(Y);
If ( AX > AY )
Then FI:=ArcTan(AY/AX)/Rad
Else FI:=90.0-ArcTan(AX/AY)/Rad;
If X < 0.0 Then FI:=180.0-FI;
If Y < 0.0 Then FI:=-FI;
Atn2:=FI;
End;
End;
// Кусок моей программы
// Sn, Cs - Синус и Косинус от угла в градусах
// ceLat.Value - широта, ceLong.Value - долгота
S:=LMST(LocalDateTimeToDateTime(ATime)+15018, -ceLong.Value);
T:=15*(S-Ra);
El:=90-Acs(Cs(ceLat.Value)*Cs(Dec)*Cs(T)+Sn(ceLat.Value)*Sn(Dec));
Az:=Atn2(Cs(Dec)*Sn(T), Cs(Dec)*Sn(ceLat.Value)*Cs(T)-Cs(ceLat.Value)*Sn(Dec));
Az:=Az+180; // Отсчитывается от точки юга
If Az >= 360 Then
Az:=Az-360;