Hinzufügen eines Volumeneffekts zu den Indikatorlinien - Seite 4

 
barabashkakvn:
Die Punkte werden ohne Antialiasing gezeichnet. Ich habe mich speziell für diePixelSetAA-Methode entschieden - das Zeichnen von Punkten mit Anti-Aliasing.

Versuchen Sie, mitPixelSetAA eine Linie zu zeichnen.

Die Methode PolylineAA verwendet die Methode LineAA. Die Methode LineAA verwendet die Methode PixelSetAA. Wenn Sie einen einzelnen Punkt zeichnen, sehen Sie den Effekt des Antialiasing nicht.

 
tol64:
Versuchen Sie, mitPixelSetAA eine Linie zu zeichnen.

Nein. Keine Wirkung. Keine nahen Punkte der Glättung. Scharfe Ecken sind wie Ziegelsteine:

Linie mit Punkten über PixelSetAA

 
barabashkakvn:

Nein. Keine Wirkung. Keine nahen Punkte der Glättung. Scharfe Ecken sind wie Ziegelsteine:

Ich habe den vorherigen Beitrag ergänzt. Beachten Sie, wie die oben genannten Methoden implementiert sind, und verwenden Sie sie, wenn eine Glättung erforderlich ist.
 
tol64:
Ich habe die vorherige Nachricht ergänzt. Beachten Sie, wie die oben genannten Methoden implementiert sind, und verwenden Sie sie, wenn Sie eine Glättung benötigen.
Die Methode des Linienzeichnens mit Glättung -PolylineAA- werde ich vorerst nicht anfassen. Ich möchte verstehen, was in der Hilfe überPixelSetAA gesagt wird:
PixelSetAA-Zeichnet einen Punkt mit Anti-Aliasing-Algorithmus.

Da diese Methode einen Punkt mit Anti-Aliasing zeichnet, sollte ich ein Bild wie dieses erhalten, wenn ich mehrere Punkte in einer Reihe zeichne:

Ich denke, so sollten viele Punkte mit Glättung aussehen

Aber ich bekomme keine glatten Punkte.

 
barabashkakvn:
Die Methode zum Zeichnen einer Linie mit Glättung -PolylineAA- werde ich vorerst nicht anfassen. Ich möchte verstehen, was in der Hilfe überPixelSetAA gesagt wird:
PixelSetAA-Zeichnet einen Punkt mit Anti-Aliasing-Algorithmus.

Da diese Methode einen Punkt mit Anti-Aliasing zeichnet, sollte ich ein Bild wie dieses erhalten, wenn ich mehrere Punkte in einer Reihe zeichne:

Aber ich bekomme keine glatten Punkte.

Deshalb schlage ich vor, dass Sie den Code von Methoden mit und ohne Antialiasing vergleichen. Der Kodex kann studiert werden.

Um sie zu verstehen, müssen Sie die Algorithmen, die in diesen Methoden verwendet werden, gründlich studieren.

Sie könnten sogar einen Artikel über dieses Thema schreiben. Ich würde es gerne selbst lesen. )

 
Der Punkt kann nicht geglättet werden, er ist in gewisser Weise ein "Elementarteilchen")
 
komposter:
Ein Punkt kann nicht geglättet werden, er ist in gewisser Weise ein "Elementarteilchen")
Hier ist also die Frage: Es gibt zwei Methoden(PixelSet undPixelSetAA). Ich interessiere mich sehr fürPixelSetAA- vielleicht verstehe ich nicht, wie die Punktglättung funktioniert?
 
barabashkakvn:
Das ist also die Frage: Es gibt zwei Methoden(PixelSet undPixelSetAA). Ich interessiere mich sehr fürPixelSetAA- vielleicht verstehe ich nicht, wie die Punktglättung funktioniert?

Wenn alles andere fehlschlägt, lesen Sie die Hilfe ;)

PixelSet setzt einfach die Farbe des Punktes.

 
Wir haben die Hilfe gelesen. Die Frage ist also: " SolltePixelSetAA auch nur einen einzigen Punkt mit Anti-Aliasing zeichnen?". Ich möchte eine Meinung hören.
 
barabashkakvn:
Wir haben die Hilfe gelesen. Die Frage ist also: " SolltePixelSetAA auch nur einen einzigen Punkt mit Anti-Aliasing zeichnen?". Ich möchte eine Meinung hören.

Die Antwort lautet: DiePixelSetAA-Methodesollte auch nur einen einzigen Punkt mit Antialiasing zeichnen, und sie zeichnet diesen einzigen Punkt auch mit Antialiasing. Um dies zu tun, musste ich in den Code des CCanvas schauen:

//+------------------------------------------------------------------+
//| 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));
     }
  }

Klasse und stellte fest, dass die Glättung nur erscheint, wenn Sie eine Zahl vom Typ double als Koordinaten übergeben, und zwar nicht als gerundeten Wert, sondern mit einem "Schwanz". Etwa 200,4; 125,6; 200,7.

Hier ist eine Parabel, die mit derPixelSetAA-Methode mit Punkten gezeichnet wurde, und sie wird mit Antialiasing gezeichnet:

Eine Parabel, die mit der PixelSetAA-Methode mit Punkten gezeichnet wurde und mit Anti-Aliasing gezeichnet wird

Dateien: