O método PolylineAA utiliza o método LineAA. O método LineAA utiliza o método PixelSetAAA. Ao desenhar um único ponto, você não verá o efeito do antialiasing.
barabashkakvn: Não estou tocando no método de traçar uma linha com suavização -PolylineAA por enquanto. Quero entender o que é dito na ajuda sobrea PixelSetAA:
PixelSetAA-Desenha um ponto usando um algoritmo anti-aliasing.
Como este método desenha um ponto com anti-aliasing, eu deveria obter uma imagem como esta se eu desenhasse vários pontos seguidos:
Mas eu não tenho pontos suaves.
É por isso que eu sugiro que você compare o código dos métodos com e sem antialiasing. O código está aberto para estudo.
Para compreendê-lo, é preciso estudar minuciosamente os algoritmos utilizados nestes métodos.
Você poderia até escrever um artigo sobre este tema. Eu mesmo ficaria feliz em lê-lo. )
komposter: Um ponto não pode ser suavizado, é uma "partícula elementar" em certo sentido )
Portanto, eis a questão: existem dois métodos(PixelSet ePixelSetAA). Estou muito interessado noPixelSetAA- talvez eu não entenda como funciona o alisamento de pontos?
barabashkakvn: Então essa é a questão: existem dois métodos(PixelSet ePixelSetAA). Muito interessado noPixelSetAA- talvez eu não entenda como funciona o alisamento de pontos?
barabashkakvn: Nós lemos a ajuda. E assim a pergunta é: "APixelSetAA deve desenhar até mesmo um único ponto usando o anti-aliasing? Quero ouvir uma opinião.
A resposta é: o métodoPixelSetAAdeve desenhar até mesmo um único ponto usando o antialiasing, e ele desenha esse único ponto usando o antialiasing. Para fazer isso, tive que pesquisar o código do 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 percebeu que o alisamento só aparece se você passar um número de tipo duplo como coordenadas, e não um valor arredondado, mas com uma "cauda". Algo como 200,4; 125,6; 200,7.
Aqui está uma parábola desenhada com pontos usando o métodoPixelSetAA e ela começa a desenhar com antialiasing:
Os pontos são desenhados sem antialiasing. Eu escolhi especificamente o métodoPixelSetAA- desenho de pontos com anti-aliasing.
Tente desenhar uma linha usandoPixelSetAA.
O método PolylineAA utiliza o método LineAA. O método LineAA utiliza o método PixelSetAAA. Ao desenhar um único ponto, você não verá o efeito do antialiasing.
Tente desenhar uma linha usandoPixelSetAA.
Não. Sem efeito. Não há pontos próximos de alisamento. Os cantos afiados são como tijolos:
Não. Sem efeito. Não há pontos próximos de alisamento. Os cantos afiados são como tijolos:
Eu completei a mensagem anterior. Observe como os métodos acima são implementados e use-os se você precisar de suavização.
Como este método desenha um ponto com anti-aliasing, eu deveria obter uma imagem como esta se eu desenhasse vários pontos seguidos:
Mas eu não tenho pontos suaves.
Não estou tocando no método de traçar uma linha com suavização -PolylineAA por enquanto. Quero entender o que é dito na ajuda sobrea PixelSetAA:
Como este método desenha um ponto com anti-aliasing, eu deveria obter uma imagem como esta se eu desenhasse vários pontos seguidos:
Mas eu não tenho pontos suaves.
É por isso que eu sugiro que você compare o código dos métodos com e sem antialiasing. O código está aberto para estudo.
Para compreendê-lo, é preciso estudar minuciosamente os algoritmos utilizados nestes métodos.
Você poderia até escrever um artigo sobre este tema. Eu mesmo ficaria feliz em lê-lo. )
Um ponto não pode ser suavizado, é uma "partícula elementar" em certo sentido )
Então essa é a questão: existem dois métodos(PixelSet ePixelSetAA). Muito interessado noPixelSetAA- talvez eu não entenda como funciona o alisamento de pontos?
Se tudo mais falhar, leia a ajuda ;)
O PixelSet simplesmente define a cor do ponto.
Nós lemos a ajuda. E assim a pergunta é: "APixelSetAA deve desenhar até mesmo um único ponto usando o anti-aliasing? Quero ouvir uma opinião.
A resposta é: o métodoPixelSetAAdeve desenhar até mesmo um único ponto usando o antialiasing, e ele desenha esse único ponto usando o antialiasing. Para fazer isso, tive que pesquisar o código do CCanvas:
e percebeu que o alisamento só aparece se você passar um número de tipo duplo como coordenadas, e não um valor arredondado, mas com uma "cauda". Algo como 200,4; 125,6; 200,7.
Aqui está uma parábola desenhada com pontos usando o métodoPixelSetAA e ela começa a desenhar com antialiasing: