![]() |
|||
| 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