Page 1 of 1

Algorithme de Bresenham

Unread postPosted: 11 Apr 2016, 20:27
by grosged
Je sais ce que vous allez me dire : pourquoi se casser la tête à tracer un segment point-par-point alors que le Basic est pourvu de l'instruction Line( :help:
Hé bien c'est dans l'intention de simplifier/tester l'algorithme en vue d'une adaptation en assembleur :p
C'est surtout dans la boucle que la simplification est recherchée.
Pour l'instant , je me borne à un seul cas de figure : le tracé part du point (A,B) vers (C,D) avec A<C et B≥D

1ère version:
Code: Select all
:ClrDraw
:0→A:0→B:90→C:17→D        ; initialise les coordonnées
:C-A→M       ; c'est Δx
:D-B→N        ; c'est Δy
:0→E
:B→Y
:For(X,A,C
:Pxl-on(Y,X
:If 2E<M-2N:Goto 0
:Y+1→Y
:E-2M→E
:Lbl 0:E+2N→E
:End


2ème version:
Code: Select all
:ClrDraw
:0→A:0→B:90→C:17→D
:2(C-A→M
:2(D-B→N
:C-A-N→H
:0→E
:B→Y
:For(X,A,C
:Pxl-on(Y,X
:If E-H<0:Goto 0
:Y+1→Y
:E-M→E
:Lbl 0:E+N→E
:End
C'est déjà plus léger :)

3ème version:
...Quelqu'un a une idée ? :#roll#:

(Pour plus d'infos : http://home.mis.u-picardie.fr/~choplin/ ... enham.html )

Re: Algorithme de Bresenham

Unread postPosted: 11 Apr 2016, 20:31
by Ti64CLi++
Tu devrais faire en ASM ;)

Re: Algorithme de Bresenham

Unread postPosted: 11 Apr 2016, 22:46
by Adriweb
Ce que j'avais utilisé en C :

(dans la branche des y différents)
Code: Select all
int dx = abs(x1-x0), sx = x0<x1 ? 1 : -1;
int dy = abs(y1-y0), sy = y0<y1 ? 1 : -1;
int err = (dx>dy ? dx : -dy)/2, e2;
for(;;) {
    gc_drawPixel(x0, y0);
    if (x0 == x1 && y0 == y1)
        break;
    e2 = err;
    if (e2 >-dx) { err -= dy; x0 += sx; }
    if (e2 < dy) { err += dx; y0 += sy; }
}

Re: Algorithme de Bresenham

Unread postPosted: 12 Apr 2016, 15:27
by grosged
Merci pour le partage, Adriweb ;)
Personnellement, j'avoue que j'ai du mal à déchiffrer (j'y connais que dalle en C)
Pour le moment, je ne planche que sur le cas de figure x1<x2 et y1<y2 et (x2-x1)>(y2-y1)
je suis à la phase d'écriture en assembleur...

Re: Algorithme de Bresenham

Unread postPosted: 12 Apr 2016, 21:34
by grosged
neuronix wrote:Tu devrais faire en ASM ;)


ça y est, je m'y colle :)
[eZ80] Algorithme de Bresenham : optimisation