Section courante

A propos

Section administrative du site

Sommaire


Introduction

Cette page est consacrée aux explications dite de techniques d'affichage de forme primitive à l'écran. Il ne s'agit pas d'un absolu, mais d'une présentation des différentes techniques d'affichage utilisé pour obtenir une performance acceptable. Entre autre, on retrouvera les fabuleux méthode du mathématicien français, Bézier, de CAO ayant permis d'offrir une performance accrue et même légendaire dans le domaine du visuel des formes géométriques.

Traçage de ligne

La technique suivante, est sans aucun doute la plus performante. Elle n'utilise absolument aucune formule compliquer avec les COS et SIN ralentissant les opérations du processeur. Le génial Bézier à eu l'idée d'utiliser une technique à escalier. Celui-ci à constate qu'on n'a pas besoin d'afficher chacun des points dans un aspect géométrique mais qu'on doit plutôt connaître les intervalles verticales et horizontal que la ligne doit avoir. En somme remarquera qu'une ligne parcourant la largeur de l'écran par exemple, mais ayant un simple décalage de deux ou trois pixels plus bas à l'autre extrémité semble n'être rien d'autre qu'une suite de ligne horizontal brisé! Et bien, étant donnée l'affichage linéaire qu'utilise les ordinateurs, la constation exacte. On doit simplement déterminer la longueur de ses lignes et les afficher jusqu'à atteindre la cible.

Afin de permet une meilleure compréhension de cette techniques, nous avons décidé d'introduire l'algorithme suivant:

MODULE Ligne(variable X1 , variable Y1 , variable X2 , variable Y2 , variable Couleur )

SI Y2 = Y1 ALORS

Afficher Ligne Horizontale ( X1 , Y1 , X2 ), Couleur

SINON

SI Abs ( X2X1 ) < Abs( Y2 - Y1 ) ALORS

SI Y1 > Y2 ALORS

ECHANGER X1 , X2
ECHANGER Y1 , Y2

FIN SI
SI X2 > X1 ALORS

Direction Incrémentation ← 1

SINON

Direction Incrémentation ← -1

FIN SI
Delta YY2 - Y1
Delta X <- Abs ( X2X1 )
DeltaDelta X x 2 – Delta Y
A inc ← ( Delta XDelta Y ) x 2
B incDelta X x 2
J X1
Afficher Pixel ( X1 , Y1 ), Couleur
I Y1 + 1
BOUCLE FAIRE TANT QUE I <= Y2

SI Delta >= 0 ALORS

JJ + Direction Incrémentation
DeltaDelta + A inc

SINON

DeltaDelta + B inc

FIN SI
Afficher Pixel( J , I ), Couleur
I I + 1

FIN BOUCLE FAIRE TANT QUE

SINON

SI Y1 > Y2 ALORS

ECHANGER X1 , X2
ECHANGER Y1 , Y2

FIN SI
SI Y2 > Y1 ALORS

Direction Incrémentation ← 1

SINON

Direction Incrémentation ← -1

FIN SI
Delta XX2X1
Delta Y ← Abs ( Y2Y1 )
Delta ← ( Delta Y x 2 ) - Delta X
A inc ← ( Delta YDelta X ) x 2
B incDelta Y x 2
JY1
Afficher Pixel ( X1, Y1 ), Couleur
IX1 + 1
BOUCLE FAIRE TANT QUE I <= X2

SI Delta >= 0 ALORS

JJ + Direction Incrémentation
DeltaDelta + A inc

SINON

DeltaDelta + B inc

FIN SI
Afficher Pixel ( I, J ), Couleur
II + 1

FIN SI

FIN SI

FIN SI

Voici maintenant la même routine écrit en langage de programmation Pascal permettant d'effectuer l'opérations d'affichage d'une ligne à afficher. On remarquera qu'il n'y a aucune variable un besoin d'un nombre à virgule flottante (nombre réel) pour obtenir le résultat escompter.

Procedure Ligne(X1,Y1,X2,Y2,Color:Word);
Var D,DX,DY,I,J,Ainc,Binc,Ic:Integer;
Begin
 If(Y2=Y1)Then Begin 
  LigneHorizontal(X1,Y1,X2,Color);
  Exit;
 End;
 If Abs(X2-X1)<Abs(Y2-Y1)Then Begin
  If(Y1>Y2)Then ASM 
   MOV AX,X1
   XCHG AX,X2
   MOV X1,AX
   MOV AX,Y1
   XCHG AX,Y2
   MOV Y1,AX 
  END;
  If(X2>X1)Then Ic:=1
                  Else Ic:=-1;
  DY:=Y2-Y1;DX:=Abs(X2-X1);D:=(DX shl 1)-DY;Ainc:=(DX-DY)shl 1;Binc:=DX shl 1;J:=X1;
  SetPixel(X1,Y1,Color);
  I:=Y1+1;
  While(I<=Y2)do Begin
   If D>=0Then Begin
     Inc(J,Ic);
     Inc(D,Ainc)
   End 
    else
   Inc(D,Binc);
   SetPixel(J,I,Color);
   Inc(I);
  End;
 End
  else
 Begin
  If(X1>X2)Then ASM 
   MOV AX,X1
   XCHG AX,X2
   MOV X1,AX
   MOV AX,Y1
   XCHG AX,Y2
   MOV Y1,AX
  END;
  If(Y2>Y1)Then Ic:=1 
                  else Ic:=-1;
  DX:=X2-X1;DY:=Abs(Y2-Y1);D:=(DY shl 1)-DX;AInc:=(DY-DX)shl 1;BInc:=DY shl 1;J:=Y1;
  SetPixel(X1,Y1,Color);
  I:=X1+1;
  While(I<=X2)do Begin
   If D>=0Then Begin
    Inc(J,Ic);
    Inc(D,Ainc) 
  End 
   else 
  Inc(D,Binc);
   SetPixel(I,J,Color);
   Inc(I);
  End;
 End;
End;


Dernière mise à jour : Dimanche, le 1 mai 2016