Premetto che sono solo un "misero" programmatore php e che di astronomia (fortuna che un amico mi ha corretto, all'inizio avevo scritto "astrologia"... perdonate l'ignoranza...

) conosco molto poco, anche se devo ammettere che col progetto che sto portando avanti da circa un anno mi sto appassionando molto alla materia.
Premesso questo, il mio problema ora è quello di realizzare una funzione in php che mi restituisca la coordinate celesti del punto del cielo che, in un dato momento, si trova esattamente "sopra alla testa" (90° rispetto alla perpendicolare sulla superficie terrestre) dell'osservatore. In parole povere, mi serve capire come calcolare più o meno esattamente, quale stella era sopra la mia testa il giorno x alla ora y, mentre ero in vacanza a Cuba. Ho già un database di stelle con le coordinate e so già fare query georeferenziate, quindi il mio problema è solo il primo passaggio: trovare le coordinate sopra la testa in un dato momento in radianti/declinazione.
Ho chiesto e contattato diverse persone, tra le quali solo una mi ha saputo dare "il via" e indicarmi l'algoritmo corretto. Ora che l'ho scritto però avrei bisogno che qualcuno più esperto di me e con magari qualche competenza php, mi dicesse se è corretto, se è totalmente cannato, se mancano costanti di correzione, o simili...
L'algoritmo non prende in considerazione il fatto che le stelle si allontanano/avvicinano tra di loro in tempi "lunghi" perchè mi basta sia approssimativamente corretto nell'arco di +/-200 anni.
Di seguito le due funzioni (giuste? Sbagliate? Boh...aiuto!!!):
Codice:
function getObserverRaDec($observer_lat, $observer_long, $observer_datetime = null,$H = 90, $A = 0) {
//Converto prima da gradi a radianti (seni e coseni usano i radianti)
$H = deg2rad($H);
$observer_lat = deg2rad($observer_lat);
$observer_long = deg2rad($observer_long);
if ($observer_datetime === null) {
$observer_datetime = getdate();
}
$ums = $observer_datetime['hours'] + $observer_datetime['minutes']/60. + $observer_datetime['seconds']/3600;
$jd = cal2Jul($observer_datetime['mday'],$observer_datetime['mon'],$observer_datetime['year']);
//sin(dec)=sin(lat)*sin(alt)+cos(lat)*cos(alt)*cos(az)
//sin(ha)=(cos(alt)*sin(az))/cos(dec)
//cos(ha)=(cos(lat)*sin(alt)-sin(lat)*cos(alt)*cos(az))/cos(dec)
$Dec = asin(sin($observer_lat)); //Ho dovuto fixare così perchè il cos di 90 gradi, convertendoli in radianti, non era esattamente 0, ma "prossimo" allo 0.
$HA = 0;
$TS = 100.46 + 0.9856474 * $jd + $observer_long + 15*$ums;
$AR = $TS - $HA;
$AR = fmod($AR,360);
//$costante_di_conversion_ra = 360/23.93447; //(23h 56m 4.100s)
return array('dec'=>$Dec,'ra'=>$AR);
}
function cal2Jul($dd,$mm,$yyyy){
$xa=0;
$xb=0;
$xc=0;
$xd=0;
$ind=0;
if ($yyyy < 0) $yyyy++;
if ($mm < 3) {
$mm+=12;
$yyyy--;
}
if ($yyyy < 1582) $ind=1;
if (($yyyy == 1582) && ($mm < 10)) $ind=1;
if (($yyyy == 1582) && ($mm == 10) && ($dd < 15)) $ind=1;
if ($ind == 0) {
$xa=(int)($yyyy/100);
$xb=2-$xa+(int)($xa/4);
}
if ($yyyy < 0) {
$xc=(int)((365.25*$yyyy)-0.75)-694025;
} else {
$xc=(int)(365.25*$yyyy)-694025;
}
$xd=(int)(30.6001*($mm+1));
$DJD=$xb+$xc+$xd+$dd-0.5;
$JD=$DJD+2415020;
return $JD;
}
Vi riporto quanto mi scrisse quella persona tempo fa e ciò da cui son partito per estrapolare queste formule...
Cita:
Mi sembra di capire che il suo problema e' quello di trovare le coordinate celesti di un punto del cielo che in un dato momento si trova in una particolare posizione rispetto all'osservatore.
L'osservatore solitamente prende come riferimento il punto in cui si trova e misura due angoli: l'altezza sull'orizzonte dell'oggetto celeste e l'azimuth, ovvero l'angolo fra il piano meridiano nel punto di osservazione ed un piano verticale che passa per l'oggetto. Chiamiamo questi due angoli H (altezza) ed A (azimut).
Il calcolo solitamente avviene in due passi: prima si trasformano i due angoli detti (che identificano il sistema di riferimento altoazimutale) nel sistema di riferimento equatoriale locale, poi si effettua la trasformazione nel riferiemto equatoriale celeste..
Il primo passo e' rappresentato dalle seguenti formule:
sin Dec = sin B * sin H + cos B * cos H * cos A
sin HA = (cos H * sin A)/cos Dec
cos HA = (cos B * sin H + sin B * cos H * cos A) / sin Dec
Dove, B:latitudine, A: azimuth, H: altezza, sono i dati di ingresso e Dec: declinazione e HA: angolo orario, sono le coordinate nel riferimento equatoriale. In pratica dopo aver calcolato la declinazione con la prima formula, si utilizza la seconda, oppure la terza, per calcolare l'angolo orario (si scegle quella per la quale il denominatore e' un numero non troppo piccolo, ovviamente).
Il successivo passaggio, trasforma l'angolo orario in ascensione retta, dato che la declinazione rimane uguale nella trasformazione da coordinate equatoriali locali a coordinate equatoriali celesti.
La relazione e' la seguente:
AR = TS - HA
Dove AR e' l'ascensione retta e TS il "tempo sidereo".
Quest'ultimo e' il tempo misurato basandosi sul passaggio al meridiano di una stella (mentre il tempo che si usa normalmente e' basato sul passaggio al meridiano del sole. I due tempi non coincidono a cusa della rivoluzione della terra intorno al sole).
Il tempo sidereo si calcola a partire dal tempo locale:
TS = 100.46 + 0.985647 * d + long + 15*UT
dove d e' il numero di giorni (e frazioni) trascorsi dal giorno giuliano J2000 UT e' il tempo universale in ore e frazioni di ora, long: e' la longitudine in gradi (positiva ad est di Greenwich)
Il risultato e' in gradi e deve essere riportato nell'intervallo fra 0 e 360. Se i risultati delle relazioni precedenti sono stati calcolati anch'essi in gradi, il valore di TS puo' essere usato direttamente.
Calcolato TS e trovata AR, i due valori Dec e AR sono quelli che nei cataloghi si utilizzano per le coordinate degli oggetti celesti.
Note: J2000 indica il numero di giorni trascorsi dalle ore 12 UT del 1 gennaio 2000.
Julian Date
The Julian date is the number of days since Greenwich mean noon on the first of January, 4713 B.C.
To compute the Julian Date:
1. Convert local time to Greenwich Mean Time
2. Let Y equal the year, M equal the month, D equal the day in decimal form.
3. If M equals 1 or 2 then subtract 1 from Y. and add 12 to M.
4. Compute A. A=INT(Y/100)
5. Compute B. B=2-A+INT(A/4). However, if the date is earlier than October 15, 1582 then B=0.
6. Calculate C. C=INT(365.25*Y). If Y is negative then C=INT((365.25*Y)-.75).
7. Calculate E. E=INT(30.6001*(M+1))
8. Calculate JD (Julian Date). JD=B+C+D+E+1720994.5
Confermate la teoria? Grazie a chiunque avrà anche solo letto tutto questo post, ma sinceramente non sapevo più dove sbattere la testa e spero di esser capitato nel posto giusto!
