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