2016-04-14 4 views
1

ich versuche, eine flüssige Vektoranimation in gnuplot zu machen. Um die Vektorwerte zu erstellen, verwende ich FORTRAN. Mein FORTRAN-Unterprogramm druckt Vektordaten in einer txt-Datei namens vekdata.txt und erstellt eine andere Datei namens plotvek.txt mit gnuplot-Befehlen. Diese Subroutine befindet sich innerhalb einer do-Schleife, so dass für jede Iteration vekdata.txt aktualisiert wird.Gnuplot Animationsvektor

So war ich herumwandernd, wie ich eine Animation davon machen kann, wie es sich in der Zeit entwickelt? Gibt es einige einfache Befehle? Wie es jetzt ist, druckt es eine riesige Menge an Bildern auf meinen Bildschirm. Jedes Bild ist ein bisschen anders, also weiß ich, dass der Code funktioniert.

do t=1,1000 

call vektorplot(storu,storv,n,Re,t) 

end do 





open(21,access='sequential',file='plotvek.txt',status='unknown') 

write(21,*)'set term png enhanced' 
write(21,*)'# plotvek.txt' 
write(21,*)'set output sprintf(''frame_%09d.png'',',t,')' 




!animation commands 
write(21,*)'set output sprintf("frame_%9d",'t,')' 


close(21,status='keep') 


call execute_command_line("gnuplot -persist plotvek.txt") 

Antwort

1

Ich poste hier eine Alternative.

Obwohl ich normalerweise das animierte gif als Karl answers bevorzuge, sind manchmal zu große Gifs schwierig zu mieten und vor allem für sehr lange Filme, neigen sie dazu, nicht reagierende Anwendungen (Browser oder Diapräsentationen) zu erstellen.


Grundsätzlich schreiben Sie in einer Datei jedes Rahmen und dann einen Film erstellen. In this link haben Sie sowohl gif und Film Beispiele. Ich werde mich hier an die Prinzipien erinnern.

Für jeden Rahmen Sie ein Png-Terminal und Ausgabedatei. Als Fortran Befehl, wäre das so etwas wie:

write(21,*)'set term png enhanced' 
write(21,*)'# plotvek.txt' 
write(21,*)'set output sprintf("frame_%09d.png",',n+1,')' 
[...] 

Dann, wenn das Programm ausgeführt wird, können Sie einen Film erstellen:

mencoder mf://frame_%09d.png -mf fps=30 -ovc lavc -o my_video.avi 

Natürlich mencoder eine Tonne von Optionen zur Melodie hat Ihren Film .

Eine weitere Alternative zur mencoder ist ffmpeg:

ffmpeg -framerate 1/5 -i frame_%09d.png -c:v libx264 -r 30 -pix_fmt yuv420p my_video.mp4 
+0

Ich verstehe nicht, warum ich eine do-Schleife brauche, was macht es? Mein Programm befindet sich in einer do-Schleife (siehe bearbeiteter Code). Also kann ich das einfach als Variable verwenden, denke ich. Also möchte ich Gnuplut t = 1000 Bilder plotten, dann machen sie zu einem Film, ich habe versucht, die gnuplot Befehle zu machen (siehe bearbeiteter Code) – euroshopper

+0

aber es funktioniert nicht kann es nicht lesen 'set output sprintf ("frame_% 9d ", 'n + 1,')" Befehl. Ich weiß nicht, wie die Syntax aussehen sollte wie ich Fortran in Mac schreiben, so ist meine Syntax schreiben (21, *) 'setzen Ausgabe sprintf (' 'frame_% 9d', t, ')' '' – euroshopper

+0

Sorry, du hast Recht, das 'set terminal' ist in unserer for-Schleife und ich habe auch eine' 0' und ein Komma', 'und' .png' vergessen ... was für ein Durcheinander ... – bibi

2

Der gif Terminal verfügt über eine Option, um eine GIF-Animation zu machen, aber Sie haben sie alle in einem Aufruf zum gnuplot Skript plotten.

Man könnte so etwas wie dies versucht:

$ makevectors | gnuplot 

wo makevectors Ihren Fortran-Code, nur druckt es alles zu STDOUT ersten

set term gif animation 
set out 'vectors.gif' 
do for [i=1:100] {plot '-' using 1:2:($3*30):($4*25) with vectors} 

(plus dem Rest Ihrer Einstellungen) und dann 100 Datensätze mit jeweils einem EOF. druckt Schließlich

set out 

(Ok, würde der Ausgang in der Nähe sowieso, aber nur sehr ordentlich sein) und Sie haben eine Datei mit der GIF-Animation bekommen.

Update: Ich würde empfehlen Ihnen, Ihre Gnuplot-Befehle in eine Skriptdatei zu verschieben und Gnuplot Anruf über die Befehlszeile makevectors | gnuplot script.gp. Auf diese Weise müssen Sie das Programm nicht immer neu kompilieren, wenn Sie eine Linienfarbe oder etwas ändern möchten.

+0

Vielen Dank für Ihre Antwort, aber was bedeutet der Befehl "sh> makevectors | gnuplot" tun? – euroshopper

+0

sh> sollte die Shell-Eingabeaufforderung sein. änderte es – Karl