Dynamisches(!) Plotten von Messdaten in 2D / 3D



  • Hallo allerseits!

    Ich schreibe derzeit mit C++ an einem Messprogramm für eine mehr oder minder zeitkritsche Messung. Das ganze ist eine einfache Konsolenanwendung (weil ich das Arbeiten mit GUIs bisher nicht beherrsche), und funktioniert für sich genommen schon recht zufriedenstellend.

    Allerdings erleichtert es die Fehlererkennung, wenn man nicht nur die Mess-Ergebnisse fortlaufend durch die Konsole jagt, sondern den aktuellen Zustand und den zeitlichen Verlauf in geeigneter Weise (Liniengraph/Farbkontur) plottet.

    Kann mir jemand eine Bibliothek empfehlen, mit der man "unkompliziert" mehrere Plots in einem Fenster darstellen und periodisch updaten kann? Das ganze darf die Berechnung nicht wesentlich verlangsamen - notfalls zweiter Thread, der auf Daten-Updates wartet. Meinetwegen kann die Lösung unportabel hoch zehn sein, nur funktionieren muss es.

    Mit meiner eingeschränkten Erfahrung habe ich ähnliche Plots bisher nur mit Python und MatPlotLib realisieren können. Zwar bietet Python eine C API ...

    #include <Python.h>
    [...sonstiger Quelltext...]
    Py_Initialize();                           //Interpreter initialisieren
    PyRun_SimpleString("from pylab import *"); //Pylab aus Matplotlib importieren
    PyRun_SimpleString("plot(rand(100))");     //Zufallszahlen plotten
    PyRun_SimpleString("show()");              //Fenster anzeigen
    Py_Finalize()                              //Interpreter schließen
    

    ...damit kann ich aber nur einen einzigen Plot machen, danach verfängt sich das ganze Programm aufgrund des show() -Befehles im Mainloop von PyGTK und läuft erst weiter, wenn das Fenster wieder geschlossen wird. Das Fenster öffnen und plotten ohne den Mainloop zu starten habe ich bisher nicht geschafft - klappt wahrscheinlich auch prinzipiell nicht.

    MfG



  • mit pixeltoaster kannst du ein einfachs fenster aufmachen und dort die pixel deiner wahl setzen.

    du musst die dinge dann zwar selbst implementieren, aber die sache an sich ist recht einfach.

    z.b.
    ein clear waere
    memset(pPixel,Color,BufferSize);

    pixel setzen waere
    pPixel[x+y*width=Color;

    ein sinus plut waere
    for(int x=0;x<width;x++)
    SetPixel(x,sin(x*2.f*PI/width)*height/2+height/2,Color);//das ruft die vorherige pixel setz funktin auf.

    brauchst du mehr? :p



  • Klingt zwar nicht schlecht, aber ich glaube, das ist ein bisschen sehr "low level". Außerdem müsste ich zum Kompilieren von Pixeltoaster das komplette DirectX SDK (>500MB) runterladen und installieren. Wäre da OpenGL nicht doch die bessere Wahl? Damit müsste man doch eigentlich auch malen können...




Anmelden zum Antworten