10.03.2014 Views

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

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!