Aller au contenu

Calculer coordonnées objet ?


Valentino

Messages recommandés

Bonjour à tous,

 

J'ai un problème que je n'arrive pas à résoudre et j'aurai besoin de votre aide.

Alors voilà j'ai une base de données avec des centaines d'objets dont j'ai les coordonnées célestes (en AD et en DEC).

 

A l'aide d'un petit programme, j'ai envie de calculer leurs coordonnées en hauteur et en azimut, en fonction de la date et de l'heure.

 

J'ai trouvé ce site qui explique très bien : http://emilie.bodin.free.fr/logiciel/logicielframe.html

Malheureusement, certaines choses m'échappent :

 

- Que représente "angleH = 2 * PI * HS / (23H56min4s)", et que doit-on mettre à la place de (23H56min4s) ?

 

- Puis dans la formule "angleT = (heure - 12 + minute/60 - zone) * 2 * PI/(23H56min4s)", que représente zone ?

 

- Tous les angles doivent-ils être en radian ?

 

Merci d'avance pour votre aide :)

Lien vers le commentaire
Partager sur d’autres sites

- Que représente "angleH = 2 * PI * HS / (23H56min4s)", et que doit-on mettre à la place de (23H56min4s) ?

 

C'est l'angle horaire de l'objet au moment de l'observation, tu peux mettre: 359,016666 ° = 23.944444 * 180 / 12 heures où 23.944444 = 23 + 56/60 + 4/3600

 

- Puis dans la formule "angleT = (heure - 12 + minute/60 - zone) * 2 * PI/(23H56min4s)", que représente zone ?

 

C'est ton fuseau horaire, il manque aussi le paramètre DST dans la formule (heures été/hiver) qui est à prendre en compte bien évidement :)

 

- Tous les angles doivent-ils être en radian ?

 

Pas forcement si tu ne doit pas les utiliser dans les fonctions trigonométrique.

Modifié par jgricourt
Lien vers le commentaire
Partager sur d’autres sites

C'est ton fuseau horaire, il manque aussi le paramètre DST dans la formule (heures été/hiver) à prendre en compte bien évidement

A la place de zone, si on est en France on doit rajouter +1 c'est ça ?

Si on est en heure d'été, on rajoutera +2 si je ne m'abuse ?

 

Pas forcement si tu ne doit pas les utiliser dans les fonctions trigonométrique.

Pardonnez mon ignorance, je ne comprends pas cette phrase --'

Lien vers le commentaire
Partager sur d’autres sites

A la place de zone, si on est en France on doit rajouter +1 c'est ça ?

Si on est en heure d'été, on rajoutera +2 si je ne m'abuse ?

 

Oui c'est ça, j'ai regardé la page web à laquelle tu fais référence, il y a quelques erreurs, beaucoup d'approximations et je trouve au final que ce n'est pas très bien expliqué:

 

On en déduit l'heure sidérale en seconde grâce à la formule suivante :

H1 = 24110.54841 + ( 8640184.812866 * T) + ( 0.093104 * ( T^2 ) ) - (0.0000062 * ( T^3 ) )

 

C'est faux, ce n'est pas l'heure sidéral du lieu, c'est en fait l'heure sidérale de Greenwich à 0h UT :)

 

Mais il faut ramener cette heure dans un intervalle de 0 à 24H et ne garder que la partie fractionnaire de ce nombre d'où :

 

Des complications inutiles.

 

Bref je vais pas commenter toute la page ...

 

Je te recommande vivement l'ouvrage de référence Astronomical Algorithms de Jean Meeus le spécialiste mondialement reconnu sur les calculs astronomiques, il a écrit un livre de vulgarisation très accessibles aux débutants et truffé d'exemples concrets immédiatement exploitables par un programme informatique.

Modifié par jgricourt
Lien vers le commentaire
Partager sur d’autres sites

 

C'est l'ancienne édition du même livre de Jean Meeus sortie 10 ans avant, il ne fait que 151 p alors que la nouvelle édition ayant encore cours aujourd'hui fait presque 500 p donc ce n'est pas tout à fait le même livre :)

 

Tu peux l'avoir neuf pour 39 euros chez Uranie ou pour sensiblement le même prix livré chez l'éditeur Willmann Bell.

Modifié par jgricourt
Lien vers le commentaire
Partager sur d’autres sites

D'accord merci beaucoup. Je viens de me renseigner, il me semble très interessant. Est-il accessible a un débutant dont l'anglais est assez moyen ?

 

