Auswertung von Messwerten (PDF) - Netzmafia
Auswertung von Messwerten (PDF) - Netzmafia
Auswertung von Messwerten (PDF) - Netzmafia
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
2.1 Programmierung grafischer Darstellungen 21<br />
wobei für S und T gilt:<br />
S = A·X max − B·X min<br />
X max − X min<br />
(2.9)<br />
T = C· Y max − D· Y min<br />
Y max − Y min<br />
(2.10)<br />
Diese lineare Transformation hat nicht nur den Vorteil, dass man in Weltkoordinaten arbeiten kann,<br />
sondern auch, dass man durch Ändern der Werte <strong>von</strong> A, B, C und D das Bild beliebig skalieren kann.<br />
Damit man im Programm auch mit den Weltkoordinaten arbeiten kann, sollte man die benötigten<br />
Grafikroutinen als eigene Funktionen definieren. Dazu reichen zunächst nur vier Routinen, die sich<br />
ihrerseits auf die Grafikprimitive (z. B. des GD-Pakets) stützen:<br />
window (A, B, C, D)<br />
Reservieren eines Fensters, das sich in X-Richtung <strong>von</strong> A bis B und in Y-Richtung <strong>von</strong> C bis D<br />
erstreckt (in Gerätekoordinaten, beim Bildschirm in Pixeln)<br />
scale (Xmin,Xmax,Ymin,Ymax)<br />
Skalieren des reservierten Fensters auch den angegebenen Bereich in Weltkoordinaten<br />
moveto (X,Y)<br />
Positionieren des (virtuellen) Zeichenstifts auf den Punkt (X,Y) in Weltkoordinaten, ohne eine Spur<br />
zu hinterlassen<br />
drawto (X,Y,COL)<br />
Zeichnen einer Linie vom augenblicklichen Standpunkt zum Punkt (X,Y) in Weltkoordinaten unter<br />
Verwendung der Farbe COL<br />
Diese Funktionen werden an dieser Stelle nur skizziert, die Ausarbeitung bleibt Ihnen als Übung<br />
überlassen. So könnte man beispielsweise die globalen Werte in einer Verwaltungs-Struktur speichern<br />
und einen Pointer darauf jeweils als ersten Parameter übergeben.<br />
void window (int a, b, c, d)<br />
{<br />
// Definieren des Zeichenfensters in Geraetekoordinaten<br />
// z. B. window (0, 0, 400, 200);<br />
// globale Konstante: W, H (maximale Maße der Zeichenfläche)<br />
// globale Variablen: A, B, C, D (Fensterkoordinaten)<br />
// A, B, C, D werden hier verändert<br />
A = a;<br />
// Randueberwachung<br />
if (A < 0) A = 0;<br />
if (A > W) A = W;<br />
B = b;<br />
// Randueberwachung<br />
if (B < 0) B = 0;<br />
if (B > W) B = W;<br />
C = c;<br />
// Randueberwachung<br />
if (C < 0) C = 0;<br />
if (C > H) C = H;<br />
D = d;<br />
if (D < 0) D = 0;<br />
if (D > H) D = H;<br />
}<br />
int scale (float xmin, xmax, ymin, ymax)<br />
{<br />
// Skalieren des reservierten Fensters in Weltkoordinaten<br />
// global: int A, B, C, D (<strong>von</strong> window)<br />
// global: float P, Q, S, T (Skalierung)<br />
// P, Q, S, T werden hier veraendert<br />
// Rueckgabewert: 0 = OK, -1 = Fehler<br />
if (xmin == xmax)<br />
{