Simulateur & conduite automatique d'1 voiture

sonia393 Messages postés 4 Date d'inscription samedi 2 mai 2009 Statut Membre Dernière intervention 4 mai 2009 - 1 mai 2009 à 21:48
kikosoft Messages postés 2 Date d'inscription mardi 10 avril 2007 Statut Membre Dernière intervention 26 décembre 2009 - 24 oct. 2009 à 15:27
Bonjour,

voila, je suis en train de créer un petit simulateur de voiture avec conduite automatique :

j'ai un état 1 (position, cap, vitesse, accélération). La fonction
commande permet de donner la direction et l'accélération à prendre en
fonction de l'environnement (il s'agit d'un circuit avec des obstacles
représentés par des 1 et des espaces libres par 0).

La fonction balayage consiste à balayer dans les directions teta appartenant à [cap-pi/2, cap+pi/2]

pour chercher l'obstacle le plus loin dans chacune de ces directions.

ensuite on sélectionne la valeur maximale de ces distances. Et cette valeur sera le nouveau cap à prendre.

voila le code :

le pb que je rencontre, c'est que j'obtient tjs 0 comme distance maximale

je crois que le pb se situe au niveau de la boucle while

typedef struct {float abscisse;float ordonnee;} points;

float balayage ( points position,float cap , int** circ, int n, int m) {

float teta ;int r=0; int k=1;

int a= (position.abscisse);

int b= (position.ordonnee);

points libre1 = position; points libre2;

int i2= (libre2.abscisse);

int j2= (libre2.ordonnee);

float * tab_teta = tab_radians (181);

for ( r=0; r<=180; r++) {

teta = (cap- PI/2. +r*0.01745 ); /*on balaye tous les 1° ( Pi/180~0.01745... */

while (i2<(n*COEF) && j2<(m*COEF) && i2>=0 && j2>=0 && circ[i2][j2]==0) {

libre1 =libre2;

i2= (a + floor (0.1*k));

j2= (b+ floor (tanf (teta) *0.1*k));

k++;

}

tab_teta [r]= distance (position, libre1);

}

return max_tab ( tab_teta, 181);

}

float * tab_radians ( int n) {

float * tab = (float*) malloc (n* sizeof(float ) );

int i;

for (i=0; i<n; i++) tab[i] = 0 ;

return tab;

}

/* fonction puissance pour flottants*/

float puissf (float x, int y) {

return (y > 0) ? (x*puissf(x, y-1)) : 1;

}

/* recherche du maximum dans un tab de flottants*/

float max_tab (float *tab,int taille){

int i;

float max=tab[0];

for(i=1;i<taille;++i){

if (tab[i]> max){

max=tab[i];

}

}

return max;

}

/* calcul de la distance entre deux points du circuit */

float distance (points p1, points p2) {

return sqrtf ( puissf(((p1.abscisse)-(p2.abscisse)),2)+ puissf(( (p1.ordonnee)- (p2.ordonnee)),2));

}

2 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
10 mai 2009 à 14:47
Bienvenue,

Ca ne sert à rien de poster deux fois la même question à deux heures d'intervalle. Je supprime le doublon.

Indente ton code, ça le rend infiniment plus lisible.

Sinon ça à l'air pas mal à vu de nez.

Pour la correction, désolé, c'est dimanche.

A ta place j'utiliserais un débogueur (Code::Blocks si tu es plutôt "libre", Visual C++ si tu es plutôt microsoft, proposent tous les deux un débogueur). Cela te permet de faire du pas à pas dans le code, d'inspecter les variables...

Si tu ne veux pas de débogueur (Tu as tort !), tu peux mettre des printf un peu partout.

De cette manière, tu connaîtra le détail de tous tes calculs qu'il faudra que tu compare avec ce que tu attends -> papier crayon et calculatrice.
0
kikosoft Messages postés 2 Date d'inscription mardi 10 avril 2007 Statut Membre Dernière intervention 26 décembre 2009
24 oct. 2009 à 15:27
cc
slt , moi j vé fére un prg de simualtion 3d aide à la conduite automobile !
j vé utulisé Visuel c++ é Directx
alr jémré bien un pti pe d'aide :)
0
Rejoignez-nous