Je dois optimiser 4 fonctions + une fonction d'initialisation pour un exercice.
Avant de me lancer dans l'assembleur je voudrais savoir l'optimisation en c est suffisante :
voici le code non optimisé en c:
Moi je reduis ca comme ca :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 // calcule la rotation du point de vue inline float x3D(float x, float y, float z, float alpha, float beta) { return cosf(alpha)*(x*cosf(beta)-y*sinf(beta))-z*sinf(alpha); } inline float y3D(float x, float y, float z, float alpha, float beta) { return x*sinf(beta)+y*cosf(beta); } inline float z3D(float x, float y, float z, float alpha, float beta) { return z*cosf(alpha)+sinf(alpha)*(x*cosf(beta)-z*sinf(beta)); } // Calcule la projection en 2D inline void p2D(float x, float y, float z, float alpha, float beta, float px, float py, float pz, float *xp, float *yp) { float x3 = x3D(x-px,y-py,z-pz,alpha,-beta); float y3 = y3D(x-px,y-py,z-pz,alpha,-beta); float z3 = z3D(x-px,y-py,z-pz,alpha,-beta); *xp = -y3/x3; *yp = -z3/x3; }
et pour la fonction initialisation :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 inline void p2D(float x, float y, float z, float alpha, float beta, float px, float py, float pz, float *xp, float *yp) { float acos = cosf(alpha); float asin = sinf(alpha); float bcos = cosf(beta); float bsin = sinf(beta); float p2x = x-px; float p2y = y-py; float p2z = z-pz; float x3 = acos *( p2x * bcos - p2y * bsin )- p2z * asin; float y3 = p2x * bsin + p2y * bcos; float z3 = p2z * acos + asin *( p2x*bcos -p2z * bsin); *xp = -y3/x3; *yp = -z3/x3; }
je fais ca :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 int voitN = 8; float voitX[12]; float voitY[12]; float voitAng[12]; float voitVit[12]; float voitDV[12]; float voitDAng[12]; void initVoitures() { int i; for (i=0; i<voitN; i++) { if (i%2 == 0) { voitX[i] = -0.7; voitY[i] = 1+i*1.7; voitAng[i] = M_PI/2; voitDV[i] = 0.25; voitDAng[i] = -M_PI/120; } else { voitX[i] = 0.7; voitY[i] = 1+i*1.7; voitAng[i] = M_PI/2; voitDV[i] = 0.25; voitDAng[i] = -M_PI/120; } } }
Es que ces optimisations suffisent ? , ou es qu'on peux faire mieux en c ?.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 int voitN = 8; float voitX[8]; float voitY[8]; float voitAng[8]={M_PI/2,M_PI/2,M_PI/2,M_PI/2,M_PI/2,M_PI/2,M_PI/2,M_PI/2}; float voitDV[8]={0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25}; float voitDAng[8]={-M_PI/120,-M_PI/120,-M_PI/120,-M_PI/120,-M_PI/120,-M_PI/120,-M_PI/120,-M_PI/120,}; float voitVit[8]; void initVoitures() { int i; for (i=0; i<voitN; i++) { if (i%2 == 0) { voitX[i] = -0.7; } else { voitX[i] = 0.7; } voitY[i] = 1+i*1.7; } }
Sinon pour l'obtimisation en assembleur si vous avez des pistes pour optimiser ce code ?
Partager