2016-05-12 104 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架無人機需要同時更新,你不會有問題。