2010-02-01 8 views
9

Ich versuche die Pipe-Schnittstelle zu Gnuplot zu verwenden (ein Standard-gnuplot_i. {Cpp, hpp}), um eine Echtzeitanzeige von Werten zu erzeugen, die sich ständig ändern Programm in C++ geschrieben. Das funktioniert gut, aber ich wollte sehen, ob jemand Verbesserungsvorschläge hat.Visualisierung von C/C++ über die Gnuplot Pipe-Schnittstelle

Diese Implementierung enthält eine bequeme Methode zum Zeichnen eines einzelnen Vektors und von 2 Vektoren als 2D-Diagramm. Dies wurde erreicht, indem über einen Standardbibliotheksaufruf in die mktemp-Funktion in eine temporäre Datei geschrieben und diese dann als Eingabe für einen gnuplot-Plotaufruf verwendet wurde. Dies erzeugte zu viele temporäre Dateien und schien nicht gut zu funktionieren, wenn die Aktualisierungsrate auf dem Diagramm hoch ist (möglicherweise zu einem Zeitpunkt auf IO beschränkt). Ich habe mich entschieden, die '-' Pseudodatei im Plot-Aufruf zu verwenden und die Vektoren einfach direkt an die Pipe zu senden (beendet mit einer einzelnen Zeile mit "e" darauf). Das funktioniert besser, ist aber immer noch nicht großartig.

Gibt es eine slicker Möglichkeit zu tun, was ich versuche zu tun, als die Grafik kontinuierlich zu regenerieren, wenn sich die Werte geändert haben? Wie oft ist es sicher, um die Handlung mit neuen Informationen zu aktualisieren? Oder vielleicht gibt es einen viel einfacheren Weg, um zu erreichen, was ich versuche zu tun?

@Andy Ross

Ich habe keine "Anforderungen" per se. Was ich mit Slick meinte, war, dass es vielleicht einen eleganteren Ansatz gab, das zu tun, was ich versuchte, als ich noch Gnuplot benutzte. Obwohl elegant ist subjektiv, finde ich den Ansatz, den ich derzeit besonders unelegant nehme. Was ich mit Sicherheit meinte, war, ob irgendjemand wusste, mit welcher Aktualisierungsrate IO-Probleme (z. B. Latenz, Sperrung der Anzeige usw.) bei diesem Ansatz auftreten würden.

Ich möchte vermeiden, ein Toolkit aus den folgenden Gründen zu verwenden (zumindest meine kurze Liste).

  • Ich habe festgestellt, dass sie in der Regel nicht trivial auf verschiedenen Architekturen, insbesondere als nicht-root (und wenn sie Abhängigkeiten, die nicht standardmäßig über Betriebssysteme erforderlich sind) installieren.
  • Sie verursachen eine zusätzliche Kompilierungsabhängigkeit für andere Personen, die diese Software verwenden.
  • Es scheint nicht wirklich Standard, dass die meisten Menschen für diesen Zweck afiak verwenden (ich selbst sowie die meisten Menschen, mit denen ich arbeite in der Regel speichert nur Log-Dateien und Post-Lauf-Analyse in MATLAB).
  • Ich weiß/gnuplot Syntax lernen. Ich kenne die Syntax von SuperPlottingApiXX nicht.
  • Das Feature-Set von Gnuplot ist fast ideal für die Dinge, die ich gerne mit dieser Software machen könnte.
  • Wenn Sie jedoch irgendwelche besonderen Vorschläge in Bezug auf C/C++ - Plotbibliotheken haben, die angesichts der obigen Liste wie eine gute Lösung erscheinen, bin ich immer an Vorschlägen interessiert (Warnung: Ich habe mich schon ein bisschen umgesehen finde sie).

    Antwort

    0

    Slicker? Sicher? Können Sie genauer auf Ihre Anforderungen eingehen?

    Es klingt wie Sie versuchen, eine animierte Visualisierung mit einem Tool zum Erstellen statischer Bilder zu erstellen. Wenn Ihre Anzeige so einfach ist, wie Sie sagen, warum nicht eine schnelle GUI-App schreiben (mit dem Toolkit Ihrer Wahl), um stattdessen die Zeichnung zu machen?

    2

    gibt es eine C2gnuplot Bibliothek, die ich vor ein paar Jahren schrieb. Es ist sehr einfach, aber kann Ihnen einige Tipps geben.Im Grunde verwendet es FIFO-Dateien, um Daten in Gnuplot zu übergeben. Es ist in der Lage, Animation von den Plots zu erzeugen. Here ist ein Video mit der App erstellt. Ich hoffe, dass dies für Sie nützlich sein wird.

    +0

    Danke, das Video sieht glatter aus als das, was ich mit der Implementierung erhalte, die ich benutze, so dass es durchaus einige Verbesserungen in Ihrer Implementierung geben kann. Habe noch keine Chance, den Code zu sehen, aber ich werde Sie wissen lassen, ob das mein Problem löst. – bpw1621

    3

    gnuplot-cpp ist eine objektorientierte C++ - Wrapper-Schnittstelle um eine POSIX-Pipe-Verbindung mit Gnuplot.

    Die Beispieldatei kompiliert sofort und der Schnittstellencode sieht anständig aus; Ich werde es in meinem aktuellen Projekt versuchen.

    +0

    Nur um Sie wissen zu lassen. Es gibt ein Update für die verfügbare gnuplot C++ - Schnittstelle [hier] (https://github.com/orbitcowboy/gnuplot-cpp) – orbitcowboy