2017-01-05 121 views
0

我与这件事可能 我刚开始用Matlab.this挣扎是我的代码,我想 旋转两个环节的手臂,用旋转矩阵:删除一行在for循环与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

您可以在MATLAB中使用drawnow函数来达到此目的。该函数可以在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功能,并与电影功能

  • 和其他功能发挥它可能会帮助你彗星