几个点同时进行的Matlab动画
Matlab animation of several points simultaneously
我正在尝试在 Matlab 上模拟一些二维粒子的轨迹。我有这些粒子的 x 和 y 坐标作为时间的函数,我将其存储为矩阵 x 和 y。 x 和 y 中的列对应于时间,而行对应于粒子数:1、2 等
我知道如何为一个粒子做带停顿的动画,但我不知道如何为多个粒子的轨迹定制代码。基本上,我的想法是,在初始图上,我有 3 个标记对应于粒子的初始位置,比如粒子 A、B 和 C。然后,我想跟随这 3 个标记的移动,这里是我遇到问题的地方:我不知道如何根据粒子身份对后续点进行排序。例如,我想指定我在第二个时间点绘制的第一个点为粒子A,第二个点为粒子B,第三个点为粒子C。
我做过类似的事情,但是在我的模拟中,粒子的数量可能是 100,这使得创建 x1, x2, ..., x100, y1, y2, ..., y100 动画工作:
y = rand(3, 20); % Generate random sample data.
x = rand(size(y, 1), size(y, 2));
% Now we have x and y sample data and we can begin.
% Extract into separate arrays
x1 = sort(x(1,:));
x2 = sort(x(2,:));
x3 = sort(x(3,:));
y1 = y(1,:);
y2 = y(2,:);
y3 = y(3,:);
for k = 1 : length(x1)
plot(x1(1:k), y1(1:k), 'r*-', 'LineWidth', 2);
xlim([min(x(:)), max(x(:))]);
ylim([min(y(:)), max(y(:))]);
grid on;
hold on;
plot(x2(1:k), y2(1:k), 'g*-', 'LineWidth', 2);
plot(x3(1:k), y3(1:k), 'b*-', 'LineWidth', 2);
hold off;
fprintf('Plotted points 1 through %d\n', k);
pause(0.8);
end
如有任何想法或建议,我们将不胜感激!
为了一次绘制所有图形,我们可能会制作一个二维数组。
下面是一个例子。
y = rand(3, 20); % Generate random sample data.
x = rand(size(y, 1), size(y, 2));
% Now we have x and y sample data and we can begin.
% Extract into separate arrays
x = sort(x');
y=y';
M=size(x);
N=M(2);
for k = 1 : length(x)
if k==1;
zeroPad=zeros(1,N);
x0=[zeroPad;x(1,1:N)];
y0=[zeroPad;y(1,1:N)];
plot(x0(1:2,1:N), y0(1:2,1:N), '*', 'LineWidth', 2);
else
plot(x(1:k,1:N), y(1:k,1:N), '*-', 'LineWidth', 2);
end
xlim([min(x(:)), max(x(:))]);
ylim([min(y(:)), max(y(:))]);
grid on;
fprintf('Plotted points 1 through %d\n', k);
pause(0.8);
end
增加了一个技巧。
在第一次迭代中,我在 x 和 y 之前添加了零。
删除了一些不必要的代码。
我正在尝试在 Matlab 上模拟一些二维粒子的轨迹。我有这些粒子的 x 和 y 坐标作为时间的函数,我将其存储为矩阵 x 和 y。 x 和 y 中的列对应于时间,而行对应于粒子数:1、2 等
我知道如何为一个粒子做带停顿的动画,但我不知道如何为多个粒子的轨迹定制代码。基本上,我的想法是,在初始图上,我有 3 个标记对应于粒子的初始位置,比如粒子 A、B 和 C。然后,我想跟随这 3 个标记的移动,这里是我遇到问题的地方:我不知道如何根据粒子身份对后续点进行排序。例如,我想指定我在第二个时间点绘制的第一个点为粒子A,第二个点为粒子B,第三个点为粒子C。
我做过类似的事情,但是在我的模拟中,粒子的数量可能是 100,这使得创建 x1, x2, ..., x100, y1, y2, ..., y100 动画工作:
y = rand(3, 20); % Generate random sample data.
x = rand(size(y, 1), size(y, 2));
% Now we have x and y sample data and we can begin.
% Extract into separate arrays
x1 = sort(x(1,:));
x2 = sort(x(2,:));
x3 = sort(x(3,:));
y1 = y(1,:);
y2 = y(2,:);
y3 = y(3,:);
for k = 1 : length(x1)
plot(x1(1:k), y1(1:k), 'r*-', 'LineWidth', 2);
xlim([min(x(:)), max(x(:))]);
ylim([min(y(:)), max(y(:))]);
grid on;
hold on;
plot(x2(1:k), y2(1:k), 'g*-', 'LineWidth', 2);
plot(x3(1:k), y3(1:k), 'b*-', 'LineWidth', 2);
hold off;
fprintf('Plotted points 1 through %d\n', k);
pause(0.8);
end
如有任何想法或建议,我们将不胜感激!
为了一次绘制所有图形,我们可能会制作一个二维数组。
下面是一个例子。
y = rand(3, 20); % Generate random sample data.
x = rand(size(y, 1), size(y, 2));
% Now we have x and y sample data and we can begin.
% Extract into separate arrays
x = sort(x');
y=y';
M=size(x);
N=M(2);
for k = 1 : length(x)
if k==1;
zeroPad=zeros(1,N);
x0=[zeroPad;x(1,1:N)];
y0=[zeroPad;y(1,1:N)];
plot(x0(1:2,1:N), y0(1:2,1:N), '*', 'LineWidth', 2);
else
plot(x(1:k,1:N), y(1:k,1:N), '*-', 'LineWidth', 2);
end
xlim([min(x(:)), max(x(:))]);
ylim([min(y(:)), max(y(:))]);
grid on;
fprintf('Plotted points 1 through %d\n', k);
pause(0.8);
end
增加了一个技巧。
在第一次迭代中,我在 x 和 y 之前添加了零。
删除了一些不必要的代码。