Ajout d'un effet de volume aux lignes de l'indicateur - page 4

 
barabashkakvn:
Les points sont dessinés sans anticrénelage. J'ai spécifiquement choisi la méthodePixelSetAA- dessiner des points avec un anticrénelage.

Essayez de dessiner une ligne en utilisantPixelSetAA.

La méthode PolylineAA utilise la méthode LineAA. La méthode LineAA utilise la méthode PixelSetAA. En dessinant un seul point, vous ne verrez pas l'effet de l'anticrénelage.

 
tol64:
Essayez de dessiner une ligne en utilisantPixelSetAA.

Non. Aucun effet. Aucun point de lissage proche. Les coins pointus sont comme des briques :

Ligne avec points via PixelSetAA

 
barabashkakvn:

Non. Aucun effet. Aucun point de lissage proche. Les coins pointus sont comme des briques:

J'ai complété le post précédent. Notez comment les méthodes ci-dessus sont mises en œuvre et utilisez-les si un lissage est nécessaire.
 
tol64:
J'ai complété le message précédent. Notez comment les méthodes ci-dessus sont mises en œuvre et utilisez-les si vous avez besoin d'un lissage.
Je ne touche pas à la méthode de dessin de ligne avec lissage -PolylineAA pour le moment. Je veux comprendre ce qui est dit dans l'aide à propos dePixelSetAA:
PixelSetAA-Dessine un point en utilisant l'algorithme d'anti-crénelage.

Comme cette méthode dessine un point avec anticrénelage, je devrais obtenir une image comme celle-ci si je dessine plusieurs points à la suite :

Je pense que c'est à cela que devraient ressembler beaucoup de points avec lissage.

Mais je n'obtiens pas de points lisses.

 
barabashkakvn:
Je ne touche pas à la méthode de dessin d'une ligne avec lissage -PolylineAA pour le moment. Je veux comprendre ce qui est indiqué dans l'aide à propos dePixelSetAA:
PixelSetAA-Dessine un point en utilisant l'algorithme d'anti-crénelage.

Comme cette méthode dessine un point avec anticrénelage, je devrais obtenir une image comme celle-ci si je dessine plusieurs points à la suite:

Mais je n'obtiens pas de points lisses.

C'est pourquoi je vous suggère de comparer le code des méthodes avec et sans anticrénelage. Le code est ouvert à l'étude.

Pour le comprendre, vous devez étudier en profondeur les algorithmes utilisés dans ces méthodes.

Vous pourriez même écrire un article sur ce sujet. Je serais heureux de le lire moi-même. )

 
Le point ne peut pas être lissé, il s'agit d'une "particule élémentaire" en un sens).
 
komposter:
Un point ne peut pas être lissé, il s'agit d'une "particule élémentaire" dans un sens).
Voici donc la question : il existe deux méthodes(PixelSet etPixelSetAA). Je suis très intéressé parPixelSetAA- peut-être ne comprends-je pas comment fonctionne le lissage des points ?
 
barabashkakvn:
Voilà donc la question : il existe deux méthodes(PixelSet etPixelSetAA). Très intéressé parPixelSetAA- peut-être ne comprends-je pas comment fonctionne le lissage des points ?

Si tout le reste échoue, lisez l'aide ;)

PixelSet définit simplement la couleur du point.

 
Nous avons lu l'aide. La question est donc la suivante :"PixelSetAA doit-il dessiner ne serait-ce qu'un seul point en utilisant l'anticrénelage ?". Je veux entendre une opinion.
 
barabashkakvn:
Nous avons lu l'aide. La question est donc la suivante :"PixelSetAA doit-il dessiner ne serait-ce qu'un seul point en utilisant l'anticrénelage ?". Je veux entendre une opinion.

La réponse est la suivante : la méthodePixelSetAAdevrait dessiner ne serait-ce qu'un seul point en utilisant l'anticrénelage, et elle dessine ce point unique en utilisant l'anticrénelage. Pour ce faire, j'ai dû me pencher sur le code du 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));
     }
  }

et j'ai réalisé que le lissage n'apparaît que si vous passez un nombre de type double comme coordonnées, et non pas une valeur arrondie, mais avec une "queue". Quelque chose comme 200.4 ; 125.6 ; 200.7.

Voici une parabole dessinée avec des points en utilisant la méthodePixelSetAA et elle commence à être dessinée avec l'anticrénelage :

Une parabole dessinée avec des points en utilisant la méthode PixelSetAA et elle a commencé à être dessinée avec le lissage

Dossiers :
Raison: