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=(yByA)/(xBxA ) ;
disp ( La pente dusegment [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 <= (yByA) /(xBxA))&((yByA)/(xBxA)<=1) then ,// cas 1 : 0 <= a <= 1 .
disp ( ’ Cas1 : 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 (yByA)/(xBxA) > 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 (yByA)/(xBxA) >= 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 ( ’ Lenombrede 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 , 3ones (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 a1. Pour cela, on peut voir
dans le listing ci-dessus que le cas xA< xBa été divisé en quatre sous-cas :
1. 0a1(cas 1),
2. a > 1(cas 2),
3. 1a < 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 Aet Bles symétriques des points Aet Bpar rapport à la droite d’équation y=x.
1
2
3
4
5
1
2
1 2 3 4 512
A
B
a
C
D
b
A
B
c
Figure 1
2.a - Exprimer les coordonnées xA,yA,xBet yBde Aet Ben fonction des coordonnées de Aet B.
Exprimer la pente ade [AB]en fonction de a. En déduire que l’algorithme « Bresenham1 » peut être
appliqué au segment de droite [AB].
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=(yByA)/(xBxA ) ;
disp ( La pente dusegment [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 ( ’ Cas1 : 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 ( ’ Cas2 : 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 ( ’ Lenombrede 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 , 3ones (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 Aet Bles symétriques des points Aet Bpar rapport à la droite d’équation y= 0
(axe des abscisses).
1
2
1
2
1 2 3 4 512
A
B
C D
b
A
B
Figure 2
3.a - Exprimer les coordonnées xA,yA,xBet yBde Aet Ben fonction des coordonnées de Aet B.
Exprimer la pente ade [AB]en fonction de a. En déduire que l’algorithme « Bresenham1 » peut être
appliqué au segment de droite [AB].
3.b - Étendre l’algorithme « Affichage2 » au cas 3 en appliquant l’algorithme « Bresenham1 » au segment
de droite [AB]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 Aet Bles 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
1231234
A′′
B′′
D
c
B
A
A
B
Figure 3
4.a - Exprimer les coordonnées xA,yA,xBet yBde Aet Ben fonction des coordonnées de Aet B.
Exprimer la pente ade [AB]en fonction de a. En déduire que l’algorithme « Bresenham1 » peut être
appliqué au segment de droite [AB].
4.b - Étendre l’algorithme « Affichage3 » au cas 4 en appliquant l’algorithme « Bresenham1 » au segment
de droite [AB]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 linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !