2012-03-29 10 views
1

Ich bin neu bei GLUT und opengl. Ich muss eine Streudiagrammmatrix für ein n-dimensionales Array zeichnen. Ich habe die Daten von CSV in einen Vektor von Vektoren gespeichert und jeder Vektor entspricht einer Zeile. Ich habe nur ein Streudiagramm gezeichnet. Und GL_LINES verwendet, um das Raster zu zeichnen. Meine Fragen 1. Wie zeichne ich Punkte in einem bestimmten Raster? Mit GL_POINTS kann ich nur Punkte im gesamten Fenster zeichnen.Zeichnen Sie eine Streudiagramm-Matrix mit Glut, opengl

Bitte lassen Sie mich wissen, jede weitere Informationen benötigen, diese Frage zu beantworten

Dank

+0

Was meinen Sie mit "Punkte in einem bestimmten Raster zeichnen"? Wollen Sie, dass das Gitter mit gepunkteten Linien gezeichnet wird oder dass Sie die Punkte in einer Koordinatenskala zeichnen möchten, die Ihrem Datenbereich entspricht? –

+0

Ich muss das Fenster in Regionen und Plotpunkte in diesen Regionen teilen. Jede Region/jedes Gitter bezieht sich auf ein Streudiagramm. Sagen wir, ich habe 400 * 400 Fenster. Ich unterteile mich in 4 gleiche Regionen. Ich weiß wirklich nicht, wie das funktioniert, da ich völlig neu bin. – user1302064

Antwort

1

Was müssen Sie in der Lage ist zu tun, um Ihre Daten des (x, y) Koordinaten in Bildschirmkoordinaten zu transformieren. Die einfachste Art und Weise, dies zu tun, ist nicht auf OpenGL oder GLUT angewiesen. Alles, was Sie tun müssen, ist ein bisschen Mathe. Ermitteln Sie die Bildschirmkoordinaten (x, y) des Ortes, an dem ein Datenpunkt für (0,0) auf dem Bildschirm angezeigt werden soll, und bestimmen Sie dann, wie weit ein Inkrement auf dem Bildschirm auseinander liegen soll. Nehmen Sie einfach Ihre ursprünglichen Datenpunkte, wenden Sie den Offset an und skalieren Sie sie dann, um Ihre Bildschirmkoordinaten zu erhalten, die Sie dann an glVertex2f() übergeben (oder an die Funktion, die Sie verwenden, um Punkte in Ihrer API anzugeben).

Sie können beispielsweise festlegen, dass der Punkt (0,0) in Ihren Daten auf dem Bildschirm (200,0) und der Abstand zwischen 0 und 1 in Ihren Daten 30 Pixel beträgt Bildschirm. Dieser Vorgang wird wie folgt aussehen:

int x = 0, y = 0; //Original data points 
int scaleX = 30, scaleY = 30; //Scaling values for each component 
int offsetX = 100, offsetY = 100; //Where you want the origin of your graph to be 

// Apply the scaling values and offsets: 
int screenX = x * scaleX + offsetX; 
int screenY = y * scaleY + offsetY; 

// Calls to your drawing functions using screenX and screenY as your coordinates 

Sie müssen Werte bestimmen, den Sinn für das scalaing und Offsets zu machen. Sie können auch unterschiedliche Werte für verschiedene Datensätze verwenden, um mehrere Grafiken auf demselben Bildschirm anzuzeigen. Aber das ist ein einfacher Weg, es zu tun.

Es gibt auch andere Möglichkeiten, wie Sie das tun können. OpenGL hat sehr leistungsfähige Koordinatentransformationsfunktionen und Matrixmathematikfunktionen. Diese können nützlicher werden, wenn Sie immer ausgefeiltere Programme entwickeln. Sie sind am nützlichsten, wenn Sie Dinge in Echtzeit auf dem Bildschirm bewegen oder mit unglaublich großen Datensätzen arbeiten, da sie Ihnen erlauben, diese mathematischen Berechnungen sehr schnell mit Ihrer Grafikhardware durchzuführen (die in der Lage ist, mach sie viel schneller als die CPU). Jedoch ist die Zeit, die die CPU benötigt, um einfache Berechnungen wie jene durchzuführen, bei denen Sie sie nur einmal oder sehr selten auf begrenzten Datensätzen ausführen werden, für Computer heute kein Problem.

+0

Vielen Dank für Ihre schnelle Antwort. Ich werde das ausprobieren. – user1302064

+0

Ich habe meinen Code basierend auf dieser Logik implementiert. Es hat perfekt funktioniert! Danke eine Tonne :) – user1302064

+0

@ user1302064 du bist willkommen! Bitte markieren Sie es dann als akzeptiert. –