J'ai vu que vous en vendez un dans les petites annonces, est-ce encore d'actualité ?

Lien vers le commentaire
Partager sur d’autres sites

D'accord merci beaucoup. Je viens de me renseigner, il me semble très interessant. Est-il accessible a un débutant dont l'anglais est assez moyen ?

 

J'ai vu que vous en vendez un dans les petites annonces, est-ce encore d'actualité ?

 

Jean Meeus est Belge, c'est de l'anglais bateau sans fioriture à part peut être les termes techniques et encore ...

 

(oui je le vends toujours)

Modifié par jgricourt
Lien vers le commentaire
Partager sur d’autres sites

 

Bonjour,

 

Si tu as déjà du mal avec la page d'Emilie Bodin ce bouquin ne te servira pas à grand chose.

Ca fera un dessous de verre sympa :be:

 

Attention je ne critique pas ce bouquin, je l'ai.

Très bien :)

Simplement les pré-requis en maths du Calculs astronomiques à l'usage des amateurs est bien plus élevé que ce qu'il faut pour comprendre Emilie Bodin.

 

Bon ciel

Lien vers le commentaire
Partager sur d’autres sites

Simplement les pré-requis en maths du Calculs astronomiques à l'usage des amateurs est bien plus élevé que ce qu'il faut pour comprendre Emilie Bodin.

 

Oui il ne faut pas exagérer c'est du niveau collège ! a9e957f9.gif

 

Et en plus les formules sont prêtes à l'emploi (pas besoin de se plonger dans la théorie) avec à chaque fois un exemple concret commenté pour montrer comment appliquer la formule donc rien de plus simple. Par contre je trouve cette page web truffée d'erreurs et d'approximations, c'est dommage car je suis sûr que cela partait d'une bonne intention. Tout ça pour dire que je reste convaincu que les meilleurs vulgarisateurs des théories compliquées reste les spécialistes eux même :)

Modifié par jgricourt
Lien vers le commentaire
Partager sur d’autres sites

Quand je cherche des explications, j'aime bien que les auteurs soient précis. Or un livre de 400 pages, difficile de faire plus précis je pense ...

 

airconone : Oui je veux bien, je pourrai sûrement l'utiliser :)

 

Leimury : Je ne connais pas ce bouquin mais je pense avoir le niveau de comprendre les calculs. Le seul problème avec la page d'émilie Bodin, c'est qu'il y a plein de calculs, et on ne comprend pas à quoi ils servent. Du coup, si il y a une erreur, on ne peut pas la corriger soit-même.

Modifié par Valentino
Lien vers le commentaire
Partager sur d’autres sites

// comme ca peut servir a du monde je met ma class Java ici brut de decoffrage

// j'ai mit un Main pour l exemple

//

 

