Algorithme de Bresenham (2)
Fiche élève 1S
Auteurs : J-MD, PL, RM
Nous savons représenter un segment de droite [AB]comme une succession de pixels à l’aide de l’algorithme
de Bresenham. [AB]est donné par les coordonnées entières xA,yAde A,xB,yBde Bdans le plan pixellisé.
adésigne sa pente. Le fichier « Affichage1bis » ci-dessous réalise cet affichage. On remarque qu’il fait appel
à une fonction : « Bresenham1 ».
Listing 1 – source scilab
// Charger dans s c i l a b " Bresenham1 . s c i "
// S a i s i e des données
xA=input( ’xA=’ ) ;
yA=input( ’yA=’ ) ;
xB=input( ’xB=’ ) ;
yB=input( ’yB=’ ) ;
Graphe=1;// quand Graphe =0, aucun g ra phe n ’ e s t t r a c é .
a=(yB−yA)/(xB−xA ) ;
disp ( ’La␣ pente ␣du␣segment␣ [AB] ␣ est ␣ ’ +string ( a ) ) ;
// D i s t i n c t i o n des d i f f é r e n t s cas
i f xA<xB then ,
i f (0 <= (yB−yA) /(xB−xA))&((yB−yA)/(xB−xA)<=1) then ,// cas 1 : 0 <= a <= 1 .
disp ( ’ Cas␣1␣ : ␣ l ’ ’ algori th me ␣Bresenham1␣ s ’ ’ appli qu e ’ ) ;
[ Xpix , Ypix]= bresenham1 (xA, yA, xB, yB , a ) ;
n=size ( Xpix , " c " ) ;
e l s e i f (yB−yA)/(xB−xA) > 1 then ,// cas 2 : a > 1 .
Graphe=0;
disp ( ’ Cas␣ 2 , ␣ l e s ␣ c onditions ␣de␣ v a l i d i t é ␣de␣ l ’ ’ algorithme ␣Bresenham1
␣␣␣␣ne␣ sont ␣ pas ␣ v é r i f i é e s ’ ) ;
e l s e i f (yB−yA)/(xB−xA) >= −1then ,// cas 3 : −1 <= a < 0 .
Graphe=0;
disp ( ’ Cas␣ 3 , ␣ l e s ␣ c onditions ␣de␣ v a l i d i t é ␣de␣ l ’ ’ algorithme ␣Bresenham1
␣␣␣␣ne␣ sont ␣ pas ␣ v é r i f i é e s ’ ) ;
else // cas 4 : a < −1
Graphe=0;
disp ( ’ Cas␣ 4 , ␣ l e s ␣ c onditions ␣de␣ v a l i d i t é ␣de␣ l ’ ’ algorithme ␣Bresenham1
␣␣␣␣ne␣ sont ␣ pas ␣ v é r i f i é e s ’ ) ;
end ;
else // cas 5 : xA > xB
Graphe=0;
disp ( ’ Cas␣ 5 , ␣ l e s ␣ c onditions ␣de␣ v a l i d i t é ␣de␣ l ’ ’ algorithme ␣Bresenham1
␣␣ne␣ sont ␣ pas ␣ v é r i f i é e s ’ ) ;
end ;
c l f ; // Pr é paration de l ’ a f f i c h a g e
i f Graphe=1 then ,// L ’ a f f i c h a g e e s t commandé quand l ’ a l g o r i t h m e s ’ a p p l i q u e .
disp ( ’ Le␣nombre␣de␣ p i x e l s ␣de␣ l ’ ’ a f f i c h a g e ␣ s er a ␣ ’ +string(n ) ) ;
xfpolys ( Xpix , Ypix , 3∗ones (1 ,n ) ) ;
orthonorme ;
plot2d ( [ xA, xB ] , [ yA , yB ] ) ;
1
end ;
 
