即使重读后 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。

不确定是否有其他方法可以更有效地做到这一点,但这确实解决了我的问题。我希望这可以帮助将来处理类似事情的人。