在MATLAB中使用点数据创建电影,以进行简单的N体仿真

时间:2011-11-20 00:12:20

标签: matlab

我正在尝试用C ++中的4个粒子编写一个简单的n体重力模拟。我将4个粒子的位置输出到标记为“time_X.mat”的.mat文件中(其中X = 1,2,3 ....表示时间戳),其形式为4x2矩阵,其中 第i行表示在时间X的第i个粒子的(x,y)cooridinates。

现在,对于特定的时间步,我可以将.mat文件加载到MATLAB中,并获得矩阵中点的散点图,显示粒子位置。但我想在time_X.mat文件的所有.mat文件/散点图中创建一部电影,它向我展示了4粒子系统的演变。我应该如何在MATLAB中做到这一点?

1 个答案:

答案 0 :(得分:0)

首先,您必须为模拟的每个时间步骤制作帧(图像)。

由于您有笛卡尔坐标,因此必须将x和y坐标转换为像素索引,并从中创建图像矩阵。有关如何执行此操作的示例,请参阅我的answer相关问题。您还可以修改代码以使您的点大于像素,具有形状等,可能使用strel[a,b,~] = sphere(N)

拥有帧后,您可以在MATLAB中轻松制作AVI文件(未压缩或MPEG):

aviOutput = fullfile('path','to','file.avi');
aviobj = VideoWriter(aviOutput);
aviobj.Quality = 100;
aviobj.FrameRate = 24; %# arbitrary
open(aviobj);
for i=1:length(frames)
    writeVideo(aviobj,frames{i}); %# or frames(:,:,i) etc.
end
close(aviobj);

<强>更新

以上假设时间步骤全部可用。例如:

files = dir('path/to/dir');
files(1:2) = []; %# . and ..
orderedfiles = cell(length(files),1);
for i=1:length(files)
   ind = sscanf(files(i).name,[name '%*[_]%u%*s']);
   orderedfiles{ind+1} = files(i).name;
end
timeSteps = zeros(numPoints,2,length(orderedfiles));
for i=1:length(orderedfiles)
    temp = load(orderedfiles(i).name);
    timeSteps(:,:,i) = temp.matrixName %# All the same name?
end

来自链接答案的代码是为了对两个向量xy进行操作,并使用timeSteps(:,1,i)timeSteps(:,2,i)得到的坐标进行操作对于每个时间步。