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 p>
5 Réponses :
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. P>
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.
GNUPLOT prend en charge l'entrée via des tuyaux (sous Windows, il existe un exécutable distinct pour cela, 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. P >
sur Windows, il y a sur POSIX (UNIX, Linux, Mac OSX, etc.), vous pouvez simplement utiliser EDIT: de La documentation Gnuplot : P>
Le nom de fichier spécial pgnuplot code>). Ensuite, votre programme peut envoyer de nouvelles commandes à gnuplot, telles que
replot code>, comme si vous les saisissez directement dans l'interface GNUPLOT. P>
CreateEpipe Code>, puis définissez l'élément
hstdinput code> de l'élément
STARTUPINFO code> struct que vous passez à
CreateProcess code >. Idem avec
hstdoutput code> Si vous avez besoin des messages d'état de
pgnuplot code>. P>
popen code> comme moyen rapide d'obtenir une connexion unidirectionnelle. Pour bidirectionnelles, cela fonctionne plus sur Windows:
tuyau code> pour obtenir des poignées aux extrémités, puis
Fourche code> et dans l'appel de processus enfant
DUP2 code> pour associer STDIN et STDOUT avec le tuyau, puis
EXEC code> pour avoir
gnuplot code> Remplacez le processus enfant, en gardant les tuyaux que vous avez configurés. P>
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.
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 . P>
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. P>
Également disponible en homebrew pour Mac OS - Brew Install FeedGnuplot
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.
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