root/branch/leroy/sp4a12/TP2_SP4/main.c @ 916
222 | jeleroy | #include <stdio.h>
|
|
#include <stdlib.h>
|
|||
#include <math.h>
|
|||
228 | jeleroy | struct position { // d?claration structure position contenant la latitude et la longitude
|
|
222 | jeleroy | int latitude;
|
|
int longitude;
|
|||
};
|
|||
228 | jeleroy | // declaration fonctions utilis?es dans le programme
|
|
222 | jeleroy | void decode_trame(char trame[1000], int* latitude, int* longitude);
|
|
float calcule_distance(struct position p_1,struct position p_2);
|
|||
float calcule_vitesse(struct position p_1,struct position p_2);
|
|||
228 | jeleroy | int distance_a_la_plus_proche_zone(struct position p,float zones[100][3][2],int nb_zones, float *d);
|
|
222 | jeleroy | void decode_trame(char trame[1000], int* latitude, int* longitude){
|
|
int i;
|
|||
915 | jeleroy | /*stockage de la latitude et de la longitude dans les variables de micro controleur ? partir de la trame*/
|
|
222 | jeleroy | for(i = 17; i < 21;i++){
|
|
228 | jeleroy | *latitude = *latitude*10 + (trame[i]-48); // r?cup?ration de la partie enti?re de la latitude
|
|
222 | jeleroy | }
|
|
for(i = 22; i < 26;i++){
|
|||
228 | jeleroy | *latitude = *latitude*10 + (trame[i]-48); // r?cup?ration de la partie d?cimale de la latitude
|
|
222 | jeleroy | ||
}
|
|||
for(i = 29; i < 34;i++){
|
|||
228 | jeleroy | *longitude = *longitude*10 + (trame[i]-48);// r?cup?ration de la partie enti?re de la latitude
|
|
222 | jeleroy | ||
228 | jeleroy | ||
222 | jeleroy | }
|
|
for(i = 35; i < 39;i++){
|
|||
228 | jeleroy | *longitude = *longitude*10 + (trame[i]-48); // r?cup?ration de la partie d?cimale de la longitude
|
|
222 | jeleroy | }
|
|
228 | jeleroy | *latitude = *latitude - *latitude%1000000 + *latitude%1000000 * 5/3; //conversion de la latitude en hexad?cimal
|
|
*longitude = *longitude - *longitude%1000000 + *longitude%1000000 * 5/3; //conversion de la longitude en hexad?cimal
|
|||
222 | jeleroy | }
|
|
float calcule_distance(struct position p_1, struct position p_2){
|
|||
float distance;
|
|||
float lat1 = p_1.latitude;
|
|||
float lat2 = p_2.latitude;
|
|||
float lon1 = p_1.longitude;
|
|||
float lon2 = p_2.longitude;
|
|||
228 | jeleroy | /*conversion de la latitude et de la longitude cod?e en un entier en d?cimal*/
|
|
222 | jeleroy | lat1 = lat1/1000000;
|
|
lat2 = lat2/1000000;
|
|||
lon1 = lon1/1000000;
|
|||
lon2 = lon2/1000000;
|
|||
228 | jeleroy | /*affichage des coordonn?es des deux points*/
|
|
printf("LAT1 = %f deg\n", lat1);
|
|||
printf("LON1 = %f deg\n", lon1);
|
|||
printf("LAT2 = %f deg\n", lat2);
|
|||
printf("LON2 = %f deg\n", lon2);
|
|||
222 | jeleroy | ||
228 | jeleroy | /*calcul de la distance entre ces deux points*/
|
|
distance = acos(sin(lat1*M_PI/180)*sin(lat2*M_PI/180)+cos(lat1*M_PI/180)*cos(lat2*M_PI/180)*cos(lon1*M_PI/180-lon2*M_PI/180))*6371;
|
|||
222 | jeleroy | ||
228 | jeleroy | printf("D = %f km \n", distance); //affichage de la distance entre les deux points
|
|
222 | jeleroy | return distance;
|
|
}
|
|||
float calcule_vitesse(struct position p_1, struct position p_2){
|
|||
float distance;
|
|||
float vitesse;
|
|||
float lat1 = p_1.latitude;
|
|||
float lat2 = p_2.latitude;
|
|||
float lon1 = p_1.longitude;
|
|||
float lon2 = p_2.longitude;
|
|||
228 | jeleroy | /*idem que pour la fonction decode_trame*/
|
|
222 | jeleroy | lat1 = lat1/1000000;
|
|
lat2 = lat2/1000000;
|
|||
lon1 = lon1/1000000;
|
|||
lon2 = lon2/1000000;
|
|||
distance = acos(sin(lat1*M_PI/180)*sin(lat2*M_PI/180)+cos(lat1*M_PI/180)*cos(lat2*M_PI/180)*cos(lon1*M_PI/180-lon2*M_PI/180))*6371;
|
|||
228 | jeleroy | ||
vitesse = distance * 3600; //calcul de la vitesse sachant qu'il s'?coule 1s 1es entre les deux trames
|
|||
printf("V = %f km/h\n", vitesse); // affichage de la vitesse
|
|||
222 | jeleroy | return vitesse;
|
|
}
|
|||
228 | jeleroy | int distance_a_la_plus_proche_zone(struct position p,float zones[100][3][2],int nb_zones, float *d){
|
|
float distance, distance_precedente;
|
|||
int i;
|
|||
float lat1 = p.latitude;
|
|||
float lon1 = p.longitude;
|
|||
/*conversion de la latitude et de la longitude cod?e en un entier en d?cimal*/
|
|||
lat1 = lat1/1000000;
|
|||
lon1 = lon1/1000000;
|
|||
/*Calcul de la distance entre la premi?re zone et l'endroit o? le point de r?f?rence*/
|
|||
distance_precedente = acos(sin(lat1*M_PI/180)*sin(zones[0][0][0]*M_PI/180)+cos(lat1*M_PI/180)*cos(zones[0][0][0]*M_PI/180)*cos(lon1*M_PI/180-zones[0][0][1]*M_PI/180))*6371-zones[0][1][0];
|
|||
for(i=0; i < nb_zones; i++){
|
|||
printf("LAT zone %d : %f deg\n",i+1, zones[i][0][0]);
|
|||
printf("LON zone %d : %f deg\n",i+1, zones[i][0][1]);
|
|||
printf("Rayon zone %d : %f\n",i+1, zones[i][1][0]);
|
|||
/*Calcul de la distance entre les zones suivantes et le point de r?f?rence*/
|
|||
distance = acos(sin(lat1*M_PI/180)*sin(zones[i][0][0]*M_PI/180)+cos(lat1*M_PI/180)*cos(zones[i][0][0]*M_PI/180)*cos(lon1*M_PI/180-zones[i][0][1]*M_PI/180))*6371-zones[i][1][0];
|
|||
/*Comparaison entre la distance entre la zone pr?c?dente et le point de r?ference et celle entre la zone actuelle et ce m?me point*/
|
|||
if(distance_precedente < distance){
|
|||
*d = distance_precedente;
|
|||
}else{
|
|||
*d = distance;
|
|||
}
|
|||
/*Conservation de la distance calcul?e entre la zone actuelle et le point de r?f?rence pour ensuite la recomparer ? la distance entre ce m?me point et la zone suivante*/
|
|||
distance_precedente = distance;
|
|||
printf("Distance %d zone : %f km\n",i+1, *d); // Affichage du num?ro de la zone la plus proche ainsi que sa distance la s?parant du point de r?f?rence
|
|||
}
|
|||
return i;
|
|||
}
|
|||
222 | jeleroy | int main()
|
|
{
|
|||
228 | jeleroy | char trame1[] = {"$GPGGA,141914.00,4545.0000,N,00306.6036,E,1,05,3.4,499.3,M,,M,,*7D"}; //Premi?re trame
|
|
char trame2[] = {"$GPGGA,141915.00,4545.0242,N,00306.6039,E,1,05,3.4,499.5,M,,M,,*72"}; //Deuxi?me trame
|
|||
float zones[100][3][2] = {{{44.7887762, -3.012}, {50}}, {{44.7891220, -3.013}, {70}}}; //Tableau contenant les coordonn?es du centre du cercle et son rayon de chacune des zones
|
|||
222 | jeleroy | ||
228 | jeleroy | int nb_zones = 2; // Nombre de zones (ici le tableau en contient 2)
|
|
float d = 0;
|
|||
struct position p_1,p_2, p;
|
|||
222 | jeleroy | ||
228 | jeleroy | /*Initailisation de la longitude et de la latitude des points ? 0* (ces variables contiendront ensuite les coordon?es des points p1 et p2 apr?s ex?cution de la fonction decode_trame*/
|
|
222 | jeleroy | p_1.longitude = 0;
|
|
p_1.latitude = 0;
|
|||
p_2.longitude = 0;
|
|||
p_2.latitude = 0;
|
|||
228 | jeleroy | /*Ex?cution de chacunes des fonctions*/
|
|
222 | jeleroy | decode_trame(trame1, &p_1.latitude, &p_1.longitude);
|
|
decode_trame(trame2, &p_2.latitude, &p_2.longitude);
|
|||
calcule_distance(p_1, p_2);
|
|||
calcule_vitesse(p_1, p_2);
|
|||
228 | jeleroy | /*Affichage du num?ro de la zone la plus proche ainsi que la distance s?parant cette zone au point de r?f?rence (ici p_1) (donn?es renvoy?s par la fonction distance_a_la_plus_proche_zone)*/
|
|
printf("Numero de la zone la plus proche : %d\n", distance_a_la_plus_proche_zone(p_1,zones,nb_zones, &d)); //test unitaire pour la fonction distance_a_la_plus_proche_zone
|
|||
printf("Distance a la zone la plus proche : %f km\n", d);
|
|||
222 | jeleroy | ||
return 0;
|
|||
}
|