public class Astro {

 

 

 

public static void main(String[] args){

 

System.out.println("test");

 

// TEST sur M13 pour le 12 aout 2012 a 20h45

// latitude 48 51 36

// longitude 2 20 24

 

// M13 AD = 16h 41mn 42 Declinaison = 36° 28' 00

 

// 1) je convertit le AD en Decimal

int[] ad ={16,41,42};

double raDecimal = rightAscensionToDegreeDecimal( ad );

 

// 2) je convertit la declinaison en degree decimals

int[] dec ={36,28,00};

double declinaisonDecimal = coordonneeToDegreeDecimal(dec );

 

// 3)

int[] dateTU ={2012,8,12};

int[] heureTU ={20,45,00};

 

int[] lat = {48,51,36} ;

double latdecimal = coordonneeToDegreeDecimal( lat );

 

int[] longi = {2,20,24} ;

double longiDecimal = coordonneeToDegreeDecimal( longi );

 

double[] hauteurAzimut = hauteurAzimutDegree(dateTU, heureTU, raDecimal, declinaisonDecimal, latdecimal, longiDecimal);

 

System.out.println("hauteur "+hauteurAzimut[0]);

System.out.println("azimut "+hauteurAzimut[1]);

 

System.out.println("hauteur "+ degreeDecimalToDMS( hauteurAzimut[0] ) );

System.out.println("azimut "+degreeDecimalToDMS( hauteurAzimut[1] ) );

 

}

 

 

public static double toJulianDay(int dateTU[], int heureTU[]){

double julianDay;

double y , m , d , h, min, sec;

double T,C,B;

 

y = dateTU[0];

m = dateTU[1];

d = dateTU[2];

 

h = heureTU[0];

min = heureTU[1];

sec = heureTU[2];

 

if (m<3){

y = y -1;

m = m +12;

}

 

C= partieEntiere(y/100.0);

B = 2.0 - C + partieEntiere(C/4.0);

 

T = h/24.00 + min/1440.00 + sec/86400.00;

//

julianDay = (double) (partieEntiere(365.25 * (y+4716.0))) ;

julianDay = julianDay + partieEntiere(30.6001*(m+1.0)) + d + T + B - 1524.5 ;

 

 

 

return julianDay;

}

 

public static double toJulianDay2000(int dateTU[], int heureTU[]){

double j2000=0.0;

double julianDay = toJulianDay(dateTU, heureTU);

//j2000 = 2000.0 + (julianDay - 2451545.0)/365.25 ;

 

j2000 = julianDay - 2451545;

return j2000;

}

public static int partieEntiere(double val){

// Log.i(" ","val: "+val);

if(val<0){

val = Math.ceil(val);

}else{

val = Math.floor(val);

}

// Log.i(" "," "+val);

return (int)val;

}

 

public static double partieDecimal(double val){

if(val<0){

val = val - Math.ceil(val);

}else{

val = val - Math.floor(val);

}

return val;

}

 

 

public static String degreeDecimalToDMS(double val){

String signe="+";

String str="";

int d=0, m=0 ;

 

 

if( val<0 ){

signe="-";

val = Math.abs(val);

}

 

d = partieEntiere(val);

m = (int) ((val-d)*60) ;

//s= (int) ((((val-d)*60) - m) * 60) ;

 

// str = String.format("% 03d",(int)d) +"°"+ String.format("% 03d",(int)m) +"m"+ String.format("% 03d",(int)s)+"s";

 

str = signe+String.format("%02d",(int)d) +"°"+ String.format("%02d",(int)m) +"m";

 

return str;

}

 

public static double heureSiderale(int[] dateTU, int[] heureTU){

// double hs=0;

 

 

/*

* L'heure sidérale va nous permettre de calculer un angle qui dépend de l'heure d'observation et de la date.

Nous connaissons le jour julien, nous en déduisons le nombre de siècle depuis le 01/01/2000 grâce à la formule suivante :

T = ( JJ - 2451545 ) / 36525

On en déduit l'heure sidérale en seconde grâce à la formule suivante :

H1 = 24110.54841 + ( 8640184.812866 * T) + ( 0.093104 * ( T^2 ) ) - (0.0000062 * ( T^3 ) )

en heure l'heure sidérale est donc :

HSH = H1 / 3600

Mais il faut ramener cette heure dans un intervalle de 0 à 24H et ne garder que la partie fractionnaire de ce nombre d'où :

HS = (( HSH / 24 ) - Int( HSH / 24 ))*24

Calcul du décalage dû à l'heure sidérale

*

*/

double T = ( toJulianDay2000(dateTU, heureTU) - 2451545.0 )/36525.0;

double H1 = 24110.54841 + ( 8640184.812866 * T) + ( 0.093104 * ( T*T ) ) - (0.0000062 * ( T*T*T ) );

double HSH = H1 / 3600.0;

double HS = ( ( HSH / 24.0 ) - partieEntiere( HSH / 24.0 ) )*24.0 ;

//Log.i("","hs:"+HS);

return HS;

 

 

}

 

 

 

 

public static double toHeureMeridianLocalTime(int[] dateTU, int[] heureTU, double ra , double longi,double timeZone){

double heureMeridian=0.0;

 

 

double j2000 = toJulianDay2000(dateTU, heureTU);

 

heureMeridian = ra - 100.460 - 0.985647*j2000 - longi + timeZone*15.0 ;

 

 

heureMeridian = heureMeridian % 360.0;

if ( heureMeridian < 0 ){

heureMeridian = heureMeridian + 360;

}

 

return heureMeridian;

}

 

 

public static double toAngleHoraireDegree(int[] dateTU, int[] heureTU, double ra , double longi){

double angleHoraire ;

double heureDegree = (heureTU[0] + heureTU[1]/60.0 + heureTU[2]/3600.0) * 15.0;

double heureSiderale ;

 

 

double jd = toJulianDay(dateTU, heureTU);

double t = ( jd - 2451545.0) / 36525.0;

heureSiderale = 280.46061837 + 360.98564736629*(jd - 2451545.0 ) + t *( t*(0.000387933 - t/38710000.0) ) ;

 

heureSiderale = heureSiderale + longi ;

 

/*

double j2000 = toJulianDay2000(dateTU, heureTU);

heureSiderale = 100.460 + 0.985647*j2000 + longi + ( heureDegree );

*/

 

heureSiderale = heureSiderale % 360.0;

if ( heureSiderale < 0 ){

heureSiderale = heureSiderale + 360;

}

// Log.i("", " heureSiderale:"+degreDecimalToHMS(heureSiderale) );

//Log.i(""," heureSiderale "+ degreDecimalToHMS( heureSiderale) );

 

angleHoraire = heureSiderale - ra;

if (angleHoraire <0 ){ angleHoraire = 360 + angleHoraire; }

 

return angleHoraire;

//return 54.382617;

// return (H);

}

 

public static double round(double what, int howmuch) {

return (double)( (int)(what * Math.pow(10,howmuch) + .5) ) / Math.pow(10,howmuch);

}

 

public static String degreDecimalToHMS(double val){

String str="";

val = Math.abs(val);

 

int h;

double m;

h= (int)Math.floor( val/15.0 );

 

 

 

m = ((val/15) - h)*60.0 ;

m = round(m,0);

 

// m = partieEntiere( ((val/15) - h)*60.0 );

 

//s= ((((val/15) - h)*60 ) - m)*60.0;

 

//str = "RA:" + String.format("% 03d",(int)h) +"h"+ String.format("% 03d",(int)m) +"m"+ String.format("% 03d",(int)s)+"s";

str = String.format("%02d",(int)h) +"h"+ String.format("%02d",(int)m) +"m";

return str;

 

 

}

 

 

public static double rightAscensionToDegreeDecimal(int ra[]){

double ra2DegreeDecimal = 0.0 ;

double heure,minute,seconde;

heure = ra[0];

minute = ra[1];

seconde = ra[2];

ra2DegreeDecimal = (heure*15.0 + minute*15/60.0 + seconde*15/3600.0) ;

return ra2DegreeDecimal;

}

 

public static double rightAscensionToRadian(int val[]){

return Math.toRadians( rightAscensionToDegreeDecimal(val) );

}

 

public static double coordonneeToDegreeDecimal(int val[]){

double decDegreeDecimal=0.0;

double degree,minute,seconde ;

degree = val[0];

minute = val[1];

seconde = val[2];

decDegreeDecimal = degree + minute/60.0 + seconde/3600.0 ;

return decDegreeDecimal;

}

 

public static double coordonneeToRadian(int val[]){

return Math.toRadians( coordonneeToDegreeDecimal(val) );

}

 

 

public static double degtoradian(double angledeg){

double pi = 3.141592653589793238462 ;

double resultat = 0.0;

// pi * (angle en degré) / 180

resultat = (pi * angledeg) / 180.0 ;

return resultat;

 

}

 

 

public static double[] altazToRaDEc(int[] dateTU, int[] heureTU, double lat , double longi, double alt, double az){

double[] rd = {0,0};

/*

* http://groups.google.com/group/sara-list/browse_thread/thread/d62b27bf7df04a85?pli=1

sin DEC = sin LAT sin ALT + cos LAT cos ALT cos AZ

cos H = (sin ALT - sin DEC sin LAT)/(cos DEC cos LAT)

The arc cos function may be used to find H.

H = LST - RA therefore RA = LST - H

*/

 

// 1 => sin DEC = sin LAT sin ALT + cos LAT cos ALT cos AZ

if (alt==90) alt = 89.99;

if(lat ==90) lat = 89.99;

 

double sinDec =0;

double sinLat = Math.sin( Math.toRadians(lat) ) ;

double sinAlt = Math.sin( Math.toRadians(alt) ) ;

double cosLat = Math.cos( Math.toRadians(lat) ) ;

double cosAlt = Math.cos( Math.toRadians(alt) ) ;

double cosAz = Math.cos( Math.toRadians(az) ) ;

 

//if(az<180) cosAz = -1 * cosAz;

 

sinDec = (sinLat * sinAlt) + (cosLat * cosAlt * cosAz);

double decRadian = Math.asin(sinDec);

//2=> cos H = (sin ALT - sin DEC sin LAT)/(cos DEC cos LAT)

double cosDec = Math.cos(decRadian);

double cosH = (sinAlt - sinDec * sinLat) / (cosDec * cosLat);

Double H = Math.acos(cosH);

 

if(az<180) H = -1 * H;

double lstDegree = toAngleHoraireDegree(dateTU, heureTU, 0, longi); // en mettant RA a 0 j ai le LST;

 

double RAdegree = lstDegree - Math.toDegrees(H);

double decDegree = Math.toDegrees(decRadian);

 

rd[0]=RAdegree;

rd[1]=decDegree;

 

return rd;

}

 

 

public static double[] hauteurAzimutDegree(int[] dateTU, int[] heureTU, double ra, double dec, double lat , double longi){

 

// correction de la precession sur ra et dec

double[] radecCorriger = RaDecPrecession(dateTU[0], ra, dec);

ra = radecCorriger[0];

dec = radecCorriger[1];

 

double angleHoraireDegre = toAngleHoraireDegree(dateTU, heureTU, ra, longi);

double sinDec = Math.sin( (float) degtoradian(dec) );

double sinLat = Math.sin( (float) degtoradian(lat));

double cosDec = Math.cos( (float) degtoradian(dec) );

double cosLat = Math.cos( (float) degtoradian(lat));

double cosHA = Math.cos( (float) degtoradian(angleHoraireDegre) );

double sinHA = Math.sin( (float) degtoradian(angleHoraireDegre) );

 

double hauteur;

double azimuth;

 

double cosazimuth = 0.0;

 

double sinHauteur = 0.0;

double cosHauteur = 0.0;

sinHauteur = (sinDec * sinLat) + ( cosDec * cosLat * cosHA );

hauteur = Math.asin(sinHauteur);

 

cosHauteur = Math.cos(hauteur);

cosazimuth =(sinDec - sinHauteur * sinLat) / (cosHauteur * cosLat) ;

 

if ( sinHA< 0){

azimuth = Math.acos(cosazimuth);

azimuth = Math.toDegrees(azimuth);

}else {azimuth =360- Math.toDegrees( Math.acos(cosazimuth) );}

 

hauteur = Math.toDegrees(hauteur);

// azimuth = Math.toDegrees(azimuth);

double[] altAz ={hauteur,azimuth,angleHoraireDegre};

return altAz;

}

 

public static double calculateDifferenceBetweenAngles(double firstAngleDegree, double secondAngleDegree)

{

double difference = secondAngleDegree - firstAngleDegree;

while (difference < -180) difference += 360;

while (difference > 180) difference -= 360;

return difference;

}

 

public static double[] RaDecPrecession(int year, double ra,double dec){

double[] RaDec = {0,0};

int deltaAnnee = year - 2000;

// methode simplifier page 124 astronomical algorithme

//Log.i(" xxxx ","ra: "+ra+" dec:"+dec+" year: "+year);

double m = 3.075 ; // en seconde

double n = 20.04 ; // en seconde degree

 

double deltaRa = m + n * Math.sin( Math.toRadians(ra) ) * Math.tan( Math.toRadians(dec) );

double deltaDec = n * Math.cos( Math.toRadians(ra) );

 

ra = ra + (deltaRa * deltaAnnee)/3600.0;

 

dec = dec + (deltaDec * deltaAnnee)/3600.0;

//Log.i("yyyy ","ra: "+ra+" dec:"+dec);

 

RaDec[0]=ra;

RaDec[1]=dec;

 

return RaDec;

}

 

 

 

 

}

Lien vers le commentaire
Partager sur d’autres sites

Il manque la méthode pour passer du temps légal (celui affiché par l'ordinateur) au temps TU, c'est dommage car en Java cela se fait simplement à partir des informations de localisation et cela simplifie le travail de celui qui va utiliser ta lib ;)

 

PS: en Java on obtient la valeur de pi par Math.PI...

Modifié par jgricourt
Lien vers le commentaire
Partager sur d’autres sites

je me suis servi du bouquin de jean meuus ( acheter a Paris ) et divers sites internet.

 

Sinon c'est une classe que j'ai extraite de mon programme "android" astrotools dans lequel je gere bien sur le TU.

Comme ca fait un an que je n'y ai pas touché , j'ai adapté la class à l arrache.

 

PS: en Java on obtient la valeur de pi par Math.PI... Des fois on est pas inspiré :-)

Modifié par airconone
Lien vers le commentaire
Partager sur d’autres sites

Rejoignez la conversation !

Vous pouvez répondre maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous pour poster avec votre compte.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.