2017-01-05 15 views
0

я борюсь с этим вопросом, вероятно я только начиная с Matlab.this мой код, я хочу повернуть две ссылки рукой, используя матрицу вращения:удалить строку в цикле с MATLAB

clear all 

close all 

clc 

myaxes = axes('Xlim',[-1 1 ],'Ylim',[-1 1],'Zlim',[-1 1]); 
view(3); 

grid on; 

axis equal; 

hold on 

xlabel('X') 

ylabel('y') 

zlabel('Z') 


P_0 = [0; 0; 0] ; 

P_1 = [-0.5;0; 0] ; 

P_2 = [-1; 0; 0] ; 

alfa_1 = 0:1:30 ; 

alfa_2 =(0:0.5:15) ; 

for i = 1:length(alfa_1) 

    M3(:,:,i) = [cosd(alfa_1(i)) -sind(alfa_1(i)) 0 
        sind(alfa_1(i)) cosd(alfa_1(i)) 0 
        0    0    1] ; 

    P_1(:,i,i) = M3(:,:,i)*[-0.5;0; 0] ; 
    P_2(:,i,i) = M3(:,:,i)*[-1;0; 0]; 
    figure(1) 
    line([0 P_1(1,i,i)],[0 P_1(2,i,i)],[0 P_1(3,i,i)]); 
    scatter(P_1(1,i,i),P_1(2,i,i)); 

    hold on 

    M3_1(:,:,i) = [cosd(alfa_2(i)) -sind(alfa_2(i)) 0 
        sind(alfa_2(i)) cosd(alfa_2(i)) 0 
        0    0    1] ; 
     P_2_2(:,i,i) = M3_1(:,:,i)*P_2(:,i,i); 
     line([P_1(1,i,i) P_2_2(1,i,i)],[P_1(2,i,i) P_2_2(2,i,i)],[P_1(3,i,i) P_2_2(3,i,i)],'color','r'); 
     scatter(P_2_2(1,i,i), P_2_2(2,i,i)) 
     hold on 
end 

Должен ли я использовать функцию удаления, чтобы получить анимацию, не строгая все строки, но только текущую строку?!?. заранее за вашу помощь и поддержку.

ответ

1

Вы можете использовать функцию drawnow в MATLAB для этой цели. Эта функция может использоваться внутри цикла for, чтобы заставить график отображать каждую итерацию, вместо того, чтобы храниться в буфере до момента цикла.

обновить рисунок окно и выполнение отложенных обратных вызовов

Пример: для более простого кода рассмотрим объект движется по кругу

t = 0:0.05:2*pi; 
x = cos(t); 
y = sin(t); 

for k=1:length(t) 
    plot(x(k),y(k),'ko') 
    axis([-1.2 1.2 -1.2 1.2]) 
    axis square 
    drawnow 
end 

Обратите внимание axis функции в этом методе. Если строки axis удалены из кода, то на каждой итерации пределы оси будут изменены, а анимация не будет гладкой.

насчет кода:

clear all 
close all 
clc 

view(3); 

xlabel('X'); 
ylabel('y'); 
zlabel('Z'); 

P_0 = [0; 0; 0] ; 
P_1 = [-0.5;0; 0] ; 
P_2 = [-1; 0; 0] ; 

alfa_1 = 0:1:30 ; 
alfa_2 = (0:0.5:15) ; 

for i = 1:length(alfa_1) 

    % Calculate new values for plotting 
    M3(:,:,i) = [cosd(alfa_1(i)), -sind(alfa_1(i)), 0 
        sind(alfa_1(i)), cosd(alfa_1(i)), 0 
        0    , 0    , 1] ; 

    P_1(:,i,i) = M3(:,:,i)*[-0.5; 0; 0] ; 
    P_2(:,i,i) = M3(:,:,i)*[-1; 0; 0] ; 

    % Clear figure 1 and hold for all plots 
    figure(1) 
    clf 

    % Hold only needs to be applied around plots on same axes 
    hold on 

    line([0 P_1(1,i,i)],[0 P_1(2,i,i)],[0 P_1(3,i,i)]); 
    scatter(P_1(1,i,i),P_1(2,i,i)); 

    % Recalculate plotting values  
    M3_1(:,:,i) = [cosd(alfa_2(i)), -sind(alfa_2(i)), 0 
        sind(alfa_2(i)), cosd(alfa_2(i)), 0 
        0    , 0    , 1] ; 

    P_2_2(:,i,i) = M3_1(:,:,i)*P_2(:,i,i); 

    line([P_1(1,i,i) P_2_2(1,i,i)], [P_1(2,i,i) P_2_2(2,i,i)], [P_1(3,i,i)    P_2_2(3,i,i)], 'color', 'r'); 
    scatter(P_2_2(1,i,i), P_2_2(2,i,i)) 

    % Set axis limits for consistency in all plots, show grid 
    axis([-2 2 -2 2]) 
    grid on  

    % Hold off is good practice to avoid later accidental plotting on same axes 
    hold off  

    % Draw from the buffer 
    drawnow 

    end 
  • вы можете сохранить (если вы хотите) эту анимацию с GetFrame функции и играть с кино функции

  • и другую функцию может помочь вам комета.