Añadir un efecto de volumen a las líneas indicadoras - página 4

 
barabashkakvn:
Los puntos se dibujan sin antialiasing. Elegí específicamente el métodoPixelSetAA- dibujar puntos con antialiasing.

Intenta dibujar una línea usandoPixelSetAA.

El método PolylineAA utiliza el método LineAA. El método LineAA utiliza el método PixelSetAA. Al dibujar un solo punto, no se verá el efecto del antialiasing.

 
tol64:
Intenta dibujar una línea usandoPixelSetAA.

No. No tiene efecto. No hay puntos cercanos de alisado. Las esquinas afiladas son como los ladrillos:

Línea con puntos vía PixelSetAA

Archivos adjuntos:
 
barabashkakvn:

No. No tiene efecto. No hay puntos cercanos de alisado. Las esquinas afiladas son como los ladrillos:

He complementado el post anterior. Observe cómo se implementan los métodos anteriores y utilícelos si es necesario el suavizado.
 
tol64:
He complementado el mensaje anterior. Observe cómo se implementan los métodos anteriores y utilícelos si necesita el suavizado.
No voy a tocar el método de dibujo de líneas con suavizado -PolylineAA por ahora. Quiero entender lo que se dice en la ayuda sobrePixelSetAA:
PixelSetAA-Dibuja un punto utilizando el algoritmo de antialiasing.

Como este método dibuja un punto con antialiasing, debería obtener una imagen como ésta si dibujo varios puntos seguidos:

Creo que este es el aspecto que deberían tener muchos puntos con alisado

Pero no consigo puntos suaves.

 
barabashkakvn:
No voy a tocar el método de dibujar una línea con suavizado -PolylineAA por ahora. Quiero entender lo que se indica en la ayuda sobrePixelSetAA:
PixelSetAA-Dibuja un punto utilizando el algoritmo de antialiasing.

Como este método dibuja un punto con antialiasing, debería obtener una imagen como esta si dibujo varios puntos seguidos:

Pero no consigo puntos suaves.

Por eso te sugiero que compares el código de los métodos con y sin antialiasing. El código está abierto para su estudio.

Para entenderlo hay que estudiar a fondo los algoritmos utilizados en estos métodos.

Incluso podría escribir un artículo sobre este tema. Me encantaría leerlo yo mismo. )

 
El punto no se puede suavizar, es una "partícula elemental" en cierto sentido )
 
komposter:
Un punto no se puede suavizar, es una "partícula elemental" en cierto sentido )
Esta es la cuestión: hay dos métodos(PixelSet yPixelSetAA). Estoy muy interesado enPixelSetAA- ¿quizás no entiendo cómo funciona el suavizado de puntos?
 
barabashkakvn:
Así que esa es la cuestión: hay dos métodos(PixelSet yPixelSetAA). Estoy muy interesado enPixelSetAA, pero quizá no entiendo cómo funciona el suavizado de puntos.

Si todo lo demás falla, lee la ayuda ;)

PixelSet simplemente establece el color del punto.

 
Leemos la ayuda. Así que la pregunta es: "¿DebePixelSetAA dibujar incluso un solo punto utilizando el antialiasing?". Quiero escuchar una opinión.
 
barabashkakvn:
Leemos la ayuda. Así que la pregunta es: "¿DebePixelSetAA dibujar incluso un solo punto utilizando el antialiasing?". Quiero escuchar una opinión.

La respuesta es: el métodoPixelSetAAdebería dibujar incluso un solo punto utilizando el antialiasing, y dibuja ese único punto utilizando el antialiasing. Para ello, he tenido que buscar en el código del 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));
     }
  }

y me di cuenta de que el suavizado sólo aparece si se pasa un número de tipo double como coordenadas, y no un valor redondeado, sino con una "cola". Algo así como 200,4; 125,6; 200,7.

Aquí hay una parábola dibujada con puntos usando el métodoPixelSetAA y sí empieza a dibujarse con antialiasing:

Una parábola dibujada con puntos utilizando el método PixelSetAA y sí se empieza a dibujar con suavizado

Archivos adjuntos: