(x1,y1),
au point B de coordonnées (x2,y2).dX = x2-x1 et dY = y2-y1,
et plaçons nous dans le cas où dX ≥ dY > 0,
c'est-à-dire dans le premier octant.Xn, Yn et Sn
qui se définissent mutuellement :
Initialisation des suites :
X0 = x1
Y0 = y1
S0 = 2dY - dX
Xn+1 = Xn + 1
Si Sn ≥ 0
Alors
Yn+1 = Yn + 1
Sn+1 = Sn + 2dY - 2dX
Sinon
Yn+1 = Yn
Sn+1 = Sn + 2dY
Il existe plusieurs algorithmes permettant de réaliser le fenêtrage.
Pour la plupart, ils consistent à calculer les points A' et B', puis à tracer le
segment qui les relie.
Xn, Yn,
et Sn à l'endroit où le segment entre dans
la fenêtre, puis de lancer le tracer de segment avec ces valeurs initiales.n fois à partir de
X0, Y0, et S0).Sn, et
nous verrons que Xn et Yn
viennent rapidement.Sn (sans calculer les termes de 0 à n-1),S est incrémenté de 2dY,
et que s'il était positif ou nul, il est en plus décrémenté
de 2dX.Sn est atteinte
losque Sn-1 = -1.Sn = Sn-1 + 2dY = 2dY - 1,
sauf peut-être à l'initialisation.S0 = 2dY - dX ≤ 2dY - 1 puisque dX
≥ 1, donc 2dY - 1 est bien la plus grande valeur
possible de S.Sn
est atteinte lorsque Sn-1 = 0 car alors Sn
= 2dY - 2dX, et S0 = 2dY-dX > 2dY - 2dX.Sn varie dans l'intervalle
[ 2dY - 2dX ; 2dY - 1 ], c'est-à-dire qu'il peut
prendre 2dX valeurs distinctes au maximum.Sn : supposons que
n points aient été tracés et qu'il y ait eu x
pas en Y, c'est-à-dire que S a été
n fois incrémenté de 2dY et x
fois décrémenté de 2dX.Sn = S0 + n.2dY - x.2dX = 2dY - dX + 2.n.dY - 2.x.dX.Sn ne peut prendre que 2dX
valeurs distinctes, il est donc clair qu'une seule valeur de x convient
(le facteur de x étant justement 2dX).Sn prend sa plus grande
valeur, et déduisons-en x : Sn = 2dY -
dX + 2.n.dY - 2.x.dX = 2dY-1.x = ( 2.n.dY - dX + 1) div 2dX.(A div B)*B = A - (A mod B), il vient :
Sn = ( 2.n.dY + dX ) mod 2dX + 2dY - 2dXYn = Y0 + ( 2ndY
+ dX ) div 2dX + 2dY - 2dX, et trivialement Xn = X0
+ n.n à partir de
Xn et Yn :
n = Xn - X0, ou encore
n = ( 2dX( Yn - Y0 ) - dX - 1 ) div 2dY + 1.xmin et xmax les limites
en X de la fenêtre, et ymin et ymax
les limites en Y.xd, yd et sd,
les valeurs initiales des suites X, Y et S.
Si x1 > xmax ou x2 < xmin
Alors
Sortie
Si y1 > ymax ou y2 < ymin
Alors
Sortie
Si (x1 < xmin) et ((y1 + ( 2(xmin
- x1).dY + dX) div 2dX ≥ ymin) ou (y1 ≥ ymin))
Alors
Si (y1 + ( 2( xmin - x1 )dY + dX ) div 2dX) ≥ ymax
Alors
SortieSinon
n ← xmin-x1
xd ← xmin
yd ← y1 + ( 2ndY + dX ) div 2dX
sd ← ( 2ndY + dX ) mod 2dX + 2dY - 2dX
Sortie
Si y1 < ymin
Alors
Si x1 + ( 2dX( ymin - y1 ) - dX - 1 ) div 2dY + 1 > xmax
AlorsSortieSinon
n ← ( 2dX( ymin - y1 ) - dX - 1 ) div 2dY + 1
xd ← x1 + n
yd ← ymin
sd ← ( 2ndY + dX ) mod 2dX + 2dY - 2dX
Sortie
Sinon
xd ← x1
yd ← y1
sd ← 2dY - dX
Sortie
Si y2 > ymax et ( x2 ≤ xmax
ou (y1 + 2dY(xmax - x1) + dX) div 2dX > ymax)
Alors
n ← ( 2dX( ymax - y1 ) - dX - 1 ) div 2dY
xf ← x1 + n
Sinon
Si x2 > xmax
Alors
xf ← xmax
Sinon
xf ← x2(xd,yd) avec l'erreur initiale Sd,xf :
x ← xd
y ← yd
s ← sd
Tant que ( x ≤ xf )
AllumerPixel( x,y )
x ← x + 1
Si s ≥ 0
Alors
y ← y + 1
s ← s + 2dY - 2dX
Sinon
s ← s + 2dY