]> AND Private Git Repository - snake_gpu.git/blob - src/lib_math.c~
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
clean
[snake_gpu.git] / src / lib_math.c~
1 /**
2  * \file lib_math.c
3  * \brief routines 
4  * \author NB - PhyTI 
5  * \version x.x
6  * \date 20 decembre 2009
7  *
8  */
9
10 #include <stdio.h>
11 #include "lib_math.h"
12 #include "constantes.h"
13
14 /**
15  * \fn void tic(struct timeval* temps, char* texte)
16  * \brief Initialise le compteur de temps
17  *
18  * \param[out]  temps  
19  * \param[in]   texte texte a afficher
20  *
21  */
22 void tic(struct timeval* temps, char* texte)
23 {
24   gettimeofday(temps, NULL);
25
26   if (texte != NULL)
27     printf("%s\n", texte) ;
28 }
29
30 /**
31  * \fn double toc(struct timeval start, char* texte)
32  * \brief Calcule le temps ecoule
33  *
34  * \param[in]  start temps de debut du chrono  
35  * \param[in]  texte texte a afficher
36  *
37  * \return le temps ecoule entre tic et toc
38  */
39 double toc(struct timeval start, char* texte)
40 {
41   struct timeval end ;
42   double elapsed ;
43
44   gettimeofday(&end, NULL);
45
46   elapsed = (double)(end.tv_sec-start.tv_sec) 
47     + 0.000001*(double)(end.tv_usec-start.tv_usec);
48   if (texte != NULL)
49     printf("%s : %f\n", texte, elapsed) ;
50
51   return elapsed ;
52 }
53
54
55 /**
56  * \fn void min_max_int1d(int *val_min, int *val_max, int *vect, int dim)
57  * \brief determine le min et max d'un vecteur de int
58  *
59  * \param[out]  val_min 
60  * \param[out]  val_max 
61  * \param[in]   vect
62  * \param[in]   dim dimension du vecteur
63  *
64  */
65 void min_max_int1d(int *val_min, int *val_max, int *vect, int dim)
66 {
67   int n, min, max ;
68
69   min = vect[1];
70   max = min;
71   
72   for (n=0;n<dim;n++)
73     {
74       if (vect[n] > max) max = vect[n];
75       if (vect[n] < min) min = vect[n];
76     }
77
78   *val_min = min ;
79   *val_max = max ;
80 }
81
82
83
84
85 /**
86  * \fn inline int test_inf(double arg1, double arg2)
87  *
88  * \brief test (arg1 < arg2) inferieur a avec pourcentage minimum
89  *
90  * \param[in]   arg1
91  * \param[in]   arg2
92  *
93  * return test
94  */
95 inline int test_inf(double arg1, double arg2)
96 {
97   if (arg2 > 0)
98     return arg1 < (arg2*COEF_DECROI) ;
99   else
100     return arg1 < (arg2*INV_COEF_DECROI) ;
101 }
102
103
104
105 /**
106  * \fn int calcul_px_autour_noeud(int ni, int nj, int pas, 
107  *                         int idim_m1, int jdim_m1,
108  *                         int *liste_pixel_move)
109  *
110  * \brief determine les positions de test autout d'un noeud
111  *
112  * \param[in]   ni coordonnee i
113  * \param[in]   nj coordonnee j
114  * \param[in]   pas ecartement par rapport au centre
115  * \param[in]   idim_m1 dimension de l'image sur l'axe i (-1)
116  * \param[in]   jdim_m1 dimension de l'image sur l'axe j (-1)
117  * \param[out]  liste_pixel_move liste des coordonnees [i,j,i,j,...]
118  *
119  * return le nombre de coordonnees (*2)
120  */
121 uint32 calcul_px_autour_noeud(uint32 ni, uint32 nj, int pas, 
122                            uint32 idim_m1, uint32 jdim_m1,
123                            uint32 *liste_pixel_move)
124 {
125   uint32 ind = 0 ;
126   
127   liste_pixel_move[ind++] = min(ni + pas, idim_m1) ;
128   liste_pixel_move[ind++] = nj ;
129
130   liste_pixel_move[ind++] = min(ni + pas, idim_m1) ;
131   liste_pixel_move[ind++] = min(nj + pas, jdim_m1) ;
132
133   liste_pixel_move[ind++] = ni ;
134   liste_pixel_move[ind++] = min(nj + pas, jdim_m1) ;
135
136   liste_pixel_move[ind++] = max(ni - pas, 0) ;
137   liste_pixel_move[ind++] = min(nj + pas, jdim_m1) ;
138
139   liste_pixel_move[ind++] = max(ni - pas, 0) ;
140   liste_pixel_move[ind++] = nj ;
141
142   liste_pixel_move[ind++] = max(ni - pas, 0) ;
143   liste_pixel_move[ind++] = max(nj - pas, 0) ;
144
145   liste_pixel_move[ind++] = ni  ;
146   liste_pixel_move[ind++] = max(nj - pas, 0) ;
147
148   liste_pixel_move[ind++] = min(ni + pas, idim_m1) ;
149   liste_pixel_move[ind++] = max(nj - pas, 0) ;
150
151   return ind ;
152 }
153
154
155
156 /**
157  * \fn inline int sign_diff_ou_egal_zero(int val1, int val2)
158  *
159  * \brief fonction qui test si les arguments sont de signes differents ou nuls
160  * \author NB - PhyTI
161  *
162  * \param[in] val1 
163  * \param[in] val2
164  *
165  * \return le test 0/1 
166  *
167  */
168 inline int sign_diff_ou_egal_zero(int val1, int val2)
169 {
170   if (val1 > 0) 
171     {
172       if (val2 > 0) return 0 ;
173       else return 1 ;
174     }
175   else 
176     if (val1 < 0)
177       {
178                 if (val2 < 0) return 0 ;
179                 else  return 1 ;
180       }
181     else
182       return 1 ;/* val1 == 0 */
183 }
184
185 /**
186  * \fn inline int sign_diff_strict(int val1, int val2)
187  *
188  * \brief fonction qui test si les arguments sont de signes differents strictement
189  * \author NB - PhyTI
190  *
191  * \param[in] val1 
192  * \param[in] val2
193  *
194  * \return le test 0/1 
195  *
196  */
197 inline int sign_diff_strict(int val1, int val2)
198 {
199   if (val1 > 0) 
200     {
201       if (val2 >= 0) return 0 ;
202       else return 1 ;
203     }
204   else 
205     if (val1 < 0)
206       {
207         if (val2 <= 0) return 0 ;
208         else  return 1 ;
209       }
210     else
211       return 0 ;/* val1 == 0 */
212 }
213
214
215
216 /**
217  * \fn inline int sinus_triangle(int Ai, int Aj, int Bi, int Bj, int Ci, int Cj)
218  *
219  * \brief calcul le "sinus" de l'angle du triangle ABC 
220  * \author NB - PhyTI
221  *
222  * \param[in] Ai les coordonnees
223  * \param[in] Aj
224  * \param[in] Bi
225  * \param[in] Bj
226  * \param[in] Ci
227  * \param[in] Cj
228  *
229  * \return le sinus non normalise 
230  *
231  * Cette fonction est utile pour determiner si un triangle ABC
232  * est donne dans l'ordre trigo. 
233  * Signe > 0: sens trigo,
234  * signe < 0: sens antitrigo
235  *       = 0: plat
236  */
237 inline int sinus_triangle(int Ai, int Aj, int Bi, int Bj, int Ci, int Cj)
238 {
239   return (((Bi-Ai)*(Cj-Aj)) - ((Ci-Ai)*(Bj-Aj))) ;
240 }
241
242
243 /**
244  * \fn void recopie_vecteur(int *in, int *out, int dim)
245  *
246  * \brief recopie le vecteur out vers in
247  * \author NB - PhyTI
248  *
249  * \param[in]  in  vecteur d'entree
250  * \param[out] out vecteur recopier
251  * \param[in]  dim longueur du vecteur
252  */
253 void recopie_vecteur(int *in, int *out, int dim)
254 {
255   int n ;
256   for (n=0; n<dim; n++) out[n] = in[n] ;
257 }