Eine der Grundlagen jeder 2D Graphik ist die sog.
Window-Viewport Transformation.
Es geht darum, einen bestimmten Ausschnitt aus dem Welt
koordinatensystem (eben das Window) in einem bestimmten
Pixelbereich (eben dem Viewport) abzubilden.
Da wir uns in einem 2D Kontinuum bewegen, ist die
Window/Viewport Trafo klarerweise für x und y
getrennt aufzusetzen. Im Folgenden betrachte ich
zur Ableitung des Formalismus daher nur 1 Dimension (x).
Für y ist alles völlig analg.
Worum gehts:
Wie haben einen Ausschnitt aus der Welt, der durch seine
beiden Grenzwerte winMin und winMax gegeben sei. Diesen Bereich,
winMin bis winMax, wollen wir in einem bestimmten Pixelbereich
abbilden: viewMin bis viewMax. Also etwa so
winMin winMax
+--------------------+
viewMin viewMax
d.h. der Zahlenwert winMin soll nach der Umrechnung den Zahlenwert
viewMin ergeben und der Zahlenwert winMax soll zu viewMax werden.
Die Formel für die Umrechnung lautet:
viewMax - viewMin
viewX = ( winX - winMin ) * ------------------- + viewMin
winMax - winMin
Bsp:
Angenommen du möchtest den Bereich -10 bis +10 (zb. weil du
deine X^2 Formel eben in diesem Bereich darstellen möchtest)
abbilden. Deine Ausgabefläche sei 360 Pixel breit, wobei
links das Pixel 0 und rechts das Pixel 359 sei.
winMin: -10
winMax: +10
viewMin: 0
viewMxa: 359
Die Frage ist daher: Wenn du einen X Wert von 0.5 hast, welches
ist das entsprechende Pixel dazu.
359 - 0
viewX = ( 0.5 - -10 ) * ------------ + 0
+10 - -10
359
viewX = ( 10.5 ) * -------- + 0
20
viewX = 10.5 * 17.95
viewX = 188.475
Also, um zb auf der X Achse bei 0.5 eine Markierung zu setzen,
muss das Pixel mit der X-koordinate 188 gesetzt werden.
Völlig analog geht das auch in der Y-Achse.
D.h. du musst im Vorfeld folgendes wissen:
Wie gross ist meine Ausgabefläche in Pixel, damit du viewMinX
viewMaxX, viewMinY und viewMaxY bestimmen kannst.
Welchen Ausschnitt aus meiner Welt möchte ich auf der
Ausgabefläche sehen. Es macht einen Unterschied ob ich von
meiner Funktion den Bereich x: -10 bis +10 sehen möchte,
oder den Bereich x: 0 bis 20. Selbiges natürlich in der
Y Richtung.
Danach gehts du deine Funktion mit einer Schleife durch und
lässt dir jeweils den Funktionswert zu einem bestimmten X
ausrechnen. Du hast also das winX und das winY und zwar
in Weltkoordinaten. Um den entsprechenden Punkt zu setzen
musst du diesen Punkt in Pixel umrechnen.
Die rechnest du nach der Formel:
viewMaxX - viewMinX
viewX = ( winX - winMinX ) * ------------------- + viewMinX
winMaxX - winMinX
bzw.
viewMaxY - viewMinY
viewY = ( winY - winMinY ) * ------------------- + viewMinY
winMaxY - winMinY
um und setzt zb. an die Pixelkoordinate viewX/ViewY einen
Punkt. Oder du verbindest diesen Punkt mit einer Linie mit
den Pixelkoordinaten des vorhergehenden Punktes.