10
votes

Comment tracer des graphiques dans Gnuplot en temps réel en C ++?

J'essaie de tracer un graphique en temps réel en utilisant Gnuplot et C ++. Est-ce que quelqu'un connaît de bonnes bibliothèques qui fait cela? Merci


0 commentaires

5 Réponses :


1
votes

Si vous êtes intéressé par le tracé en temps réel doux, vous êtes probablement le meilleur de l'utilisation d'une API graphique accélérée matérielle (telle que OpenGL) et de la traçage de la carte vous-même.


3 commentaires

Suis vraiment espérant utiliser Gnuplot, car c'est ce que je sais que je sais, j'ai vu diverses interfaces qui diffusent des données réelles dans Gnuplot à l'aide de Perl, mais parce que c'est une mission pour mon cours uni, le directeur du cours veut vraiment que je le fasse dans C ++.


Définissez ce que «temps réel» signifie pour vous. Si cela signifie "25 mises à jour par seconde", alors gnuplot n'est probablement pas pour vous.


1 tracé une seconde est beaucoup pour moi.



4
votes

GNUPLOT prend en charge l'entrée via des tuyaux (sous Windows, il existe un exécutable distinct pour cela, pgnuplot ). Ensuite, votre programme peut envoyer de nouvelles commandes à gnuplot, telles que replot , comme si vous les saisissez directement dans l'interface GNUPLOT.

Comment vous configurez la connexion de tuyau et l'écriture à l'extrémité d'envoi du tuyau à partir de votre programme C ++ varie selon le système d'exploitation, vous devrez donc nous dire ce que vous utilisez si vous voulez plus d'aide.

sur Windows, il y a CreateEpipe , puis définissez l'élément hstdinput de l'élément STARTUPINFO struct que vous passez à CreateProcess . Idem avec hstdoutput Si vous avez besoin des messages d'état de pgnuplot .

sur POSIX (UNIX, Linux, Mac OSX, etc.), vous pouvez simplement utiliser popen comme moyen rapide d'obtenir une connexion unidirectionnelle. Pour bidirectionnelles, cela fonctionne plus sur Windows: tuyau pour obtenir des poignées aux extrémités, puis Fourche et dans l'appel de processus enfant DUP2 pour associer STDIN et STDOUT avec le tuyau, puis EXEC pour avoir gnuplot Remplacez le processus enfant, en gardant les tuyaux que vous avez configurés.

EDIT: de La documentation Gnuplot :

Le nom de fichier spécial '-' spécifie que les données sont en ligne; c'est-à-dire qu'ils Suivez la commande. Seulement les données Suivez la commande; Terrain Options comme Filtres, titres et styles de ligne rester sur la ligne ligne de commande. Cette est similaire à << dans UNIX Shell Script, et $ pont dans la DCL VMS. Les données sont entré comme s'il est lu d'un fichier, un point de données par enregistrer. La lettre "e" au début de La première colonne termine les données entrée. L'option en utilisant peut être appliquée à ces données - l'utiliser pour filtrer eux à travers une fonction pourrait faire sens, mais sélectionner des colonnes probablement Ne pas!


2 commentaires

Je pensais que, mais quelles sont les commandes pour envoyer des points individuels? Je sais seulement comment le dire de tracer un fichier de données ou une fonction. Comment puis-je comploter comme x1 Y1, X2 Y2, point par point?


@chutsu: Je n'ai pas fourni ces détails parce que vous avez dit que vous connaissiez déjà la partie gnuplot. Quoi qu'il en soit, a ajouté le paragraphe pertinent de la documentation.



3
votes

Avez-vous essayé interfaces Gnuplot dans ANSI C ?, il s'agit d'une interface pour C mais dans le mêmes liens Il existe une interface pour C ++. Ou vous pouvez essayer Plplot .


0 commentaires

1
votes

Regardez http://search.cpan.org/~dkogan/ FeedGeNuplot-1.08 / Bin / FeedGeNuplot Il s'agit d'un utilitaire de commande de commande, mais fonctionne également bien s'il est contrôlé à partir d'un programme.


1 commentaires

Également disponible en homebrew pour Mac OS - Brew Install FeedGnuplot



0
votes

Dans mon code C ++, cela fonctionnait (sur Mac OSX Mavericks, utilisant g ++ Apple LLVM version 5.0):

#include <sys/types.h>
#include <unistd.h>

...

// ready to make a plot

pid_t childpid=fork();
if(childpid==0) {
  // child process makes plot
  std::FILE* pipehandle=popen("gnuplot -persist","w");
  // make some plot. You can send multiple commands to the pipe each ending in \n
  std::fprintf(pipehandle,"plot \"results.txt\" using 1:2 with lines\n");
  std::fprintf(pipehandle,"quit\n");
  std::fflush(pipehandle);
  std::fclose(pipehandle);
  // child process exits
  exit(0);
}
// parent process waits for child process to exit
waitpid(childpid,NULL,0);

// you can now repeat to make other gnuplots; all will appear simultaneously in the 
// terminal and are persistent after the parent process has finished.


1 commentaires

Cela devrait être possible sans avoir à ouvrir une application de gnuplot externe - toute modification que vous savez faire cela sous Windows - je sais que cela se fait via. fx. Sigpack sur Ubuntu