WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

scatter3 animieren abh. von Zeit-Vektor

 

bham

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.11.2012, 19:34     Titel: scatter3 animieren abh. von Zeit-Vektor
  Antworten mit Zitat      
Hallo!

Bin etwas am verzweifeln und es waere super, wenn mir jemand helfen koennte!
Ich habe eine Matrix (bottom) mit Ortskoordinaten (x, y, z) eines Partikels zu einer bestimmten Zeit t. Ich moechte das ganze jetzt so animieren, dass ich den Weg des Partikels in Echtzeit darstellen kann, am besten ohne dass ich die schon gezeigten Punkte wieder loesche, sodass ich sozusagen die Trajektorie erhalte (so ein bisschen wie hier: http://de.wikipedia.org/w/index.php.....etimestamp=20091021125704 nur mit Punkten).

Das einzige was ich bisher hingekriegt hab, ist dass sich der "Punkt" ueberhaupt bewegt:
Code:

figure;
hline = plot3(0,0,0, 'Marker','*','LineStyle','--');
grid on
axis([0 20 0 20 0 150]);
for i=1:length(bottom)
x=bottom(i,2);
y=bottom(i,4);
z=bottom(i,3);
set(hline,'XData',x,'YData',y,'ZData',z);
pause(0.1)
end
 


Crying or Very sad
Habt ihr da vielleicht eine gute Idee? Sollte ich das besser mit getframe machen?


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.11.2012, 20:52     Titel:
  Antworten mit Zitat      
Hallo,

und worin genau besteht nun die Frage?

Wenn es darum geht, dass die Punkte erhalten bleiben sollen: nimm
Code:
x=bottom(1:i,2);

statt
Code:
x=bottom(i,2);

und genauso für y und z.

Ich würde zudem mit dem axis-Befehl dafür sorgen, dass die Skala des Koordinatensystems sich nicht verändert.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
bham

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.11.2012, 12:36     Titel:
  Antworten mit Zitat      
Super, vielen Dank, das hilft mir auf jeden Fall schon mal weiter! Smile

Der zweite Teil der Frage bezog sich auf das Animieren in Echtzeit, so dass sich der "Partikel" eben so schnell bewegt wie durch den Zeitvektor t vorgegeben.

Wuerde das evtl. mit einer zweiten Schleife drumherum klappen?
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.11.2012, 12:46     Titel:
  Antworten mit Zitat      
Hallo,

genaue Echtzeit ist schwierig.
Was du machen könntest: die Zeit, die zum Plotten benötigt wird, stoppen (mit tic/toc), und dann so lange pausieren, wie Zeit bis zum nächsten Zeitschritt in t vergehen muss.
Falls dieser nächste Zeitschritt schon vergangen ist, weil der Plot zu lange gebraucht hat, wird dir nichts anderes übrig bleiben, als zum darauffolgenden Zeitschritt zu springen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
bham

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.11.2012, 13:20     Titel:
  Antworten mit Zitat      
Oooh ja das scheint soweit zu funktionieren!! Smile

Bin jetzt so weit:
Code:
clf
clear all
bottom = importdata('a30compl.txt');
bottom(:,1) = bottom(:,1)/1000;
bottom(:,2) = bottom(:,2) - 267.45;
bottom(:,3) = bottom(:,3) - 80;
bottom(:,4) = bottom(:,4) - 121.45;
h=figure(1);
p = scatter3(0,0,0,'o','filled');
grid on
axis([0 20 0 20 0 150]);
hold on
colorbar
R=9.55;                     % column as cylinder
N=100;
[X,Y,Z] = cylinder (R,N);
X=X+9.55;
Y=Y+9.55;
Z=150*Z;
cyl=surf(X,Y,Z);
set(cyl,'FaceAlpha', 0.1, 'EdgeColor','none');
count=length(bottom)-1;
nextframe=1;
for i = 1:count
    tStart=tic;
    t=bottom(i+1,1)-bottom(i,1);
    x=bottom(1:i,2);
    y=bottom(1:i,4);
    z=bottom(1:i,3);
    col=bottom(1:i,1);
    set(p,'XData',x,'YData',y,'ZData',z,'CData',col);
    M(nextframe)=getframe(h);
    tElapsed=toc(tStart);
    nextframe=nextframe+1;
    pause(t-tElapsed);
end
movie(M)


Stimmt das denn so mit der Position von tic und toc?

Nachdem ich jetzt den Zylinder drumherum gemacht hab (es geht im konkreten Fall um einen Partikel in einer Saeule, aehnlich eines Fliessbetts) hat sich allerdings die colorbar veraendert - vorher war es eine sich stetig veraenderte Zeit-Achse und jetzt zeigt es einen konstanten Wert bis 150 an, aber meine Zeit geht gar nicht nur bis 150?

Bin jetzt noch dabei einen Slider einzubauen, mit dem ich sozusagen durch die Zeit "fahren" kann... habe da das hier gefunden:
http://stackoverflow.com/questions/.....th-respect-to-time-matlab
Was soll allerdings dieses xl, yl und zl?
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.11.2012, 14:00     Titel:
  Antworten mit Zitat      
Hallo,

hat sich nur die Colorbar verändert oder auch die Colormap?
Das kann man mit der Achsen-Eigenschaft CLim kontrollieren.

Die xl, yl, zl werden benötigt, damit sich die Skalierung des Koordinatensystems nicht dauernd ändert.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
bham
Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 29.11.12
Wohnort: England
Version: R2012a
     Beitrag Verfasst am: 29.11.2012, 18:58     Titel:
  Antworten mit Zitat      
Aaah ja, perfekt! Danke!! Die Colorbar und -map passt jetzt, das ist genau wie ich's haben wollte (plotted die Punkte farbig abhaengig von der Gesamtzeit).

Allerdings funktioniert das doch nicht mit der Zeit... habe festgestellt, dass tElapsed > t. Weiss gar nicht genau was pause dann da eigentlich macht...

Ausserdem wird wohl tElapsed durch das Plotten von 1:i Punkten stetig groesser. Gibt es da evtl. eine andere Loesung? Weil am Anfang stimmt es zumindest ungefaehr mit meinem t ueberein (0.02s, habe keine Ahnung ob das viel oder wenig ist?).

Edit:
Seh ich das richtig, dass ein einfaches hold on in der Schleife hier nicht funktioniert weil getframe das sozusagen wieder aufhebt?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.11.2012, 21:35     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Weiss gar nicht genau was pause dann da eigentlich macht...

Das Verhalten von pause für negative Argumente ist nicht dokumentiert. Meine Vermutung ist, dass das dann quasi ignoriert wird.

Zitat:
Ausserdem wird wohl tElapsed durch das Plotten von 1:i Punkten stetig groesser.

Macht Sinn. Es müssen ja auch immer mehr Punkte geplottet werden.

Letztlich wird es sinnvoller sein, wenn du die Frames nur mit getframe aufzeichnest und dann nachher am Stück mit MOVIE abspielst. Dann kannst du die Sample-Rate einstellen und dir die Mühe mit pause sparen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
bham
Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 29.11.12
Wohnort: England
Version: R2012a
     Beitrag Verfasst am: 30.11.2012, 14:56     Titel:
  Antworten mit Zitat      
Mmhm ja mein Problem ist jetzt eigentlich eher, dass ich das 1:i in der Schleife am liebsten komplett umgehen wuerde, weil es dadurch irgendwann ewig dauert (habe ca. 35000 Punkte, in anderen Faellen sogar mehr als 60000).

Dadurch sieht es ja dann so aus, als wuerde der Partikel sich mit der Zeit immer langsamer bewegen. Stimmt, die frames per second kann ich ja dann nachher im movie einstellen, aber dazu muesste halt wenigstens jedes frame im (etwa) gleichen Zeitabstand aufgezeichnet sein?

Ist fuer so eine Anzahl an Punkten scatter ueberhaupt geeignet? Ich schaetze ich sollte doch eher plot3 nehmen und dann mit hold on arbeiten.

Kann ich dann allerdings mit plot eine aehnliche Farbkodierung hinkriegen wie bei scatter, also abhaengig von meinem Zeitvektor - oder zumindest von der Schleifenzahl "count"?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.11.2012, 15:33     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Mmhm ja mein Problem ist jetzt eigentlich eher, dass ich das 1:i in der Schleife am liebsten komplett umgehen wuerde, weil es dadurch irgendwann ewig dauert (habe ca. 35000 Punkte, in anderen Faellen sogar mehr als 60000).

Dazu sehe ich keine Möglichkeit. Es kann aber sinnvoll sein, immer z.B. 10 Punkte auf einmal hinzuzufügen.
Code:
for i=1:10:count


Zitat:
Stimmt, die frames per second kann ich ja dann nachher im movie einstellen, aber dazu muesste halt wenigstens jedes frame im (etwa) gleichen Zeitabstand aufgezeichnet sein?

Der zeitliche Abstand, den die Frames darstellen sollen, muss gleich sein. Wie lange die Aufzeichnung der Frames dauert, sollte für movie egal sein.

Zitat:
Kann ich dann allerdings mit plot eine aehnliche Farbkodierung hinkriegen wie bei scatter, also abhaengig von meinem Zeitvektor - oder zumindest von der Schleifenzahl "count"?

Ein Blick in die Hilfe schadet nicht. plot bietet alle erdenklichen Möglichkeiten. Ich sehe aber keine Vorteile von plot gegenüber scatter.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
bham
Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 29.11.12
Wohnort: England
Version: R2012a
     Beitrag Verfasst am: 30.11.2012, 19:55     Titel:
  Antworten mit Zitat      
Ich dachte irgendwo gelesen zu haben, dass plot effizienter/schneller waere als scatter, weil scatter jedem Punkt einen eigenen handle gibt oder so? Und line waere noch "besser", da einfacher?

Aber selbst mit line und dieser Schleife hier:
Code:

for i=1:count
    tStart=tic;
    t(i,1)=bottom(i+1,1)-bottom(i,1);
    x=bottom(i,2);
    y=bottom(i,4);
    z=bottom(i,3);
    line(x,y,z,'LineStyle','none','Marker','o', 'MarkerSize',4,...
        'MarkerEdgeColor','c',...
        'MarkerFaceColor','c');
    axis([0 20 0 20 0 150]);
    hold on
    M(nextframe)=getframe(h);
    nextframe=nextframe+1;
    tElapsed(i,1)=toc(tStart);
    deltat(i,1)=t(i,1)-tElapsed(i,1);
    pause(deltat);
end
 


wird es immer langsamer und langsamer, was ich nicht verstehe, da er doch jetzt immer nur einen neuen Punkt hinzuplotten muss?

Und mit der Farbkodierung, da konnte ich in der Hilfe eben nur finden dass ich RGB Triples verwenden kann, aber ich wusste halt nicht wie ich meinen Zeitvektor darin umwandeln kann...

Tut mir leid wenn ich bloede Fragen stelle, aber ich benutze Matlab seit ca. 2 Wochen und versuche mir das irgendwie selbst beizubringen (was nicht immer so gut funktioniert Smile).
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 01.12.2012, 11:58     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Ich dachte irgendwo gelesen zu haben, dass plot effizienter/schneller waere als scatter, weil scatter jedem Punkt einen eigenen handle gibt oder so? Und line waere noch "besser", da einfacher?

Bei deinem Ansatz hast du jedenfalls auch für jede einzelne Linie ein eigenes Handle. Und wenn MATLAB 60000 Objekte verwalten muss, empfinde ich persönlich Mitleid.

Zitat:
Und mit der Farbkodierung, da konnte ich in der Hilfe eben nur finden dass ich RGB Triples verwenden kann, aber ich wusste halt nicht wie ich meinen Zeitvektor darin umwandeln kann...

Ein Weg dazu wäre, dass du dir z.B. mit colormap eine Farbskala erzeugst und dir dann die entsprechenden Zeilen dazu herausholst.

Lass mal den Profiler drüberlaufen, damit du siehst, wo genau die Zeit verbraucht wird. Es würde mich nicht wundern, wenn viel Zeit mit dem wiederholten "hold on" draufgeht. Das kann man aber auch vor die Schleife setzen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
bham
Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 29.11.12
Wohnort: England
Version: R2012a
     Beitrag Verfasst am: 06.12.2012, 15:35     Titel:
  Antworten mit Zitat      
Hallo!

Zitat:
Und wenn MATLAB 60000 Objekte verwalten muss, empfinde ich persönlich Mitleid.


Was ist denn da so das Maximum, was man Matlab zumuten kann?


Der Profiler meint uebrigens, die meiste Zeit geht fuer getframe drauf...
(haengt das damit zusammen:
Zitat:
Unfortunately, the format in which MATLAB stores the movie is very wasteful of precious memory. Each time you save a frame of the movie, MATLAB creates a pixel map of the plot window and stores it in a column of the movie matrix. This is very wasteful as lots of pixels are likely to stay the same for large portions of the movie. It would be better to save the first frame (and possibly a few later on) and just record the changes in each subsequent frame. This is the idea behind the MPEG movie format.
?)

Hab allerdings noch nicht gefunden, wie ich das umgehen koennte... vielleicht ist das auch normal, dass das etwas laenger dauert? Habe jetzt schon oefter gelesen dass bei getframe wohl der Screensaver aufgenommen wird - und wenn der schon an geht, dann dauert das wohl bei denjenigen auch was laenger?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.12.2012, 16:05     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Was ist denn da so das Maximum, was man Matlab zumuten kann?

Zum einen der Speicher (soweit bist du allerdings noch nicht). Zum anderen aber, dass es immer langsamer wird.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.