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

Private GIT Repository
initialisation du snake par rectangle 'le plus probable'
[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
66 void min_max_int1d(int *val_min, int *val_max, int *vect, int dim)
67 {
68   int n, min, max ;
69
70   min = vect[1];
71   max = min;
72   
73   for (n=0;n<dim;n++)
74     {
75       if (vect[n] > max) max = vect[n];
76       if (vect[n] < min) min = vect[n];
77     }
78
79   *val_min = min ;
80   *val_max = max ;
81 }
82
83 void min_max_ushort1d(int *val_min, int *val_max, unsigned short *vect, int dim)
84 {
85   int n ;
86   unsigned short min, max ;
87
88   min = vect[1];
89   max = min;
90   
91   for (n=0;n<dim;n++)
92     {
93       if (vect[n] > max) max = vect[n];
94       if (vect[n] < min) min = vect[n];
95     }
96
97   *val_min = min ;
98   *val_max = max ;
99 }
100
101
102
103
104 /**
105  * \fn inline int test_inf(double arg1, double arg2)
106  *
107  * \brief test (arg1 < arg2) inferieur a avec pourcentage minimum
108  *
109  * \param[in]   arg1
110  * \param[in]   arg2
111  *
112  * return test
113  */
114 inline int test_inf(double arg1, double arg2)
115 {
116   if (arg2 > 0)
117     return arg1 < (arg2*COEF_DECROI) ;
118   else
119     return arg1 < (arg2*INV_COEF_DECROI) ;
120 }
121
122
123
124 /**
125  * \fn int calcul_px_autour_noeud(int ni, int nj, int pas, 
126  *                         int idim_m1, int jdim_m1,
127  *                         int *liste_pixel_move)
128  *
129  * \brief determine les positions de test autout d'un noeud
130  *
131  * \param[in]   ni coordonnee i
132  * \param[in]   nj coordonnee j
133  * \param[in]   pas ecartement par rapport au centre
134  * \param[in]   idim_m1 dimension de l'image sur l'axe i (-1)
135  * \param[in]   jdim_m1 dimension de l'image sur l'axe j (-1)
136  * \param[out]  liste_pixel_move liste des coordonnees [i,j,i,j,...]
137  *
138  * return le nombre de coordonnees (*2)
139  */
140 uint32 calcul_px_autour_noeud(uint32 ni, uint32 nj, int pas, 
141                            uint32 idim_m1, uint32 jdim_m1,
142                            uint32 *liste_pixel_move)
143 {
144   uint32 ind = 0 ;
145   
146   liste_pixel_move[ind++] = min(ni + pas, idim_m1) ;
147   liste_pixel_move[ind++] = nj ;
148
149   liste_pixel_move[ind++] = min(ni + pas, idim_m1) ;
150   liste_pixel_move[ind++] = min(nj + pas, jdim_m1) ;
151
152   liste_pixel_move[ind++] = ni ;
153   liste_pixel_move[ind++] = min(nj + pas, jdim_m1) ;
154
155   liste_pixel_move[ind++] = max(ni - pas, 0) ;
156   liste_pixel_move[ind++] = min(nj + pas, jdim_m1) ;
157
158   liste_pixel_move[ind++] = max(ni - pas, 0) ;
159   liste_pixel_move[ind++] = nj ;
160
161   liste_pixel_move[ind++] = max(ni - pas, 0) ;
162   liste_pixel_move[ind++] = max(nj - pas, 0) ;
163
164   liste_pixel_move[ind++] = ni  ;
165   liste_pixel_move[ind++] = max(nj - pas, 0) ;
166
167   liste_pixel_move[ind++] = min(ni + pas, idim_m1) ;
168   liste_pixel_move[ind++] = max(nj - pas, 0) ;
169
170   return ind ;
171 }
172
173
174
175 /**
176  * \fn inline int sign_diff_ou_egal_zero(int val1, int val2)
177  *
178  * \brief fonction qui test si les arguments sont de signes differents ou nuls
179  * \author NB - PhyTI
180  *
181  * \param[in] val1 
182  * \param[in] val2
183  *
184  * \return le test 0/1 
185  *
186  */
187 inline int sign_diff_ou_egal_zero(int val1, int val2)
188 {
189   if (val1 > 0) 
190     {
191       if (val2 > 0) return 0 ;
192       else return 1 ;
193     }
194   else 
195     if (val1 < 0)
196       {
197                 if (val2 < 0) return 0 ;
198                 else  return 1 ;
199       }
200     else
201       return 1 ;/* val1 == 0 */
202 }
203
204 /**
205  * \fn inline int sign_diff_strict(int val1, int val2)
206  *
207  * \brief fonction qui test si les arguments sont de signes differents strictement
208  * \author NB - PhyTI
209  *
210  * \param[in] val1 
211  * \param[in] val2
212  *
213  * \return le test 0/1 
214  *
215  */
216 inline int sign_diff_strict(int val1, int val2)
217 {
218   if (val1 > 0) 
219     {
220       if (val2 >= 0) return 0 ;
221       else return 1 ;
222     }
223   else 
224     if (val1 < 0)
225       {
226         if (val2 <= 0) return 0 ;
227         else  return 1 ;
228       }
229     else
230       return 0 ;/* val1 == 0 */
231 }
232
233
234
235 /**
236  * \fn inline int sinus_triangle(int Ai, int Aj, int Bi, int Bj, int Ci, int Cj)
237  *
238  * \brief calcul le "sinus" de l'angle du triangle ABC 
239  * \author NB - PhyTI
240  *
241  * \param[in] Ai les coordonnees
242  * \param[in] Aj
243  * \param[in] Bi
244  * \param[in] Bj
245  * \param[in] Ci
246  * \param[in] Cj
247  *
248  * \return le sinus non normalise 
249  *
250  * Cette fonction est utile pour determiner si un triangle ABC
251  * est donne dans l'ordre trigo. 
252  * Signe > 0: sens trigo,
253  * signe < 0: sens antitrigo
254  *       = 0: plat
255  */
256 inline int sinus_triangle(int Ai, int Aj, int Bi, int Bj, int Ci, int Cj)
257 {
258   return (((Bi-Ai)*(Cj-Aj)) - ((Ci-Ai)*(Bj-Aj))) ;
259 }
260
261
262 /**
263  * \fn void recopie_vecteur(int *in, int *out, int dim)
264  *
265  * \brief recopie le vecteur out vers in
266  * \author NB - PhyTI
267  *
268  * \param[in]  in  vecteur d'entree
269  * \param[out] out vecteur recopier
270  * \param[in]  dim longueur du vecteur
271  */
272 void recopie_vecteur(int *in, int *out, int dim)
273 {
274   int n ;
275   for (n=0; n<dim; n++) out[n] = in[n] ;
276 }