Algorithme de Bresenham (1) 1S

publicité
Algorithme de Bresenham (1)
Fiche élève
1S
Auteurs : J-MD, PL, RM
Voici, à gauche, l’image d’un segment produite par « scilab » et exportée dans le format « png », puis, à
droite, l’image d’une partie de ce segment obtenue à la suite de plusieurs grossissements (« zoom »).
Figure 1
Figure 2
C’est l’image de gauche que l’on voit mais si notre vision était parfaite, ce que l’on verrait ressemblerait à
l’image de droite. En effet, la machine se contente de « colorier » ou d’« allumer » des pixels (des carrés,
constituants de base de l’écran, en bleu sur la figure 2, si l’on a une imprimante couleur). Il y a donc deux
niveaux dans le problème de l’affichage d’un segment sur un écran d’ordinateur, le niveau du pixel et le
niveau usuel (quand il s’agit par exemple d’afficher un segment de plusieurs cm de longueur). Nous allons
étudier la solution qui est utilisée dans les ordinateurs actuels et est due à John Bresenham (1962). Elle
concerne le niveau du pixel. Il s’agit de l’un des premiers algorithmes de synthèse d’image.
Nous supposons donc
que le plan
est rapporté à un
( → −
)
repère orthonormé O; −
ı ,→
ȷ dont l’unité de longueur est la longueur du côté d’un pixel, soit 0.18
mm (pour fixer les idées, cela dépend de votre installation). La disposition des pixels est indiquée sur
la figure 3. Les centres des pixels sont les points à
coordonnées entières (les nœuds du quadrillage). Les
côtés des pixels ont donc pour abscisse ou pour ordonnée des nombres de la forme n + 12 où n désigne
un entier. Un pixel a, ici, été coloré en vert.
Figure 3
Le cas particulier d’abord traité par Bresenham, qui conduira au cas général au moyen de quelques
transformations géométriques simples, est le suivant :
Représenter sur un écran d’ordinateur un segment [AB] en coloriant certains pixels, sachant que
- les points A(xA ; yA ) et B(xB ; yB ) sont à coordonnées entières telles que
xA < xB
(1)
(ces points sont alignés sur les horizontales et les verticales de la figure 3),
- la pente a de la droite (AB) est un nombre réel tel que
06a61
1
(2)
1
Description de l’algorithme de Bresenham
Les horizontales et verticales de la figure 3 sont représentées en gras sur la figure 4.
Algorithme 1 : Algorithme de base de la méthode de Bresenham
Étape 1 : Coloriage du pixel de centre A ;
Étape 2 : déplacement jusqu’à la verticale en gras immédiatement à droite, choix sur cette
verticale du centre de pixel M le plus proche de l’intersection P de la verticale et du segment [AB]
(quand il y a deux plus proches centres de pixel, on conviendra que M est le plus bas), coloriage du
pixel de centre M ;
Étape 3 : Itération de l’étape 2 jusqu’au coloriage du pixel de centre B.
1 - Démontrer que ya ≤ yb .
2 - À titre d’exemple, reproduire la figure 4 ci-dessous et appliquer l’algorithme de Bresenham en justifiant
chaque étape.
b
A(xA ; yA)
B (xB ; yB )
b
Figure 4
2
b
b
Choix des positions successives du point M
b
b
3 - Le critère du choix de M a été indiqué à l’étape 2 de l’algorithme 1. Nous avons besoin de le transformer en vue de la programmation. En fait, le point M choisi peut se trouver au-dessous ou au-dessus du
segment [AB], ce qui donne deux cas de figure pour choisir la position suivante de M , notée M1 :
b
b
b
b
b
P
M (x,y)
b
b
P1
Q1
M1 (x+1,y)
P1
M1(x+1,y)
b
M(x,y)
b
b
b
b
b
P
b
Figure 6
Q1
Figure 5
b
On rappelle que a est la pente du segment [AB]. Dans les deux cas de figure :
2
b
b
−−→
−
→
1. dire pourquoi il existe un réel e tel que M P = e j .
−−−→
−
→
2. dire pourquoi il existe un réel e1 tel que M1 P1 = e1 j .
−−−→
→
3. démontrer que M P = (e + a) −
ȷ.
1
1
4. en déduire que e1 = a + e.
4 - Expliquer pourquoi le critère de choix du point M décrit dans l’algorithme 1 équivaut à la recherche
du pixel dont le centre est le plus proche de la droite (AB). On pourra s’appuyer sur le schéma suivant :
P1
b
b
H1
P
b
b
H
b
M
b
M1
Figure 7
3
Algorithme de Bresenham
L’algorithme qui suit se trouve sous une forme programmable :
Algorithme 2 : Tracé d’un segment dans le plan pixellisé par la méthode de Bresenham
Entrées :
Saisir xA , yA , xB , yB , coordonnées entières respectives de A et B
Condition de validité n˚ 1 : xA < xB
Sorties :
Graphe du segment [AB]
début
yB − yA
a←
; Condition de validité n˚ 2 : 0 6 a 6 1
xB − xA
e ← 0;
y ← yA ;
pour x variant de xA à xB faire
Allumer le pixel de centre (x; y) ;
e ← e + a;
si e > 0.5 alors
y ← y + 1;
e ← e − 1;
fin
fin
5 - Vérifier qu’il est identique à l’algorithme 1.
6 - Vérifier que l’algorithme 2 a bien été traduit ci-dessous en code scilab (fichier « Bresenham1.sci ») :
Listing 1 – source scilab
// A l g o r i t h m e de b a s e de Bresenham ( f i c h i e r −f o n c t i o n ) .
// E n t r é e s : xA , yA , xB , yB , c o o r don n ées de A e t B e t a p e n t e de [AB]
// ( a=(yB−yA ) / ( xB−xA ) ) .
3
// CONDITIONS DE VALIDITÉ : xA , yA , xB e t yB s o n t d e s nombres e n t i e r s
// v é r i f i a n t xA < xB e t 0 <= a <= 1 .
// S o r t i e s : Xpix e t Ypix . Xpix e t Ypix s o n t d e s m a t r i c e s à 5 l i g n e s e t n
// c o l o n n e s ( n é t a n t l e nombre de p i x e l s u t i l i s é s ) . Xpix c o n t i e n t l e s
// a b s c i s s e s d e s sommets d e s p i x e l s ( une c o l o n n e par p i x e l , l e s p i x e l s s o n t
// d é c r i t s de l a gauche v e r s l a d r o i t e ) ; de même pour Ypix e t l e s ordonnées .
function [ Xpix , Ypix ] = bresenham1 (xA , yA , xB , yB , a ) ;
Xpix = [ ] ;
Ypix = [ ] ; // Les m a t r i c e s Xpix e t Ypix s e r o n t r e m p l i e s au f u r e t à mesure .
y=yA ;
e =0;
for x=xA : xB
X=[x −1/2 ,x+1/2 ,x+1/2 ,x −1/2 ,x − 1 / 2 ] ’ ; // a b s c i s s e s , p i x e l de c e n t r e ( x , y ) .
Y=[y −1/2 ,y −1/2 ,y+1/2 ,y+1/2 ,y − 1 / 2 ] ’ ; // ordonnées , p i x e l de c e n t r e ( x , y ) .
Xpix =[Xpix ,X ] ; // On a j o u t e l a c o l o n n e X aux c o l o n n e s d é j à s t o c k é e s .
Ypix =[Ypix ,Y ] ; // On a j o u t e l a c o l o n n e Y aux c o l o n n e s d é j à s t o c k é e s .
e=e+a ;
i f e >0.5 ,
y=y+1;
e=e −1;
end ; // Les i n é g a l i t é s −0.5 < e <= 0 . 5 s o n t constamment v é r i f i é e s .
end ;
endfunction
7 - Exécuter l’algorithme de Bresenham dans chacun des trois cas suivants, à l’aide du fichier « Affichage1.sce » qui est le fichier précédent auquel on a ajouté les commandes de graphe, notamment la
commande de coloriage des pixels :
cas 1 : A(-5 ;-5), B(10 ;7),
cas 2 : A(-50 ;-50), B(100 ;70),
cas 3 : A(-500 ;-500), B(1000 ;700).
On pourra procéder de la manière suivante :
3 avec l’éditeur de texte de « scilab », ouvrir les fichiers « Bresenham1.sci » et « Affichage1.sce » ;
3 charger le fichier-fonction dans « scilab » (Exécuter ? > Charger dans scilab),
3 puis exécuter « Affichage1.sce » (Exécuter ? > Exécuter le fichier dans scilab).
8 - Quels commentaires peut-on faire concernant l’affichage du segment [AB] selon le couple de points pris
en entrée ?
4
Téléchargement