Vous êtes sur la page 1sur 21

Algorithmes de trac de segment

Jean-Luc Mari

IREM dAix-Marseille

Mai 2010
licunc 1: Illustration du rsultat de lalgorithme de trac de segment
de Bresenham.
1 Introduction
1.1 Contexte et principe
Les algorithmes de trac de segment prsents dans ce docu-
ment sont au nombre de trois. Le premier algorithme est dit naf car

Dpartement dInformatique, Facult des Sciences de Luminy, Uni-


versit de la Mditerrane Contact : mari@univmed.fr Web :
http://www.dil.univ-mrs.fr/mari/ Site de lIREM dAix-Marseille :
http://www.irem.univ-mrs.fr
1
1. lNncoucicN
il permet de tracer un segment sans chercher tirer avantage du
caractre intrinsquement discret dune image numrique (sec-
tion 4). Le deuxime algorithme, dit incrmental, est fond sur une
relation de rcurrence qui permet damliorer le temps de calcul
(section 5). Cependant, le troisime algorithme (dit du point mi-
lieu) est encore plus ecace car il ne manipule que des entiers en
eectuant un minimum doprations couteuses (section 6).
On doit cette dernire approche Jack E. Bresenham qui, en
mai 1962, travaillait dans un laboratoire dinformatique dIBM. Il a
mis au point son algorithme de trac de segment alors quil cher-
chait piloter un traceur attach une console texte. Cet algo-
rithme a t prsent la convention de lACMen 1963, puis publi
en 1965 dans la revue IBM Systems Journal.
1.2 Utilisations
Lalgorithme dtermine quels sont les points dun plan discret
qui doivent tre tracs an de former une approximation de seg-
ment de droite entre deux points donns (voir gure 1). Cet algo-
rithme est souvent utilis pour dessiner des segments de droites sur
lcran dun ordinateur ou une image calcule pour limpression.
Il est considr comme lun des premiers algorithmes dcouverts
dans le domaine de la synthse dimage.
Le principe du calcul est largement document et a depuis t
repris pour tracer de faon incrmentale nimporte quelle courbe
conique (cercle, ellipse, arc, parabole, hyperbole) ou courbes de
Bzier grce aux proprits de leur fonction polynomiale de dni-
tion, dont les drives permettent de calculer les orientations de
segments lmentaires avec de simples oprations entires. On
peut mme ladapter lapproximation de courbes dont on ne
connat quun dveloppement limit (dont on ne prendra que les
premiers termes de faible degr), utilisable avec une bonne prci-
sion sur un domaine susant par rapport la rsolution (sinusodes,
exponentielles, puissances non entires).
Lalgorithme est galement facilement adaptable au calcul de
courbes et surfaces dans un espace discret de plus de deux di-
mensions (notamment pour le pilotage de machines outils). Mme
en deux dimensions seulement, on peut discrtiser avec cet algo-
rithmeunecourbeavecunefonction delissageprenant en compte
lerreur commiseentredeux points candidats an dajuster leur cou-
2
leur, lerreur incrmentale tant convertible en coecient de trans-
parence, ce qui permet de conserver la graisse (paisseur visuelle)
dune courbe tout en limitant leet descalier (crnelage).
Cet algorithme intervient aussi dans le lissage de rendus de tex-
tures 2D appliques sur des surfaces dune scne 3D o la texture
subit des rductions ou agrandissements. On lemploie aussi pour
le lissage dagrandissements photographiques, ou pour linterpola-
tion de couleurs intermdiaires sur une chelle discrte.
2 Rappels sur les droites et segments dans le
plan
2.1 Repre, coordonnes cartsiennes dans
le plan
On considre le plan muni dun repre orthonorm (O,

i ,

j ).
Ceci signienotamment queles vecteurs

i et

j sont denorme1 et
sont orthogonaux entre eux. Chaque point Mdu plan est ainsi muni
de deux coordonnes (x
M
, y
M
) qui dterminent sa position :

OM =
x
M

i + y
M

j . Les nombres x
M
et y
M
sont respectivement labscisse
et lordonne du point M. En crivant M = (x
M
, y
M
), on identie le
point M ses coordonnes : le plan sidentie lensemble R
2
des
couples (x, y) de nombres rels.
2.2 Pente dun segment
On considre deux points distincts A = (x
A
, y
A
) et B = (x
B
, y
B
) du
plan. Par ces deux points passe une seule droite, que lon nommera
D. Notons aussi dx = x
B
x
A
et dy = y
B
y
A
les dirences entre les
coordonnes de A et de B. On suppose que dx est non nul, ce qui
revient dire que la droite D nest pas verticale (voir gure 2). On
note alors m =
dy
dx
le nombre que lon appelle la pente de la droite
D.
3
z. PArrcts sun tcs oncics c sccrcNs oANs tc rtAN
A
dx
B
dy
P
licunc 2: Le segment

A, B

.
2.3 Equation cartsienne F(x, y) = 0
On considre lquation (E) suivante :
(E) : F(x, y) = 0, avec F(x, y) = dy(x x
A
) dx(y y
A
)
Lquation (E) est lquation cartsienne dune droite : lensemble
de tous les points du plan vriant (E) est une droite.
On a F(x
A
, y
A
) = dy.0 dx.0 = 0 et F(x
B
, y
B
) = dy.dx dx.dy =
0, cest--dire que les points A et B vrient lquation (E), cette
quation est donc prcisment lquation de la droite D passant
par A et B.
2.4 Position dun point par rapport un
segment
Soit M = (x
M
, y
M
) un point du plan qui ne se trouve pas sur la
droite D. Pour rpondre la question "le point M se situe-t-il droite
ou gauche du segment

A, B

orient de A vers B?", on peut


considrer lquation (E) de la droite D donne ci-dessus et va-
luer F(x
M
, y
M
). Si F(x
M
, y
M
) < 0, le point M se trouve gauche du
segment

A, B

, et si F(x
M
, y
M
) > 0, le point M se situe droite de

A, B

. On peut noter que ce critre est galement vrai si le seg-


ment

A, B

est vertical, cest--dire si dx = 0. Dans le cas o dx > 0,


ce critre permet de savoir si le point M est "au dessus" de la droite
D (on a dans ce cas F(x
M
, y
M
) < 0) ou "au dessous" de D (et dans
ce cas, on a F(x
M
, y
M
) > 0).
4
2.5. Augmentation de y de long dun segment
2.5 Augmentation de y de long dun
segment
Soit un point P = (x
P
, y
P
) de la droite D ayant pour abscisse :
x
P
= x
A
+ x
Etant sur la droite D, le point P doit vrier lquation (E) de la droite
D, cest--dire que F(x
P
, y
P
) = 0. On a donc :
F(x
P
, y
P
) = 0
dy(x
P
x
A
) dx(y
P
y
A
) = 0
dy(x
A
+ x x
A
) dx(y
P
y
A
) = 0
On en dduit que dy.x = dx(y
P
y
A
), cest--dire que y
P
= y
A
+
dy
dx
.x, ou encore :
y
P
= y
A
+ m.x
Laugmentation dey lelongdeladroiteDest proportionnel laug-
mentation de x, le coecient de proportionnalit tant gal la
pente m de D.
3 Position du problme
Les objets gomtriques dessiner dans une image numrique,
dans notre cas des segments de droites, sont des approximations
discrtes dobjets idaux continus. On cherche des mthodes e-
caces pour passer de lobjet idal sa discrtisation, laquelle sera
reprsente pixel par pixel sur limage.
Il faut savoir que lopration qui consiste tracer des segments
de droites est si frquente que sa version optimise (que nous tu-
dions dans la section 6) est implmente dans tous les processeurs
graphiques actuels, dans le but de ne pas avoir un trac "logiciel"
(trop lent) mais "matriel" (de manire tre encore plus rapide).
On suppose que le langage de programmation utilis (ven-
tuellement au sein dune bibliothque graphique) dispose dune
primitive :
DessinePixel (x, y, couleur : entier)
5
. PcsiicN ou rncstcrc
qui permet dacher, de dessiner le pixel de couleur couleur
aux coordonnes (x, y) dans une fentre graphique.
Cette primitive correspondrait la ligne suivante sous AlgoBox
1
:
TRACER_POINT (x,y)
et aurait le prototype suivant en langage C :
void DessinePixel (int x, int y, unsigned char couleur)
On se limitera dans ce document aux segments de droites
dpaisseur 1. De manire obtenir un ensemble de pixels adja-
cents, pour une pente comprise entre 1 et 1, on veut diter un
pixel sur chaque verticale. Pour des pentes de valeur absolue su-
prieure 1, on veut un pixel sur chaque horizontale. Il nous faut
donc une mthode rapide pour parcourir cet ensemble de pixels.
Une discrtisation de droite est reprsente sur la gure 3. Les pixels
y sont reprsents par des gros points sur une grille.
D
licunc 3: Exemple de segment discrtis.
1. AlgoBox est un logiciel libre, multi-plateforme et gratuit daide llabora-
tion et lexcution dalgorithmes dans lesprit des nouveaux programmes de
mathmatiques du lyce.
Il peut tre tlcharg ici : http://www.xm1math.net/algobox/
6
Pour notre tude, on se place dans le premier octant (voir gure
4), cest--dire dire dans le cas dune pente comprise entre 0 et 1.
On pourra se ramener aux autres cas par rotation et symtrie (cf.
section 7). Dans le cas dans lequel on se place, on doit donc a-
cher exactement un pixel sur chaque verticale.
licunc 4: En gris, le premier octant.
On suppose que lon dispose dune fonction darrondi. En lan-
gage C, elle pourrait scrire de la manire suivante qui associe
x la partie entire de x + 0, 5 :
int Round (float x)
{
return (int) (x + 0.5);
}
On cherche dessiner un segment de droite dun point A =
(x
0
, y
0
) un point B = (x
0
+ dx, y
0
+ dy), avec x
0
, y
0
, dx et dy entiers.
7
A. /tccninrc NAir
4 Algorithme naf
4.1 Principe
On note m =
dy
dx
la pente relle de la droite D passant par les
points A et B. Lalgorithme naf consiste calculer, pour chaque
valeur entire de labscisse x (comprise entre x
0
et x
0
+dx), la valeur
de y correspondante par une opration darrondi.
Fonction TraceSegmentNaif(x
0
, y
0
, dx, dy : entier,
couleur : caractre) :
i, x, y : entier
m : ottant
mdy / dx
Pour i de 0 dx faire
x x
0
+ i
y Arrondi(y
0
+ m * i)
DessinePixel (x, y, couleur)
Fin Pour
Fin
Cette mthode comporte de gros dfauts : pour chaque pixel
dessiner, on eectue une multiplication en virgule ottante, une
opration darrondi et une addition. Les deux oprations les plus
couteuses sont lamultiplication et larrondi. Dans lavariantedcrite
dans la section suivante, nous allons nous attacher supprimer la
multiplication en virgule ottante.
4.2 Ecriture avec AlgoBox
La transcription de lalgorithme naf entre les points (x
0
= 1, y
0
=
1) et (x
1
= 11, y
1
= 5) avec AlgoBox est la suivante :
1 VARIABLES
2 x0 EST_DU_TYPE NOMBRE
3 y0 EST_DU_TYPE NOMBRE
4 dx EST_DU_TYPE NOMBRE
8
4.3. Implmentation en C
5 dy EST_DU_TYPE NOMBRE
6 x EST_DU_TYPE NOMBRE
7 y EST_DU_TYPE NOMBRE
8 m EST_DU_TYPE NOMBRE
9 i EST_DU_TYPE NOMBRE
10 DEBUT_ALGORITHME
11 x0 PREND_LA_VALEUR 1
12 y0 PREND_LA_VALEUR 1
13 dx PREND_LA_VALEUR 10
14 dy PREND_LA_VALEUR 4
15 m PREND_LA_VALEUR dy/dx
16 POUR i ALLANT_DE 0 A dx
17 DEBUT_POUR
18 x PREND_LA_VALEUR x0+i
19 y PREND_LA_VALEUR round(y0+m*i)
20 TRACER_POINT (x,y)
21 FIN_POUR
22 FIN_ALGORITHME
4.3 Implmentation en C
void TraceSegmentNaif (int x0, int y0, int dx, int dy,
unsigned char couleur)
{
int i, x, y;
float m = ((float) dy / ((float) dx);
for (i = 0 ; i < dx ; i++)
{
x = x0 + i;
y = Round(y0 + m * i);
DessinePixel (x, y, couleur);
}
}
9
. /tccninrc iNcncrcNAt oc sAsc
5 Algorithme incrmental de base
5.1 Principe
En posant y
i
= y
0
+ m.i et x
i
= x
0
+ i, pour obtenir un couple den-
tiers qui dnissent des coordonnes discrtes dans une fentre
graphique, on doit acher les pixels de la forme :

x
i
, Round(y
i
)

pour i = 0, ..., dx.


Cependant, on peut remarquer que :
y
i+1
= y
0
+ m(i + 1)
= y
0
+ m.i + m
= y
i
+ m
On obtient ainsi la relation de rcurrence :
y
i+1
= y
i
+ m
On peut donc se servir de y
i
pour calculer y
i+1
, cest ce que lon
appelle un algorithme incrmental : on calcule une valeur (ici une
coordonne) partir de la prcdente. On obtient lalgorithme
ci-dessous.
Fonction TraceSegmentIncremental(x
0
, y
0
, dx, dy : entier,
couleur : caractre) :
y : ottant
m : ottant
x
1
: entier
y y
0
mdy / dx
x
1
x
0
+ dx
Pour x de x
0
x
1
faire
DessinePixel (x, Arrondi(y), couleur)
y y + m
Fin Pour
Fin
Avec cet algorithme, on a supprim le plus couteux : la multi-
plication entre ottants chaque tape. Cependant, il reste une
10
5.2. Ecriture avec AlgoBox
addition en virgule ottante et un calcul darrondi. Lobjet de lapro-
chaine approche (lalgorithme du point milieu) est de supprimer le
calcul darrondi et lutilisation de variables en virgule ottante.
5.2 Ecriture avec AlgoBox
La transcription de lalgorithme incrmental de base entre les
points (x
0
= 1, y
0
= 1) et (x
1
= 11, y
1
= 5) avec AlgoBox est lasuivante :
1 VARIABLES
2 x0 EST_DU_TYPE NOMBRE
3 y0 EST_DU_TYPE NOMBRE
4 dx EST_DU_TYPE NOMBRE
5 dy EST_DU_TYPE NOMBRE
6 x EST_DU_TYPE NOMBRE
7 y EST_DU_TYPE NOMBRE
8 m EST_DU_TYPE NOMBRE
9 x1 EST_DU_TYPE NOMBRE
10 DEBUT_ALGORITHME
11 x0 PREND_LA_VALEUR 1
12 y0 PREND_LA_VALEUR 1
13 dx PREND_LA_VALEUR 10
14 dy PREND_LA_VALEUR 4
15 y PREND_LA_VALEUR y0
16 m PREND_LA_VALEUR dy/dx
17 x1 PREND_LA_VALEUR x0+dx
18 POUR x ALLANT_DE x0 A x1
19 DEBUT_POUR
20 TRACER_POINT (x,round(y))
21 y PREND_LA_VALEUR y+m
22 FIN_POUR
23 FIN_ALGORITHME
5.3 Implmentation en C
void TraceSegmentIncremental (int x0, int y0, int dx, int dy,
unsigned char couleur)
{
11
. /tccninrc ou rciN riticu
float y = y0;
float m = ((float) dy) / ((float) dx);
int x1 = x0 + dx;
for (x = x0 ; x <= x1 ; x++)
{
DessinePixel (x, Round(y), couleur);
y = y + m;
}
}
6 Algorithme du point milieu
6.1 Principe
Cette section dcrit un algorithme incrmental permettant de
calculer chaque pixel acher en fonction du prcdent en utili-
sant des oprations peu couteuses darithmtique entire.
Lapproche propose est dirente de celles vues prcdem-
ment. Lide est la suivante : tant donn que lon travaille dans le
premier octant et que la pente de la droite est comprise entre 0 et
1, le pixel dessiner seraforcment lun des deux suivants (parmi les
8 pixels adjacents possibles) : soit il sagira de celui situ la droite
du pixel courant (que lon appellera le point Est, ou E), soit il sagira
de celui situ en haut droite (que lon appellera le point Nord-Est,
ou NE).
Pour chaque verticale x = x
0
+ i, on considre le point dinter-
section Qentre la droite relle Dque lon veut discrtiser et la droite
verticale dquation x = x
0
+i (voir gure 5). Ce point Qse trouve sur
un segment vertical caractris par deux valeurs entires succes-
sives de y. Soit M le milieu de ce segment vertical. On veut dessiner
le pixel centr sur lextrmit du segment vertical qui se trouve du
mme ct que le point Q relativement au point M.
Connaissant le pixel prcdent P = (x
P
, y
P
), le calcul du pixel
(x
P+1
, y
P+1
) acher se droule de la manire suivante (voir gure
6). Comme dit plus haut, il existe deux possibilits pour le pixel
(x
P+1
, y
P+1
) :
le pixel E = (x
P
+ 1, y
P
) (cest--dire le point Est) ;
le pixel NE = (x
P
+ 1, y
P
+ 1) (cest--dire le point Nord-Est).
12
6.1. Principe
D
Q
M
licunc 5: Choix du point diter pour une verticale donne.
Q
NE
D
E
M
P = (x
P
,y
P
)
licunc 6: Dtermination de (x
P+1
, y
P+1
) partir de (x
P
, y
P
).
Soit Q le point dintersection de la droite relle D et de la droite
verticale x = x
P
+ 1, et soit M le milieu du segment

E, NE

. Pour sa-
voir si lon choisit le point E ou le point NE, il sut de dterminer si le
point M se trouve au-dessus ou au-dessous du point Q sur ce seg-
ment

E, NE

. Si le point M se trouve au-dessus de Q, on choisit le


point E, sinon on choisit le point NE. Cela revient dterminer la
position du point M par rapport la droite D. On peut rpondre
13
. /tccninrc ou rciN riticu
cette question en utilisant lquation cartsienne de la droite D
(voir section 2.4) :
F(x, y) = 0, avec F(x, y) = dy(x x
0
) dx(y y
0
)
Pour savoir si le point M est au-dessus ou au-dessous de la droite
D, il sut de calculer le signe de la fonction F au point M dont les
coordonnes sont

x
P
+ 1, y
P
+
1
2

.
On pose :
d
P
= 2F

x
P
+ 1, y
P
+
1
2

Cette variable d
P
sappelle la variable de dcision. Elle est du
mme signe que la valeur de F au point M. On a :
si d
P
0 alors on choisit le point E ;
si d
P
> 0 alors on choisit le point NE.
De plus, d
P
est un nombre entier car le rationnel
1
2
que lon trouve
dans la deuxime composante de F est compens par le facteur
2 appliqu lexpression entire.
Le calcul de d
P
tant toujours trop couteux, on peut souhaiter
faire un calcul incrmental, cest--dire calculer d
P+1
en fonction
de d
P
. Pour ce faire, on distingue deux cas, selon que (x
P+1
, y
P+1
) est
gal E ou NE.
Premier cas : (x
P+1
, y
P+1
) = E. On a alors :
d
P+1
2
= F

x
P+1
+ 1, y
P+1
+
1
2

= F

x
P
+ 2, y
P
+
1
2

= dy

x
P
+ 2 x
0

dx

y
P
+
1
2
y
0

et
d
P
2
= F

x
P
+ 1, y
P
+
1
2

= dy

x
P
+ 1 x
0

dx

y
P
+
1
2
y
0

do :
d
P+1
= d
P
+ 2dy
On pose donc :

E
= 2dy
14
6.1. Principe
Deuxime cas : (x
P+1
, y
P+1
) = NE. On a alors :
d
P+1
2
= F

x
P+1
+ 1, y
P+1
+
1
2

= F

x
P
+ 2, y
P
+
3
2

= dy

x
P
+ 2 x
0

dx

y
P
+
3
2
y
0

et
d
P
2
= dy

x
P
+ 1 x
0

dx

y
P
+
1
2
y
0

do :
d
P+1
= d
P
+ 2(dy dx)
On pose donc :

NE
= 2(dy dx)
Il est donc possible de dterminer d
P+1
en fonction de d
P
par une
addition et en distinguant deux cas. La valeur initiale est :
d
0
= 2F

x
0
+ 1, y
0
+
1
2

= 2dy dx
Lors de limplmentation de lalgorithme, on peut reprsenter la
variable de dcision d
P
par une variable de type int (entire), ce
qui acclre considrablement les calculs.
Lalgorithme du point milieu est donn ci-dessous. A chaque
tape, on eectue un test du signe de d
P
, une addition entre en-
tiers et uneou deux incrmentations dentiers, cequi est beaucoup
moins couteux quelopration darrondi et laddition en virguleot-
tante que lon avait avec lalgorithme incrmental de base.
15
. /tccninrc ou rciN riticu
Fonction TraceSegmentPointMilieu(x
0
, y
0
, x
1
, y
1
: entier,
couleur : caractre) :
dx, dy, dp, deltaE, deltaNE, x, y : entier
dx x
1
x
0
dy y
1
y
0
dp2dydx [Valeur initiale de dp]
deltaE 2 dy
deltaNE 2 (dy dx)
x x
0
y y
0
DessinePixel (x, y, couleur)
Tant que (x < x
1
) faire
Si (dp 0) Alors
[On choisit le point E]
dp dp + deltaE
x x + 1
Sinon
[On choisit le point NE]
dp dp + deltaNE
x x + 1
y y + 1
Fin Si
DessinePixel (x, y, couleur)
Fait
Fin
6.2 Ecriture avec AlgoBox
1 VARIABLES
2 x0 EST_DU_TYPE NOMBRE
3 y0 EST_DU_TYPE NOMBRE
4 x1 EST_DU_TYPE NOMBRE
5 y1 EST_DU_TYPE NOMBRE
6 dx EST_DU_TYPE NOMBRE
7 dy EST_DU_TYPE NOMBRE
8 dp EST_DU_TYPE NOMBRE
9 deltaE EST_DU_TYPE NOMBRE
16
6.3. Implmentation en C
10 deltaNE EST_DU_TYPE NOMBRE
11 x EST_DU_TYPE NOMBRE
12 y EST_DU_TYPE NOMBRE
13 DEBUT_ALGORITHME
14 x0 PREND_LA_VALEUR 1
15 y0 PREND_LA_VALEUR 1
16 x1 PREND_LA_VALEUR 11
17 y1 PREND_LA_VALEUR 5
18 dx PREND_LA_VALEUR x1-x0
19 dy PREND_LA_VALEUR y1-y0
20 dp PREND_LA_VALEUR 2*dy-dx
21 deltaE PREND_LA_VALEUR 2*dy
22 deltaNE PREND_LA_VALEUR 2*(dy-dx)
23 x PREND_LA_VALEUR x0
24 y PREND_LA_VALEUR y0
25 TRACER_POINT (x,y)
26 TANT_QUE (x<x1) FAIRE
27 DEBUT_TANT_QUE
28 SI (dp<=0) ALORS
29 DEBUT_SI
30 dp PREND_LA_VALEUR dp+deltaE
31 x PREND_LA_VALEUR x+1
32 FIN_SI
33 SINON
34 DEBUT_SINON
35 dp PREND_LA_VALEUR dp+deltaNE
36 x PREND_LA_VALEUR x+1
37 y PREND_LA_VALEUR y+1
38 FIN_SINON
39 TRACER_POINT (x,y)
40 FIN_TANT_QUE
41 FIN_ALGORITHME
En sortie, on obtient le graphique de la gure 7.
6.3 Implmentation en C
void TraceSegmentPointMilieu (int x0, int y0, int x1, int y1,
unsigned char couleur)
{
17
;. /tccninrc oANs tc cAs ccNcnAt oc sccrcNs uctccNucs
int dx = x1 - x0;
int dy = y1 - y0;
int dp = 2 * dy - dx; /* Valeur initiale de dp */
int deltaE = 2 * dy;
int deltaNE = 2 * (dy - dx);
int x = x0;
int y = y0;
DessinePixel (x, y, couleur);
while (x < x1)
{
if (dp <= 0) /* On choisit le point E */
{
dp = dp + deltaE; /* Nouveau dp */
x++; /* Calcul de x_p+1 */
/* y_p+1 = y_p */
}
else /* On choisit le point NE */
{
dp = dp + deltaNE; /* Nouveau dp */
x++; /* Calcul de x_p+1 */
y++; /* Calcul de y_p+1 */
}
DessinePixel (x, y, couleur);
}
}
7 Algorithme dans le cas gnral de
segments quelconques
Nous navons jusqu prsent trait que le cas des segments
dont la pente tait comprise entre 0 et 1 (cest--dire les seg-
ments contenus dans le premier octant). Cette section apour objet
ladaptation de lalgorithme du point milieu au cas des segments
quelconques.
Dans le but de rduire le nombre de cas, on considre que le
segment discrtiser est compos de deux extrmits (x
bas
, y
bas
) et
(x
haut
, y
haut
) et que lon a y
bas
y
haut
(quitte changer les rles des
deux extrmits du segment si ncessaire). Les deux principaux cas
18
7.1. Premier cas : si x
haut
x
bas
sont donc les suivants (chaque cas tant partag en deux sous-
cas, ce qui fait au total quatre cas).
7.1 Premier cas : si x
haut
x
bas
On a alors dx = x
haut
x
bas
et dy = y
haut
y
bas
.
Cas 1.a : si dx dy
bas
haut
dx
dy
la valeur initiale d
0
est gale 2dy dx ;

E
= 2dy et
NE
= 2(dy dx) ;
chaque tape, choisir le point E revient incrmenter x et
choisir le point NE revient incrmenter x et y.
Cas 1.b : si dx < dy
bas
haut
dx
dy
la valeur initiale d
0
est gale 2dx dy ;

E
= 2dx et
NE
= 2(dx dy) ;
chaque tape, choisir le point E revient incrmenter y et
choisir le point NE revient incrmenter x et y.
19
;. /tccninrc oANs tc cAs ccNcnAt oc sccrcNs uctccNucs
7.2 Deuxime cas : si x
haut
< x
bas
On a alors dx = x
bas
x
haut
et dy = y
haut
y
bas
.
Cas 2.a : si dx dy
bas
haut
dx
dy
la valeur initiale d
0
est gale 2dy dx ;

E
= 2dy et
NE
= 2(dy dx) ;
chaque tape, choisir le point E revient dcrmenter x et
choisir le point NE revient dcrmenter x et incrmenter y.
Cas 2.b : si dx < dy
bas
haut
dx
dy
la valeur initiale d
0
est gale 2dx dy ;

E
= 2dx et
NE
= 2(dx dy) ;
chaque tape, choisir le point E revient incrmenter y et
choisir le point NE revient dcrmenter x et incrmenter y.
20
8 Rfrences
Ce document est principalement inspir des trois rfrences
suivantes :

Rmy Malgouyres. Algorithmes pour la synthse dimages et


lanimation 3D. Collection "Sciences Sup", pp. 1119, Dunod, 2005.

Wikipedia. Algorithme de trac de segment. http://fr.


wikipedia.org/wiki/Algorithme_de_trace_de_segment

Wikipedia. Algorithme de trac de segment de Bresenham.


http://fr.wikipedia.org/wiki/Algorithme_de_trace_de_segment_
de_Bresenham
Le lecteur pourra galement se tourner vers les ressources
suivantes, pour approfondir le sujet :

James D. Foley, Andries van Dam, Steven K. Feiner, John F.


Hugues et Richard L. Phillips. Introduction linfographie. Addison-
Wesley, 1995.
licunc 7: Sortie graphique de lalgorithme du point milieu sous Al-
goBox, appliqu aux points (x
0
= 1, y
0
= 1) et (x
1
= 11, y
1
= 5).
21