2013-05-15 11 views
5

sto cercando di animare questa spirale con Matlab/ottava voglio che a spirale verso l'alto o verso il bassoplot animato/traiettoria in MATLAB/ottava

t = 0:0.1:10*pi; 
r = linspace (0, 1, numel (t)); 
z = linspace (0, 1, numel (t)); 
plot3 (r.*sin(t), r.*cos(t), z); 

spiral

Ho provato ad utilizzare un ciclo for per animarla ma che appena mi dà una forma di cono vedi codice e l'immagine qui sotto

clear all, clc,clf,tic 
t = 0:0.1:10*pi; 
r = linspace (0, 1, numel (t)); 
z = linspace (0, 1, numel (t)); 

for ii=1:length(r) 
    ii 
    plot3 (r.*sin(t(ii)), r.*cos(t(ii)), z); 
    hold on 
    %pause (.00001) 
end 

immagine enter image description here

+1

Dai un'occhiata a questa risposta: http://stackoverflow.com/questions/16426378/how-to-animate-this-3d-plot-in-matlab/16426623#16426623 –

risposta

1

appare quanto segue a lavorare in Octave 3.6.2

t = 0:0.1:10*pi; 
r = linspace (0, 1, numel (t)); 
z = linspace (0, 1, numel (t)); 

figure 
axis([-1 1 -1 1 0 1]) 
hold on 

for ii=1:length(r) 
    plot3 (r(ii)*sin(t(ii)), r(ii)*cos(t(ii)), z(ii),'*'); 
    pause (.001) 
end 
+1

Questo è bello, sebbene non fornisca una traiettoria, ma solo una sequenza di punti. Vedi http://stackoverflow.com/a/17773313/181638 per una soluzione che anima una traiettoria. –

1

Certamente non i più belli, ma questi sono i primi cambiamenti che devi apportare al tuo codice per fare qualcosa di simile a quello che vuoi.

t = 0:0.1:10*pi; 
z = linspace (1, 0, numel (t)); 
for ii=1:length(t) 
    plot3 (z(ii)*sin(t(ii)),z(ii)*cos(t(ii)), z(ii)); 
    hold on 
    pause (.00001) 
end 
+0

Davin Questo mi dà solo un errore "riga 0 : * Tutti i bordi * non definiti o fuori intervallo, quindi nessuna trama. " –

+0

@RickT, mai usato prima dell'ottava, lo sto eseguendo su Matlab, presumibilmente è un problema di compatibilità/versione. Puoi provare ad aggiungere la riga 'clear ...', o sostituire 'plot3' con' scatter3', forse ciò ti aiuterà. Altrimenti, sono appena uscito dalle idee. – davin

2

È anche possibile utilizzare il pacchetto comet3(), che anima la traiettoria attraverso la trama:

delay = 0.001 % seconds 
figure 
comet3(r.*sin(t), r.*cos(t), z, delay); 

Questa anima un traiettoria continua che preferisco su una discreta sequenza di * s.

Uno svantaggio è che la versione di comet e comet3 fornita con Octave 3.6.4 è lenta, indipendentemente dal ritardo che si utilizza. Ma questo può essere superato utilizzando il seguente trucco per gentile concessione di andyras in this SO question:

% plot the first point to get started 
h = plot3(x(1),y(1),z(1),"b"); 
axis([min(x), max(x), min(y), max(y), min(z), max(z)]); 

% refresh the plot in a loop through the rest of the data 
for k = 1:length(z); 
    set(h, 'XData', x(1:k)); 
    set(h, 'YData', y(1:k)); 
    set(h, 'ZData', z(1:k)); 
    pause (0.001); % delay in seconds 
     % alternatively could provide a velocity function 
     % pause(sqrt(vx(k)^2+vy(k)^2+vz(k)^2)); 
endfor 

nota minore: una volta che hai modificato la funzione, è necessario forzare Octave ricaricarlo as it won't do this by default. È possibile riavviare, o meglio ancora utilizzare clear comet e clear comet3. Quindi, al prossimo richiamo di tali funzioni, le loro definizioni verranno aggiornate.