Aggiungere un effetto volume alle linee dell'indicatore - pagina 4

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

 
tol64:
Prova a disegnare una linea usandoPixelSetAA.

No, nessun effetto. Nessun punto vicino di levigatura. Gli angoli appuntiti sono come i mattoni:

Linea con punti via PixelSetAA

 
barabashkakvn:

No, nessun effetto. Nessun punto vicino di levigatura. Gli angoli appuntiti sono come i mattoni:

Ho integrato il post precedente. Notate come sono implementati i metodi di cui sopra e usateli se è necessario lo smoothing.
 
tol64:
Ho integrato il messaggio precedente. Notate come sono implementati i metodi di cui sopra e usateli se avete bisogno di una lisciatura.
Non toccherò il metodo di disegno delle linee con smoothing -PolylineAA per ora. Voglio capire cosa c'è scritto nella guida suPixelSetAA:
PixelSetAA-Disegna un punto usando un algoritmo di anti-aliasing.

Poiché questo metodo disegna un punto con anti-aliasing, dovrei ottenere un'immagine come questa se disegno diversi punti in fila:

Penso che questo sia l'aspetto che dovrebbero avere molti punti con lo smoothing

Ma non ottengo punti lisci.

 
barabashkakvn:
Non tocco il metodo per disegnare una linea con smoothing -PolylineAA per ora. Voglio capire cosa c'è scritto nella guida suPixelSetAA:
PixelSetAA-Disegna un punto usando un algoritmo di anti-aliasing.

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

 
Il punto non può essere smussato, è una "particella elementare" in un certo senso)
 
komposter:
Un punto non può essere smussato, è una "particella elementare" in un certo senso)
Ecco la domanda: ci sono due metodi(PixelSet ePixelSetAA). Sono molto interessato aPixelSetAA- forse non capisco come funziona lo smoothing dei punti?
 
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.

 
Abbiamo letto la guida. E quindi la domanda è:"PixelSetAA dovrebbe disegnare anche un solo punto usando l'anti-aliasing? Voglio sentire un'opinione.
 
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(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 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:

Una parabola disegnata con punti usando il metodo PixelSetAA e ha iniziato ad essere disegnata con lo smoothing