??????Dzp a écrit:J'ai commencé le calcul par la méthode cartésienne donnée par Robot, et j'ai renoncé, devant la complexité des calculs.
Uniquement à signaler que, contrairement à ce que tu affirme, les calculs en question sont on ne peut plus simple.Dzp a écrit:Ceci dit, je n'ai pas très bien compris l'intérêt de ton message.
Je peut te rassurer : il y a très clairement ENORME erreur de ta part : avec la calculatrice/ordi la plus pourrie qui soit, tu as une précision infiniment plus grande que le dixième de degré.Dzp a écrit:Sauf erreur de ma part, cette méthode donne une précision de l'ordre du 1/10 de degré.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct coord coord;
struct coord
{ double x;
double y;
double z;
};
double Rayon(coord A, coord B)
{ return acos(A.x*B.x+A.y*B.y+A.z*B.z);
}
coord Coordonnees(double latD, double latM, double latS, double lonD, double lonM, double lonS)
{ double lat,lon; coord cM;
lat=(latD+latM/60+latS/3600)*2*M_PI/360; lon=(lonD+lonM/60+lonS/3600)*2*M_PI/360;
cM.x=cos(lat)*cos(lon); cM.y=cos(lat)*sin(lon); cM.z=sin(lat);
return cM;
}
void Solve(coord A, double rA, coord B, double rB, coord *M1, coord *M2)
{ double det,coefX,coefY,cstX,cstY,a,b,c,delta,z1,z2;
det=A.x*B.y-B.x*A.y;
coefX=(-A.z*B.y+B.z*A.y)/det; cstX=(cos(rA)*B.y-cos(rB)*A.y)/det;
coefY=(-A.x*B.z+B.x*A.z)/det; cstY=(A.x*cos(rB)-B.x*cos(rA))/det;
a=coefX*coefX+coefY*coefY+1; b=coefX*cstX+coefY*cstY; c=cstX*cstX+cstY*cstY-1;
delta=b*b-a*c; z1=(-b-sqrt(delta))/a; z2=(-b+sqrt(delta))/a;
M1->x=coefX*z1+cstX; M1->y=coefY*z1+cstY; M1->z=z1;
M2->x=coefX*z2+cstX; M2->y=coefY*z2+cstY; M2->z=z2;
}
void Affiche(coord M)
{ double lat,lon; int latD,latM,lonD,lonM;
lat=asin(M.z)*360/(2*M_PI); lon=atan(M.y/M.x)*360/(2*M_PI);
latD=(int)lat; lat=60*(lat-latD); lonD=(int)lon; lon=60*(lon-lonD);
latM=(int)lat; lat=60*(lat-latM); lonM=(int)lon; lon=60*(lon-lonM);
printf("(%d:%d:%f ; %d:%d:%f)\n",latD,latM,lat,lonD,lonM,lon);
}
int main()
{ coord Asterix,Calais,Rouen,Point1,Point2; double rAsterix,rCalais;
Asterix = Coordonnees( 49, 37, 36.551 , -1,-37,-19.801);
Calais = Coordonnees( 50, 57, 40.767 , 1, 44, 49.926);
Rouen = Coordonnees( 49, 28, 25.545 , 1, 02, 33.772);
rAsterix = Rayon(Asterix,Rouen);
rCalais = Rayon(Calais ,Rouen);
Solve(Asterix,rAsterix,Calais,rCalais,&Point1,&Point2);
Affiche(Rouen);
Affiche(Point1);
Affiche(Point2);
return 0;
}
lon=atan2(M.y, M.x)*360/(2*M_PI);
Heuuuuuu.Dzp a écrit:Tu calcules les rayons à partir des coordonnées cartésiennes de Rouen alors que justement, c'est cela que l'on doit calculer.
Sextant a écrit:Soient 2 cercles tracés à la surface d'une sphère (la terre), et dont on connait pour chacun d'eux :
- les coordonnées du centre (latitude / longitude)
- la longueur angulaire du rayon.
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 12 invités
Tu pars déja ?
Identification
Pas encore inscrit ?
Ou identifiez-vous :