HSG |
|
Ein Grundproblem der Grafik-Programmierung ist die Transformation sogenannter Welt-Koordinaten (x/y) auf Bildschirm-Koordinaten (u/v) . Im Folgenden soll anhand eines Beispiels die Entwicklung der Transformation gezeigt werden:
u = a*x + b
v = c*y + d
gesucht: Koeffizienten a, b, c, d
|
|
III - I:
umax - 0 = a(xmax - xmin) => a = umax/(xmax-xmin)
a in I:
b = - a*xmin
IV - II:
vmax - 0 = c(ymin - ymax) => c = vmax/(ymin-ymax)
c in II:
d = - c*ymax
Zur Demonstration des Vorstehenden soll ein kleines Programm entwickelt werden. Wir machen einen Welt-Bild-Manager für die Transformationen verantwortlich. Dazu muss dieser die Koeffizienten Fa,Fb,Fc,Fd abspeichern. Diese Koeffizienten müssen vor dem Zeichnen berechnet werden. Das macht die Methode berechneKoeffizienten, der die nötigen Parameter übergeben werden. Schließlich braucht man die transformierten Werte, die von Funktionen, wie z.B. ut (u-transformiert) geliefert werden. ut und vt erledigen auch gleich die nötigen Rundungen, da das Bild-System ganze Zahlen erwartet.
Das Programm benutzt die Transformationen in beiden Richtungen:
zum Zeichnen von Weltpunkten (x/y) im Bild (ut(x)/vt(y))
zum Anzeigen der Mauskoordinaten (u/v) in der Welt (xt(u)/yt(v))
Es ist zu beachten, dass für eine unverzerrte Darstellung das gleiche Verhältnis von Breite : Höhe in Welt und Bild erforderlich ist.
....... procedure TWeltBildManager.berechneKoeffizienten(xmin,xmax,ymin,ymax,umax,vmax : real); begin Fa := umax/(xmax-xmin); Fb := -Fa*xmin; Fc := vmax/(ymin-ymax); Fd := -Fc*ymax; end; function TWeltBildManager.ut(x : real) : integer; begin result := round(Fa*x+Fb); end; ......... function TWeltBildManager.xt(u : integer) : real; begin result := (u - Fb)/Fa; end; ........
........ procedure TForm1.FormCreate(Sender: TObject); begin wbm := TWeltBildManager.Create; wbm.berechneKoeffizienten(-2,4,-1,3,600,400); end; ........ procedure TForm1.bZeichneAchsenClick(Sender: TObject); begin with canvas do with wbm do begin // x-Achse MoveTo(ut(-2),vt(0)); LineTo(ut(+4),vt(0)); // y-Achse MoveTo(ut(0),vt(-1)); LineTo(ut(0),vt(3)); end; end; ....... procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var u,v : integer; begin u := x; v := y; with canvas do with wbm do begin TextOut(ut(-1.7),vt(-0.5),' '); // Leerstring zum Löschen TextOut(ut(-1.7),vt(-0.5),FloatToStr(xt(u))); // neuer Text TextOut(ut(-1.3),vt(-0.5),' '); TextOut(ut(-1.3),vt(-0.5),FloatToStr(yt(v))); end; end;
Transformation.zip
mTWeltBildManager.zip
MGrafTester.zip
Erweitere das Programm um