Il metodo PolylineAA utilizza il metodo LineAA. Il metodo LineAA usa il metodo PixelSetAA. Disegnando un singolo punto, non vedrete l'effetto dell'antialiasing.
barabashkakvn: Ecco la domanda: ci sono due metodi(PixelSet ePixelSetAA). Molto interessato aPixelSetAA- forse non capisco come funziona lo smoothing dei punti?
Se tutto il resto fallisce, leggete l'aiuto ;)
PixelSet imposta semplicemente il colore del punto.
barabashkakvn: Abbiamo letto la guida. E quindi la domanda è:"PixelSetAA dovrebbe disegnare anche un solo punto usando l'anti-aliasing? Voglio sentire un'opinione.
La risposta è: il metodoPixelSetAAdovrebbe disegnare anche un solo punto usando l'antialiasing, e lo fa. Per fare questo, ho dovuto guardare nel codice del CCanvas:
//+------------------------------------------------------------------+//| Draw pixel with antialiasing |//+------------------------------------------------------------------+void CCanvas::PixelSetAA(constdouble x,constdouble y,constuint clr)
{
staticdouble rr[4];
staticint xx[4];
staticint yy[4];
//--- preliminary calculationsint ix=(int)MathRound(x);
int iy=(int)MathRound(y);
double rrr=0;
double k;
double dx=x-ix;
double dy=y-iy;
uchar a,r,g,b;
uint c;
//--- no need for anti-aliasingif(dx==0.0 && dy==0.0)
{
PixelSet(ix,iy,clr);
return;
}
//--- prepare array of pixels
xx[0]=xx[2]=ix;
yy[0]=yy[1]=iy;
if(dx<0.0)
xx[1]=xx[3]=ix-1;
if(dx==0.0)
xx[1]=xx[3]=ix;
if(dx>0.0)
xx[1]=xx[3]=ix+1;
if(dy<0.0)
yy[2]=yy[2]=iy-1;
if(dy==0.0)
yy[2]=yy[2]=iy;
if(dy>0.0)
yy[2]=yy[2]=iy+1;
//--- calculate radii and sum of their squaresfor(int i=0;i<4;i++)
{
dx=xx[i]-x;
dy=yy[i]-y;
rr[i]=1/(dx*dx+dy*dy);
rrr+=rr[i];
}
//--- draw pixelsfor(int i=0;i<4;i++)
{
k=rr[i]/rrr;
c=PixelGet(xx[i],yy[i]);
a=(uchar)(k*GETRGBA(clr)+(1-k)*GETRGBA(c));
r=(uchar)(k*GETRGBR(clr)+(1-k)*GETRGBR(c));
g=(uchar)(k*GETRGBG(clr)+(1-k)*GETRGBG(c));
b=(uchar)(k*GETRGBB(clr)+(1-k)*GETRGBB(c));
PixelSet(xx[i],yy[i],ARGB(a,r,g,b));
}
}
e mi sono reso conto che lo smoothing appare solo se si passa un numero di tipo doppio come coordinate, e non un valore arrotondato, ma con una "coda". Qualcosa come 200,4; 125,6; 200,7.
Ecco una parabola disegnata con punti usando il metodoPixelSetAA e comincia ad essere disegnata con lo smoothing:
I punti sono disegnati senza antialiasing. Ho scelto specificamente il metodoPixelSetAA- disegnare punti con anti-aliasing.
Prova a disegnare una linea usandoPixelSetAA.
Il metodo PolylineAA utilizza il metodo LineAA. Il metodo LineAA usa il metodo PixelSetAA. Disegnando un singolo punto, non vedrete l'effetto dell'antialiasing.
Prova a disegnare una linea usandoPixelSetAA.
No, nessun effetto. Nessun punto vicino di levigatura. Gli angoli appuntiti sono come i mattoni:
No, nessun effetto. Nessun punto vicino di levigatura. Gli angoli appuntiti sono come i mattoni:
Ho integrato il messaggio precedente. Notate come sono implementati i metodi di cui sopra e usateli se avete bisogno di una lisciatura.
Poiché questo metodo disegna un punto con anti-aliasing, dovrei ottenere un'immagine come questa se disegno diversi punti in fila:
Ma non ottengo punti lisci.
Non tocco il metodo per disegnare una linea con smoothing -PolylineAA per ora. Voglio capire cosa c'è scritto nella guida suPixelSetAA:
Poiché questo metodo disegna un punto con anti-aliasing, dovrei ottenere un'immagine come questa se disegno diversi punti in fila:
Ma non ottengo punti lisci.
Ecco perché vi suggerisco di confrontare il codice dei metodi con e senza antialiasing. Il codice è aperto allo studio.
Per capirlo è necessario studiare a fondo gli algoritmi utilizzati in questi metodi.
Si potrebbe anche scrivere un articolo su questo argomento. Sarei felice di leggerlo io stesso. )
Un punto non può essere smussato, è una "particella elementare" in un certo senso)
Ecco la domanda: ci sono due metodi(PixelSet ePixelSetAA). Molto interessato aPixelSetAA- forse non capisco come funziona lo smoothing dei punti?
Se tutto il resto fallisce, leggete l'aiuto ;)
PixelSet imposta semplicemente il colore del punto.
Abbiamo letto la guida. E quindi la domanda è:"PixelSetAA dovrebbe disegnare anche un solo punto usando l'anti-aliasing? Voglio sentire un'opinione.
La risposta è: il metodoPixelSetAAdovrebbe disegnare anche un solo punto usando l'antialiasing, e lo fa. Per fare questo, ho dovuto guardare nel codice del CCanvas:
e mi sono reso conto che lo smoothing appare solo se si passa un numero di tipo doppio come coordinate, e non un valore arrotondato, ma con una "coda". Qualcosa come 200,4; 125,6; 200,7.
Ecco una parabola disegnata con punti usando il metodoPixelSetAA e comincia ad essere disegnata con lo smoothing: