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.
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:
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. )
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 ;)
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(constdouble x,constdouble y,constuint clr)
{
staticdouble rr[4];
staticint xx[4];
staticint yy[4];
//--- preliminary calculationsint 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-aliasingif(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 squaresfor(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 pixelsfor(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:
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.
Versuchen Sie, mitPixelSetAA eine Linie zu zeichnen.
Nein. Keine Wirkung. Keine nahen Punkte der Glättung. Scharfe Ecken sind wie Ziegelsteine:
Nein. Keine Wirkung. Keine nahen Punkte der Glättung. Scharfe Ecken sind wie Ziegelsteine:
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.
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.
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:
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. )
Ein Punkt kann nicht geglättet werden, er ist in gewisser Weise ein "Elementarteilchen")
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.
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:
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: