我有一个正在研究的项目。我是 C++ 和一般编程的初学者。我已经编写了一个程序,可以生成随着时间的推移在连续空间上移动的相互作用粒子。我的程序输出的唯一内容是每个时间步长中每个粒子的 XY 坐标。
我想可视化我的发现,以了解我的粒子是否按照应有的方式移动。我的教授说我必须使用gnuplot
. 由于我找不到将数据输出到一个文件中以便gnuplot
识别它的方法,因此我想到了以下策略:
a) 对于每个时间步,生成一个 XY 坐标格式为“ output_#.dat
”的文件。
b).png
为它们中的每一个生成一个文件gnuplot
。
.png
c) 用所有文件制作移动粒子的电影。
稍后我会担心 b 和 c,但到目前为止,我可以使用以下代码将所有数据输出到一个文件中:
void main()
{
int i = 0;
int t = 0; // time
int j = 0;
int ctr = 0;
double sumX = 0;
double sumY = 0;
srand(time(NULL)); // give system time as seed to random generator
Cell* particles[maxSize]; // create array of pointers of type Cell.
for(i=0; i<maxSize; i++)
{
particles[i] = new Cell(); // initialize in memory
particles[i]->InitPos(); // give initial positions
}
FILE *newFile = fopen("output_00.dat","w"); // print initial positions
for(i=0; i<maxSize; i++)
{
fprintf(newFile, "%f %3 ", particles[i]->getCurrX());
fprintf(newFile, "%f %3 \n", particles[i]->getCurrY());
}
fclose(newFile);
FILE *output = fopen("output_01.dat","w");
for(t = 0; t < tMax; t++)
{
fprintf(output, "%d ", t);
for(i=0; i<maxSize; i++) // for every cell
{
sumX = 0;
sumY = 0;
for(j=0; j<maxSize; j++) // for all surrounding cells
{
sumX += particles[i]->ForceX(particles[i], particles[j]);
sumY += particles[i]->ForceY(particles[i], particles[j]);
}
particles[i]->setVelX(particles[i]->getPrevVelX() + (sumX)*dt); // update speed
particles[i]->setVelY(particles[i]->getPrevVelY() + (sumY)*dt);
particles[i]->setCurrX(particles[i]->getPrevX() + (particles[i]->getVelX())*dt); // update position
particles[i]->setCurrY(particles[i]->getPrevY() + (particles[i]->getVelY())*dt);
fprintf(output, " ");
fprintf(output, "%f %3 ", particles[i]->getCurrX());
fprintf(output, "%f %3 \n", particles[i]->getCurrY());
}
}
fclose(output);
}
这确实生成了 2 个文件,output_00.dat
第output01.dat
一个包含初始随机生成的位置,第二个包含我的所有结果。
我可以感觉到在嵌套for
循环中,我正在更新 XY 坐标的速度和位置,我可以有一个FILE*
将存储每个时间步的坐标,然后在增加时间之前关闭它。这样,我将不需要同时打开多个指针。至少这是我的直觉。
我不知道如何生成递增的文件名。我偶然发现了ofstream
,但我不明白它是如何工作的......
我想我希望我的程序在这一点上做的是:
1) 使用基本名称和当前循环计数器值生成新文件名。
2)打开该文件。
3) 写出该时间步长的坐标。
4) 关闭文件。
5) 重复。
任何帮助将不胜感激。感谢您的时间!