Adicionando um efeito de volume às linhas indicadoras - página 4

 
barabashkakvn:
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.

 
tol64:
Tente desenhar uma linha usandoPixelSetAA.

Não. Sem efeito. Não há pontos próximos de alisamento. Os cantos afiados são como tijolos:

Linha com pontos via PixelSetAA

Arquivos anexados:
 
barabashkakvn:

Não. Sem efeito. Não há pontos próximos de alisamento. Os cantos afiados são como tijolos:

Eu completei o posto anterior. Observe como os métodos acima são implementados e use-os se for necessário suavizá-los.
 
tol64:
Eu completei a mensagem anterior. Observe como os métodos acima são implementados e use-os se você precisar de suavização.
Não estou tocando no método de desenho de linha com alisamento -PolylineAA por enquanto. Quero entender o que é dito na ajuda sobre aPixelSetAA:
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:

Acho que isto é o que muitos pontos com suavização devem parecer

Mas eu não tenho pontos suaves.

 
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. )

 
O ponto não pode ser suavizado, é uma "partícula elementar" em certo sentido )
 
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?

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.
 
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(const double x,const double y,const uint clr)
  {
   static double rr[4];
   static int    xx[4];
   static int    yy[4];
//--- preliminary calculations
   int    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-aliasing
   if(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 squares
   for(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 pixels
   for(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:

Uma parábola desenhada com pontos usando o método PixelSetAA e começou a ser desenhada com suavização

Arquivos anexados: