Académique Documents
Professionnel Documents
Culture Documents
Algorithme de Bresenham
Algorithme de Bresenham
Algorithme de Bresenham
J.C.Sifre, 4 décembre 2017
1 Introduction
L’algorithme de Bresenham ([Bresenham1]), dans sa version initiale, permet de
déterminer en temps linéaire (on précisera cela plus loin) une approximation sur un
écran d’ordinateur d’une droite D passant par deux pixels donnés. Il a été étendu
par le même auteur au tracé de cercle ([Bresenham2]). Il a été ensuite étendu à
d’autres courbes par divers auteurs. Nous allons voir que c’est une belle illustration
du paradigme « transition, interface » dans la mesure où le caractère algébrique
de la courbe étudiée apporte une simplification importante à cet algorithme qui
répond précisément à un problème de transition et d’interface : un certain point est-il
au-dessus ou au-dessous de la courbe donnée ?
Pour en apprécier l’intérêt, il vaut mieux l’énoncer sous une forme assez générale,
ce qui est rarement fait dans les innombrables sites internet qui abordent le sujet.
Bresenham 2 Principe de l’algorithme page 2
2 Principe de l’algorithme
Soit une courbe algébrique plane réelle f .x; y/ D 0, f 2 ZŒX; Y . On suppose
que l’intersection de et du carré K D Œ0; A Œ0; A (A entier) est le graphe d’une
fonction ' : Œ0; A ! Œ0; A de classe C 1 telle que '.0/ D 0 (c’est-à-dire que .0; 0 2 )
et surtout 0 6 ' 0 6 1. Observons que f doit vraiment avoir des coefficients entiers
(on s’y ramène si ses coefficients sont rationnels) et A doit aussi être entier, car nous
allons construire des points de Z Z.
Remarquons tout-de-suite qu’on peut s’y ramener par translation, rotation de
=4 et symétrie. D’autre part, nous supposerons que f .x; y/ est strictement positive
au-dessus de la courbe \ K (i.e. du graphe de ').
Il n’est nullement nécessaire de connaître explicitement ' dans ce qui suit.
La connaissance de f suffira.
Nous devons en revanche avoir vraiment sélectionné explicitement une branche
régulière de dont la pente soit en tout point comprise entre 0 et 1.
Pour tout i 2 ŒŒ0; A, soit Pi D .i; Yi / l’unique point de sur le segment figŒ0; A
de R2.
L’algorithme de Bresenham est une construction par récurrence sur i de
l’unique entier yi tel que yi 1=2 6 Yi < yi C 1=2.
La courbe discrétisée est alors l’ensemble des pixels pi D .i; yi /.
Le premier point p0 n’est autre que p0 D .0; 0/.
Si l’on note pi0 D pi .0; 1=2/ D .i; yi 1=2/ et pi00 D pi C.0; 1=2/ D .i; yi C1=2/,
on voit que Pi est sur le segment semi-ouvert (en un sens évident) Œpi0 ; pi00 Œ de R R.
Le lemme suivant est évident, mais c’est le coeur de l’algorithme.
Le point piC1 ne peut alors être que l’un des deux points .i C1; yi / ou .i C1; yi C1/.
Toute la question est alors de déterminer un moyen pratique (et peu coûteux
informatiquement) de savoir lequel de ces deux points est le bon. C’est précisément
là une première idée de Bresenham, appelée méthode du point moyen (medium point).
Bresenham 3 Amélioration du test page 3
miC1
piC2 piC1
piC2
pi00 mi pi00
miC1 mi
pi piC1 pi
pi0 pi0
Proposition 2.3. Si, pour tout i, pi D .i; yi / est l’unique point tel que Pi 2
Œpi .0; 1=2/; pi C .0; 1=2/Œ, la suite .pi /i est déterminée à partir de p0 D .0; 0/ par
la règle suivante.
Pour tout i, soit mi D pi C .1; 1=2/ D .i C 1; yi C 1=2/.
Si f .mi / > 0, piC1 D .i C 1; yi / D pi C .1; 0/.
Sinon, piC1 D .i C 1; yi C 1/ D pi C .1; 1/.
3 Amélioration du test
À première vue, cela nécessite le calcul à chaque cran de f .mi /, ce qui peut être
long, car ce test doit être effectué des milliers de fois pour une droite sur l’écran de
Bresenham 4 Les cas de la droite et du cercle page 4
l’ordinateur : ce dernier a de nos jours environ 2000 pixels en largeur, ce qui donne
une idée de la taille des calculs.
La deuxième idée de Bresenham est la suivante : on peut calculer la suite des
valeurs f .mi / par récurrence, à partir de f .m0/ (dont le calcul complet est inévitable),
en observant deux choses :
1) une fois trouvé piC1 , le point miC1 est facile à déterminer ;
2) f .miC1 / D f .mi / C f .miC1 f .mi / , et cette dernière différence permet
d’avoir à évaluer un polynôme de degrés partiels strictement plus petits par rapport
aux deux variables en des points à coordonnées multiples entiers de 1=2.
L’algorithme amélioré est donc le suivant, voir figure (2).
Proposition 3.1. Supposons déterminés et mémorisés pi , mi et le signe de f .mi /. Si
f .mi / > 0, on a vu que piC1 D .i C 1; yi /. On pose alors
miC1 D .i C 1; yi C 1=2/ D mi C .1; 0/:
Sinon, on a vu que piC1 D .i C 1; yi C 1/. On pose alors
miC1 D .i C 1; yi C 3=2/ D mi C .1; 1/:
Après avoir trouvé une fois pour toutes une formule simplifiée pour le calcul de
f .miC1 / f .mi / en fonction des deux coordonnées de mi , on calcule f .miC1 / par
la formule f .miC1 D f .mi / C f .miC1 / f .mi / .
Il est remarquable qu’à aucun moment nous n’ayons à calculer f .pi /.
formule magique, car yi et R ont disparu, et il sera donc facile de calculer cela
incrémentation.
Si miC1 D mi C .1; 1/,
Les points à tangente verticale sont les points d’intersection de avec la courbe
@f
d’équation D 0.
@y
Les points à tangente parallèle à la première bissectrice sont les points d’intersec-
@f @f
tion de avec la courbe d’équation C D 0.
@y @y
Les points à tangente parallèle à la seconde bissectrice sont les points d’intersection
@f @f
de avec la courbe d’équation D 0.
@y @y
x2 y2
Prenons l’exemple de l’ellipse d’équation 2 C 2 1 D 0. On sait où sont les
a b
2x 2y
sommets. La tangente est parallèle à la seconde bissectrice lorsque 2 D 2 , soit
a b
xb 2 x2 x2b2
y D 2 qu’on reporte dans l’autre équation : 2 C 4 D 1, d’où (pour " D ˙1) :
a a a
a2 b2
x D "p ; y D "p :
a2 C b 2 a2 C b 2
Voici comment construire
ax ces points. On sait que l’ellipse est l’image par la dilatation
: .x; y/ 7! ; y du cercle C de centre 0 et de rayon b. Soit 2 0; =2Œ tel que
b
a b
cos D p ; sin D p :
a2 C b 2 a2 C b 2
Le point M de coordonnées .b cos ; b sin / est l’intersection du cercle C avec la
diagonale du rectangle R dans lequel s’inscrit le quart d’ellipse dans le premier
quadrant (voir figure 3). Le point T de ce quart d’ellipse qui nous intéresse est
justement l’image de M par .
M T
7 Programme en Python
Pour la lisibilité du programme, on ne se ramènera pas à des entiers. On se
propose ici de représenter par cet algorithme le graphe de la fonction x 7! x 2=S
restreinte à Œ0; 1, ce qui assure que la dérivée prend ses valeurs entre 0 et 1. Ainsi,
f .x; y/ D y x 2 =2. Les points où nous mettrons les pixels sont à coordonnées
multiples entiers de pas . Ce nombre sera calculé par l’algorithme comme égal à
x1 x0
pas D , où nmax est le nombre de segments du découpage de Œx0; x1, pour
nmax
une fonction f .x; y/ définie sur K D Œx0 ; x1 Œy0 ; y0 C x1 x0. Rappelons en effet
que f est définie sur un carré. L’utilisateur choisira donc la valeur à donner à la
variable nmax .
Les paramètres d’entrée de Bresenham sont x0,x1,y0,nmax dans cet ordre.
Il faut d’abord planter le décor.
## Parabole de Bresenham
# Nettoyage de l’écran :
# plt.clf()
# Dimensions réelles de la figure à l’écran :
Bresenham 7 Programme en Python page 8
plt.figure(figsize=(12,12))
ax=plt.gca()
plt.axis(’equal’)
Pour comparer nos petits pixels (qui seront des carrés gris centrés aux pi de largeur
pas ) à la vraie courbe, représentons cette courbe. Nous utilisons l’outil plt.contour
préconisé par le concours de Centrale (voir leurs documents sur Internet).
def CourbeImplicite(f,x0,x1,y0,y1,pasx,pasy):
X = arange(x0, x1, pasx)
Y = arange(y0, y1, pasy)
X, Y = meshgrid(X, Y)
Z = f(X, Y)
plt.contour(X, Y, Z, [0], colors=’k’,linewidths=3)
CourbeImplicite(f,0,1,0,1,0.002,0.002)
Les pas pasx et pasy n’ont rien à voir avec Bresenham : ce sont des pas très
petits pour une courbe précise avec plt.contour . Elle est représentée en noir avec
un trait d’épaisseur 3 unités graphique de Python. Attention, plt.contour n’affiche
pas à l’écran la courbe. Ce sera fait à la fin du programme par plt.show .
Maintenant, voici l’algorithme de Bresenham et la représentation graphique des
petits carrés gris à l’aide de plt.Rectangle . Rappelons que le rectangle est défini
par son coin en bas à gauche, sa longueur, et sa largeur. La procédure Bresenham
dessine virtuellement les rectangles, mais ne les affiche pas non plus à l’écran. Ce
sera aussi fait par l’unique appel à plt.show .
Bresenham 7 Programme en Python page 9
def Bresenham(f,x0,x1,y0,nmax):
pas=(x1-x0)/nmax
x=x0; y=y0; xm=x0+pas; ym=y0+pas/2
carre=plt.Rectangle((x-pas/2,y-pas/2),pas,pas,\
facecolor=’lightgray’,edgecolor=’k’,linewidth=1)
ax.add_patch(carre)
for i in range(nmax):
# Une impression pour contrôler la valeur :
# print(xm,f(xm,ym))
if f(xm,ym)<=0:
y+=pas; ym+=pas
x+=pas; xm+=pas
carre=plt.Rectangle((x-pas/2,y-pas/2),pas,pas,\
facecolor=’lightgray’,edgecolor=’k’,linewidth=1)
ax.add_patch(carre)
Bresenham(f,0,1,0,20)
L’étude de cette procédure est laissée au lecteur : elle suit très précisément la
proposition 3.1. On notera que les instructions
x+=pas; xm+=pas
sont écrites après le test if f(xm,ym)<=0: , mais pas dans la conséquence directe du
if .
Il ne reste plus qu’à conclure en envoyant le résultat à l’écran par un
plt.show
Références
[Bresenham1] J.E. Bresenham, Algorithm for computer control of a digital plotter,
IBM Systems Journal, vol.4, No 1, 1er janvier 1965, p.25-20.
[Bresenham2] J.E. Bresenham, A linear algorithm for incremental display of a
circular arc, Communications of the ACM, vol.20, No 2, février 1977, p.100-
106.