2013-07-20 18 views
7

Sto provando a scrivere un codice usando matlab che emula un puntatore laser in modo che il mio gatto si diverta a seguirlo sullo schermo. Questo è quello che ho fatto finora:emula efficacemente un puntatore laser per il mio gatto usando 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 

I "problemi" con questo codice sono i seguenti:

  1. il puntatore si muove più o meno a velocità costante e non rallenta a una fermata vicina e poi inaspettatamente procedere.

  2. La traiettoria si sta ripetendo, anche se ho provato a farlo usando numeri irrazionali, i movimenti generali sono continui da destra a sinistra. Penso che un cambiamento di traiettoria più preciso aiuterà.

So che questa non è una domanda di programmazione tradizionale, ma voglio risolvere un problema di programmazione. Apprezzerei il tuo aiuto e naturalmente aprirò a nuovi modi per rispondere alla mia domanda che non usa il codice che ho aggiunto.

+3

fantastico progetto . Ma a costo di sacrificare potenzialmente un monitor ?! – voxeloctree

+0

è possibile implementare la nozione di posizione, velocità e accelerazione, con i parametri da controllare ciascuno. Cerca ispirazioni in http://gamedev.stackexchange.com – Amro

+0

Divertimento. Potresti anche imparare qualcosa di nuovo nel farlo. Simula uno [attrattore strano] (http://mathworld.wolfram.com/StrangeAttractor.html) o un altro attrattore caotico. :-) Il famoso [attrattore di Lorenz] (http://en.wikipedia.org/wiki/Lorenz_attractor) è abbastanza facile da fare. Oppure guarda in [Passeggiate casuali 2D] (http://en.wikipedia.org/wiki/Random_walk) e [Processi Wiener] (http://en.wikipedia.org/wiki/Wiener_process) per modi di aggiungere rumore ad un altro sistema/processo. – horchler

risposta

3

Domanda brillante, così bene, ho pensato che avrei impiegato 15 minuti della mia vita per provarci. Dopo approfondite ricerche di YouTube sulla tecnica laser ho pensato utilizzando le equazioni del moto per spostarsi tra i punti casuali avrebbe funzionato bene:

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 

Giocare con i parametri fino a trovare qualcosa che il tuo gatto ama: 0)

+1

Per i movimenti più naturali, suggerisco di non utilizzare una distribuzione normale, ma una legge di potenza o una distribuzione di Levy. Una distribuzione log-normale funzionerebbe anche in un pizzico. – Nigel

+0

Ho provato la distribuzione normale, ma preferisco ancora la distribuzione uniforme! Suppongo che il vero arbitro debba essere il gatto, anche se non sono sicuro di come impostare un esperimento quantitativo per valutare questo ...! – en51nm