Révision 228
Ajouté par jeleroy il y a presque 4 ans
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
Ajout de la fonction int distance_a_la_plus_proche_zone et indentation