background image
Die Funktion
get_index(float xpos, float zpos)
löst dieses Problem folgendermaßen:
Die Daten der Punktwolken werden in unserem Fall so geliefert, dass die Länge des Gitters der z-
Koordinate entspricht, die Breite der x-Koordinate, entsprechend liegen die Höhenwerte in der
positiven y-Richtung vor.
Da die Höhenwerte in unserem Fall spaltenweise von unten nach oben (positive z-Richtung)
gespeichert sind und wir die gesamte Zeilen- und Spaltenanzahl des Höhenfelds vorliegen haben,
ergibt sich ein folgendes Umrechnungsschema:
off_x = (unsigned int)(((xposgmin_x)/((gmax_xgmin_x)/gridwidth))0.5);
off_z = (unsigned int)(((zposgmin_z)/((gmax_zgmin_z)/gridlength))0.5);
xpos und zpos definieren die Eingabewerte der Funktion in 3D-Koordinaten.
gmax_z, gmin_z, gmax_x, gmin_x sind die Minimal- und Maximalwerte des Gitters in 3D-
Koordinaten.
die Variablen gridlength und gridwidth geben die Anzahl der Höhenwerte des Gitters in z-
und x-Richtung an.
gridsize liefert den bei der Erzeugung des Höhenfelds festgelegten Abstand zwischen zwei
benachbarten Höhenwerten.
Über off_x wird zunächst die Gitterposition in x-Richtung bestimmt, entsprechend über off_z die
Gitterposition in z-Richtung. Um zu vermeiden, dass am oberen und rechten Rand des Gitters
ungültige Werte benutzt werden, werden die beide Offsets bei der Konvertierung in vorzeichenlose
Ganzzahlen (unsigned int) abgerundet (-0.5). Sonst könnte es vorkommen, dass am oberen Rand
des Höhenfelds der nächste Wert benutzt werden würde, der wiederum am unteren Rand des Felds
liegen würde.
Da das Gitter spaltenweise von unten nach oben und von links nach rechts vorliegt, berechnet sich
nun die entsprechende Indexpositon über:
index = ( off_x * gridlength ) + off_z;
So kann also aus zwei beliebigen (x, z)-Raumkoordinaten der nächstgelegenene Index abgerufen
werden, womit wir auch Zugriff auf den nächstliegenden Höhenwert erhalten.
Die Funktion
float get_height(float xpos, float zpos)
erledigt genau dies, indem sie auf die Funktion get_index(...) zurückgreift, den Index von dieser
erhält und im Höhenfeld den entsprechenden Wert abruft.
Die Bestimmung der Höhenwerte zu beliebigen x-z-Koordinaten ist Grundvoraussetzung, um eine
Triangulierung mit Approximation durchführen zu können, da das Mesh ohne Zugriff auf die
Höhenwerte komplett flach bliebe.
15