Révision 392
Ajouté par Jordan MORARD il y a environ 3 ans
main.c | ||
---|---|---|
|
||
|
||
typedef struct {
|
||
float lat;
|
||
float lon;
|
||
float latitude;
|
||
float longitude;
|
||
}position;
|
||
|
||
typedef struct {
|
||
... | ... | |
//d?claration et initialisation de la distance
|
||
float distance = 0.0;
|
||
|
||
float calcul_distance(position *p1,position *p2)
|
||
{
|
||
float D;
|
||
D = sqrt(pow((p2->latitude-p1->latitude)*PI*Rayon_Terre/180.0,2)+pow(((p2->longitude-p1->longitude)*(cos(((p2->latitude+p1->latitude)/2.0)*PI/180.0)*PI*Rayon_Terre/180.0)),2)); //formule calcul d'une distance sur une sphere, voir internet
|
||
|
||
return D;
|
||
}
|
||
|
||
|
||
float latitude(char *ch)
|
||
{
|
||
float res, res1, res2, res3;
|
||
... | ... | |
if(trame_cmp(trame,"GPGGA")==1) //verifier si la trame GPS contient le caractere "GPGGA"
|
||
{
|
||
printf ("> %s\n",trame);
|
||
printf("\nLatitude : %f Longitude : %f \n\n ", decode_trame_latitude(trame), decode_trame_longitude(trame));
|
||
printf("\n> %s \n\n ",trame);
|
||
}
|
||
}
|
||
|
||
//description de toutes les zones
|
||
zone zones[]= {
|
||
{{44.7887762, -3.012}, 50},
|
||
{{45.752610, 3.465067}, 60},
|
||
{{45.75080886, 3.11006165}, 70},
|
||
{{45.752910, 3.110067}, 80},
|
||
{{46.753910, 4.618967}, 90},
|
||
};
|
||
|
||
int distance_a_la_proche_zone(position p, zone r[],int nb_zones, float *d)
|
||
{
|
||
int i,j;
|
||
float reference;
|
||
|
||
reference = calcul_distance(&p,&r[0].rpos); //creation reference sur la premiere zone du tableau pour commnencer la boucle
|
||
for(i=0; i<nb_zones; i++)
|
||
{
|
||
*d=calcul_distance(&p,&r[i].rpos);
|
||
if(*d<=reference)
|
||
{
|
||
j=i; //changement de l'indice de la zone la plus proche
|
||
reference=*d; //changement de la reference en distance de la zone la plus proche
|
||
}
|
||
}
|
||
|
||
return j;
|
||
|
||
}
|
||
|
||
int trame_cmp(char * trame,char * type)
|
||
{
|
||
int i;
|
||
... | ... | |
}
|
||
|
||
|
||
float decode_trame_latitude(char *ch) //executer directement les deux fonctions pour retrouver la longitude et la latitude
|
||
decode_trame(char *ch, position *p) //executer directement les deux fonctions pour retrouver la longitude et la latitude
|
||
{
|
||
position p2;
|
||
p2.lat = latitude(ch);
|
||
return p2.lat
|
||
p->latitude = latitude(ch);
|
||
p->longitude = longitude(ch);
|
||
}
|
||
|
||
float decode_trame_latitude(char *ch) //executer directement les deux fonctions pour retrouver la longitude et la latitude
|
||
{
|
||
position p2;
|
||
p3.lat = latitude(ch);
|
||
return p3.lat
|
||
}
|
||
|
||
float calcul_distance(position *p1,position *p2)
|
||
{
|
||
float D;
|
||
D = sqrt(pow((p2->latitude-p1->latitude)*PI*Rayon_Terre/180.0,2)+pow(((p2->longitude-p1->longitude)*(cos(((p2->latitude+p1->latitude)/2.0)*PI/180.0)*PI*Rayon_Terre/180.0)),2)); //formule calcul d'une distance sur une sphere, voir internet
|
||
|
||
return D;
|
||
}
|
||
|
||
float calcul_vitesse(position p1,position p2)
|
||
{
|
||
float V;
|
||
... | ... | |
return V;
|
||
}
|
||
|
||
|
||
|
||
//Ajouter vos tests unitaires dans cette fonction.
|
||
void tests_unitaires(void)
|
||
{
|
||
... | ... | |
printf ("Erreur Test unitaire calcul vitesse.\n");
|
||
exit(-1);
|
||
}
|
||
|
||
int nombre_zone = 5;
|
||
|
||
//test fonction distance_a_la_proche_zone avec l'indice de la zone la plus proche dans le test, la zone 3 correspond a la 4eme zone du tableau zones[]
|
||
if(distance_a_la_proche_zone(pos4,zones,nombre_zone,&distance)!=3){
|
||
printf ("Erreur Test unitaire calcul distance_a_la_proche_zone.\n");
|
||
exit(-1);
|
||
}
|
||
}
|
||
|
||
|
||
|
||
// Ne pas modifier cette fonction
|
||
int main(int argc,char ** argv)
|
Formats disponibles : Unified diff
TP2 bien avancé, quelques questions difficiles a faire..