Projet

Général

Profil

« Précédent | Suivant » 

Révision 228

Ajouté par jeleroy il y a presque 4 ans

Ajout de la fonction int distance_a_la_plus_proche_zone et indentation

Voir les différences:

branch/leroy/sp4a12/TP2_SP4/main.c
#include <stdlib.h>
#include <math.h>
struct position {
struct position { // d?claration structure position contenant la latitude et la longitude
int latitude;
int longitude;
};
// declaration fonctions utilis?es dans le programme
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);
int distance_a_la_plus_proche_zone(struct position p,float zones[100][3][2],int nb_zones, float *d);
void decode_trame(char trame[1000], int* latitude, int* longitude){
int i;
/*stockage de la latitude et de la longitude dans les variables de micro controleur? partir de la trame*/
for(i = 17; i < 21;i++){
*latitude = *latitude*10 + (trame[i]-48);
*latitude = *latitude*10 + (trame[i]-48); // r?cup?ration de la partie enti?re de la latitude
}
for(i = 22; i < 26;i++){
*latitude = *latitude*10 + (trame[i]-48);
*latitude = *latitude*10 + (trame[i]-48); // r?cup?ration de la partie d?cimale de la latitude
}
for(i = 29; i < 34;i++){
*longitude = *longitude*10 + (trame[i]-48);
*longitude = *longitude*10 + (trame[i]-48);// r?cup?ration de la partie enti?re de la latitude
}
for(i = 35; i < 39;i++){
*longitude = *longitude*10 + (trame[i]-48);
*longitude = *longitude*10 + (trame[i]-48); // r?cup?ration de la partie d?cimale de la longitude
}
*latitude = *latitude - *latitude%1000000 + *latitude%1000000 * 5/3;
*longitude = *longitude - *longitude%1000000 + *longitude%1000000 * 5/3;
*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
}
float calcule_distance(struct position p_1, struct position p_2){
......
float lon1 = p_1.longitude;
float lon2 = p_2.longitude;
/*conversion de la latitude et de la longitude cod?e en un entier en d?cimal*/
lat1 = lat1/1000000;
lat2 = lat2/1000000;
lon1 = lon1/1000000;
lon2 = lon2/1000000;
printf("LAT1 = %f\n", lat1);
printf("LON1 = %f\n", lon1);
printf("LAT2 = %f\n", lat2);
printf("LON2 = %f\n", lon2);
/*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);
/*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;
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;
printf("D = %f\n", distance);
printf("D = %f km \n", distance); //affichage de la distance entre les deux points
return distance;
}
......
float lon1 = p_1.longitude;
float lon2 = p_2.longitude;
/*idem que pour la fonction decode_trame*/
lat1 = lat1/1000000;
lat2 = lat2/1000000;
lon1 = lon1/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;
vitesse = distance * 3600;
printf("V = %f\n", vitesse);
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
return vitesse;
}
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;
}
int main()
{
char trame1[] = {"$GPGGA,141914.00,4545.0000,N,00306.6036,E,1,05,3.4,499.3,M,,M,,*7D"};
char trame2[] = {"$GPGGA,141915.00,4545.0242,N,00306.6039,E,1,05,3.4,499.5,M,,M,,*72"};
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
int nb_zones = 2; // Nombre de zones (ici le tableau en contient 2)
float d = 0;
struct position p_1,p_2, p;
struct position p_1,p_2;
/*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*/
p_1.longitude = 0;
p_1.latitude = 0;
p_2.longitude = 0;
p_2.latitude = 0;
/*Ex?cution de chacunes des fonctions*/
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);
/*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);
printf("%d\n", p_1.latitude);
printf("%d\n", p_1.longitude);
printf("%d\n", p_2.latitude);
printf("%d\n", p_2.longitude);
return 0;
}
branch/leroy/sp4a12/TP2_SP4/TP2_SP4.depend
<stdlib.h>
<math.h>
1620302174 source:c:\tp_sp4_2021_leroy\sp4a12\tp2_sp4\main.c
<stdio.h>
<stdlib.h>
<math.h>

Formats disponibles : Unified diff