**Repräsentation der Daten auf der GPU**
Einleitender Hinweis: Die GUI verwendet QML für die grafischen Benutzerelemente (Slider, Buttons, usw.). Die eigentliche Visualisierung
wird mit zwei Technologien realisiert. Für den radialen Icicle Plot (Darstellung des Baumes mit Ringsegmenten) wird
die QPainter API von Qt benutzt, da insbesondere die Darstellung von Text mit OpenGL nicht trivial ist. Für die
Darstellung der Kurven (Größenordnung 10.000 Kurven pro Frame) ist QPainter nicht performant genug (ca. 5 sek
pro Frame, also 0.2 FPS) für eine interaktive Visualisierung (> 10 FPS). Hierfür verwenden wir OpenGL ES 2.0, um
mit einigen Optimierungen mehr als 20 FPS für den gleichen Datensatz zu erreichen.
----
__**Vertex Buffer**__
Die Festlegung auf OpenGL ES 2.0 verhindert die Benutzung von Geometry Shadern, daher wird bei Programmstart
ein großer Triangle Strip erzeugt, der die Vertices für die höchst mögliche Anzahl an Kurven für einen Datensatz
bereit hält und im Vertex Buffer abgelegt wird.
{{:wiki:tristrip.png?400|}}
Fig: Layout einer Kurve als Triangle Strip im Vertex Buffer.
Damit ein Draw-Aufruf für alle Kurven genügt, werden die Kurven an den Enden mit degenerierten Dreiecken
verbunden, also mit Dreiecken, die eine Fläche = 0 haben und daher nicht angezeigt werden. Dafür bekommen die
ersten beiden Punkte P0 und P1 jeder Kurve die gleiche Koordinate zugewiesen, wie auch die letzten beiden Punkte Pn
und Pn−1 auf den gleiche Koordinate fallen (Für die Lesbarkeit nicht im Bild dargestellt). Als Triangle Strip entstehen
dann zwei unendlich dünne Dreicke zwischen Kurven die hintereinander im Vertex Buffer gespeichert sind.
Als Attribut bekommt jeder Vertex im Vertex Buffer einen Wert für side der entweder 1 oder -1 sein kann.
Außerdem hat jeder Vertex ein Attribut tex_pos eine Texturkoordinate für die Textur tex_1 Gegen¨uberliegende
Punkte einer Kurve haben den gleichen Wert für tex_pos und unterscheiden sich nur im Wert für side.
{{:wiki:tex.png?400|}}
Fig: Verbindungen zwischen den geladenen Texturen und dem Vertex Buffer.
----
__**tex_1**__
Für jedes Jahr wird an den Namen tex_1 eine andere Textur gebunden. An der Texturkoordinate tex_pos ist die
Positionen des aktuellen Kurvenpunkte nach der Bezier Interpolation gespeichert sowie der Interpolationsparameter
t. t wird z.B. zur Farbinterpolation der Kurve verwendet (von Export t = 0 nach Import t = 1). Die Pixel einer
Kurve mit den Werten jedes Kurvenpunktes sind nebeneinander gruppiert. Am Anfang einer Solchen Gruppe liegt
ein weiterer Pixel, der Daten zur ganzen Kurve kodiert. Mit Hilfe von t kann die Position dieses Pixels berechnet
werden. Er enthält IDs für den Start- und Endknoten jeder Kurve, die als Koordinate für tex_selection genutzt
werden können und eine weitere Texturkoordinate tex_pos für den Zugriff auf tex_2
__**tex_selection**__
tex_selection speichert für jede Knoten-ID einen Wert von 0 für unausgewählt bis 1 für selektiert.
__**tex_2**__
Unter tex_2 wird für jedes Jahr und jede ausgewählte Produktkategorie eine andere Textur geladen. Sie enthält
mit conn value die Breite einer Verbindung/Kurve (für den Einheitskreis skaliert) und mit conn_angle_dist den
Winkelabstand zwischen den Endpunkten einer Kurve.
----
----
__**Vertex Shader**__
Der Vertex Shaderübernimmt die Textur-Lookups und bestimmt die Normale (normal an einem Kurvenpunkt, durch
Berechnung der Position der beiden Nachbarpunkte. Kurven werden entsprechend ihrer Breite skaliert, in dem
vert pos in Richtung der Normale verschoben wird:
pos = vert pos + normal * side * conn value * 0.5
----
__**Datenformat**__
Dieses Kapitel beschreibt das Dateiformat der Datensätze. Ein Datensatz beschreibt die Veränderung
eines Netzwerks über die Zeit. Die zusätzlichen hierarchischen Informationen, die in der Visualisierung als radialer Icicle Plot
dargestellt werden, bleiben konstant über die Zeit. Die Kanten und deren Gewichte (Handelsverbindungen) verändern
sich über die Zeit und mit der Verbindungsart (Produktklasse). Diese Informationen eines Datensatzes werden in drei
CSV-Dateien gespeichert. Die Dateinamen eines Datensatzes sollten den gleichen Präfix haben und sich nur in der
Dateiendung unterscheiden. Die erste Zeile ist jeweils f¨ur den Header reserviert, der beim Einlesen überprüft wird
um eine Verwechslung zu verhindern.
* **Verbindungsarten**
Die möglichen Verbindungsarten werden in einer Datei mit der Endung *.cid.csv gespeichert.
connection_type_id, short_name , long_name
0 ,TOTAL, Total
1 , Apples , Apples
2 , Oranges , Oranges
Listing: Beispiel simple.cid.csv
- connection type id: Index der Verbindungsart
- short name: Eine kurze Bezeichnung
- long name: Eine möglicherweise längere Bezeichnung
**Wichtig:** Die erste Verbindungsart mit der ID 0 ist für TOTAL reserviert. Eine Verbindung vom Typ TOTAL
enthält üblicherweise die Summe aller anderen Verbindungsarten für den gleichen Zeitwert.
* **Hierarchie**
Die hierarchischen Informationen bilden einen Baum und werden in einer Datei mit der Endung *.tree.csv
gespeichert.
node_id , parentid , short_name , long_name
1 ,0 , Root , Root Node
2 ,1 ,EU, ” European Union ”
3 ,1 ,NA, ” North America ”
4 ,2 ,DEU, ” Germany”
5 ,2 , ESP , ” Spain ”
6 ,3 ,CAN, ” Canada ”
7 ,3 ,USA, ” United States”
- node_id: Index des Knotens
- parent_id: Index der Elternknotens
- short_name: Eine kurze Bezeichnung, die z.B. im Icicle Plot verwendet wird
- long_name: Eine möglicherweise längere Bezeichnung, die z.B. in den Tooltips verwendet wird
**Wichtig:** Der erste Knoten mit der ID 1 ist für den Wurzelknoten reserviert. Da dieser keinen Elternknoten hat, ist parent id = 0. Alle Blätter des Baums sollten auf einer Ebene liegen.
* **Verbindungen**
Die hierarchischen Informationen werden in einer Datei mit der Endung *.conn.csv gespeichert.
from_node_id , to_node_id , connection_type_id , value , time
4 ,5 ,0 ,45.4 ,2016
4 ,5 ,1 ,12.1 ,2016
4 ,5 ,0 ,43.0 ,2015
4 ,5 , 1 ,9.8 ,20 15
4 ,6 ,0 ,27.4 ,2016
4 ,6 , 1 ,2.2 ,20 16
. . .
- from node id: Index des Startknotens
- to node id: Index des Zielknotens
- connection type id: Index der Verbindungsart
- value: Das Gewicht (Handelsvolumen)
- time: Ein Zeitwert (meist eine Jahreszahl)
In einer *.conn.csv Datei wird jede Handelsverbindung von jeden Zeitwert (Jahr) und jeder Verbindungsart
gespeichert. Verbindungen sollten nur zwischen Blättern des Baum definiert werden.