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
Welt | Bild |
(xmin/ymax) | (0/0) |
(xmax/ymin) | (umax/vmax) |
|
| | | |
|
=> | I | 0 = a*xmin + b | II | 0 = c*ymax + d |
=> | III | umax = a*xmax + b | IV | vmax = 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
- ....