我正在尝试为函数图形设置动画,但我无法让程序绘制正确的点图。我想在0到10之间绘制点,并为此图设置动画。如何将绘图作为时间的函数?
clear;
w = 2*pi;
t = 0:.01:10;
y = sin(w*t);
x = cos(w*t);
for j=1:10
plot(x(6*j),y(6*j),'*');
axis square;
grid on;
F(j) = getframe;
end
movie(F,1,1);
我将代码改进为:
clear;
w = 2*pi;
for j=2:11
t=j-1;
y = sin(w*t);
x = cos(w*t);
plot(x(t),y(t),'*');
axis square;
grid on;
F(j) = getframe;
end
movie(F);
这应该做我正在尝试但现在我得到的“索引超过矩阵维度”。我该如何解决这个问题?
答案 0 :(得分:1)
这是一个示例,在录制AVI影片时显示沿圆形路径的动画点。
要了解有关在MATLAB中制作动画和录制电影的更多信息,请查看此guide。
%# some parameters
ERASEMODE = 'normal'; %# normal,xor
RENDERER = 'painters'; %# painters,zbuffer,opengl
%# data
t = linspace(0,2*pi,100)'; %'# adjust number of points here
D = [cos(t) -sin(t)];
%# plot circluar path
figure('DoubleBuffer','on', 'Renderer',RENDERER)
plot(D(:,1), D(:,2), 'Color','b', 'LineWidth',2)
grid on, axis([-1.5 1.5 -1.5 1.5]), axis square
xlabel('x'), ylabel('y'), title('Circle Animation')
%#set(gca, 'DrawMode','fast')
%# moving point
hPoint = line('XData',D(1,1), 'YData',D(1,2), 'EraseMode',ERASEMODE, ...
'Color','r', 'Marker','.', 'MarkerSize',30);
%# moving coordinates text
hTxtCoords = text(D(1,1), D(1,2), sprintf('(%.2f,%.2f)',D(1,:)), ...
'Color',[0.2 0.2 0.2], 'FontSize',8, 'EraseMode',ERASEMODE, ...
'HorizontalAlignment','left', 'VerticalAlignment','top');
%# angle text
hTxtAngle = text(0, 0, num2str(t(1),'%.02f'), ...
'FontSize',15, 'EraseMode',ERASEMODE, ...
'HorizontalAlignment','center', 'VerticalAlignment','middle');
%# prepare video output
useVideoWriter = ~verLessThan('matlab','7.11');
if useVideoWriter
vid = VideoWriter('vid.avi');
vidObj.Quality = 100;
vid.FrameRate = 30;
open(vid);
else
vid = avifile('vid.avi', 'fps',30, 'quality',100);
end
%# loop
for i=1:numel(t)
set(hPoint, 'XData',D(i,1), 'YData',D(i,2)) %# update point location
set(hTxtAngle, 'String',num2str(t(i),'%.02f')) %# update angle text
set(hTxtCoords, 'Position',D(i,:), ... %# update angle text
'String',sprintf('(%.3f,%.3f)',D(i,:)))
drawnow %# force refresh
if ~ishandle(hPoint), break; end %# if you close the figure
%# capture frame
if useVideoWriter
writeVideo(vid,getframe);
else
vid = addframe(vid, getframe(gcf));
end
end
%# close and save video output
if useVideoWriter
close(vid);
else
vid = close(vid);
end
%# open AVI file using system default player
winopen('vid.avi')
答案 1 :(得分:0)
这正是你要求它做的事情。您正在对x
和y
进行二次采样,因此看起来很有趣。
尝试
plot(x,y);
axis square;
ax = axis;
for jx = 1 : length(t),
plot(x(ix), y(ix), '*');
axis(ax); grid on;
F(ix) = getframe;
end
movie(F, 1, 1/(t(2)-t(1)))
我还会使用t = 1 : 0.1 : 10;
,因此它会以10 FPS而不是100来绘制。将频率降低到比较w = pi;
也会更顺畅。
在一天结束时,Matlab并不是一个出色的动画解决方案。
回答精炼代码问题
您需要使用plot(x,y);
,但这会显示另一个错误 - 您的帧索引不会从1开始。它会在第一次迭代中阻塞F(j)
,其中{{1} }。为什么不循环j = 2
?