以八度音阶设置多个身体轨迹的动画

时间:2017-07-21 04:44:48

标签: animation octave

我知道八度音中的hold on;命令允许我在同一个图中绘制多个轨迹。但是,我最近遇到了'彗星'功能。它在用户定义的时间范围内激活系统的状态。我只是成功地将它用于一个简单的代码,它显示了一个固定的巨大身体周围的小身体的轨迹。如何使用“彗星”在同一时间范围内为2个物体的轨迹设置动画?

PS:如果你需要一个'彗星'如何工作的例子,这里是我上面提到的简单代码:

function xdot = f(x,t)
  G = 1.37;
  M = 10^5;
  [T,r] = cart2pol(x(1),x(2));
  xdot(3) = -((G*M)/((x(1)^2) + (x(2)^2)))*cos(T);
  xdot(4) = -((G*M)/((x(1)^2) + (x(2)^2)))*sin(T);
  xdot(1) = x(3);
  xdot(2) = x(4);
endfunction

X = lsode ("f", [1000,0,5,10],(t = linspace(0,1000,2000)'));
comet(X(:,1),X(:,2),0.01);

这基本上绘制了随时间变化的轨迹。您可以将粘贴复制到八度,然后查看动画。

任何人都可以告诉我如何为2体或多体系统做同样的事情吗?

1 个答案:

答案 0 :(得分:2)

你不能以这种方式真正使用彗星。你必须做动画'手动,但并不难。此外,您可以获得更好的可定制性。这是一种方法。

X1 = lsode ("f", [1000, 0, 5, 10], (t = linspace(0,1000,2000)'));
X2 = lsode ("f", [500,  0, 4, 5 ], (t = linspace(0,1000,2000)'));
x_low  = min ([X1(:, 1); X2(:, 1)]);    x_high = max ([X1(:, 1); X2(:, 1)]);
y_low  = min ([X1(:, 2); X2(:, 2)]);    y_high = max ([X1(:, 2); X2(:, 2)]);

for n = 1 : size (X1, 1)
  plot (X1(1:n, 1), X1(1:n, 2), ':', 'color', [0, 0.5, 1], 'linewidth', 2);
  hold on; 
  plot (X1(n, 1), X1(n, 2), 'o', 'markerfacecolor', 'g', 'markeredgecolor', 'k', 'markersize', 10);
  plot (X2(1:n, 1), X2(1:n, 2), ':', 'color', [1, 0.5, 0], 'linewidth', 2);
  plot (X2(n, 1), X2(n, 2), 'o', 'markerfacecolor', 'm', 'markeredgecolor', 'k', 'markersize', 10);
  hold off;   
  axis ([x_low, x_high, y_low, y_high]); % needed, otherwise first few plots will
                                         % use automatic axis limits
  drawnow; pause(0.01);
end

这是最简单的方法,但如果刷新率低于生成绘图所需的时间,则其速度可能不会快到0.01;如果你只绘制一次并在每一步改变每个绘图对象的数据,你可以使它更快。

此外,这个动画'仅用于在内部显示八度的会话。如果你想从中生成一个视频文件,你必须生成图像并转换为movie / gif格式等。

enter image description here