Prima di passare alla stesura di alcune semplici applicazioni, devo completare l'elenco di funzioni del jpl toolkit con qualcosa di adatto a calcolare le posizioni eclittiche (longitudine e latitudine). Come già abbiamo fatto in precedenza con il linguaggio Python, utilizzeremo il kernel trueepoch.tf già creato qualche post addietro, con frame di riferimento eclittico e dinamico.
Nel JPL toolkit esiste una funzione adatta per il calcolo delle coordinate eclittiche, reclat_c, utile per passare dalle coordinate eclittiche rettangolari alle eclittiche sferiche.
L'immagine sopra, tratta da Wikipedia, mostra efficacemente l'inclinazione del piano equatoriale rispetto a quello eclittico. Il punto di intersezione dei due circoli equatoriale ed eclittico, dal quale parte il semicircolo eclittico al di sopra dell'equatore (declinazioni positive nel riferimento equatoriale) fino al punto opposto a 0° Bilancia , è chiamato punto vernale e coincide con la posizione solare apparente all'equinozio di primavera e con lo 0° di Ariete. Per completezza, le costellazioni zodiacali che costituiscono il folclore dell'Astrologia, non sono più usate da secoli (per effetto della precessione degli equinozi l'allineamento tra segni e costellazioni è andato completamente perso), lo zodiaco è determinato dalla scelta del punto 0° di Ariete e da lì il cerchio eclittico viene diviso in dodici parti di ampiezza 30°, che si succedono in senso antiorario, come del resto il movimento apparente del Sole nel corso dell'anno solare.
Vediamo la funzione che ci interessa:
reclat_c
Perchè il suo utilizzo abbia senso, il sistema o frame di riferimento deve essere eclittico. Nel toolkit, le funzioni recrad_c, reclat_c e recsph_c, usate con lo stesso frame, non fanno altro che riproporre le stesse distanze e angoli, ruotati opportunamente.
Per questo motivo, una volta scelto il riferimento eclittico da indicare nella funzione spkezr_c (ECLIPJ2000 se statico, o il nostro MYTRUEEPOCH se dinamico), possiamo utilizzare efficacemente la funzione. Vediamo la signature in C, molto simile a quella già incontrata per recrad_c):
void reclat_c ( ConstSpiceDouble rectan[3], SpiceDouble * radius, SpiceDouble * longitude, SpiceDouble * latitude ) Brief_I/O VARIABLE I/O DESCRIPTION -------- --- -------------------------------------------------- rectan I Rectangular coordinates of a point. radius O Distance of the point from the origin. longitude O Longitude of the point in radians. latitude O Latitude of the point in radians.
Nulla di nuovo, come vediamo. Nella classe CSpice già vista nei precedenti post aggiungeremo le parti di interesse:
public interface CLibrary extends Library { double pi_c(); double spd_c(); double dpr_c(); void furnsh_c(String s); void unload_c(String s); double str2et_c(String s, DoubleByReference p); double spkezr_c(String targ, double et, String ref, String abcorr, String obs, double[] starg, DoubleByReference lt); double recrad_c(double[] rectan, DoubleByReference range, DoubleByReference ra, DoubleByReference dec); double reclat_c(double[] rectan, DoubleByReference radius, DoubleByReference longitude, DoubleByReference latitude); }
nella parte declarativa (interfaccia) e, nella parte riguardante la definizione della funzione, il codice seguente:
double[] reclat_c(double[] rectan, DoubleByReference radius, DoubleByReference longitude, DoubleByReference latitude){ radius.setValue(0.0); longitude.setValue(0.0); latitude.setValue(0.0); INSTANCE.reclat_c(rectan, radius, longitude, latitude); double[] ret = new double[6]; ret[0] = rectan[0]; ret[1] = rectan[1]; ret[2] = rectan[2]; ret[3] = radius.getValue(); ret[4] = longitude.getValue(); ret[5] = latitude.getValue(); return ret; }
Per testare la nuova funzione utilizzero' il sito Miriade dell'Observatoire de Paris, che attraverso l'IMCCE Virtual Observatory Solar System portal fornisce un comodo ambiente web per il calcolo di posizione secondo vari sistemi e frame di riferimento.
Usando il mio programma di test, usando ECLIPJ2000 come ref statico, ottengo i seguenti: (longitudine e latitudine in gradi, minuti e secondi con decimali per una più facile comparazione con i risultati di Miriade)
Vettore posizione e velocità di SUN 2019-03-25T17:15:00 x: 0.9941741023222863 y: 0.07837450273804566 z: -6.386035799020023E-6 Coordinate rettangolari e sferiche eclittiche radius: 0.9972585965779094 longitudine: 4°30'27".07 latitudine: -0°00'01".32 Vettore posizione e velocità di MOON 2019-03-25T17:15:00 x: -0.001033206460039779 y: -0.002309224486574583 z: 1.6574816415858715E-4 Coordinate rettangolari e sferiche eclittiche radius: 0.0025352526052418367 longitudine: 245°53'42".11 latitudine: 3°44'54".68 Vettore posizione e velocità di MERCURY 2019-03-25T17:15:00 x: 0.6283821386649743 y: -0.15394903328787 z: 0.01456646607325417 Coordinate rettangolari e sferiche eclittiche radius: 0.6471295071137615 longitudine: 346°14'02".74 latitudine: 1°17'23".28 Vettore posizione e velocità di VENUS 2019-03-25T17:15:00 x: 1.0515933099261605 y: -0.6464412430519756 z: -0.01326528066622894 Coordinate rettangolari e sferiche eclittiche radius: 1.2344677953965406 longitudine: 328°25'11".63 latitudine: -0°36'56".51 Vettore posizione e velocità di MARS 2019-03-25T17:15:00 x: 1.0996446391999108 y: 1.6346349816138936 z: 0.03001478808475523 Coordinate rettangolari e sferiche eclittiche radius: 1.9703174219248858 longitudine: 56°04'14".37 latitudine: 0°52'22".25 Vettore posizione e velocità di JUPITER_BARYCENTER 2019-03-25T17:15:00 x: -0.5546811837096326 y: -5.015523791671758 z: 0.05580703045516249 Coordinate rettangolari e sferiche eclittiche radius: 5.046411055892613 longitudine: 263°41'20".91 latitudine: 0°38'01".08 Vettore posizione e velocità di SATURN_BARYCENTER 2019-03-25T17:15:00 x: 3.3846391497900328 y: -9.689305891517016 z: 0.07463820459939993 Coordinate rettangolari e sferiche eclittiche radius: 10.263722604165778 longitudine: 289°15'18".63 latitudine: 0°24'59".98 Vettore posizione e velocità di URANUS_BARYCENTER 2019-03-25T17:15:00 x: 17.836331344752253 y: 10.586677831321417 z: -0.17908834868983295 Coordinate rettangolari e sferiche eclittiche radius: 20.74233680134956 longitudine: 30°41'27".84 latitudine: -0°29'40".90 Vettore posizione e velocità di NEPTUNE_BARYCENTER 2019-03-25T17:15:00 x: 30.040066592923566 y: -7.154084379289532 z: -0.5205399170871235 Coordinate rettangolari e sferiche eclittiche radius: 30.884583306539174 longitudine: 346°36'16".04 latitudine: -0°57'56"63 Vettore posizione e velocità di PLUTO_BARYCENTER 2019-03-25T17:15:00 x: 13.128721019597675 y: -31.432013468122367 z: -0.13859786812604474 Coordinate rettangolari e sferiche eclittiche radius: 34.06396917036681 longitudine: 292°40'10".65 latitudine: -0°13'59".24
Per lo stesso istante Miriade mi dà i seguenti (copio uno alla volta dal sito, Plutone è escluso);
Planetary theory: DE406 Reference Plane:ecliptic Type of Coordinates: Spherical Type of Ephemeris: MeanJ2000 ----------------------------------------------------------------------------- Target Date Longitude Latitude Distance ---------------------------------------------------------------------------- Sun 2019-03-25T17:15:00.00 4 30 21.4251 -00 0 0.9002 0.997243696 Moon 2019-03-25T17:15:00.00 245 53 42.0999 +03 44 54.6775 0.002566436 Mercury 2019-03-25T17:15:00.00 346 13 52.9789 +01 17 23.9700 0.647123973 Venus 2019-03-25T17:15:00.00 328 25 6.4727 -00 36 56.1647 1.234471820 Mars 2019-03-25T17:15:00.00 56 4 13.8153 +00 52 22.5126 1.970286798 Jupiter 2019-03-25T17:15:00.00 263 41 20.5542 +00 38 1.1265 5.046440794 Saturn 2019-03-25T17:15:00.00 289 15 18.2025 +00 24 59.9873 10.263743803 Uranus 2019-03-25T17:15:00.00 30 41 27.7752 -00 29 40.8371 20.742311016 Neptune 2019-03-25T17:15:00.00 346 36 15.7283 -00 57 56.5707 30.884601149 -----------------------------------------------------------------------------
Considerate le diversità già accennate tra i due sistemi di calcolo, i risultati sono incoraggianti. Dal prossimo post iniziamo a costruire piccoli software grafici in JavaFX (o in Swing, devo capire quale libreria grafica di Java dà i migliori risultati). Come IDE penso che usero' NetBeans, è un po' che ci traffico e mi sembra abbastanza comodo e facile da usare. Al prossimo post.