Le but de cette activité est d’écrire un algorithme qui permette l’affichage d’un segment [AB]soumis
seulement à la condition
xA̸=xB
L’idée est de se ramener sytématiquement au cas 1 : xA< xBet 0 ≤a≤1. Pour cela, on peut voir
dans le listing ci-dessus que le cas xA< xBa été divisé en quatre sous-cas :
1. 0≤a≤1(cas 1),
2. a > 1(cas 2),
3. −1≤a < 0(cas 3),
4. a < −1(cas 4).
La réunion de ces 4 cas constitue le cas xA< xB. On considèrera pour terminer le cas xA> xB(cas 5) en
se ramenant au cas xA< xB.
1 - Afficher le segment [AB]à l’aide de l’algorithme « Affichage1bis » dans les cas suivants :
xA=−140, yA= 37, xB= 75, yB= 189 et xA=−40, yA= 37, xB= 75, yB= 167
On pourra procéder de la manière suivante :
3avec l’éditeur de texte de « scilab », ouvrir les fichiers « Bresenham1 » et « Affichage1bis » ;
3charger le fichier-fonction « Bresenham1 » dans « scilab » (Exécuter ? > Charger dans scilab),
3puis exécuter « Affichage1bis » (Exécuter ? > Exécuter le fichier dans scilab).
2 - Cas 2 : Appelons A′et B′les symétriques des points Aet Bpar rapport à la droite d’équation y=x.
1
2
3
4
5
−1
−2
1 2 3 4 5−1−2
A
B
a
C
D
b
A′
B′
c
Figure 1
2.a - Exprimer les coordonnées xA′,yA′,xB′et yB′de A′et B′en fonction des coordonnées de Aet B.
Exprimer la pente a′de [A′B′]en fonction de a. En déduire que l’algorithme « Bresenham1 » peut être
appliqué au segment de droite [A′B′].
Il faudra enfin revenir au segment [AB], ce qui donne l’algorithme « Affichage2 » suivant, qui est l’algo-
rithme précédent dont seul le cas 2 a été modifié :
2
Listing 2 – source scilab
// Charger dans s c i l a b "21 _Bresenham1 . s c i "
// S a i s i e des données
xA=input( ’xA=’ ) ;
yA=input( ’yA=’ ) ;
xB=input( ’xB=’ ) ;
yB=input( ’yB=’ ) ;
Graphe=1;// quand Graphe =0, aucun graph e n ’ e s t t r a c é .
a=(yB−yA)/(xB−xA ) ;
disp ( ’La␣ pente ␣du␣segment␣ [AB] ␣ est ␣ ’ +string ( a ) ) ;
// D i s t i n c t i o n des d i f f é r e n t s cas
i f xA<xB then ,
i f (0 <= a)&(a <=1) then ,// cas 1 : 0 <= a <= 1.
disp ( ’ Cas␣1␣ : ␣ l ’ ’ al go ri th me ␣Bresenham1␣ s ’ ’ ap plique ’ ) ;
[ Xpix , Ypix]= bresenham1 (xA, yA, xB, yB , a ) ;
e l s e i f a > 1 then ,// cas 2 : a > 1.
disp ( ’ Cas␣2␣ : ␣ l ’ ’ al go ri th me ␣Bresenham1␣ s ’ ’ ap plique ␣ a pr ès ␣ symé tr ie
␣␣␣␣ par␣ rapport ␣à␣y=x ’ ) ;
ab is=1/a ;
[ Xpix , Ypix]= bresenham1 (yA, xA, yB , xB, a bi s ) ;
auxi=Xpix ;
Xpix=Ypix ;
Ypix=auxi ;
e l s e i f a >= −1then ,// cas 3 : −1 <= a < 0 .
Graphe=0;
disp ( ’ Cas␣ 3 , ␣ l e s ␣ conditions ␣de␣ v a l i d i t é ␣de␣ l ’ ’ algorithme ␣Bresenham1
␣␣␣␣ne␣ sont ␣ pas ␣ v é r i f i é e s ’ ) ;
else // cas 4 : a < −1
Graphe=0;
disp ( ’ Cas␣ 4 , ␣ l e s ␣ conditions ␣de␣ v a l i d i t é ␣de␣ l ’ ’ algorithme ␣Bresenham1
␣␣␣␣ne␣ sont ␣ pas ␣ v é r i f i é e s ’ ) ;
end ;
else // cas 5 : xA > xB
Graphe=0;
disp ( ’ Cas␣ 5 , ␣ l e s ␣ conditions ␣de␣ v a l i d i t é ␣de␣ l ’ ’ algorithme ␣Bresenham1
␣␣ne␣ sont ␣ pas ␣ v é r i f i é e s ’ ) ;
end ;
c l f ; // P r éparati on de l ’ a f f i c h a g e
i f Graphe=1 then ,// L ’ a f f i c h a g e e s t commandé quand l ’ a l g o r i t h m e s ’ a p p l i q u e .
n=size ( Xpix , " c " ) ;
disp ( ’ Le␣nombre␣de␣ p i x e l s ␣de␣ l ’ ’ a f f i c h a g e ␣ s er a ␣ ’ +string(n ) ) ;
xfpolys ( Xpix , Ypix , 3∗ones (1 , n ) ) ;
orthonorme ;
plot2d ( [ xA, xB ] , [ yA , yB ] ) ;
end ;
 
