【发布时间】:2020-06-10 21:56:35
【问题描述】:
我正在尝试通过 gnuplot-iostream 绘制两个在 gnuplot 中平移和旋转的 3D 对象。在我的 .cpp 文件中,我有一个进行 100 次迭代的 for 循环。对于每次迭代,我希望绘制更改的 .dat 文件,所以我希望我的情节能够移动。
我已将我的 gnuplot 设置为持续存在,因此绘图应该通过 100 次迭代“动画化”,但由于某种原因,我得到了一个非常错误的结果,它移动了两次(首先是不完整的数字版本,然后第二次反映.dat 文件中写入的最后一个数据,其中包含完整的数字。它会在其余的迭代中保留该图)。
除了这两个之外,我根本看不到图形旋转/平移,它们也是大跳跃。我应该能够看到我的身影在空间中缓慢地穿行,但不知怎的,它从中间走到了尽头。每次我尝试关闭 gnuplot 窗口时,它都会自动打开一个新窗口,保持相同的情节。然后我需要一遍又一遍地关闭它们,直到没有更多可以关闭。
在此之前,我有一个动画,我决定将所有数据写入文件并以这种方式绘制。但问题是它会绘制我的人物从头到尾的每一次平移/旋转,所以它看起来就像一个巨大的颜色斑点。另一个问题是我希望绘图与我的程序中正在执行的特定数学相对应,因此将绘图保存到最后不会在视觉上有用。
目前我有一些看起来像:
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 之前重新阅读......并没有真正起作用!)
【问题讨论】:
-
"reread" 在这种情况下不可能是正确的。尝试删除该行。
-
我删除了重读,并保持暂停。还是同样的问题。不过我确实尝试了一些新的东西,每次我必须绘制时都创建一个新的 Gnuplot 实例。它有效,但每次迭代都会绘制 100 个窗口。我只想有一个窗口来绘制所有内容。
-
“关闭 3dfigure.dat 文件”操作应该在您告诉 gnuplot 绘制它之前 进行。否则,更改可能处于挂起状态,但尚未写入文件。话虽如此,我希望结果是连续绘制一个周期过时的数据。
-
谢谢!我确实在绘图之前将其更改为关闭文件,但仍然处理了同样的问题。我刚刚找到了一个修复方法,但方法完全不同。我将在下面为将来需要做类似事情的任何人发布我的答案!
标签: c++ gnuplot gnuplot-iostream