Нарисуйте множество точек, линий в Gnuplot - PullRequest
5 голосов
/ 05 марта 2019

Я думаю, что это может быть очень простой вопрос для кого-то, кто уже использовал команды gnuplot и "splot", но я не могу понять это сейчас, так как это мой первый день использования этой программы.

Я добился связывания своего проекта c ++ с gnuplot, поэтому я могу создать Datafile.dat в следующем формате:

# Xcoord Ycoord Zcoord
1 2 1
2 1 1
3 1 1
3 2 2
3 3 3

И в моем файле C ++ я делаю:

#include "gnuplot.h"
#include <iostream>
using namespace std;
int main() {
    Gnuplot plot;
    plot("set border 4095");
    plot("splot \"C:/\\Users/\\lRaulMN/\\Desktop/\\Datafile.dat\" with lines");
    return 0;
}

Это отлично работает, и я получаю это:

View

Теперь вопрос: учитывая 5 точек, которые я использую, есть ли способ разбить эти числа без необходимости создания Datafile.dat?

Потому что в будущем в моем коде будет что-то вроде этого:

#include "gnuplot.h"
#include <iostream>
#include <vector>
using namespace std;
typedef struct {
    double Time;
    double X;
    double Y;
    double Z;
} DimensionalPoint;

int main() {
    Gnuplot plot;
    plot("set border 4095"); 
    vector<DimensionalPoint> test;
    plot("splot \"C:/\\Users/\\lRaulMN/\\Desktop/\\Datafile.dat\" with lines");
    return 0;
}

Таким образом, моя идея состояла в том, чтобы заполнить тестовый вектор числами (вычислите их в моем коде c ++), а затем как-нибудь вызвать splot и представить эти числа.

Первой идеей, которая пришла в голову, было создание файла с числами (в проекте c ++ при выполнении), а затем создание «splot» для этого файла, однако я бы создавал много файлов для каждого взаимодействия (потому что У меня будет несколько векторов) и я не хочу в конечном итоге использовать это решение.

Я думаю, что не будет супер простого способа вставить вектор трехмерных точек в gnuplot, но я могу с этим справиться, как только я знаю, как "разбить" по крайней мере два числа на X, Y и Z координаты.

1 Ответ

3 голосов
/ 06 марта 2019

Благодаря @Thor и @Bob я нашел решение.

Сначала я создаю метод "doubletoString":

string doubletoString(double value) {
    std::ostringstream origin;
    origin << value;
    std::string str = origin.str();
    return str;
}

Затем я создаю несколько 3D-точек, чтобы попробовать.

vector<DimensionalPoint> test;
DimensionalPoint A, B, C, D;
A.X = 1; A.Y = 1; A.Z = 1;
B.X = 2; B.Y = 2; B.Z = 3;
C.X = 1.2; C.Y = 2.4; C.Z = 2.3;
D.X = 8; D.Y = 3; D.Z = 1;
test.push_back(A);
test.push_back(B);
test.push_back(C);
test.push_back(D);

А затем я отправляю эти сообщения в GNUplot.

plot("set border 4095");
plot("$DATA << EOD"); 
double Xaux, Yaux, Zaux;
for (int i = 0; i < test.size(); i++) {
    Xaux = test.at(i).X;
    Yaux = test.at(i).Y;
    Zaux = test.at(i).Z;        
    plot(doubletoString(Xaux) + " " + doubletoString(Yaux) + " " + 
    doubletoString(Zaux));
}
plot("EOD");
plot("splot $DATA with lines");

Это результат построения, когда я выполняю код.

Plot generated by GNUplot

...