Antialiasing



Pour éviter l'effet "escalier" dû au contraste en pixels de différentes couleurs, le pire étant le noir et blanc, on utilise la technique dites de "l'antialiasing"
Cela consiste à considérér un pixel à afficher comme un carré de surface 1x1. Ce carré pouvant être affiché non plus à des coordonnées entières (type 4,5 ou 10,20) mais à des coordonnées précises (type 4.102,5.4 ou 10.874,19.7807). Physiquement il n'existe que des pixel à des coordonnées entières
Il faut donc simuler la présence d'un pixel situé à cheval sur 4 autres pixels ! Chacun des 4 pixels est recouvert en partie par le pixels antialiasé.
Il faut donc connaitre le rapport surface couverte / surface non-couvertes de chacun d'eux

Voir un exemple

OPENW #1,10,10,640,480,0
DELAY 1
ra = _Y / 6.1 ' Taille du graphique
FOR a = 0 TO 2 * PI * 150 STEP 0.0001
 
a = a + 0.001
 
x = _X / 2 + SIN(a) * ra  + SIN(a / 2) * ra + SIN(a / 3.06125) * ra   '
 
y = _Y / 2 + COS(a) * ra + COS(a / 2) * ra - COS(a / 3.06125) * ra
 
IF SQR((xx - x) ^ 2 + (yy - y) ^ 2) >= 1 ' Si point á afficher est êloignê d'au moins 1 pixel du prêcêdent on l'affiche .
   
r = 127 + SIN(a * 7) * 127 ' Couleur R G B arbitraire
   
g = 127 + COS(a * 3) * 127
   
b = 127 + SIN(a * 5) * 127
   
plot_antialiasing(x,y,r,g,b)
   
xx = x,yy = y  ' On mêmorise les coordonnêes du pixel qu'on vient d'afficher .
   
IF INKEY$=" " THEN a= 2 * PI * 150
 ENDIF
NEXT
a
RGBCOLOR 0
PRINT
"FIN... Appuyez sur une touche ."
KEYGET rien%
CLOSEW #1
PROCEDURE
plot_antialiasing(x,y,r,g,b)
 LOCAL
x1%,y1%,x2%,y2%,x3%,y3%,x4%,y4%
 
LOCAL rap1,rap2,rap3,rap4
 
LOCAL c%,r1,g1,b1,r2,g2,b2,r3,g3,b3,r4,g4,b4
         
.
 
x1% = INT(x)   , y1% = INT(y)   'Pixel supêrieur gauche
 
x2% = SUCC(x1%), y2% = y1%      'Pixel supêrieur droit
 
x3% = x1%      , y3% = SUCC(y1%)'Pixel infêrieur gauche
 
x4% = x2%      , y4% = y3%      'Pixel infêrieur droit

 ' Les valeurs des rapports de surface des 4 pixels :
           .
 
rap1 = (1 - FRAC(x)) * (1 - FRAC(y))
 
rap2 = FRAC(x) * (1 - FRAC(y))
 
rap3 = (1 - FRAC(x)) * FRAC(y)
 
rap4 = FRAC(x) * FRAC(y)

 
' Calcul des nouvelles valeurs de couleur

 c% = RGBPOINT(x1%,y1%) ' Pixel supêrieur gauche
 
r1 = r * rap1 + PEEK(V:c%) * (1 - rap1)
 
g1 = g * rap1 + PEEK(V:c% + 1) * (1 - rap1)
 
b1 = b * rap1 + PEEK(V:c% + 2) * (1 - rap1)
 RGBCOLOR RGB(
r1,g1,b1)
 PLOT
x1%,y1%
 c%
= RGBPOINT(x2%,y2%) ' Pixel supêrieur droit
 
r2 = r * rap2 + PEEK(V:c%) * (1 - rap2)
 
g2 = g * rap2 + PEEK(V:c% + 1) * (1 - rap2)
 
b2 = b * rap2 + PEEK(V:c% + 2) * (1 - rap2)
 RGBCOLOR RGB(
r2,g2,b2)
 PLOT
x2%,y2%
 c%
= RGBPOINT(x3%,y3%) ' Pixel infêrieur gauche
 
r3 = r * rap3 + PEEK(V:c%) * (1 - rap3)
 
g3 = g * rap3 + PEEK(V:c% + 1) * (1 - rap3)
 
b3  = b * rap3 + PEEK(V:c% + 2) * (1 - rap3)
 RGBCOLOR RGB(
r3,g3,b3)
 PLOT
x3%,y3%
 c%
= RGBPOINT(x4%,y4%) ' Pixel infêrieur droit
 
r4 = r * rap4 + PEEK(V:c%) * (1 - rap4)
 
g4 = g * rap4 + PEEK(V:c% + 1) * (1 - rap4)
 
b4  = b * rap4 + PEEK(V:c% + 2) * (1 - rap4)
 RGBCOLOR RGB(
r4,g4,b4)
 PLOT
x4%,y4%

RETURN