2014-11-15 8 views
5

enter image description heresymulacyjne MATLAB

muszę zrobić symulację mrówek przemieszczających się pomiędzy ich domu (black box) i żywności (żółta ramka). Te potrójne kolorowe pudełka to mrówki. Kod, który napisałem, aby narysować rysunek pokazany jest następujący:

% background 
background() 

% making ants 
handle = zeros(10,3) 
handle = makingAnts(10) ; 

% moving ants 
movingAnts(hand) 

Funkcja background:

function background() 

figure 
hold on 
axis equal 
axis([0 100 0 100]) 
pos = rand(1,2).*75 
rectangle('position',[0 0 10 10],'facecolor','k') 
rectangle('position',[pos 25 25],'facecolor','y') 
end 

funkcyjne co mrówki:

function [h] = makingAnts(n) 
    h = zeros(10,3) 
    dia = [2 2] 
    for i = 1:n 
    pos = rand(1,2).* 95 ; 
    h(i,1) = rectangle('position',[pos dia],'facecolor',[0.2 0.6 1]) 
    g1 = get(h(i,1),'position') 
    h(i,2) = rectangle('position',[(g1(1)+2) (g1(2)+2) 2 2],'facecolor',[0.4 1 0.6]) 
    h(i,3) = rectangle('position',[(g1(1)+4) (g1(2)+4) 2 2],'facecolor',[1 0.8 1]) 
    end 
    end 

Teraz muszę przenieść mrówki. Chociaż napisałem kod, ale to nie działa. Potrzebuję pomocy w poruszaniu mrówkami.

Kod, który napisałem:

function movingAnts(h) 
% moving 1 ant 
pos = get(h(1),'position') 
m = pos(1) 
n = pos(2) 
    for i = 1:50 
set(h(1),'position',[(m+0.2) (n+0.2) 2 2]) 
pause(0.05) 
end 
    end 
+1

Może ktoś wyjaśnić, dlaczego to pytanie otrzymało tak wiele przebojów? – robert

+0

@ franz1 - Najprawdopodobniej jest to fajny problem do rozwiązania, nawet jeśli opis problemu nie jest tak szczegółowy jak odpowiedzi w tym wpisie. – rayryeng

Odpowiedz

2
for i = 1:50 
    set(h(1),'position',[(m+0.2) (n+0.2) 2 2]) 
    pause(0.05) 
end 

Od m, n są stałymi, tutaj stawiają mrówkę do tej samej pozycji w każdej iteracji.

4
figure 
axis([0 100 0 100]) 
rectangle('position',[0 0 5 5],'facecolor','k') 
rectangle('position',[95 95 100 100],'facecolor','y') 
n = 5; 
x = zeros(1,n); 
y = zeros(1,n); 
c = ones(1,n); 
while 1 
    for i = 1 : n 
     h1(i) = rectangle('position',[x(i) y(i) 2 2],'facecolor',[0.2 0.6 1]); 
     g1 = get(h1(i),'position'); 
     h2(i) = rectangle('position',[(g1(1)+2) (g1(2)+2) 2 2],'facecolor',[0.4 1 0.6]); 
     h3(i) = rectangle('position',[(g1(1)+4) (g1(2)+4) 2 2],'facecolor',[1 0.8 1]); 
     x(i) = x(i) + c(i) * randi(4,1); 
     y(i) = y(i) + c(i) * randi(4,1); 
     if x(i) > 100 || y(i) > 100 
      c(i) = -1 * c(i); 
      x(i) = 100; y(i) = 100; 
     end 
     if y(i) < 0 || x(i) < 0 
      c(i) = -1 * c(i); 
      x(i) = 0; y(i) = 0; 
     end 
    end 
    pause(.1) 
    delete(h1,h2,h3); 
end 

enter image description here

4

Jako @ franz1 wskazał, że problem jest, że m i n zmienne są poza pętlą, a zatem nie są aktualizowane. Aby przedłużyć na jego/jej odpowiedź, tutaj jest to możliwe movingAnts.m funkcja:

function movingAnts(h) 
    h = reshape(h,numel(h),[]); 
    for i = 1:50 
     pos = get(h,'position'); 
     % move all ants 
     pos = cellfun(@(x) x+[1,1,0,0], pos, 'UniformOutput', false); 
     set(h,{'position'},pos);   
     drawnow update %display updates 
     pause(0.1); 
    end 
end 

enter image description here

Dodatkowo należy zmienić definicję h w makingAnts.m do:

h = zeros(n,3);