Anti-Aliasing

the snake II

Erfahrenes Mitglied
Hallo zusammen,

ich habe in Delphi 6 auf Windows XP einen Funktionsplotter geschrieben, der ähnlich wie ein Vektor Programm arbeitet; im moment sind erst zwei Funktionstypen implementiert (<- nennt man das so?): lineare und quadratische Funktionen. Sie sind in Arrays gespeichert. Für jeden der beiden Typen existiert ein Array, das jeweils aus einer Klasse besteht (TLinearGraph und TSquareGraph).
Gezeichnet wird auf ein TCanvas Objekt einer TPaintBox (ehemals TImage; was ist eigentlich "besser"?)

Das ganze Funktioniert bisher auch ganz gut.
Doch hatte ich mir gedacht, dass man für die schönere (wenn auch evtl ungenauere) Darstellung einen Anti-Alias Filter schreiben könnte, der den Treppeneffekt lindert.

Bei Wikipedia habe ich etwas über die "Nyquist-Frequenz" gefunden, auf die im Zusammenhang mit Anti-Aliasing von Vektorgraphiken verwiesen wird.
Beim durchlesen des Artikels (hier der Link auf wikipedia.org) hab ich nichts verstanden.

Was ich jedoch verstanden habe ist, dass viele Filter die Technik verwenden, beispielsweise für eine Linie zu berechnen, in welchem Maße jedes Pixel von dieser Linie geschnitten wird (also wie lang das Liniensegment ist, dass das betreffende Pixel beinhaltet) und anhand dessen das Pixel mit einem niedrigeren bzw. höheren Farbwert füllt.

Allerdings fehlt mir hierbei der mathematische Ansatz.

Hat jemand vielleicht eine Idee das ganze durch eine Formel zu lösen, oder mir zu erklären, wie das etwa klappen könnte.
Oder ist das Ganze viel zu kompliziert für ein TCanvas?


Viele Grüße,

The Sanke II
 

WieGehts

Erfahrenes Mitglied
Hallo,
der wikipedia-Artikel kommt aus der digitalen Signalverarbeitung. Diese hat aber - meine Meinung - nichts mit deinem Problem zu tun, sondern beschäftigt sich mit der Umwandlung analoger (Sprach)signale in digitale und umgekehrt.
Ansonsten kann ich dir leider nicht helfen - nur eines:
Was ich jedoch verstanden habe ist, dass viele Filter die Technik verwenden, beispielsweise für eine Linie zu berechnen, in welchem Maße jedes Pixel von dieser Linie geschnitten wird (also wie lang das Liniensegment ist, dass das betreffende Pixel beinhaltet) und anhand dessen das Pixel mit einem niedrigeren bzw. höheren Farbwert füllt.
das ist der richtige Ansatz.

WieGehts
 

LightningVector

Grünschnabel
Hallo snake,

leider schreibst du nicht, welche Ansprüche du an das Antialiasing stellst. Da hab ich schon unterschiedliche Varianten gesehen. Poste doch Beispiele, wo du was ändern möchtest.

Mit höherer Mathematik kann ich nicht dienen, aber ein paar pragmatische Überlegungen kann ich beitragen.

Das Glätten ist beim Zeichnen weniger aufwändig, als eine Bearbeitung der bitmap im Nachhinein.

Variante1:
Wenn du die x Achse pixelweise entlang gehst und punkte auf die canvas setzt, die x/f(x) entsprechen, dann wird der Graph an den steilen Stellen löchrig. Du kannst aber auch die Punkte von x/f(x-PixelBreite/2) bis x/f(x+PixelBreite/2) setzen, dann verschwinden die Lücken.

Variante2:
Du kannst die Kurve entlang gehen und für die benachbarten Pixels den Abstand zur Kurve berechnen. Abhängig vom Abstand kannst du einen Grauton verwenden. Daei wird eine Lieare Abhängigkeit eventuell verwaschen aussehen. Da kann man sich was besseres einfallen lassen und etwas experimentieren.

So, hoffe das hilft.

grüsse,
lv