对于那些已经使用了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;
}
这非常有效,我明白了:
现在的问题是:鉴于我正在使用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 ++项目中,同时执行),然后对该文件进行“绘制”,但是我会为每次交互创建很多文件(因为我将有多个向量),并且我不想最终使用此解决方案。
我想将3D点向量插入gnuplot并没有一种超级简单的方法,但是只要知道如何用X,Y和Z至少“绘制”两个数字,我就可以解决这个问题。坐标。
答案 0 :(得分:3)
感谢@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");
这是我执行代码时的绘图结果。