2016-05-12 10 views
0

Gibt es eine Möglichkeit, mehrere if-Anweisungen gleichzeitig zu aktivieren. Ich arbeite an einer Simulation und brauche mehrere Punkte, um sich gleichzeitig auf einer Karte zu bewegen. Im Moment habe ich was im Anhang gif (nur die ersten 3 Punkte bewegt sich). Der zweite Punkt sollte sich ungefähr auf halbem Weg durch die erste Punktefahrt bewegen. Schleife ist unter.Matlab - mehrere if-Anweisungen gleichzeitig aktiv

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 

Ich habe versucht, mit While-Schleifen/mehr elseif-Anweisungen usw., aber ohne Glück. Dank

+3

Ihr Code ist nicht sehr einfach zu befolgen, er benötigt ein ernsthaftes Refactoring. Bedenken Sie, dass bei jeder Iteration Ihrer äußeren Hauptschleife alles eine Chance haben sollte, sich nur einmal zu bewegen. Also überprüfst du alle Bedingungen für jedes Objekt sequentiell und erlaubst ihnen, sich nur einmal zu bewegen (vielleicht um ein ganzzahliges Vielfaches eines Entfernungsquantums, wo der Multiplikator proportional zur Geschwindigkeit ist, oder du magst deine Diskretisierung klein genug, um die Geschwindigkeit zu kontrollieren indem man Objekte macht, springt n-1 bewegt sich alle n Iterationen). Sie sollten auch nur einen einzigen Aufruf pro Pause "anhalten". – Dan

Antwort

4

Restructure Ihren Code, so dass es wie folgt aussieht:

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 

die Zeichnung von den Rechen trennen und setzen Pausen überall nicht! Auf diese Weise haben Sie kein Problem, wenn 3 UAV gleichzeitig aktualisiert werden müssen.