3 * \brief routines pour la gestion des contours polygonaux
6 * \date 24 decembre 2009
10 #include "lib_contour.h"
15 * \fn int calcul_liste_pixel_segment(int y1,int x1,int y2,int x2,
16 * int *liste_pixel_segment, int ind_offset=0)
18 * \brief calcul la liste des pixels du segment entre 2 noeuds
19 * \author FG - PhyTI (mars 2007), modifiee NB - PhyTI
21 * \param[in] y1 coordonnee du point P1 (equiv i1)
22 * \param[in] x1 coordonnee du point P1 (equiv j1)
23 * \param[in] y2 coordonnee du point P2 (equiv i2)
24 * \param[in] x2 coordonnee du point P2 (equiv j2)
25 * \param[out] liste_pixel_segment coordonnees des pixels [i j i j i j ...]
26 * \param[in] ind_offset decalage de la position origine dans la liste
28 * \return nb_pixel_segment, la dimension de la liste en nombre de coord (i,j)
30 * donne la liste des pixels d'un segment [P1 -> P2]
31 * Utilise l'algo de Bresenham en version int (recupere sur Wikipedia)
34 uint32 calcul_liste_pixel_segment(uint32 y1,uint32 x1,uint32 y2,uint32 x2, uint32 *liste_pixel_segment, int ind_offset)
40 liste = liste_pixel_segment + ind_offset ;
46 if ( (dy=y2-y1) != 0 )
50 // vecteur oblique dans le 1er quadran
53 // vecteur diagonal ou oblique proche de l'horizontale, dans le 1er octant
54 dx = (e=dx) * 2 ; dy = dy * 2 ; // e est positif
55 while( x1!=x2 ) //boucler sans fin: deplacements horizontaux
63 y1++ ; // deplacement diagonal
70 // vecteur oblique proche de la verticale, dans le 2nd octant
71 dy = (e=dy) * 2 ; dx = dx * 2 ; // e est positif
72 while ( y1 != y2 ) //boucler sans fin: deplacements verticaux
79 x1++ ; // deplacement diagonal
85 else // dy < 0 (et dx > 0)
87 // vecteur oblique dans le 4e cadran
90 // vecteur diagonal ou oblique proche de l'horizontale, dans le 8e octant
91 dx = (e=dx) * 2 ; dy = dy * 2 ; // e est positif
92 while ( x1 != x2 ) //boucler sans fin // deplacements horizontaux
99 y1--; // deplacement diagonal
104 else // vecteur oblique proche de la verticale, dans le 7e octant
106 dy = (e=dy) * 2 ; dx = dx * 2 ; // e est negatif
107 while ( y1 != y2 ) // boucler sans fin: deplacements verticaux
114 x1 ++; // deplacement diagonal
121 else // dy = 0 (et dx > 0)
123 // vecteur horizontal vers la droite
135 if ( (dy=y2-y1) != 0 )
139 // vecteur oblique dans le 2nd quadran
142 // vecteur diagonal ou oblique proche de l'horizontale, dans le 4e octant
143 dx = (e=dx) * 2 ; dy = dy * 2 ; // e est negatif
144 while ( x1 != x2 ) //boucler sans fin // deplacements horizontaux
149 if ( (e += dy) >= 0 )
151 y1++ ; // deplacement diagonal
158 // vecteur oblique proche de la verticale, dans le 3e octant
159 dy = (e=dy) * 2 ; dx = dx * 2 ; // e est positif
160 while ( y1 != y2 ) //boucler sans fin // deplacements verticaux
165 if ( (e += dx) <= 0 )
167 x1--; // depacement diagonal
174 else // dy < 0 (et dx < 0)
176 // vecteur oblique dans le 3e cadran
179 // vecteur diagonal ou oblique proche de l'horizontale, dans le 5e octant
180 dx = (e=dx) * 2 ; dy = dy * 2 ; // e est negatif
181 while ( x1 != x2 ) //boucler sans fin // deplacements horizontaux
186 if ( (e -= dy) >= 0 )
188 y1-- ; // deplacement diagonal
195 // vecteur oblique proche de la verticale, dans le 6e octant
196 dy = (e=dy) * 2 ; dx = dx * 2 ; // e est negatif
197 while ( y1 != y2 ) //boucler sans fin // deplacements verticaux
204 x1 --; // deplacement diagonal
211 else // dy = 0 (et dx < 0)
213 // vecteur horizontal vers la gauche
225 if ( (dy=y2-y1) != 0 )
229 // vecteur vertical croissant
237 else // dy < 0 (et dx = 0)
239 // vecteur vertical décroissant
253 return (uint32)(liste-liste_pixel_segment)/2;