Ubuntu Suomen keskustelualueet
Ubuntun käyttö => Multimedia ja grafiikka => Aiheen aloitti: teele - 10.08.18 - klo:14.12
-
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 :(
-
Ohjelmasi tuottaa siis tällaisen Gnuplot-skriptin:
set style data lines
set xrange [0:11]
set yrange [0:30]
plot '-'
0 3.000000
1 3.841471
2 3.909297
3 3.141120
4 2.243198
5 2.041076
6 2.720585
7 3.656987
8 3.989358
9 3.412118
plot '-'
0 0
1 2
2 4
3 6
4 8
5 10
6 12
7 14
8 16
9 18
e
Oikea syntaksi on tällainen:
set style data lines
set xrange [0:11]
set yrange [0:30]
plot '-', '-'
0 3.000000
1 3.841471
2 3.909297
3 3.141120
4 2.243198
5 2.041076
6 2.720585
7 3.656987
8 3.989358
9 3.412118
e
0 0
1 2
2 4
3 6
4 8
5 10
6 12
7 14
8 16
9 18
e
-
Kiitos :)
Piirtää hyvin.
#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++) // liikkuvan käyrän toistokerrat
{
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]);
}
fprintf(pipe,"e\n"); // ensimmäinen käyrä valmis, e
for(int j = 0; j < 10; j++)
{
fprintf(pipe, "%d %d\n", j, 2*j );
}
fprintf(pipe,"e\n"); // toinen käyrä valmis, 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;
}
// g++ koe01.cpp -Wall -pedantic -std=c++11 -o koe01