Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 10

Bresenham 1 Introduction page 1

Algorithme de Bresenham
J.C.Sifre, 4 décembre 2017

FIGURE 1 Transition et interface (Coke en stock).

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.

Lemme 2.1. Lorsque i < A, l’ordonnée YiC1 du point PiC1 vérifie

yi 1=2 6 YiC1 < yi C 1=2 C 1 D yi C 3=2:

Démonstration. Conséquence immédiate de yi 1=2 6 Yi < yi C 1=2 et de l’hypo-


thèse sur la dérivée de '.

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

Pour tout i < A (strictement), notons mi D pi C .1; 1=2/ D .i C 1; yi C 1=2/, voir


figure (2) (où les pixels dessinés sont représentés en gris).

Lemme 2.2. Si f .mi / > 0, alors piC1 D .i C 1; yi /.


Si f .mi / 6 0, alors piC1 D .i C 1; yi C 1/.

miC1
piC2 piC1
piC2
pi00 mi pi00
miC1 mi

pi piC1 pi

pi0 pi0

FIGURE 2 Les deux positions possibles de piC1 .

Démonstration. En effet, dans le premier cas, YiC1 2 Œyi 1=2; yi C 1=2Œ.


Dans le second cas, YiC1 2 Œyi C 1=2; yi C 3=2Œ.

Le critère sera donc le suivant :

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 /.

4 Les cas de la droite et du cercle


4.1 Cas de la droite
Ici, € est la droite d’équation y D ax C b, et c’est, en pratique, toujours la droite
joignant deux points de l’écran. Donc a est un nombre rationnel dont le numérateur
et le dénominateur sont des entiers inférieurs ou égaux au nombre de pixels d’écran
en largeur ou en hauteur. Nous y reviendrons à la section suivante.
Donc f .x; y/ D y .ax C b/, avec a 2 Œ0; 1. Comme la droite passe par .0; 0/,
b D 0.
Mais alors m0 D .1; 1=2/ et f .m0 / D 1=2.
Si miC1 D mi C .1; 0/, f .miC1 / f .mi / D a.
Si miC1 D mi C .1; 1/, f .miC1 / f .mi / D 1 a.
On voit que les calculs deviennent très simples.
Bresenham 5 Cas d’une courbe algébrique quelconque page 5

4.2 Cas du cercle


Nous supposerons que le centre du cercle est un point à coordonnées entières et
son rayon est entier (autrement dit les points du cercle à la verticale et à l’horizontale
du centre sont entiers).
Le choix des coordonnées pour décrire l’algorithme nous amène à prendre pour
équation du cercle € : f .x; y/ D R2 x 2 .R y/2 . C’est le cercle tangent à l’axe des
x en 0 et dont le centre est au point .0; R/. On se propose donc d’en décrire l’arc dans
p p 
le premier quadrant, tangent à l’axe des x et allant jusqu’au point R 2; R.1 2/ .
Simplifions déjà un peu f : f .x; y/ D 2Ry y 2 x 2 .
D’abord, f .m0 / D f .1; 1=2/ D R 1=4 1.
Si miC1 D mi C .1; 0/,

f .miC1 / f .mi / D 2R.yi C 1=2/ .yi C 1=2/2 .i C 1/2


.yi C 1=2/2 i2

2R.yi C 1=2/
D 2i 1;

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/,

f .miC1 / f .mi / D 2R.yi C 3=2/ .yi C 3=2/2 .i C 1/2


.yi C 1=2/2 i 2

2R.yi C 1=2/
.yi C 3=2/2 .yi C 1=2/2

D 2R 2i 1
D 2.R yi 1/ 2i 1

Là encore la formule est simple.

5 Cas d’une courbe algébrique quelconque


Nous en dirons juste quelques mots afin qu’on voie pourquoi le cas d’une ellipse
n’est pas bien plus compliqué. Ce qui est essentiel, c’est de repérer dans la courbe les
points à tangente horizontale, à tangente verticale, et à tangente parallèle à une des
deux bissectrices. Nous ne discuterons pas des singularités de la courbe, bien-sûr.
Les points à tangente horizontale sont les points d’intersection de € avec la courbe
@f
d’équation D 0.
@x
Bresenham 5 Cas d’une courbe algébrique quelconque page 6

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

FIGURE 3 Le point où la pente est 1.


Bresenham 7 Programme en Python page 7

6 Pour ne travailler qu’avec des entiers


C’est très simple. Si l’on sait d’avance que tous les nombres f .mi / sont rationnels
avec un dénominateur commun fixe d et connu d’avance, il suffira, au lieu de calculer
les nombres f .mi /, de calculer les nombres df .mi /, puisque ce n’est que leur signe
qui, in fine, nous intéresse ! On peut alors déclarer entières toutes les variables
utilisées !
Dans le cas de la droite si a D N=D, N , D entiers (comme on l’a signalé plus
haut), on prendra d D 2D, le facteur 2 étant dû au fait que les points mi sont à
coordonnées demi-entières.
Dans le cas du cercle, on prendra d D 1=4, parce que le dénominateur 1=4 qui
apparaît dans f .m0 / se répercutera sur tous les f .mi /.
L’écriture de l’algorithme est alors facile.

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

from numpy import *


import matplotlib.pyplot as plt

# 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’)

# Fenêtre graphique pour les calculs :


xmin=-1/10; xmax=1.1; ymin=-1/10; ymax=1.1
plt.xlim(xmin,xmax)
plt.ylim(ymin,ymax)

Ces instructions définissent les bibliothèques indispensables, la place occupée


sur l’écran (définie par plt.figure ) des initialisations pour pyplot , et enfin le
domaine mathématique représenté (les constantes xmin , xmax , ymin , ymax de la
figure mathématique). On observera qu’elles sont choisies pour déborder légèrement
du domaine où l’on travaille.
Maintenant, définissons la fonction f .
def f(x,y):
return(y-x*x/2)

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

FIGURE 4 Parabole de Bresenham pour 21 points.



Bresenham Références page 10

On remarquera que le résultat de ce programme est une sorte de preuve expéri-


mentale de la validité du programme ci-dessus. Pour le voir, il suffit de noter que,
dans chaque petit carré gris, la médiane verticale du carré gris coupe la courbe € dans
le carré. C’est d’ailleurs ce qui à permis à l’auteur de ces lignes de ‘‘déboguer’’ (il
paraît qu’on dit comme cela) le programme. Le résultat est la figure (4).
Nous avons bien-sûr choisi un petit nombre de points pour bien voir si la condition
d’intersection des médianes et de la courbe est vérifiée.
Pour un arc de cercle de centre .0; 1/ et de rayon 1, on trouve la figure (5).

FIGURE 5 Arc de cercle de Bresenham pour 21 points.

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.

Vous aimerez peut-être aussi