2013-07-20 11 views
7

Próbuję napisać kod za pomocą programu matlab, który emuluje wskaźnik laserowy w sposób, w jaki mój kot będzie się cieszył ściganiem go na ekranie. To, co zrobiłem do tej pory:Efektywne emulowanie wskaźnika laserowego dla mojego kota przy użyciu Matlab

figure('menubar','none','color','k') 
h = plot(0,'r.','MarkerSize',20); 
xlim([-1 1]); ylim([-1 1]) 
axis off 
phi1=(1+sqrt(5))/2; 
phi2=sqrt(3); 
step= 0.0001; % change according to machine speed 
for t=0:step:100 
    set(h,'xdata',sin(t+phi1*t),'ydata',cos(phi2*t)) 
    drawnow 
end 

„Issues” z tego kodu są następujące:

  1. wskaźnik porusza się mniej lub bardziej ze stałą prędkością i nie zwalniać do prawie całkowitego zatrzymania, a następnie nieoczekiwanie kontynuować.

  2. Trajektoria nieco się powtarza, chociaż starałem się ją wykorzystywać na liczbach nieracjonalnych, ogólne ruchy są ciągłe od prawej do lewej. Myślę, że pomoże nam ostrzejsza zmiana trajektorii.

Wiem, że to nie jest tradycyjne pytanie programistyczne, ale nadal chcę rozwiązać problem programistyczny. Byłbym wdzięczny za twoją pomoc i oczywiście na nowe sposoby udzielania odpowiedzi na moje pytanie, które nie używa kodu, który dodałem.

+3

Fantastyczny projekt . Ale kosztem potencjalnego poświęcenia monitora ?! – voxeloctree

+0

można zaimplementować pojęcie pozycji, prędkości i przyspieszenia, z parametrami do sterowania każdym. Szukaj inspiracji w http://gamedev.stackexchange.com – Amro

+0

Zabawa. Możesz nawet nauczyć się nowych rzeczy. Symuluj [dziwny atraktor] (http://mathworld.wolfram.com/StrangeAttractor.html) lub inny chaotyczny atraktor. :-) Słynny [atraktor Lorenza] (http://en.wikipedia.org/wiki/Lorenz_attractor) jest całkiem łatwy do zrobienia. Możesz też zajrzeć do [2-D przypadkowych spacerów] (http://en.wikipedia.org/wiki/Random_walk) i [procesy Wiener] (http://en.wikipedia.org/wiki/Wiener_process), aby dowiedzieć się, jak dodać szum do innego systemu/procesu. – horchler

Odpowiedz

3

Znakomite pytanie, takie dobre, myślałem, że poświęcę 15 minut mojego życia, aby samemu się udać. Po szeroko zakrojonych badań YouTube na technice laserowej myślałem użyciu równania ruchu, aby przejść między losowych punktów będzie działać dobrze:

n = 20; %number of steps 
pos = [0,0]; % initial position 
vel = 4; % laser velocity 
acc = 400; % laser acelertation 
dt = 0.01; % timestep interval 
figure 
set(gcf,'Position',get(0,'Screensize')); 
for i=1:n 
    point = rand(1,2); 
    dist = 1; 
    while dist > 0.05 % loop until we reach the point 
     plot(pos(1),pos(2),'o','color','r','MarkerFaceColor','r') 
     axis equal 
     xlim([0,1]) 
     ylim([0,1]) 
     drawnow 
     % create random point to move towards 
     dist = pdist([point;pos],'euclidean'); 
     % calculate the direction & mag vector to the point 
     dir = (point-pos)/norm((point-pos)); 
     mag = norm(point-pos); 
     % update position 
     displ = vel*dt - 0.5*acc*mag*dt^2; 
     pos = pos + dir*displ; 
    end 
end 

poeksperymentować z parametrami aż znajdziesz coś twój kot lubi: 0)

+1

Dla bardziej naturalnych ruchów, sugeruję nie używać rozkładu normalnego, ale prawa mocy, lub dystrybucji Levy. Dystrybucja log-normalna również działałaby w skrócie. – Nigel

+0

Próbowałem dystrybucji normalnej, ale nadal wolę dystrybucję jednolitą! Przypuszczam, że prawdziwym arbiterem musi być kot, chociaż nie jestem pewien, jak byś stworzył eksperyment ilościowy, żeby to ocenić ...! – en51nm

Powiązane problemy