Projet total V1
Dependencies: mbed
Diff: fonctions_distance.cpp
- Revision:
- 0:eac65d0c5a1c
diff -r 000000000000 -r eac65d0c5a1c fonctions_distance.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fonctions_distance.cpp Wed Jun 15 09:00:08 2016 +0000 @@ -0,0 +1,134 @@ +#include <fonctions_distance.h> + +void init_tab_max(struct maximum tab[3], float acquisition){ + int i; + for (i=0;i<3;i++){ + tab[i].valeur=acquisition; + tab[i].indice=0; + } +} + +void init_tab_min(struct minimum tab[3], float acquisition){ + int i; + for(i=0;i<3;i++){ + tab[i].valeur=acquisition; + tab[i].indice=0; + } +} + +bool appartient_max(int i, struct maximum tab_max[3]){ + int indice; + bool state; + state=false; + for(indice=0;indice<3;indice++){ + if (tab_max[indice].indice == i) state = true; + } + return state; +} + + +bool appartient_min(int i, struct minimum tab_min[3]){ + int indice; + bool state; + state=false; + for(indice=0;indice<3;indice++){ + if (tab_min[indice].indice == i) state = true; + } + return state; +} + +void have_max(float tab[NB_VALEURS], struct maximum tab_max[3]){ + int i,j; + for(j=0;j<3;j++){ + for(i=0;i<NB_VALEURS;i++){ + if (tab_max[j].valeur < tab[i] && appartient_max(i, tab_max) != true){ //La valeur du tableau est supérieure et aucune autre case du tabelau de structure ne contient cette valeur; + tab_max[j].valeur=tab[i]; + tab_max[j].indice=i; + } + } + } +} + +void have_min(float tab[NB_VALEURS], struct minimum tab_min[3]){ // A modifier avec la rejection de valeur; + int i,j; + for(j=0;j<3;j++){ + for(i=0;i<NB_VALEURS;i++){ + if (tab_min[j].valeur > tab[i] && appartient_min(i, tab_min) != true){ + tab_min[j].valeur=tab[i]; + tab_min[j].indice=i; + } + } + } +} + +//ALGO DETECTION DISTANCE +float abs_minus(float a, float b){ + float retour; + if ((a-b)>=0) retour = a-b; + else retour = b-a; + return retour; +} + +void init_struct(struct signal_caracteristiques tableau){ + tableau.indice_max=0; + tableau.indice_moyenne=0; + tableau.indice_ecart=0; + tableau.indice_rapport=0; +} + +void verifff(struct distance signal, struct distance donnee[], struct signal_caracteristiques *signal_carac){ + int i; + init_struct(*signal_carac); + for(i=1;i<9;i++){ + if (abs_minus(signal.max, donnee[signal_carac->indice_max].max) > abs_minus(signal.max, donnee[i].max))signal_carac->indice_max=i; + if (abs_minus(signal.moyenne, donnee[signal_carac->indice_moyenne].moyenne) > abs_minus(signal.moyenne, donnee[i].moyenne))signal_carac->indice_moyenne=i; + if (abs_minus(signal.ecart, donnee[signal_carac->indice_ecart].ecart) > abs_minus(signal.ecart, donnee[i].ecart))signal_carac->indice_ecart=i; + if (abs_minus(signal.rapport, donnee[signal_carac->indice_rapport].rapport) > abs_minus(signal.rapport, donnee[i].rapport))signal_carac->indice_rapport=i; + } +} + +void printf_SC(struct signal_caracteristiques sig){ + printf("indice_max: %d\n", sig.indice_max); + printf("indice_moyenne: %d\n", sig.indice_moyenne); + printf("indice_ecart: %d\n", sig.indice_ecart); + printf("indice_rapport: %d\n", sig.indice_rapport); +} + +int calcul_distance_V1(struct distance signal, struct distance donnee[], struct signal_caracteristiques caracteristiques){ + int distance; + if (caracteristiques.indice_rapport < 3){ + if (abs_minus(signal.rapport, donnee[0].rapport) <= abs_minus(signal.rapport, donnee[1].rapport)) distance = 20; + else { + if (abs_minus(signal.rapport, donnee[1].rapport) < abs_minus(signal.rapport, donnee[2].rapport)) distance = 30; + else distance = 40; + } + } + else{ + if (abs_minus(signal.ecart, donnee[3].ecart) < abs_minus(signal.ecart, donnee[4].ecart)) distance = 50; + else { + if (signal.ecart < donnee[8].ecart) distance = 100; + else if (signal.ecart < donnee[7].ecart) distance = 90; + else if (signal.ecart < donnee[6].ecart) distance = 80; + else if (signal.ecart < donnee[5].ecart) distance = 70; + else distance = 60; + } + } + return distance; +} + +float convert_indice(int indice){ + return indice*10+20; +} + +float calcul_distance_V2(struct distance signal, struct signal_caracteristiques caracteristiques){ + float distance; + if(convert_indice(caracteristiques.indice_rapport) <= 40) + distance = convert_indice(caracteristiques.indice_rapport); + else if(convert_indice(caracteristiques.indice_ecart) == 100) + distance = 100; + else + distance = 0.5*convert_indice(caracteristiques.indice_rapport) + 0.5*convert_indice(caracteristiques.indice_ecart); + return distance; + +} +//FIN ALGO DETECTION DISTANCE \ No newline at end of file