Laden...

Smoothing von Graphics

Erstellt von PES 4ever vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.710 Views
PES 4ever Themenstarter:in
46 Beiträge seit 2008
vor 13 Jahren
Smoothing von Graphics

Hallo!

Für meine Diplomarbeit verwende ich eine selbst erstellte Diagramm-Klasse. Nun möchte ich die Linien ein bisschen "smoothen" damit sie nicht so pixelig aussehen.

Den SmoothingMode habe ich schon auf AntiAliasing eingestellt, aber die Linien wirken noch immer pixelig.

gc.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

Die Funktionen (List<Funktion> f) werden in Punkt-Arrays (Point[] fdraw) mit der Länge = Anzahl der Pixel entlang der Abszisse gespeichert und dann gezeichnet.

gc.DrawLines(new Pen(f[i].farbe), fdraw);

Gibt es noch Möglichkeiten, um die Darstellung der Funktionen zu verbessern?

Danke im Voraus!

MFG PES 4ever

5.742 Beiträge seit 2007
vor 13 Jahren

Die Funktionen (List<Funktion> f) werden in Punkt-Arrays (Point[] fdraw) mit der Länge = Anzahl der Pixel entlang der Abszisse gespeichert und dann gezeichnet.

Ich denke, das wird genau das Problem sein.
Punkte können ja nicht wirklich antialiased werden - das geht IMHO nur mit "echten" Kurven und Linien.

Ansonsten musst du das wohl selber implementieren.

PES 4ever Themenstarter:in
46 Beiträge seit 2008
vor 13 Jahren

Danke für die schnelle Antwort!

Ist es möglich eine Art Spline zu verwenden?
Ein Spline müsste sich dann smoothen lassen, oder?

MFG PES 4ever

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo PES 4ever,

klar lässt sich eine Spline smoothen. Und im Prinzip kannst du mit einer Spline mit genügend vielen Stützpunkten jede beliebige andere Kurve auch genügend genau approximieren. Grundsätzlich machbar ist das. Ob es einfacher ist, als das Smoothing selber zu implementieren, steht auf einem anderen Blatt.

herbivore

PES 4ever Themenstarter:in
46 Beiträge seit 2008
vor 13 Jahren

Hallo herbivore!

Smoothing selber implementieren.

Wie funktioniert das? Gibt es dazu schon einen Beitrag? Mit der Suche habe ich nichts gefunden.

MFG PES 4ever

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo PES 4ever,

du erhöhst (virtuell) die Auflösung deiner Kurven, in dem du dir z.B. sowohl horizontal als auch vertikal zweimal soviele Punkte merkst. Jedes Pixel färbst du dann entsprechend der Anzahl der Punkte ein, die in dem Pixel liegen. Je mehr desto dunkler/kräftiger.

herbivore

5.742 Beiträge seit 2007
vor 13 Jahren

du erhöhst (virtuell) die Auflösung deiner Kurven

Oder zeichnest einfach auf ein Bitmap mit höherer Auflösung und zeichnest dieses dann verkleinert.

PES 4ever Themenstarter:in
46 Beiträge seit 2008
vor 13 Jahren

Danke für die Antworten. 👍

herbivore hast du ein Code-Beispiel dazu?

MFG PES 4ever

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo winSharp93,

Oder zeichnest einfach auf ein Bitmap mit höherer Auflösung und zeichnest dieses dann verkleinert.

da die Kurven bei der von PES 4ever gewählten Zeichenmethode - so wie ich es verstanden habe - aber nur immer ein Pixel breit sind, werden die Kurven dadurch ziemlich blass werden. Je höher die Auflösung der temporären Bitmap, desto blasser.

Hallo PES 4ever,

herbivore hast du ein Code-Beispiel dazu?

nö. So schwer ist das nun weder zu verstehen noch zu programmieren.

herbivore

5.742 Beiträge seit 2007
vor 13 Jahren

so wie ich es verstanden habe - aber nur immer ein Pixel breit sind

Könnte man das nicht durch einen breiteren Pen kompensieren?

PES 4ever Themenstarter:in
46 Beiträge seit 2008
vor 13 Jahren

OK, dann versuche ich es mal. 8)

Kann man eigentlich Punkte alleine zeichnen?

MFG PES 4ever

1.002 Beiträge seit 2007
vor 13 Jahren

Hallo PES 4ever,

meinst du Bitmap.SetPixel()?

m0rius

Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg

5.299 Beiträge seit 2008
vor 13 Jahren

Für meine Diplomarbeit verwende ich eine selbst erstellte Diagramm-Klasse. Nun möchte ich die Linien ein bisschen "smoothen" damit sie nicht so pixelig aussehen

Also pixelig findich das Bildchen ja nicht, und auch nicht in der Weise eckig, dass Bezier-Linien oder Splines einen Fortschritt bringen täten.
Höchstens die TreppenForm nahe am Nullpunkt - das sieht aber aus, als ob AntiAliasing eben nicht aktiviert ist.

Das würdich nochmal überprüfen, zB. indem du mit verschiedenen Smoothingmodes experimentierst, ob sich da Verbesserungen ergeben.

Evtl. verwendest du ja auch ints, wo floats hingehören, also zum Zeichnen solltest du PointF verwenden, nicht Point.

Zum Thema Splines/Beziers: gugge die Methoden Graphics.DrawSpline() / Graphics.DrawBezier()
Aber ich glaube nicht, dass das was bringt, weil du scheinbar eh sehr viele Punkte verwendest.

Der frühe Apfel fängt den Wurm.

PES 4ever Themenstarter:in
46 Beiträge seit 2008
vor 13 Jahren

Danke ErfinderDesRades!

PointF ist die Lösung.
Funktioniert nun super! Danke! 👍

MFG PES 4ever