Entwickler-Ecke

Multimedia / Grafik - Linie Glätten


downdapp - Mi 20.11.02 14:31
Titel: Linie Glätten
Wie kann ich ein Linie glätten die so erstellt wurde

with canvas do begin
moveto(400,400);
lineto(200,250);
end; :shock:


Matthias - Mi 20.11.02 15:36

:?: Hy,

was möchtest Du an dieser Linie noch glätten. Das kleinste
delta für ein Richtungsänderung ist nunmal 1 Pixel, egal
auf welchem Gerät Du die Linie ausgibst.

Matthias


downdapp - Mi 20.11.02 16:51

Muss ich extrem wiedersprechen!

Gib mal bei dir

sowas ein

with canvas do begin
moveto(400,300);
lineto(233,333);
end;

und du wirst sehen ess iss extrem kantig... :autsch:


tommie-lie - Mi 20.11.02 17:16

er meint bestimmt Antialiasing, um schattierte Pixel an den Rändern der Stufen zu haben, damit die Linie nicht gestuft, sondern sanfter aussieht.
Da weiß ich aber nichts, was mit 'nem Canvas funktioniert. Entweder OpenGL mit aktiviertem AA, oder Direct3D (ehemaliges DirectDRAW-Interface) mit aktivertem AA. Das funktioniert an sich dann automatisch, wenn der GraKa-Treiber das kann.
Wenn du keins von beiden benutzen willst, müsstest du dir den Algo irgendwo suchen (aus den GraKA-Treibern) und manuell berechnen, wo welcher Pixel auf deme Canvas landen müsste. Wenn du aber nicht extreeeem viel MAthe drauf hast und viele Teile in Assembler schreibst, könnte's langsamer werden, als erwartet...


OregonGhost - Mi 20.11.02 17:35

Ich weiß nicht, ob man GDI+ in Delphi benutzen kann, wenn ja, wäre das die Lösung des Problems, da damit Windows nativ Kantenglättung unterstützt. Wenn nicht, kannst du einfach mit Supersampling selbst eine Kantenglättung schreiben. Dazu zeichnest du das ganze Bild z.B. doppelt so groß (Breite UND Höhe, also vierfache Fläche) und verkleinerst es wieder, indem du den Durchschnitt nimmst (also die Pixel im großen Bild mit den Koordinaten [0,0], [0,1], [1,0], [1,1] werden im Ausgabebild zum Pixel [0,0]. Du rechnest also (bei 2x-Kantenglättung) immer die vier Pixel zusammen und bildest den Durchschnitt. Wenn du statt TCanvas TBitmap.Scanline nimmst und am Ende die Bitmap auf den TCanvas kopierst, ist die Geschwindigkeit auch akzeptabel. Der Haken ist halt, dass die nicht nur die Linie, sondern das komplette Rechteck, in dem die Linie liegt, geglättet wird, wenn du nicht gerade einen ausgefuchsten Algorithmus hast, um den Bereich zu beschränken.