即使重读后 Gnuplot 也没有正确更新
Gnuplot not updating correctly even after reread
我正在尝试通过 gnuplot-iostream 绘制两个在 gnuplot 中平移和旋转的 3D 对象。在我的 .cpp 文件中,我有一个进行 100 次迭代的 for 循环。对于每次迭代,我希望绘制的 .dat 文件都会发生变化,因此我希望我的绘图能够移动。
我已将我的 gnuplot 设置为持久化,因此绘图应该 "animate" 通过 100 次迭代,但出于某种原因,我得到了一个移动两次的错误结果(首先是数字的不完整版本,然后第二个反映了写入 .dat 文件中的最后数据以及完整的数字。它在其余的迭代中保留该图)。
除了那两个我根本没看到rotate/translate的数字,而且他们也是大跃进。我应该能够看到我的数字在 space 中缓慢移动,但不知何故它从中途走到了尽头。每次我尝试关闭 gnuplot window,它都会自动打开一个新的,并保持相同的情节。然后我需要一遍又一遍地关闭所有这些,直到没有更多可以关闭。
在此之前,我有一个动画,我决定只将所有数据写入文件并以这种方式绘制。但问题是它会从头到尾绘制我图形的每个 translation/rotation,所以整个图看起来像一个巨大的颜色斑点。另一个问题是我希望绘图与我的程序中正在执行的特定数学相对应,因此将绘图保存到最后在视觉上没有用。
目前我有一些东西看起来像:
int main()
{
Gnuplot gp;
for(int i = 0; 1 < 100; i++)
{
// open 3dfigure.dat file
// bunch of math
...
for(int j = 0; j < vector.size(); j++)
{
// more math
for(int k = 0; vector(j).size(); k++)
{
// write or overwrite 3dfigure.dat file
}
}
gp<<"splot [-6:6] [-2:2] [-1:4] '3dfigure.dat' u 1:2:3 w lines \n";
gp<<"pause 1 \n";
gp<<"reread \n";
// close 3dfigure.dat file
}
}
我已经尝试了各种关于放置绘图代码的安排,我要么得到 100 次相同外观图的迭代,要么得到一个空图。我认为我安排代码的方式存在缺陷(起初我认为我重读没有任何变化所以我会在 splot 之前重读......没有真正起作用!)
所以为了让我在同一个 window 上绘制我的两个图形的旋转和平移,我必须完全改变我的方法。事实证明,我什至不需要使用整个 Gnuplot gp(gnuplot -persist),也不需要刷新、重绘、重读、清除等。
我使用 send1d 输入我的数据,而不是不断地写入文件。我做了两个容器来容纳我的人物的脸,两个都是元组向量。例如:
std::vector<std::tuple<double,double,double>> faces1;
std::vector<std::tuple<double,double,double>> faces2;
对于每次迭代,我将面孔推入那些容器(即 faces1.push_back(std::make_tuple(x,y,z));
)
我通过执行 ff 来绘制它:
gp<<"splot '-' u 1:2:3 w lines, '-' u 1:2:3 w lines \n";
gp.send1d(face1);
gp<<"pause 0.5 \n";
gp.send1d(face2);
faces1.clear();
faces2.clear();
这对我有用,因为我的绘图已经发生在 for 循环中,所以它必然会更新。 I对于每次迭代,我们从两个空向量开始以填充新数据。不清除向量将使所有先前的数据都被推回,您最终将绘制每个 rotation/translation。
不确定是否有其他方法可以更有效地做到这一点,但这确实解决了我的问题。我希望这可以帮助将来处理类似事情的人。
我正在尝试通过 gnuplot-iostream 绘制两个在 gnuplot 中平移和旋转的 3D 对象。在我的 .cpp 文件中,我有一个进行 100 次迭代的 for 循环。对于每次迭代,我希望绘制的 .dat 文件都会发生变化,因此我希望我的绘图能够移动。
我已将我的 gnuplot 设置为持久化,因此绘图应该 "animate" 通过 100 次迭代,但出于某种原因,我得到了一个移动两次的错误结果(首先是数字的不完整版本,然后第二个反映了写入 .dat 文件中的最后数据以及完整的数字。它在其余的迭代中保留该图)。
除了那两个我根本没看到rotate/translate的数字,而且他们也是大跃进。我应该能够看到我的数字在 space 中缓慢移动,但不知何故它从中途走到了尽头。每次我尝试关闭 gnuplot window,它都会自动打开一个新的,并保持相同的情节。然后我需要一遍又一遍地关闭所有这些,直到没有更多可以关闭。
在此之前,我有一个动画,我决定只将所有数据写入文件并以这种方式绘制。但问题是它会从头到尾绘制我图形的每个 translation/rotation,所以整个图看起来像一个巨大的颜色斑点。另一个问题是我希望绘图与我的程序中正在执行的特定数学相对应,因此将绘图保存到最后在视觉上没有用。
目前我有一些东西看起来像:
int main()
{
Gnuplot gp;
for(int i = 0; 1 < 100; i++)
{
// open 3dfigure.dat file
// bunch of math
...
for(int j = 0; j < vector.size(); j++)
{
// more math
for(int k = 0; vector(j).size(); k++)
{
// write or overwrite 3dfigure.dat file
}
}
gp<<"splot [-6:6] [-2:2] [-1:4] '3dfigure.dat' u 1:2:3 w lines \n";
gp<<"pause 1 \n";
gp<<"reread \n";
// close 3dfigure.dat file
}
}
我已经尝试了各种关于放置绘图代码的安排,我要么得到 100 次相同外观图的迭代,要么得到一个空图。我认为我安排代码的方式存在缺陷(起初我认为我重读没有任何变化所以我会在 splot 之前重读......没有真正起作用!)
所以为了让我在同一个 window 上绘制我的两个图形的旋转和平移,我必须完全改变我的方法。事实证明,我什至不需要使用整个 Gnuplot gp(gnuplot -persist),也不需要刷新、重绘、重读、清除等。
我使用 send1d 输入我的数据,而不是不断地写入文件。我做了两个容器来容纳我的人物的脸,两个都是元组向量。例如:
std::vector<std::tuple<double,double,double>> faces1;
std::vector<std::tuple<double,double,double>> faces2;
对于每次迭代,我将面孔推入那些容器(即 faces1.push_back(std::make_tuple(x,y,z));
)
我通过执行 ff 来绘制它:
gp<<"splot '-' u 1:2:3 w lines, '-' u 1:2:3 w lines \n";
gp.send1d(face1);
gp<<"pause 0.5 \n";
gp.send1d(face2);
faces1.clear();
faces2.clear();
这对我有用,因为我的绘图已经发生在 for 循环中,所以它必然会更新。 I对于每次迭代,我们从两个空向量开始以填充新数据。不清除向量将使所有先前的数据都被推回,您最终将绘制每个 rotation/translation。
不确定是否有其他方法可以更有效地做到这一点,但这确实解决了我的问题。我希望这可以帮助将来处理类似事情的人。