2015-04-29 2 views
0

Есть ли причина, по которой матрац MATLAB не смывается?Втягивание MATLAB не сбрасывается

Это мой код:

j=1; 
for k = 1:length(P) 
    for i = 1:n 
     plot(P(k,j),P(k,j+1),'.'); 
     j = j+2; 
    end 
    axis equal 
    axis([-L L -L L]); 
    j=1; 
    drawnow 
end 

(rungekutta4 моя собственная функция, которую я написал, и он хорошо работает, так что проблема не существует.)

частицы просто оставаться обращено на и не переписываться каждый раз, когда цикл выполняется.

Как я могу исправить эту проблему?

+0

Вы можете что-нибудь сделать, прежде чем рисовать. Попробуйте 'clf' –

+0

Спасибо! Я попробовал, и он оживляет только одну частицу:/ – DoubleOseven

+0

Он оживляет количество частиц, которые вы рисуете! Зависит от того, где вы его положили, конечно. Вам нужно поставить его перед строкой 'for i = 1: n'. После этого напишите 'hold on'. –

ответ

1

Если вы хотите что-то оживить, вы, конечно же, хотите сделать ничью. Вот для чего нужна команда drawnow. Но есть и другие вещи, которые нужно учитывать!

Одним из них является то, что вам нужно убедиться, что все рисуется в каждом кадре. Для этого используйте функцию hold on непосредственно перед началом рисования (сюжет).

Однако вы также должны убедиться, что вы очищаете изображение перед рисованием, иначе графики будут складываться навсегда. Используйте clf «четкий рисунок command before the previously mentioned удержания on` и что будет делать эту работу.

помнить, что если анимация слишком быстро, вы всегда можете добавить pause(0.2) линию после того, как drawnow, чтобы замедлить его.

2

Правильное и эффективное способ сделать это с handle graphics. Вы должны также векторизации ваши plot команды.

% Example data to make runnable 
L = 1; 
n = 10; % Number of points 
P = 2*rand(1e2,n+1)-1; 

% Initialize plot, first iteration 
h = plot(P(1,1:n),P(1,2:n+1),'.'); % Plot first set of points and return handle 
axis equal; 
axis([-L L -L L]); 
hold on; % Ensure axis properties are fixed 
drawnow; 

% Animate 
for k = 2:size(P,1) % size is safer in this case 
    % Use handle to update the positions of the previously plotted points 
    set(h,{'XData','YData'},{P(k,1:n),P(k,2:n+1)}); 
    drawnow; 
    pause(0.1); % Slow down animation a bit to make visible 
end 

Вызов clf и/или plot на каждой итерации анимации вызывает много-й которые уже в памяти будут излишне удалены и перераспределены, что приведет к значительному снижению кода. В некоторых случаях это может также вызвать мерцание.

См. Также this very similar question and answer.

+0

yep, этот вопрос, кажется, регулярно возвращается. Вам действительно нужно заявление 'hold on'? когда я ответил на тот же вопрос раньше (несколько раз уже) так же, как и вы, я также объяснял, что «plot» воссоздает сюжет и пересчитывает/корректирует все пределы оси и другие свойства, а при использовании 'set' on только «X/YData», и ничего больше, поэтому пределы оси и другие свойства не изменились. – Hoki

+0

@Hoki: Вы правы, на этом простом примере вам, вероятно, это не нужно, но я не тестировал старые версии Matlab. Тем не менее, я часто помещал его туда, потому что я могу вставить другие команды до или в цикле анимации, которые могут привести к изменениям. – horchler

Смежные вопросы