2016-05-12 107 views
0

有没有办法让多个if语句一次激活?我正在进行模拟,并且需要多个点一次在地图上移动。目前我有什么是在附加的GIF(只显示前3个点移动)。第二个点应该在第一个点行程的中途开始移动。循环在下面。Matlab - 一次激活多个if语句

enter image description here

for t = 1:120 
    pause(0.1) 
    if t == times(1) 
     while uav1.position(1) ~= event1(2) 
      pause(0.1) 
      uav1.position(1) = uav1.position(1) + 5.*(event1(2)./abs(event1(2))); 

      XY(:,1) = [uav1.position(1),uav2.position(1),uav3.position(1),uav4.position(1),... 
      uav5.position(1),]; 
      XY(:,2) = [uav1.position(2),uav2.position(2),uav3.position(2),uav4.position(2),... 
      uav5.position(2),];  
      set(UAVs, 'XData', XY(:,1), 'YData', XY(:,2)); 
     end 
     while uav1.position(2) ~= event1(3) 
      pause(0.1) 
      uav1.position(2) = uav1.position(2) + 5.*(event1(3)./abs(event1(3))); 

      XY(:,1) = [uav1.position(1),uav2.position(1),uav3.position(1),uav4.position(1),... 
      uav5.position(1),]; 
      XY(:,2) = [uav1.position(2),uav2.position(2),uav3.position(2),uav4.position(2),... 
      uav5.position(2),];  
      set(UAVs, 'XData', XY(:,1), 'YData', XY(:,2)); 
     end 

    elseif t == times(2) 
     while uav2.position(1) ~= event2(2) 
      pause(0.1) 
      uav2.position(1) = uav2.position(1) + 5.*(event2(2)./abs(event2(2))); 

      XY(:,1) = [uav1.position(1),uav2.position(1),uav3.position(1),uav4.position(1),... 
      uav5.position(1),]; 
      XY(:,2) = [uav1.position(2),uav2.position(2),uav3.position(2),uav4.position(2),... 
      uav5.position(2),];  
      set(UAVs, 'XData', XY(:,1), 'YData', XY(:,2)); 
     end 
     while uav2.position(2) ~= event2(3) 
      pause(0.1) 
      uav2.position(2) = uav2.position(2) + 5.*(event2(3)./abs(event2(3))); 

      XY(:,1) = [uav1.position(1),uav2.position(1),uav3.position(1),uav4.position(1),... 
      uav5.position(1),]; 
      XY(:,2) = [uav1.position(2),uav2.position(2),uav3.position(2),uav4.position(2),... 
      uav5.position(2),];   
      set(UAVs, 'XData', XY(:,1), 'YData', XY(:,2)); 
     end 

    elseif t == times(3) 
     while uav3.position(1) ~= event3(2) 
      pause(0.1) 
      uav3.position(1) = uav3.position(1) + 5.*(event3(2)./abs(event3(2))); 

      XY(:,1) = [uav1.position(1),uav2.position(1),uav3.position(1),uav4.position(1),... 
      uav5.position(1),]; 
      XY(:,2) = [uav1.position(2),uav2.position(2),uav3.position(2),uav4.position(2),... 
      uav5.position(2),];   
      set(UAVs, 'XData', XY(:,1), 'YData', XY(:,2)); 
     end 
     while uav3.position(2) ~= event3(3) 
      pause(0.1) 
      uav3.position(2) = uav3.position(2) + 5.*(event3(3)./abs(event3(3))); 

      XY(:,1) = [uav1.position(1),uav2.position(1),uav3.position(1),uav4.position(1),... 
      uav5.position(1),]; 
      XY(:,2) = [uav1.position(2),uav2.position(2),uav3.position(2),uav4.position(2),... 
      uav5.position(2),];   
      set(UAVs, 'XData', XY(:,1), 'YData', XY(:,2)); 
     end 

    elseif t == times(4) 
     while uav4.position(1) ~= event4(2) 
      pause(0.1) 
      uav4.position(1) = uav4.position(1) + 5.*(event4(2)./abs(event4(2))); 

      XY(:,1) = [uav1.position(1),uav2.position(1),uav3.position(1),uav4.position(1),... 
      uav5.position(1),]; 
      XY(:,2) = [uav1.position(2),uav2.position(2),uav3.position(2),uav4.position(2),... 
      uav5.position(2),]; 
      set(UAVs, 'XData', XY(:,1), 'YData', XY(:,2)); 
     end 
     while uav4.position(2) ~= event4(3) 
      pause(0.1) 
      uav4.position(2) = uav4.position(2) + 5.*(event4(3)./abs(event4(3))); 

      XY(:,1) = [uav1.position(1),uav2.position(1),uav3.position(1),uav4.position(1),... 
      uav5.position(1),]; 
      XY(:,2) = [uav1.position(2),uav2.position(2),uav3.position(2),uav4.position(2),... 
      uav5.position(2),];  
      set(UAVs, 'XData', XY(:,1), 'YData', XY(:,2)); 
     end 

    elseif t == times(5) 
     while uav5.position(1) ~= event5(2) 
      pause(0.1) 
      uav5.position(1) = uav5.position(1) + 5.*(event5(2)./abs(event5(2))); 

      XY(:,1) = [uav1.position(1),uav2.position(1),uav3.position(1),uav4.position(1),... 
      uav5.position(1),]; 
      XY(:,2) = [uav1.position(2),uav2.position(2),uav3.position(2),uav4.position(2),... 
      uav5.position(2),];   
      set(UAVs, 'XData', XY(:,1), 'YData', XY(:,2)); 
     end 
     while uav5.position(2) ~= event5(3) 
      pause(0.1) 
      uav5.position(2) = uav5.position(2) + 5.*(event5(3)./abs(event5(3))); 

      XY(:,1) = [uav1.position(1),uav2.position(1),uav3.position(1),uav4.position(1),... 
      uav5.position(1),]; 
      XY(:,2) = [uav1.position(2),uav2.position(2),uav3.position(2),uav4.position(2),... 
      uav5.position(2),];   
      set(UAVs, 'XData', XY(:,1), 'YData', XY(:,2)); 
     end 
    end 
end 

drawnow 

我已经尝试使用while循环/更ELSEIF语句等,但没有运气。 感谢

+3

你的代码不是很容易遵循,它需要严肃的重构。考虑到这一点,在你的主要外部循环的每一次迭代中,一切都应该有机会移动一次。因此,您可以顺序检查每个对象的所有条件,并允许它们仅移动一次(可能是乘法器与速度成比例的某个距离量程的整数倍,或者可能使您的时间割草小到足以控制速度通过让对象每n次迭代跳过n-1次移动)。你每次迭代也只能有一次“暂停”。 – Dan

回答

4

调整你的代码,以便它看起来像:

while cond % only 1 while 
    if drawUAV1? 
     % calculate 
    end 
    if drawUAV2? 
     % calculate 
    end 

    plot(everyhing needed) 
    drawnow 
    pause(0.01) %only one pause in the code 
end 

分开计算的图纸,并且不要把暂停无处不在!这样,如果3架无人机需要同时更新,你不会有问题。