IN Représentation et codage - TD 3 - IUT d'Arles
IN Représentation et codage - TD 3 - IUT d'Arles
IN Représentation et codage - TD 3 - IUT d'Arles
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<strong>IUT</strong> de Provence, site d’Arles 2010-2011<br />
Département Informatique<br />
LP SIL <strong>IN</strong><br />
Imagerie Numérique<br />
Représentation <strong>et</strong> <strong>codage</strong><br />
<strong>TD</strong> 1 bis<br />
On souhaite ajouter à la classe Image la possibilité de tracer des lignes. On écrira tout<br />
d’abord une fonction utilisant l’équation cartésienne d’une droite. On écrira ensuite une<br />
fonction plus rapide basée sur l’algorithme mis au point par Bresenham.<br />
1. Utilisation de l’équation cartésienne d’une droite<br />
Principe de l’algorithme<br />
On souhaite tracer une droite entre les points de coordonnées (x1,y1) <strong>et</strong> (x2,y2).<br />
On utilise l’équation cartésienne de la droite : y = a.x + b<br />
y2<br />
− y1<br />
Avec : a = <strong>et</strong> b = y1 − a.x1<br />
x − x<br />
Question<br />
2<br />
1<br />
1 Ajoutez à la classe Image une méthode ligneCartesienne() de prototype :<br />
void ligneCartesienne( int x1, int y1,<br />
int x2, int y2,<br />
Pixel couleur )<br />
C<strong>et</strong>te méthode perm<strong>et</strong>tra de tracer une ligne grâce à l’équation cartésienne, entre les<br />
points de coordonnées (x1,y1) <strong>et</strong> (x2,y2) avec la couleur de type Pixel passée en<br />
paramètre.<br />
Remarque<br />
En pratique, une telle fonction s’avère « trop lente » à cause de l’utilisation de réels, d’une<br />
division <strong>et</strong> de plusieurs multiplications qui sont des opérations coûteuses en temps de calcul<br />
(en particulier, on a une multiplication pour chaque pixel affiché).<br />
Afin de tracer des lignes, on utilise généralement l’algorithme mis au point par Bresenham,<br />
qui est plus rapide car il n’utilise que des entiers <strong>et</strong> ne fait pas intervenir de division ou de<br />
multiplication pour l’affichage de chaque pixel, mais simplement des additions.<br />
1
2. Utilisation de l’algorithme de Bresenham<br />
Principe de l’algorithme de Bresenham<br />
Pour représenter une ligne sur un écran composé de pixels, il faut allumer les pixels dont le<br />
« centre » passe le plus près possible de la ligne idéale :<br />
B<br />
A<br />
La droite (AB) est la droite idéale. Le problème est de savoir quels pixels allumer pour<br />
s'approcher le plus possible de la droite idéale.<br />
Le principe de l’algorithme de Bresenham est de calculer la distance verticale entre le pixel <strong>et</strong><br />
la droite idéale <strong>et</strong> d'allumer le pixel pour lequel l'erreur est inférieure à 0.5. Par exemple,<br />
considérons la droite d'équation y=ax+b avec a=1/3 :<br />
y2<br />
y1<br />
1 - 0.66<br />
0.33<br />
0.66<br />
x1<br />
x2<br />
Pour le premier pixel, bien entendu, il n'y a aucune erreur, mais pour le deuxième, l'erreur est<br />
égale à 0.33 (a) <strong>et</strong> au troisième, l'erreur est 0.66, ce qui est supérieur à 0.5, donc on allume le<br />
pixel au-dessus. À chaque pixel, l'erreur augmente de a <strong>et</strong> lorsqu'elle est supérieure à 0.5, on<br />
allume le pixel du dessus, <strong>et</strong> l'erreur devient minorée de 1.<br />
On se place dans le cas où on trace une ligne dont la distance sur x est plus grande que celle<br />
sur y <strong>et</strong> où x1
Il faut donc allumer des pixels entre x1 <strong>et</strong> x2, en commençant à la ligne y=y1. Il faut tout<br />
d’abord calculer la pente a de la droite, puis utiliser une variable erreur qu’on initialise à 0.<br />
Après chaque pixel allumé, on ajoute a à erreur. Si erreur dépasse 0.5, on fait erreur=erreur-<br />
1 <strong>et</strong> on incrémente y de 1.<br />
Questions<br />
1 Ajoutez à la classe Image une méthode ligneBresenham(), de prototype :<br />
void ligneBresenham( int x1, int y1,<br />
int x2, int y2,<br />
Pixel couleur )<br />
C<strong>et</strong>te méthode perm<strong>et</strong>tra de tracer une ligne grâce à l’algorithme de Bresenham entre<br />
les points de coordonnées (x1,y1) <strong>et</strong> (x2,y2) avec la couleur de type Pixel passée en<br />
paramètre.<br />
2 Ajoutez à la classe Image une méthode ligneBresenhamOptimisee(), de<br />
prototype :<br />
void ligneBresenhamOptimisee( int x1, int y1,<br />
int x2, int y2,<br />
Pixel couleur )<br />
C<strong>et</strong>te méthode perm<strong>et</strong>tra de tracer une ligne de manière plus optimisée, en n’utilisant<br />
que des variables entières <strong>et</strong> pas de flottant.<br />
3 Etendre la méthode de la question 2 de manière à pouvoir tracer une ligne dans<br />
n’importe quelle configuration de position de ses deux extrémités (dans n’importe<br />
lequel des « 8 octants »).<br />
Remarque<br />
Pour comparer la rapidité des différentes méthodes de tracé de ligne, vous pourrez les<br />
chronométrer grâce à la fonction clock() en affichant dans une boucle un nombre très élevé de<br />
lignes (par exemple 100000).<br />
3