Animazione plot matlab

di il
4 risposte

Animazione plot matlab

Buongiorno a tutti,
sono nuovo nel forum e mi scuso nel caso stia scrivendo nella sezione sbagliata.
Avrei il seguente problema con matlab:
il mio compito da svolgere è quello di rappresentare le oribte di Terra, un asteroide e di un satellite ed il loro movimento.
Per rappresentare le orbite non ho avuto nessun problema, mentre non riesco a rappresentare gli stessi (sempre per i 3 corpi) in movimento.
In sintesi vorrei vedere Terra,asteroide e satellite che percorrano le loro stesse orbite (quindi vedere le 3 orbire ed i relativi "puntini" che si spostano su di esse) nello stesso momento, ma senza la "scia" dei passaggi precedenti. Ho anche provato il comando comet, ma invano.
Spero che mi possiate aiutare.
Grazie in anticipo per la vostra disponibilità.
Ps: non riesco a caricare i file txt


clear all
close all
clc

%% Orbita Terra

a=fopen('terra.txt','r');
b=fscanf(a,'%f %f %f %f',[4 inf]);
terra=b';

i=max(size(terra(:,1)));
for n=1:i
x(n)=terra(n,2)*cosd(terra(n,3))*cosd(terra(n,4)); % r*cos(theta)*cos(phi)
y(n)=terra(n,2)*sind(terra(n,3))*cosd(terra(n,4)); % r*sin(theta)*cos(phi)
z(n)=terra(n,2)*sind(terra(n,4)); % r*sin(phi)
end

xT=x;
yT=y;
zT=z;

% Orbita asteroide

a=fopen('ast.txt','r');
b=fscanf(a,'%f %f %f %f',[4 inf]);
ast=b'; %i valori sono: t r theta phi

i=max(size(ast(:,1)));
for n=1:i
x(n)=ast(n,2)*cosd(ast(n,3))*cosd(ast(n,4));
y(n)=ast(n,2)*sind(ast(n,3))*cosd(ast(n,4));
z(n)=ast(n,2)*sind(ast(n,4));
end

xA=x;
yA=y;
zA=z;


% Orbita satellite

a=fopen('sat.txt','r');
b=fscanf(a,'%f %f %f %f',[4 inf]);
sat=b'; %i valori sono: r theta phi t

i=max(size(sat(:,1)));
for n=1:i
x(n)=sat(n,1)*cosd(sat(n,2))*cosd(sat(n,3));
y(n)=sat(n,1)*sind(sat(n,2))*cosd(sat(n,3));
z(n)=sat(n,1)*sind(sat(n,3));
end

xsat=x;
ysat=y;
zsat=z;

figure(1)
plot3(xT,yT,zT,xA,yA,zA,xsat,ysat,zsat)

figure(2)
plot(xT,yT,xA,yA,xsat,ysat)]

4 Risposte

  • Re: Animazione plot matlab

    Dovresti pubblicare i files si input (magari usando DropBox o qualcosa di simile e pubblicando il link relativo) in modo che so possa fare qualche prova.

    Non è chiaro cosa intendi con ma senza la "scia" dei passaggi precedenti.

    Di principio potresti provare ad inserire le chiamate alla funzione "plot" in un loop che iteri sui punti da plottare, inserire il comando "pasue" per plottare un punto ogni "tot" secondi (es. "pause(.3)").

    Se vuoi cancellare il punti plottati in precedenza, puoi chiamare la funzione "plot" in modo che ritorni l'handle dell'oggetto plottato (es. h=plot(...)") e poi cancellarlo invocando la funzione "delete" (es. "delete(h)").
  • Re: Animazione plot matlab

    Grazie per il consiglio, ho un po' capito il tuo modo di svolgere il mio problema, solo che non saprei come scrivere il codice
    Per quanto riguarda il non volere la scia mi riferisco al fatto che, oltre a voler vedere il plot dell'orbita (cosa che sono riuscito a fare), vorrei vedere anche la stessa orbita plottata come un puntino che si muove , ma senza vedere i passaggi precedenti. Spero di essermi spiegato meglio

    Se possibile, sempre se non chiedo troppo, ti chiederei se ti fosse possibile farmi un esempio, magari anche con solo un caso,ad esempio solo per il primo grafico e per solo un'orbita , e poi vedendo la soluzione ci penserò io per gli altri.

    Ecco qui il link con tutti i file, compresi il codice matlab
    https://d.pr/dKJQ7

    Grazie ancora e buona domenica
  • Re: Animazione plot matlab

    Prova a dare un'occhiata a quanto segue.
    Ho anche semplificato un po' il codice che hai scritto:
    
    terra=load('terra.txt');
    ast=load('ast.txt');
    sat=load('sat.txt');
    % Orbita Terra
    xT=terra(:,2).*cosd(terra(:,3)).*cosd(terra(:,4)); % r*cos(theta)*cos(phi)
    yT=terra(:,2).*sind(terra(:,3)).*cosd(terra(:,4)); % r*sin(theta)*cos(phi)
    zT=terra(:,2).*sind(terra(:,4)); % r*sin(phi)
    % Orbita asteroide
    xA=ast(:,2).*cosd(ast(:,3)).*cosd(ast(:,4));
    yA=ast(:,2).*sind(ast(:,3)).*cosd(ast(:,4));
    zA=ast(:,2).*sind(ast(:,4));
    % Orbita satellite
    xsat=sat(:,1).*cosd(sat(:,2)).*cosd(sat(:,3)); 
    ysat=sat(:,1).*sind(sat(:,2)).*cosd(sat(:,3));
    zsat=sat(:,1).*sind(sat(:,3));
    
    
    figure(1)
    plot3(xT,yT,zT,'b','linewidth',2,xA,yA,zA,'k','linewidth',2,xsat,ysat,zsat,'r','linewidth',2)
    %daspect([1 1 1])
    grid minor
    hold on
    
    for i=1:length(xT)
       hp(1)=plot3(xT(i),yT(i),zT(i),'o','markerfacecolor','b','markeredgecolor','b','markersize',13);
       hp(2)=plot3(xA(i),yA(i),zA(i),'o','markerfacecolor','k','markeredgecolor','k','markersize',13);
       hp(3)=plot3(xsat(i),ysat(i),zsat(i),'o','markerfacecolor','r','markeredgecolor','r','markersize',13);
       pause(0.3)
       delete(hp(:))
    end
    
    Togli il commento alla riga "%daspect([1 1 1])" se vuoi che i tre assi abbbiano lo stesso aspect ratio.
  • Re: Animazione plot matlab

    Grazie mille, non so come ringraziarti.
    Sei grande
Devi accedere o registrarti per scrivere nel forum
4 risposte