2016-05-17 15 views
0

Ich arbeite an einer Flussvisualisierungsaufgabe, bei der ich die Daten in irgendeiner Weise analysieren muss. Die Visualisierung wird von jemand anderem geschrieben und erwartet einen Vektor von GLFloat, der die Daten enthält. Ich würde jedoch viel lieber eine Klassenstruktur wie unten haben. Gibt es eine Möglichkeit, dies zu erreichen, ohne die Daten zu kopieren (wie eine Union)?Zwei Vektoren mit gleichen Daten, aber unterschiedlichen Typen

struct Vertex 
{ 
    math::vec3 pos; 
    float time; 
    float velocity; 
}; 

class Pathline 
{ 
    std::vector<Vertex> points; 
}; 

//these have the same data 
std::vector<Pathline> lines; 
std::vector<GLfloat> lineData; 

Dank

+1

Die Daten scheinen eine sehr unterschiedliche Struktur zu haben. Nein, Sie können keine Union verwenden, wenn Sie auf Portabilität Wert legen. – user2079303

+0

In welchem ​​Format müssen sich die Daten befinden? Wenn es fünf Floats in Folge erwartet, würden Sie höchstwahrscheinlich von den Interna des Vektors profitieren. Aber nicht, wenn es Vektoren in einem Vektor gibt. –

+0

Wie erkennen Sie die Anzahl der Pfadlinien von lineData? Speichern Sie diese Informationen irgendwo? –

Antwort

0

Von Ihrem Beispiel kommen einige Probleme meiner Meinung nach:

  • GLfloat nicht mit Schwimmer kompatibel sein muss.
  • Sie wissen nicht, wie viele Pathlines Sie haben, also könnten Sie 3 Pfadlinien von 2 Eckpunkten oder 6 Pfadlinien von einem Eckpunkt oder jede andere Kombination haben.
  • std :: vector nicht sicherstellen, ein Vielfaches von 5 GLfloat, also Ihre Konvertierung Relais auf diese semantische Einschränkung.
  • Klassen/Strukturen werden normalerweise vom Compiler ausgerichtet, dh Ihr Vertex könnte mehr als erwartet sein.

Wahrscheinlich könnten Sie Ihre Struktur zu so etwas wie umformulieren:

struct Vertex 
{ 
    GLfloat[3] pos; 
    GLfloat time; 
    GLFloat velocity; 
}; 

std::vector<Vertex> lineVertexData; 
std::vector<GLfloat> lineData; 

Und wenn Sie zusätzliche externe Daten haben die Bahnlinien zu definieren, könnten Sie einen Schritt weiter gehen.

Alles hängt davon ab, wie weit Sie "philosophisch korrekt" C++ Code machen wollen. Manchmal schwierig mit OpenGL zu erreichen.

Sobald Ihre 2 Strukturen äquivalent sind, können Sie Ihren Zeiger/Referenz zwischen. Aber diese Äquivalenz ist nicht ganz einfach.

Beantwortung Ihrer Frage:

  • Ist es möglich? nein mit deinem aktuellen Code.
  • Ist es mit einigen Änderungen möglich? Ja, auch wenn nicht empfohlen.