/** * \file lib_math.c * \brief routines * \author NB - PhyTI * \version x.x * \date 20 decembre 2009 * */ #include #include "lib_math.h" #include "constantes.h" /** * \fn void tic(struct timeval* temps, char* texte) * \brief Initialise le compteur de temps * * \param[out] temps * \param[in] texte texte a afficher * */ void tic(struct timeval* temps, char* texte) { gettimeofday(temps, NULL); if (texte != NULL) printf("%s\n", texte) ; } /** * \fn double toc(struct timeval start, char* texte) * \brief Calcule le temps ecoule * * \param[in] start temps de debut du chrono * \param[in] texte texte a afficher * * \return le temps ecoule entre tic et toc */ double toc(struct timeval start, char* texte) { struct timeval end ; double elapsed ; gettimeofday(&end, NULL); elapsed = (double)(end.tv_sec-start.tv_sec) + 0.000001*(double)(end.tv_usec-start.tv_usec); if (texte != NULL) printf("%s : %f\n", texte, elapsed) ; return elapsed ; } /** * \fn void min_max_int1d(int *val_min, int *val_max, int *vect, int dim) * \brief determine le min et max d'un vecteur de int * * \param[out] val_min * \param[out] val_max * \param[in] vect * \param[in] dim dimension du vecteur * */ void min_max_int1d(int *val_min, int *val_max, int *vect, int dim) { int n, min, max ; min = vect[1]; max = min; for (n=0;n max) max = vect[n]; if (vect[n] < min) min = vect[n]; } *val_min = min ; *val_max = max ; } /** * \fn inline int test_inf(double arg1, double arg2) * * \brief test (arg1 < arg2) inferieur a avec pourcentage minimum * * \param[in] arg1 * \param[in] arg2 * * return test */ inline int test_inf(double arg1, double arg2) { if (arg2 > 0) return arg1 < (arg2*COEF_DECROI) ; else return arg1 < (arg2*INV_COEF_DECROI) ; } /** * \fn int calcul_px_autour_noeud(int ni, int nj, int pas, * int idim_m1, int jdim_m1, * int *liste_pixel_move) * * \brief determine les positions de test autout d'un noeud * * \param[in] ni coordonnee i * \param[in] nj coordonnee j * \param[in] pas ecartement par rapport au centre * \param[in] idim_m1 dimension de l'image sur l'axe i (-1) * \param[in] jdim_m1 dimension de l'image sur l'axe j (-1) * \param[out] liste_pixel_move liste des coordonnees [i,j,i,j,...] * * return le nombre de coordonnees (*2) */ uint32 calcul_px_autour_noeud(uint32 ni, uint32 nj, int pas, uint32 idim_m1, uint32 jdim_m1, uint32 *liste_pixel_move) { uint32 ind = 0 ; liste_pixel_move[ind++] = min(ni + pas, idim_m1) ; liste_pixel_move[ind++] = nj ; liste_pixel_move[ind++] = min(ni + pas, idim_m1) ; liste_pixel_move[ind++] = min(nj + pas, jdim_m1) ; liste_pixel_move[ind++] = ni ; liste_pixel_move[ind++] = min(nj + pas, jdim_m1) ; liste_pixel_move[ind++] = max(ni - pas, 0) ; liste_pixel_move[ind++] = min(nj + pas, jdim_m1) ; liste_pixel_move[ind++] = max(ni - pas, 0) ; liste_pixel_move[ind++] = nj ; liste_pixel_move[ind++] = max(ni - pas, 0) ; liste_pixel_move[ind++] = max(nj - pas, 0) ; liste_pixel_move[ind++] = ni ; liste_pixel_move[ind++] = max(nj - pas, 0) ; liste_pixel_move[ind++] = min(ni + pas, idim_m1) ; liste_pixel_move[ind++] = max(nj - pas, 0) ; return ind ; } /** * \fn inline int sign_diff_ou_egal_zero(int val1, int val2) * * \brief fonction qui test si les arguments sont de signes differents ou nuls * \author NB - PhyTI * * \param[in] val1 * \param[in] val2 * * \return le test 0/1 * */ inline int sign_diff_ou_egal_zero(int val1, int val2) { if (val1 > 0) { if (val2 > 0) return 0 ; else return 1 ; } else if (val1 < 0) { if (val2 < 0) return 0 ; else return 1 ; } else return 1 ;/* val1 == 0 */ } /** * \fn inline int sign_diff_strict(int val1, int val2) * * \brief fonction qui test si les arguments sont de signes differents strictement * \author NB - PhyTI * * \param[in] val1 * \param[in] val2 * * \return le test 0/1 * */ inline int sign_diff_strict(int val1, int val2) { if (val1 > 0) { if (val2 >= 0) return 0 ; else return 1 ; } else if (val1 < 0) { if (val2 <= 0) return 0 ; else return 1 ; } else return 0 ;/* val1 == 0 */ } /** * \fn inline int sinus_triangle(int Ai, int Aj, int Bi, int Bj, int Ci, int Cj) * * \brief calcul le "sinus" de l'angle du triangle ABC * \author NB - PhyTI * * \param[in] Ai les coordonnees * \param[in] Aj * \param[in] Bi * \param[in] Bj * \param[in] Ci * \param[in] Cj * * \return le sinus non normalise * * Cette fonction est utile pour determiner si un triangle ABC * est donne dans l'ordre trigo. * Signe > 0: sens trigo, * signe < 0: sens antitrigo * = 0: plat */ inline int sinus_triangle(int Ai, int Aj, int Bi, int Bj, int Ci, int Cj) { return (((Bi-Ai)*(Cj-Aj)) - ((Ci-Ai)*(Bj-Aj))) ; } /** * \fn void recopie_vecteur(int *in, int *out, int dim) * * \brief recopie le vecteur out vers in * \author NB - PhyTI * * \param[in] in vecteur d'entree * \param[out] out vecteur recopier * \param[in] dim longueur du vecteur */ void recopie_vecteur(int *in, int *out, int dim) { int n ; for (n=0; n