使用Octave制作轨迹动画

4
我有一组描述物体轨迹的坐标点集(x,y),我想使用GNU Octave来实现轨迹动画。
数据集比较大,所以如果我想让动画更加流畅,就不能在每次迭代时都重新绘制整个图形。那么,有哪些函数可以让我“更新”图像而不是重新绘制它呢?
此外,我还有另一组(vx,vy)点集,它们描述了物体的速度。我希望我的动态轨迹考虑到速度因素。我应该使用哪个函数使程序睡眠几毫秒,以使轨迹与物体以相同的速度运动?
(我已经知道Octave有诸如comet之类的函数,但我需要编写自己的动画程序。)
编辑:以下是我到目前为止所拥有的内容。我原本以为这会运行得太快并需要使用pause,但它仍然相当缓慢(x和y具有10001个元素)。
bounds = [min(x) max(x) min(y) max(y)];
axis(bounds);

hold on
for k = 2 : length(x)
    plot(x(k-1:k), y(k-1:k));
    drawnow("expose");
end
hold off
2个回答

6
您可以使用set命令来更改特定绘图对象hXDataYData数据:
h = plot(my_xdata(0),my_ydata(0))
for i_=1:length(my_xdata)
    set(h, 'YData', my_ydata(i_))
    set(h, 'XData', my_xdata(i_))
    pause(sqrt(vx(i_)^2+vy(i_)^2))
end

pause(x)命令暂停x秒,可以小于1秒。


谢谢,pause 很有用,但 set 不是我想要的。我希望轨迹的痕迹保留下来。我想知道是否有一些函数可以更新绘图的轨迹,而不是重新绘制单个点。 - Paul Manta
我猜我不清楚你想要动画的是什么。你想要绘制一条线(轨迹),并使一个物体沿着该线移动吗?还是你想要更新线本身? - andyras
然后,您可以使用相同的 set(h, 'YData', new_ydata) 命令;它可以更新一个点或整条线。我编写了我的示例以更新一个点,因为我认为那是您想要的——一个点在移动。 - andyras
这不就是反复调用plot函数吗? - Paul Manta
1
不完全正确。plot命令会创建一个全新的图形,重新绘制坐标轴等。而当你使用set命令时,它只会更改你已经创建的图形的某个部分。因此,当你调用set(h, 'YData', ydata)时,它只会更改图形对象h中的y数据,并重新绘制你想要更改的唯一部分——线条。 - andyras
很棒的回答!(+1) 你的技巧让cometcomet3运行速度更快。我在这个SO问题中详细阐述了(并标明了出处!) - Assad Ebrahim

0

我认为你正在寻找 "hold" 命令。保持绘图将所有先前的数据保留在绘图上,新数据添加在其上。


4
hold 不允许移除绘图中的先前数据。当您对图形进行动画处理时,通常需要添加一些数据,并删除其他一些数据。 hold 通常用于在单个图形上绘制多个数据系列。 - ronalchn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接