HSG

Aktuelle Seite: HSG/Fächer/Informatik/Material

Transformation Welt —› Bild

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:

Ansatz

u = a*x + b
v = c*y + d
gesucht: Koeffizienten a, b, c, d

Gleichungen

WeltBild
(xmin/ymax)(0/0)
(xmax/ymin)(umax/vmax)
=>I0 = a*xmin + bII0 = c*ymax + d
=>IIIumax = a*xmax + bIVvmax = c*ymin + d

Lösungen

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

Kleines Demo-Programm

Klassendiagramm

mTWeltBildManager.zip
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.

Programm-Details

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.


Quelltext-Auszüge aus der Unit mTWeltBildManager

.......
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;
........

Quelltext-Auszüge aus der Formular-Unit:

........
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;


Downloads

Transformation.zip
mTWeltBildManager.zip

Aufgaben

Erweitere das Programm um
- Graph einer Funktion, z.B. Gf mit f(x) = 0.2*x²-0.5 im Bereich [-1;3]
- kleine Striche auf den Achsen
- Beschriftung der Striche
- Pfeile an den Achsen
- Rasterpunkte
- ....