2.b - Commenter les commandes suivantes du cas 2 :
Listing 3 – source scilab
[ Xpix , Ypix]= bresenham1 (yA, xA, yB , xB , a bi s ) ;
3
n=size ( Xpix , " c " ) ;
auxi=Xpix ;
Xpix=Ypix ;
Ypix=auxi ;
 
2.c - Afficher le segment [AB]à l’aide de l’algorithme « Affichage2 » dans les cas suivants :
xA=−140, yA= 37, xB= 75, yB= 189 et xA=−40, yA= 37, xB= 75, yB= 167
3 - Cas 3 : Appelons A′et B′les symétriques des points Aet Bpar rapport à la droite d’équation y= 0
(axe des abscisses).
1
2
−1
−2
1 2 3 4 5−1−2
A′
B′
C D
b
A
B
Figure 2
3.a - Exprimer les coordonnées xA′,yA′,xB′et yB′de A′et B′en fonction des coordonnées de Aet B.
Exprimer la pente a′de [A′B′]en fonction de a. En déduire que l’algorithme « Bresenham1 » peut être
appliqué au segment de droite [A′B′].
3.b - Étendre l’algorithme « Affichage2 » au cas 3 en appliquant l’algorithme « Bresenham1 » au segment
de droite [A′B′]puis en revenant à [AB]. Pour cela, on pourra remplacer les commandes
Listing 4 – source scilab
Graphe=0;
disp ( ’ Cas␣ 3 , ␣ l e s ␣ conditions ␣de␣ v a l i d i t é ␣de␣ l ’ ’ algorithme ␣Bresenham1
␣␣␣␣ne␣ sont ␣ pas ␣ v é r i f i é e s ’ ) ;
 
du cas 3 de l’algorithme « Affichage2 » par un jeu de commandes ad hoc.
3.c - Exécuter l’algorithme obtenu ou l’algorithme fourni « Affichage3 » aux données suivantes :
xA=−140, yA=−37, xB= 75, yB=−189
4 - Cas 4 : Appelons A′′ et B′′ les symétriques des points Aet Bpar rapport à la droite d’équation y= 0,
puis A′et B′les symétriques des points A′′ et B′′ par rapport à la droite d’équation y=x, ce qui revient
à faire subir à [AB]deux symétries axiales consécutives.
4
1
2
3
4
−1
−2
−3
−4
123−1−2−3−4
A′′
B′′
D
c
B′
A′
A
B
Figure 3
4.a - Exprimer les coordonnées xA′,yA′,xB′et yB′de A′et B′en fonction des coordonnées de Aet B.
Exprimer la pente a′de [A′B′]en fonction de a. En déduire que l’algorithme « Bresenham1 » peut être
appliqué au segment de droite [A′B′].
4.b - Étendre l’algorithme « Affichage3 » au cas 4 en appliquant l’algorithme « Bresenham1 » au segment
de droite [A′B′]puis en revenant à [AB]. Pour cela, on pourra remplacer les commandes
Listing 5 – source scilab
Graphe=0;
disp ( ’ Cas␣ 3 , ␣ l e s ␣ conditions ␣de␣ v a l i d i t é ␣de␣ l ’ ’ algorithme ␣Bresenham1
␣␣␣␣ne␣ sont ␣ pas ␣ v é r i f i é e s ’ ) ;
 
du cas 4 de l’algorithme « Affichage3 » par un jeu de commandes ad hoc.
4.c - Exécuter l’algorithme obtenu ou l’algorithme fourni « Affichage4 » aux données suivantes :
xA=−40, yA=−37, xB= 75, yB=−189
5 - Cas 5 : Finalement, passer au cas 5, c’est à dire au cas xA> xB, en modifiant l’algorithme « Af-
fichage4 ». Lorsque cela sera fait, on pourra représenter par des pixels n’importe quel segment de droite
[AB]non parallèle à l’axe des ordonnées (condition xA̸=xB).
Il suffit pour cela de remarquer que si [AB]vérifie le cas 5, son symétrique par rapport à la droite d’équation
x= 0 vérifie l’un des 4 premiers cas.
5
1 / 6 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans l'interface ou les textes ? Ou savez-vous comment améliorer l'interface utilisateur de StudyLib ? N'hésitez pas à envoyer vos suggestions. C'est très important pour nous!