2011-01-15 12 views
5

Also schreibe ich einen Grafikrechner. Bisher habe ich einen semi-funktionalen Grapher, aber es fällt mir schwer, ein gutes Gleichgewicht zwischen genauen Graphen und glatt aussehenden Kurven zu finden.So implementieren Sie einen Grapher in C#

Die aktuelle Implementierung (semi-Pseudo-Code) sieht wie folgt aus etwas:

for (float i = GraphXMin; i <= GraphXMax; i++) 
{ 
    PointF P = new PointF(i, EvaluateFunction(Function, i) 
    ListOfPoints.Add(P) 
} 
Graphics.DrawCurve(ListOfPoints) 

Das Problem dabei ist, da es nur einen Punkt bei jedem ganzzahligen Wert addiert, Grafiken verzerrt am Ende, wenn ihre Wendepunkte fallen nicht auf ganze Zahlen (zB sin (x)^2).

alt text

versuchte ich i durch etwas kleiner (wie 0,1) erhöht wird, die aber die Grafik sieht sehr rau funktioniert.

alt text

I C# und GDI + verwenden. Ich habe SmoothingMethod auf AntiAlias ​​eingestellt, das ist also nicht das Problem, wie Sie aus der ersten Grafik sehen können. Gibt es ein Problem mit dem Zeichnen von Kurven mit vielen Punkten? Sollten die Punkte vielleicht genau auf Pixeln liegen?

Ich bin sicher, dass einige von euch schon einmal an etwas sehr ähnlichem gearbeitet haben, also irgendwelche Vorschläge? Wenn Sie schon dabei sind, haben Sie irgendwelche Vorschläge für das Zeichnen von Funktionen mit Asymptoten? z.B. 1/x^2

P.S. Ich bin nicht auf der Suche nach einer Bibliothek, die all dies tut - ich möchte es selbst schreiben.

+0

was meinen Sie mit "der Graph sieht sehr rau aus"? Die Anzahl der Punkte zu erhöhen, ist der Weg zu gehen, um es glatter aussehen zu lassen. Und wenn man die X-Stufen verkleinert (1 -> 0,1) * erhöht * sie. – user492238

+0

Auch ich weiß nicht, was Sie mit "Vorschläge für die Darstellung von Funktionen mit Asymptoten" meinen. Was du erwartest? Wie werden sie anders gehandhabt als andere Graphen? Sie sind nicht. – user492238

+0

Ich habe bearbeitet, um es klarer zu machen. – ian93

Antwort

1

OK, ich habe das Problem behoben. Irgendwo im Zeichenprozess verwendete ich eher int als float.

2

Beim Rendern eines Graphen machen Sie immer Rundungsfehler, weil eine Bitmap diskret ist und der Graph nicht.

gibt mehrere Möglichkeiten, von Bewältigungs:

  1. Verwendung Anti-Aliasing; es macht das Diagramm nur glatter.
  2. verwenden Sie eine Nichtlinear-Interpolation. Das Zeichnen von Punkt a nach b unter Verwendung einer Linienluft-Interpolation verursacht Winkel. Berechnen der Steigung des Graphen (nicht des Liniensegments!) In jedem Punkt und speisen die Neigung zum Interpolationsverfahren (bikubische oder Bezier-Kurve)

Vektor APIs wie WPF oder Silver könnten Dinge leichter implementieren.

Die Pflege von Asymptoten ist ziemlich schwierig. Zuerst müssen Sie sie finden und dann überspringen Sie den Wert, so dass Sie das "Loch" in der Grafik machen können.