Miten voisi tehdä c++ -pipen kautta 2 käyrää ja niiden datapisteet gnuplotille. Netistä löytyy paljon esimerkkejä tiedostodatan tulostamisesta, mutta pienen pistemäärän laittaisi mielellään suoraan pipen kautta.
Kokeilin alla olevalla ohjelmalla, enkä keksinyt keinoa erottaa käyrät toisistaan
#include<iostream> //fprint ainakin täältä
#include <vector>
#include <algorithm> // sin tulee ainakin täältä
#include <chrono>
#include <thread>
int main()
{
FILE *pipe = popen("gnuplot -persist", "w");
std::vector<double> y(10, 0.0); // y values
fprintf(pipe, "set style data lines \n ");
fprintf(pipe,"set xrange [0:11]\n");
fprintf(pipe,"set yrange [0:30]\n");
for(int i=0; i<1; i++) // 10 plots
{
fprintf(pipe, "%s", "plot '-' \n");
for(int j = 0; j < 10; j++)
{
y[j] = sin(i + j) + 3;
}
for(int j = 0; j < 10; j++)
{
fprintf(pipe, "%d %f\n", j, y[j]); // ensimmäinen käyrä
}
fprintf(pipe, "%s", "plot '-' \n"); // toinen käyrä
for(int j = 0; j < 10; j++)
{
fprintf(pipe, "%d %d\n", j, 2*j);
}
fprintf(pipe,"e\n"); // finally, e
fflush(pipe); // flush the pipe to update the plot
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
fclose(pipe); // close the pipe
return 1;
}
// käyttämäni käännöskomento
// g++ koe01.cpp -Wall -pedantic -std=c++11 -o koe01
Silmukoita on turhaan sisäkkäin, kokeilin myös liikkuvaa käyrää, ja se toimii, mutta ohjelma on niin lyhyt, että kahden käyrän ongelmakin selviää varmaan siitä helposi.
Ehkä jotenkin olisi saatava '-' -lukumuodolle kerrottua, mitä datarivin arvoja haluaa käyttää. Toinen vaihtoehto olisi saada viiva katkaistuksi silloin, kun datasarjat vaihtuvat. En ole onnistunut kummassakaan