In dieser Struktur werden die Punktinformationen gespeichert.
struct point_struct
{
MFLOAT x_world, y_world, z_world;
struct point_data_struct *p;
MINT flags;
MINT Number_of_Polygons;
struct polygon_struct **Polygons;`
};
x_world, y_world, z_world stellen die
Punktkoordinaten im Weltsystem dar. p zeigt auf ein Datenfeld
mit den Koordinaten im Beobachter- und im Bildschirmsystem (siehe
point_data_struct). flags dient zur Markierung bestimmter
Punkte (siehe Punkteflags). Number_of_Polygons ist gleich der
Anzahl Polygone, die diesen Punkt enthalten. Polygons zeigt auf
ein Datenfeld von Zeigern auf Polygonstrukturen polygon_struct.
Diese Zeiger zeigen auf die Polygone, welche diesen Punkt enhalten.
Diese Struktur enthält die Beobachter und Bildschirmkoordinaten eines Punktes. Diese Daten wurden aus der Punktstruktur gelöst, da sie von Bild zu Bild ändern. Sie können somit in einem Datenfeld zusammengefasst werden, dass dann parallelisiert werden könnte. Wären diese Daten nicht herausgelöst, müssten jedesmal alle Punktedaten kommuniziert werden, obwohl nicht alle geändert haben.
struct point_data_struct
{
MFLOAT x_view, y_view, z_view;
MFLOAT x_screen, y_screen;
};
x_view, y_view und z_view enthalten die
Koordinaten im Bildschirmsystem. Sie werden durch transform
berechnet (siehe 5.6.1). x_screen und
y_screen enthalten die Koordinaten im Bildschirmsystem. Sie werden
duch project berechnet (siehe 5.7.1).
Die Struktur polygon_struct speichert die Polygoninformationen.
struct polygon_struct
{
MINT Number_of_Points;
struct point_struct **Points;
MINT Old_Number_of_Points;
struct point_struct **Old_Points;
MINT RGB;
MINT RGB_color;
MINT flags;
MFLOAT nx_world, ny_world, nz_world;
MFLOAT sx_world, sy_world, sz_world;
struct polygon_data_struct *p;
MFLOAT radius;
};
Number_of_Points enthält die Anzahl Punkte eines Polygons;
Points ist ein Zeiger auf ein Datenfeld mit Zeigern auf diese
Punktstrukturen (point_struct). Old_Number_of_Points
und Old_Points dienen dem Sichern dieser Strukturen. RGB
enthält die Farbe des Polygons, die auf dem Bildschirm erscheint;
RGB_color ist die Grundfarbe des Polygons wie sie der Parser
einliest. Dabei ist das MSB leer, gefolgt von blau, grün und rot als
LSB. flags dient zur Markierung bestimmter Polygone (siehe
Polygonflags). nx_world, ny_world und nz_world
enthalten den Normalenvektor des Polygons in Weltkoordinaten.
sx_world, sy_world und sz_world enthalten den
Polygonschwerpunkt in Weltkoordinaten. radius enthält die
maximale Distanz zwischen Schwerpunkt und den Randpunkten des
Polygons. Diese Daten werden durch die Funktion des Moduls
preprocess (siehe 5.4.1) berechnet.
Damit auch die Transformation der Polygondaten (Normalenvektor und Schwerpunkt) effizient parallelisiert werden können, haben wir auch diese Daten in einem eigenen Datenfeld gespeichert.
struct polygon_data_struct
{
MFLOAT nx_view, ny_view, nz_view;
MFLOAT sx_view, sy_view, sz_view;
};
nx_view, ny_view und nz_view enthalten die
Koordinaten des Normalenvektors im Beobachtersystem, sx_view,
sy_view und sz_view enthalten die Koordinaten des
Schwerpunktes im Beobachtersystem. Diese Daten werden durch die
Funktion transform (siehe 5.6.1) berechnet.
Die Transformation vom Welt- ins Beobachtersystem erfolgt mit einer 4x4 Matrix. Die Struktur view_struct enthält die notwendigen Daten.
struct view_struct
{
MFLOAT Object_to_World[4][4];
MFLOAT Object_to_World_begin[4][4];
MFLOAT Distance_to_screen;
MINT ok;
};
Object_to_World enthält die Tranformationsmatrix vom
Weltsystem ins Beobachtersystem. Object_to_World_begin
enthält die erste Transformationsmatrix, die aus den Angaben des
Parsers berechnet wird. Alle weiteren Drehungen bauen dann auf
dieser auf. Diese Matrix wird durch die Funktion getview (siehe
5.5.1) berechnet. Distance_to_screen enthält die Distanz vom
Beobachter zum Bildschirm (siehe Abbildung 1.2).