Matlab for loop animations

后端 未结 2 1214
后悔当初
后悔当初 2020-12-20 06:47

I\'m trying to animate the graph of a function but I cant get the program to graph the correct points. I want to plot points between time 0 and 10 and animate this graph. Ho

相关标签:
2条回答
  • 2020-12-20 07:25

    It's doing exactly what you ask it to do. You're subsampling the x and y, so it looks kind of funny.

    Try

    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)))
    

    I would also use t = 1 : 0.1 : 10; so that it plots at 10 FPS instead of 100. Slowing the frequency down to, say, w = pi; will be smoother as well.

    At the end of the day, Matlab is just not a great animation solution.

    Answer to refined code question

    You'd need to use plot(x,y);, but this will reveal another error - your frame index does not start at 1. It will choke on F(j) in the first iteration, where j = 2. Why not just loop over t = 1 : 10?

    0 讨论(0)
  • 2020-12-20 07:32

    Here is an example that show an animated point along a circular path, while recording an AVI movie.

    To learn more about doing animations and recording movies in MATLAB, check out this 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')
    

    screenshot_animation

    0 讨论(0)
提交回复
热议问题