Создание точки, движущейся по графику в MATLAB

Я хочу создать простой график log(x) в MATLAB, в котором модель показывает, как точка движется по кривой во времени.

Общая цель состоит в том, чтобы иметь два таких графика рядом друг с другом и применить к ним алгоритм. Я действительно не знаю, с чего начать.

Я относительно новичок в кодировании MATLAB, поэтому любая помощь будет очень полезна!

Спасибо Люк


person LukeyB    schedule 10.02.2011    source источник


Ответы (5)


Вот вариант @Jacob решение. Вместо перерисовки всего в каждом кадре (clf) мы просто обновляем местоположение точки:

%# control animation speed
DELAY = 0.01;
numPoints = 600;

%# create data
x = linspace(0,10,numPoints);
y = log(x);

%# plot graph
figure('DoubleBuffer','on')                  %# no flickering
plot(x,y, 'LineWidth',2), grid on
xlabel('x'), ylabel('y'), title('y = log(x)')

%# create moving point + coords text
hLine = line('XData',x(1), 'YData',y(1), 'Color','r', ...
    'Marker','o', 'MarkerSize',6, 'LineWidth',2);
hTxt = text(x(1), y(1), sprintf('(%.3f,%.3f)',x(1),y(1)), ...
    'Color',[0.2 0.2 0.2], 'FontSize',8, ...
    'HorizontalAlignment','left', 'VerticalAlignment','top');

%# infinite loop
i = 1;                                       %# index
while true      
    %# update point & text
    set(hLine, 'XData',x(i), 'YData',y(i))   
    set(hTxt, 'Position',[x(i) y(i)], ...
        'String',sprintf('(%.3f,%.3f)',[x(i) y(i)]))        
    drawnow                                  %# force refresh
    %#pause(DELAY)                           %# slow down animation

    i = rem(i+1,numPoints)+1;                %# circular increment
    if ~ishandle(hLine), break; end          %# in case you close the figure
end

введите здесь описание изображения

person Amro    schedule 10.02.2011

Простое решение:

x = 1:100;
y = log(x);
DELAY = 0.05;
for i = 1:numel(x)
    clf;
    plot(x,y);
    hold on;
    plot(x(i),y(i),'r*');
    pause(DELAY);
end
person Jacob    schedule 10.02.2011
comment
Что не является хорошим решением, так как вы очищаете всю фигуру каждый раз, когда перерисовываете буквально все. Таким образом, скорость, пространство для расширения и т. д. не являются лучшими в этом отношении. - person mike; 31.05.2015

Вы можете взглянуть на функцию COMET, которая сделает анимация кривой.

Например (используя те же числа, что и @Jacob)

x = 1:100;
y = log(x);
comet(x,y)

Если вы хотите показать точку, движущуюся по линии (а не «рисовать» ее), вы просто рисуете линию перед

x = 1:100;
y = log(x);
plot(x,y,'r')
hold on %# to keep the previous plot
comet(x,y,0) %# 0 hides the green tail
person Jonas    schedule 10.02.2011
comment
+1 Не знал про комету. Кстати, если кажется, что комета ничего не делает, попробуйте добавить больше очков (например, x=1:.01:100;) - person Azim J; 10.02.2011

немного более сложное решение в том же духе, что и @Jacob. Здесь я добавляю некоторую оптимизацию, используя дескриптор графики и объект фильма MATLAB для воспроизведения.

x=1:100;
y=log(x);
figure
plot(x,y);
hold on; % hold on so that the figure is not cleared
h=plot(x(1),y(1),'r*'); % plot the first point
DELAY=.05;


for i=1:length(x)
    set(h,'xdata',x(i),'ydata',y(i)); % move the point using set
                                      % to change the cooridinates.
    M(i)=getframe(gcf);
    pause(DELAY)
end

%% Play the movie back

% create figure and axes for playback
figure
hh=axes;
set(hh,'units','normalized','pos',[0 0 1 1]); 
axis off

movie(M) % play the movie created in the first part
person Azim J    schedule 10.02.2011

решение может быть таким

x = .01:.01:3;
comet(x,log(x))
person Ben    schedule 21.03.2014
comment
Бен, пожалуйста, будь более описательным. - person Christos; 21.03.2014
comment
Это не добавляет ничего нового, чего еще не было в ответе Джонаса. - person gnovice; 21.03.2014