Von
meinem Blog kopiert, um eine weitere russischsprachige Informationsquelle zu diesem Thema zu erstellen.
Hallo! Als ich beim Beherrschen des Asymptote-Programms, das stattfand, als ich die Nuancen der Einstellungen für dieses hier in
diesem Hub beschriebene Programm lernte, die Verarbeitung von .asy-Dateien ohne Animation vollständig beherrschte, stieß ich natürlich auf die Animation.
Spoiler ÜberschriftGeben Sie den Massen Animation!
Glücklicherweise muss im Fall des PDF-Ausgabeformats keines der zusätzlichen Programme, die ich im Hub unter Verwendung des obigen Links beschrieben habe, nach der Installation des Ghostscript-Programms installiert werden, und selbst der Teufel weiß, wie lange es gegraben hat. Aber dann wusste ich nichts davon, was die Sache oft komplizierte. Sie verarbeiten die Datei radius.asy und was? Nun, .pdf wurde während der Verarbeitung in TeXworks (siehe den oben angegebenen Link) im selben Ordner wie die verarbeitete ASI-Datei und beim Öffnen im Explorer (siehe denselben Hub) im
C:\Windows\System32
. Na und? Es war keine Animation darin und das war's, obwohl du knackst. Vor der Animation in Asymptote habe ich gelernt, wie man Animationen in
Tikz und
Pstricks macht . Dies gelang mir also erst, als ich die Datei animate.sty aus dem Ordner
C:\Program Files\MiKTeX 2.9\tex\latex\animate
löschte und die Datei mit demselben Namen später herunterlud.
Da ist er . Also zu wissen, dass dies
Das Paket funktioniert mit Tikz und Pstricks. Ich war der Meinung, dass es für mich nicht funktioniert, höchstwahrscheinlich nicht aufgrund von Problemen mit TeX, sondern aus einem anderen Grund. Also habe ich mehrere Jahre im Alten Internet gesucht. Zuerst habe ich im IE-Browser gesucht, nun, es gibt dort keinen geeigneten Übersetzer. Dann habe ich gerochen, dass Google einen praktischen Übersetzer hat. Auch gesucht, gesucht, gesucht, gesucht, bis er auf
diese Seite stieß. Es stellte sich heraus, dass aus irgendeinem Grund in allen .asy-Dateien aus dem Ordner
C:\Program Files\Asymptote\examples\animations
nicht genügend einzelne Zeilen vorhanden sind, um aus ihnen .pdf mit Animation zu erhalten
settings.twice=true;
Ich habe diese Zeile aus dem Animations-Unterordner des Beispielordners zur Datei radius.asy hinzugefügt:
Endlich Animation !!!!!!! import graph; // Uncomment the following 2 lines to support pdf animations: usepackage("animate"); settings.tex="pdflatex"; settings.twice=true; import animation; size(0,200); defaultpen(3); dotfactor=4; pair wheelpoint(real t) { return (t+cos(t),-sin(t)); } guide wheel(guide g=nullpath, real a, real b, int n) { real width=(ba)/n; for(int i=0; i <= n; ++i) { real t=a+width*i; g=g--wheelpoint(t); } return g; } real t1=0; real t2=t1+2*pi; animation a; draw(circle((0,0),1)); draw(wheel(t1,t2,100),linetype("0 2")); yequals(Label("$y=-1$",1.0),-1,extend=true,linetype("4 4")); xaxis(Label("$x$",align=3SW),0); yaxis("$y$",0,1.2); pair z1=wheelpoint(t1); pair z2=wheelpoint(t2); dot(z1); dot(z2); int n=10; real dt=(t2-t1)/n; for(int i=0; i <= n; ++i) { save(); real t=t1+dt*i; draw(circle((t,0),1),red); dot(wheelpoint(t)); a.add(); // Add currentpicture to animation. restore(); } erase(); // Merge the images into a gif animation. //a.movie(BBox(0.25cm),loops=10,delay=250); // Merge the images into a pdf animation. label(a.pdf(BBox(0.25cm),delay=250,"controls",multipage=false));
Zur gleichen Zeit wurde mir klar, dass ich, um .pdf mit 300 Wörtern auf Englisch zu erhalten, das Kommentieren in Form der Wheel.asy-Datei vornehmen muss, in der der Benutzer es von den Autoren des Asymptote-Programms erhält. 2 Zeilen:
....................... usepackage("animate"); settings.tex="pdflatex"; .......................
Sehen Sie sich die Kommentare zu diesen Zeilen am Ende der Datei radius.asy an:
........................ // Merge the images into a gif animation. a.movie(BBox(0.25cm),loops=10,delay=250); // Merge the images into a pdf animation. // label(a.pdf(BBox(0.25cm),delay=250,"controls",multipage=false));
Um PDF zu erhalten, muss ich den Code, den ich von den Autoren des Programms erhalten habe, wiederholen und die Zeile auskommentieren
a.movie(BBox(0.25cm),loops=10,delay=250);
und kommentieren Sie die Zeile aus
label(a.pdf(BBox(0.25cm),delay=250,"controls",multipage=false));
Und wie rollte mein Rad nach diesen Körperbewegungen! Die Logik der Autoren des Asymptote-Programms ist ebenfalls unverständlich: Um .gif zu erhalten, wird ein zusätzliches Programm mehr benötigt als um .pdf zu erhalten. Dateien mit Beispielen werden höchstwahrscheinlich von Benutzern angesehen, die überhaupt nicht wissen, wie das geht. Tun Sie dies so, dass diese Benutzer beim sofortigen Öffnen dieser Dateien, ohne etwas daran zu ändern, ein Format erhalten können, das weniger zusätzliche Programme erfordert - .pdf, nein, sie haben .gif erstellt. Warum? Na ja gut. Ja, ich werde auch beachten, dass beim Öffnen der Datei "radius.asy" im Explorer (siehe
mein Hub ), um ein funktionierendes GIF daraus zu erhalten, das Vorhandensein der Datei "config.asy" im selben Ordner (siehe
mein Hub ) optional ist. Ich möchte Sie daran erinnern, dass .gif in diesem Fall (beim Öffnen im Explorer) im
C:\Windows\System32
. Bei der Verarbeitung dieser ASI-Datei in TeXworks ist das Vorhandensein von config.asy im selben Ordner wie die zu verarbeitende Datei obligatorisch (oder einschließlich der Zeilen, die ich im vorherigen Link beschrieben habe, direkt in der verarbeiteten ASY-Datei selbst). Nun, hier ist es. Ich habe dieses rollende Rad gerade bekommen, ich habe überall gelacht, entzückt. Es war Nacht. Ich ging ins Bett. Wachte auf und comp. Während sich der Computer einschaltete, setzte er sich und rieb sich die Hände. Nun, ich denke, jetzt werde ich mathematisch anfangen, Heizöl für uns zu verwenden.) Ja, gerade jetzt. Die Animationen aus dem Unterordner der Beispiele haben praktisch alles geschafft, außer embeddedmovie.asy, externalmovie.asy und embeddeddedu3d.asy. Ich habe später auf die ersten beiden Dateien gewartet, aber mit der letzten hat es nicht funktioniert: Soweit ich weiß, muss eine dice.u3d-Datei zusätzlich von irgendwoher heruntergeladen werden, und welche ist ein großes Geheimnis für ein kleines Unternehmen. Nun, das: "Oh, das Königreich ist nicht genug, es gibt keinen Ort zum Durchstreifen." Ich schrieb, es gab einen solchen Code:
settings.twice=true; usepackage("animate"); import solids; settings.tex="pdflatex"; import animation; settings.outformat="pdf"; settings.axes3=true; import graph3; import palette; currentprojection=orthographic(1,1,1); limits((-1.3,-1.3,-1.3),(1.3,1.3,1.3)); unitsize(6cm); animation a; int n=44; for(int i=0; i<=n; ++i){ real g(real x) {return sqrt(1-x^2);} pair G(real x) {return (x,g(x));} triple G3(real x) {return (x,g(x),0);} path q=graph(G,1-i/n,1); path3 q3=path3(q); revolution c=revolution(q3,X,0,360); draw(surface(c),red); real f(real x) {return sqrt(1-x^2);} pair F(real x) {return (x,f(x));} triple F3(real x) {return (x,f(x),0);} path p=graph(F,-1,-1+i/n); path3 p3=path3(p); revolution b=revolution(p3,X,0,360); draw(surface(b),green); axes3("$x$","$y$","$z$",Arrow3); a.add(); restore(); } erase(); label(a.pdf("controls,loop",delay=1000));
Ich habe den folgenden vielversprechenden Fehler in
TeXworks erhalten :
error: out of memory
Beim Öffnen dieser ASI-Datei im Explorer (siehe Link zum Hub oben) war der Fehler derselbe. Ja. Ich habe gedämpft, ich habe gedämpft, ich bin getrübt, ich habe das gefunden, als
es stellt sich heraus .pdf mit Animation, aber schon bei
dass dieser Fehler auch auftritt. Lassen Sie mich im Asymptote-
Forum selbst fragen. Aber Angelsachsen sind gesetzestreue Menschen, die sich nicht gerne von Anweisungen zurückziehen. Sie haben sich nichts ausgedacht. Was zu tun ist? Hat es sich gelohnt, das halbe Internet zu schaufeln, um über solchen Müll zu stolpern? Nichts, die Russen geben nicht auf! Und außerdem gehen normale Helden immer herum ... Ich begann den Prozess der Verarbeitung der Wheel.asy-Datei in TeXworks zu beobachten und was habe ich gesehen? Zuerst erscheinen die Dateien _wheel + 0.pdf, _wheel + 1.pdf, ..., _wheel + 10.pdf, dann wird aus diesen Dateien eine mehrseitige Datei _wheel.pdf gebildet und weiter im Programm. Zu diesem Zweck wird das Animationsmodul in die ASI-Datei importiert, aus der die Animation abgerufen werden soll. Und dann hatte ich eine Idee. Was aber, wenn Sie in diesem Modul (Datei
C:\Program Files\Asymptote\animation.asy
) einen Ort finden, an dem Dateien wie _wheel + 0.pdf generiert und deaktiviert werden? Stempeln Sie diese Dateien mit Asymptote-Verarbeitungs-ASY-Dateien, die durch Loopback in Batch-Dateien generiert wurden? Diese .asy-Dateien können so lange wie nötig mit den Namen
name + 0.asy ,
name + 1.asy usw. erstellt werden. Dabei handelt es sich bei dem
Namen um eine Reihe lateinischer Buchstaben, die mit der erstellten Animation verknüpft sind und die Sie höchstwahrscheinlich im vorgefertigten PDF mit Animation ändern möchten. Aber es wird später sein. In der Zwischenzeit, nach dem Erstellen der Dateien, ist der
Name + 0.asy , der
Name ist + 1.asy ... meiner Idee nach sollte die Verarbeitung durch Asymptote folgen. Dies würde den
Dateinamen + 0.pdf , den
Namen + 1.pdf erstellen ... Und vor dem Code, der den
Dateinamen + 0.asy , den
Namen + 1.asy ... erstellt, musste ich Zeilen in die Batchdatei einfügen, um den Dateinamen.asy zu erstellen oder besser gesagt, nur Zeilen, die in diese Datei eingegeben werden sollen. Und der Dateiname.asy würde einfach als Ergebnis der Batch-Datei gebildet. In dieser Datei lautet der Name .asy. Ich hatte vor, das von mir konvertierte
Animationsmodul anstelle des
Animationsmoduls selbst zu importieren. Ich habe mich entschlossen, den Anfang dieses Dateinamens.asy am einfachsten zu machen, im Geiste des Anfangs der Datei radius.asy. Nach der Schleife habe ich die Zeilen aus dieser Datei einfach dumm kopiert und wie folgt in die Batch-Datei eingefügt:
echo >> .asy
,
echo >> .asy
Ich habe die Batch-Datei so geschrieben, dass in der erstellten Datei der Name. Einfach, der Hauptteil der Schleife war leer, und wo für war, würde es so aussehen:
for(int i=0; i <= n; ++i) {
In der Batch-Datei ist die Zeile über der Codezeile, die diese Zeile in den Dateinamen.asy eingibt, eine Zeile
echo int n=%n%; >>%name%.asy
und die dritte und vierte Zeile dieser Batchdatei sind:
set n=24 set name=OdnopGip
Also zu Beginn der Schleifenverarbeitung im Dateinamen. Easy Asymptote kennt in diesem Fall bereits den Wert von n und alles funktioniert. Der Name der Umgebungsvariablen bedeutet bei der Übersetzung in die Sprache dieses Artikels den
Namen von
name.asy . In diesem Fall die Werte von name oder n in der Batch-Datei über set zu deklarieren, erscheint mir äußerst praktisch: Wenn Sie ihre Werte nur an einer Stelle in der Batch-Datei ändern, müssen Sie alle Namen von .tex-, .pdf-Dateien ändern, die bei der Verarbeitung einer bestimmten .asy-Datei oder -Nummer generiert werden Frames im resultierenden animierten PDF, wodurch die Details der Animation wesentlich geändert werden. Nun, hier ist es. Also habe ich den
Frame-Namen + 0.pdf , den
Namen + 1.pdf vorbereitet ... da ich jedoch nach der Vorbereitung jedes geöffneten Frames einen Befehl in meine Batch-Datei aufnehmen musste, um ihn zu schließen. Da ich nicht wusste, wie ein Fenster mit einem bestimmten Titel aus einer Batchdatei geschlossen werden kann, habe ich den folgenden Befehl in meine Batchdatei in den Hauptteil des Frame-Blank-Verarbeitungszyklus aufgenommen.
taskkill /IM AcroRd32.exe
Wie sich später herausstellte, ist dies sogar noch besser als das Schließen jedes einzelnen Frames: Manchmal hat der Frame noch keine Zeit, um auf dem Monitor angezeigt zu werden, und die Verarbeitung der nächsten .asy-Datei beginnt bereits, an deren Ende der nächste Frame auf dem Monitor und der letzte angezeigt wird Mit dem Befehl dieses nächsten Schrittes des Zyklus werden sowohl der Frame aus diesem nächsten Schritt als auch der Frame des vorherigen Schritts, nach dem die laufende Batchdatei abgelaufen ist, geschlossen, obwohl klar ist, dass dieser Befehl nach dem Einfügen in die Batchdatei während der Ausführung des Buches in PDF nicht mehr vorhanden ist Ich bin schlecht, ja. Weiter entlang der Logik musste ich den Dateinamen + 0.asy, name + 1.asy, ... in _name + 0.asy, _name + 1.asy, ... umbenennen, da Dateien mit genau diesen Namen in einem vorhanden waren Der Ordner mit der zu verarbeitenden ASI-Datei, in dem sich eine Animation befindet, geht davon aus, dass diese Datei verarbeitet wird, vorausgesetzt, das native Animationsmodul wird importiert, bevor mit der Erstellung der Dateinamen-Datei.pdf begonnen wird (ja, ich könnte innerhalb der Batch-Dateischleife mit der Variablen k die Zeilen des Codes, aus dem der Frame besteht, nicht ausrichten, nicht in der Dateiname + k.asy und die Datei _name + k.asy, aber dies würde mehr Eingabe des Zeichens "_" erfordern. Und die weitere Verarbeitung von Asymptote-Wunden . E-Datei Kurz erstellt imya.asy, entsprechend der ursprünglichen Idee war, eine Batch-Datei sieht wie folgt zu haben:
cd /d %0\.. echo off set n=99 set name=cvetok echo settings.twice=true; > %name%.asy echo usepackage("animate"); >>%name%.asy echo settings.tex="pdflatex"; >>%name%.asy echo import izgraphiki; >>%name%.asy echo animation a; >>%name%.asy echo int n=%n%; >>%name%.asy echo for(int i=0; i ^<= n; ++i) { >>%name%.asy echo a.add(); >>%name%.asy echo restore(); >>%name%.asy echo } >>%name%.asy echo erase(); >>%name%.asy echo label(a.pdf(BBox(0.25cm),delay=250,"controls",multipage=false)); >>%name%.asy for /l %%k in (0,1,%n%) do ( echo import graph; >> %name%+%%k.asy echo settings.tex="pdflatex"; >> %name%+%%k.asy echo limits((-1.2,-1.2^),(1.2,1.2^)^); >> %name%+%%k.asy echo size(0,100^); >> %name%+%%k.asy echo real f(real t^) {return cos(2*t^);} >> %name%+%%k.asy echo path g=polargraph(f,0,2pi*%%k/%n%,operator ..^)--cycle; >> %name%+%%k.asy echo fill(g,green+white^); >> %name%+%%k.asy echo xaxis("$x$",above=true^); >> %name%+%%k.asy echo yaxis("$y$",above=true^); >> %name%+%%k.asy echo draw(g^); >> %name%+%%k.asy ) for /l %%l in (0,1,%n%) do ( asy %name%+%%l.asy taskkill /IM AcroRd32.exe ) for /l %%l in (0,1,%n%) do ( rename %name%+%%l.pdf _%name%+%%l.pdf ) asy %name%.asy
Hier sehen wir, dass ich das oben geänderte Modul animation.asy importiere. Ich habe diesem Modul den einfachen Namen izgraphiki.asy gegeben. Und für die PDF-Animationsdatei, die ich bekomme, habe ich mir keinen besseren Namen als cvetok ausgedacht. Anscheinend wegen der Knappheit seiner Vorstellungskraft. Na komm schon, wie es ist. Ich werde Ihnen am Ende dieser Geschichte etwas über "mein" izgraphiki.asy-Modul erzählen, um den Thread der Geschichte jetzt nicht zu verlieren. Im Moment werde ich jedoch bemerken, dass ich versuche, dieser Datei den Namen iz-graphiki.asy zu geben, und dann auch iz + graphiki.asy führte nicht zum beabsichtigten Ziel: Die Arbeit meiner Batch-Datei wurde in vollem Gange gestoppt und unter keinen Umständen fortgesetzt. Anscheinend sollten die Module des Asymptote-Programms nur
Buchstaben des lateinischen Alphabets enthalten. In jedem Fall wird die Einhaltung dieser Bedingung sicherlich nicht schaden. Die Arbeit der oben zitierten Batch-Datei endete also mit dem Erscheinen der begehrten PDF-Datei mit einer Animation aus einer beliebig großen (innerhalb angemessener Grenzen, um nicht 3 Stunden zu warten, funktioniert es, die animierte PDF-Datei erscheint, alles ist in Ordnung, aber der Computer hat eine Ausführungsgeschwindigkeit Operationen sind nur endgültig). Lassen Sie mich 3D-Objekte animiert konstruieren. Und dann wurden weitere Probleme klar. Ich habe es geschafft, Aufnahmen mit diesen Objekten zu stempeln, aber das war's. Bei diesen Frames stellte sich heraus, dass diese Objekte im Raum gedreht wurden. Hier ist alles in Ordnung, aber nur aufgrund des Vorhandenseins von Volumen in PDF-Frames können sie nicht zum Erstellen von Frames in PDF mit Animation verwendet werden. Lass mich weiter nachdenken. Beobachten der Verarbeitung einer leicht modifizierten Kugel.asy-Datei:
leicht modifizierte Kugel.asy-Datei settings.twice=true; usepackage("animate"); import solids; settings.tex="pdflatex"; import animation; settings.outformat="pdf"; currentprojection=orthographic((0,5,2)); currentlight=(0,5,5); int nbpts=200; real step=2*pi/nbpts; int angle=90; unitsize(1cm); triple[] P=new triple[nbpts]; for(int i=0; i < nbpts; ++i) { real t=-pi+i*step; P[i]=(3sin(t)*cos(2t),3sin(t)*sin(2t),3cos(t)); } transform3 t=rotate(angle,(0,0,0),(1,0.25,0.25)); revolution r=sphere(O,3); draw(surface(r),lightgrey); draw(r,backpen=linetype("8 8",8)); animation A; for(int phi=0; phi < 360; phi += angle) { bool[] front=new bool[nbpts]; save(); for(int i=0; i < nbpts; ++i) { P[i]=t*P[i]; front[i]=dot(P[i],currentprojection.camera) > 0; } draw(segment(P,front,operator ..),1mm+blue+extendcap); draw(segment(P,!front,operator ..),grey); A.add(); restore(); } label(A.pdf());
Ich habe festgestellt, dass während dieser Verarbeitung alle Frames der Animation nacheinander angezeigt werden und nicht verschwinden, sondern nur, wenn ich so sagen darf, in der 2D-Version: Meiner Meinung nach handelt es sich um vollständige 3D-Grafiken, aber wenn Sie versuchen, sie von verschiedenen Seiten im Abode-Viewer-Fenster anzuzeigen Wenn Sie den Leser mit gedrückter linker Maustaste bewegen, wie dies bei mit Asymptote erhaltenen 3D-Grafiken zu erwarten ist, ist dies unmöglich, sofern die Möglichkeit dieser Überlegung nicht absichtlich deaktiviert wird, bevor mit der Produktion von PDF mit Animation in einer ASI-Datei begonnen wird th. Die Namen dieser 2D-Frames: _sphere + 0.pdf, _sphere + 1.pdf, ... Nachdem ich etwas über die Erzeugung räumlicher 2D-Frames bei der Verarbeitung von .asy-Dateien mit Animation von 3D-Objekten gelernt hatte, kam mir der Gedanke, .pdf-Frames aus einer Batch-Datei abzurufen zur weiteren Verwendung bei der Verarbeitung der ASY-Datei, in der sich ein Zyklus mit einem leeren Körper befindet, den ich ganz am Anfang der Batch-Datei generiere. Dabei werden nicht nur ASY-Dateien verarbeitet, sondern auch ASY-Dateien, von denen jede einen Zyklus hat. Diese Schleifen in jedem dieser .asy-Datei-Stubs zum Empfangen eines .pdf-Frames bestand aus einem einzelnen Frame: Ich habe diese Stubs nicht erstellt, um .pdf mit Animation von ihnen zu erhalten, sondern um übrigens einen 2d-Frame zu erhalten während der Verarbeitung jeder der .asy-Stub-Dateien. Um .asy-leere Dateien mit solchen Schleifen zu empfangen, habe ich es so gemacht, dass in den Schleifen aller leeren Dateien .asy die Variablen dieser Schleifen am Anfang und Ende von Schleifen den gleichen Wert - 0 annehmen. Die Unterschiede zwischen .pdf-Frames, die sich aus der Verarbeitung ergeben Wiedergabe Asymptote von Werkstückdateien .asy werden durch Unterschiede in den Körpern der Werkstückdateischleifenzyklen.asy verursacht, die wiederum (Unterschiede) auf die Einführung jedes der sequentiellen Werte der Batchdatei-Schleifenvariablen in die Körperfunktion der Werkstückdateizyklus.asy zurückzuführen sind, die von der Batchdatei erstellt wird, wenn ihre Variable qi Kla, der seinen nächsten Wert annimmt, friert ein und wartet auf den Abschluss der Erstellung der Beschaffungsdatei.asy, die diesem Wert der Schleifendatei der Batchdatei entspricht. Kurz gesagt, diese Unterschiede werden durch die Schleifendatei der Batchdatei erzeugt. Die Namen dieser 2d-Frames haben die Form: name + k + 0.pdf, wobei, da diese 2d-Frames das Ergebnis einer Änderung der Schleifendatei der Batchdatei sind,
nimmt in Schritt 1 Werte von 0 bis zum Endwert der Batchdatei-Schleifenvariablen an. Um die animierte PDF-Datei aus der ASI-Datei mit dem leeren Hauptteil der Schleife abzurufen, die zuvor von der Batchdatei erstellt wurde, sollten die PDF-Frame-Namen die folgende Form haben: _name + k.pdf. Daher habe ich das nächste Team in der Batch-Datei diese Frames-.pdf umbenannt. Ich habe es in einer Schleife gemacht. Und schließlich führt das Verarbeitungsteam die Asymptote .asy-Datei mit einem leeren Schleifenkörper aus. Nach dieser Verarbeitung wird ein PDF mit Animation angezeigt. In der Batch-Datei habe ich nach diesem Befehl keinen Befehl zum Öffnen der PDF-Datei mit Animation geschrieben, da diese Öffnung standardmäßig angenommen wird. Diese PDF-Datei mit Animation wird am Ende dieser Verarbeitung trotzdem geöffnet, genau wie eine PDF-Datei geöffnet wird Wird von Asymptote generiert, der eine ASI-Datei ohne Animation verarbeitet. Wenn der Leser den Prozess der Verarbeitung von .asy-Dateien aus einem Unterordner mit Animationen des Beispielordners im Asymptote-Programmordner beobachtet hat, wird er verstehen, dass ein Teil des
Namens aus _name + k.pdf mit dem Namen der .asy-Datei mit einem leeren Körper der Schleife übereinstimmen sollte. Die Dateien _name + k.pdf sind das Ergebnis des Umbenennens einiger anderer .pdf-Dateien (Dateiname + k + 0.pdf), die wiederum ein Nebenprodukt des Programms sind, das einige .asy-Dateien verarbeitet. Um die Aufgabe zu vereinfachen, habe ich diese Dateien erstellt .asy wurden von einer Batchdatei unter dem Namen + 0.asy, name + 1.asy, ... erstellt. Nun, ich habe das Arbeitsprinzip einer von mir geplanten Batchdatei beschrieben. Es ist Zeit, ein Beispiel für eine solche Batchdatei anzugeben. Zum Beispiel:
cd /d %0\.. echo off set n=44 echo settings.twice=true; >>sphera.asy echo usepackage("animate"); >>sphera.asy echo settings.tex="pdflatex"; >>sphera.asy echo import izgraphiki; >>sphera.asy echo animation a; >>sphera.asy echo int n=%n%; >>sphera.asy echo for(int i=0; i ^<= n; ++i) { >>sphera.asy echo a.add(); >>sphera.asy echo restore(); >>sphera.asy echo } >>sphera.asy echo erase(); >>sphera.asy echo label(a.pdf(BBox(0.25cm),delay=250,"controls,loop,autoplay",multipage=false)); >>sphera.asy for /l %%k in (0,1,%n%) do ( echo settings.twice=true; >> sphera+%%k.asy echo usepackage("animate"^); >> sphera+%%k.asy echo import solids; >> sphera+%%k.asy echo settings.tex="pdflatex"; >> sphera+%%k.asy echo import animation; >> sphera+%%k.asy echo settings.outformat="pdf"; >> sphera+%%k.asy echo settings.axes3=true; >> sphera+%%k.asy echo import graph3; >> sphera+%%k.asy echo import palette; >> sphera+%%k.asy echo currentprojection=orthographic(1,1,1^); >> sphera+%%k.asy echo limits((-1.3,-1.3,-1.3^),(1.3,1.3,1.3^)^); >> sphera+%%k.asy echo unitsize(6cm^); >> sphera+%%k.asy echo animation a=animation(global=false^); // (global=false^) >>sphera+%%k.asy echo //C:\Program Files\Asymptote/plain_shipout.asy: 87.10: runtime: Cannot rename _sphera+2+0_.pdf to >>sphera+%%k.asy echo //_sphera+2+0.pdf >>sphera+%%k.asy echo for(int i=0; i ^<= 0; ++i^) { >>sphera+%%k.asy echo real f(real x^) {return sqrt(1-x^^2^);} >> sphera+%%k.asy echo pair F(real x^) {return (x,f(x^)^);} >> sphera+%%k.asy echo triple F3(real x^) {return (x,f(x^),0^);} >> sphera+%%k.asy echo path p=graph(F,-1+i,-1+i+%%k/%n%^); >> sphera+%%k.asy echo path3 p3=path3(p^); >> sphera+%%k.asy echo revolution b=revolution(p3,X,0,360^); >> sphera+%%k.asy echo draw(surface(b^),green^); >> sphera+%%k.asy echo real g(real x^) {return sqrt(1-x^^2^);} >> sphera+%%k.asy echo pair G(real x^) {return (x,f(x^)^);} >> sphera+%%k.asy echo triple G3(real x^) {return (x,g(x^),0^);} >> sphera+%%k.asy echo path q=graph(G,1-i-%%k/%n%,1-i^); >> sphera+%%k.asy echo path3 q3=path3(q^); >> sphera+%%k.asy echo revolution c=revolution(q3,X,0,360^); >> sphera+%%k.asy echo draw(surface(c^),red^); >> sphera+%%k.asy echo axes3("$x$","$y$","$z$",Arrow3^); >> sphera+%%k.asy echo a.add(^); >>sphera+%%k.asy echo restore(^); >>sphera+%%k.asy echo } >>sphera+%%k.asy echo erase(^); >>sphera+%%k.asy echo label(a.pdf(^)^); >>sphera+%%k.asy ) rem for /f %%l in (0,1,%n%) do asy '_sphera+%%l'.asy for /l %%l in (0,1,%n%) do ( asy sphera+%%l.asy taskkill /F /IM AcroRd32.exe ) for /l %%l in (0,1,%n%) do rename sphera+%%l+0.pdf _sphera+%%l.pdf asy sphera.asy
Bitte achten Sie auf die Linie
echo for(int i=0; i ^<= n; ++i) { >>sphera.asy
Da das Symbol
<
eine spezielle Bedeutung für den Befehlszeileninterpreter hat, bin ich diesem Symbol entkommen, indem ich das Symbol
^
davor setze, damit dieser Interpreter dieses Symbol wörtlich nimmt.
Aus dem gleichen Grund habe ich das Symbol selbst ^
im Hauptteil des Batch-Dateizyklus abgeschirmt und ein weiteres ähnliches Symbol davor gestellt. Außerdem habe ich in diesem Hauptteil des Batch-Dateizyklus jede Klammer maskiert, andernfalls wird die erste ungeschirmte Klammer, die angezeigt wird, von der Klammer interpretiert, dem Paar der letzten Klammer anstelle der Batch-Datei for /l %%k in (0,1,%n%) do (
Verfolgen wir also, was passiert, wenn eine Batchdatei mit einer Struktur arbeitet, die ich anhand eines bestimmten Beispiels erfunden habe. Zunächst (im Fall der Ausführung einer Batch-Datei, deren Code von mir etwas weiter oben angegeben wurde, wird die oben in diesem Artikel erwähnte Dateiphera.asy von mir mehrmals mit einem leeren Text der Schleife mit folgendem Inhalt erstellt: settings.twice=true; usepackage("animate"); settings.tex="pdflatex"; import izgraphiki; animation a; int n=44; for(int i=0; i <= n; ++i) { a.add(); restore(); } erase(); label(a.pdf(BBox(0.25cm),delay=250,"controls,loop,autoplay",multipage=false));
Dann werden Sphären + 0.asy, Sphären + 1.asy, ..., Sphären + 44.asy-Dateien erzeugt, deren Verarbeitung anschließend jeweils durch Asymptote als Nebenprodukt 2D-Frames Sphären + 0.pdf, Sphären + 1 ergibt .pdf, ..., Sphäre + 44.pdf. Der Inhalt der Spherea + 4.asy-Datei lautet beispielsweise wie folgt: settings.twice=true; usepackage("animate"); import solids; settings.tex="pdflatex"; import animation; settings.outformat="pdf"; settings.axes3=true; import graph3; import palette; currentprojection=orthographic(1,1,1); limits((-1.3,-1.3,-1.3),(1.3,1.3,1.3)); unitsize(6cm); animation a=animation(global=false); // (global //C:\Program Files\Asymptote/plain_shipout.asy: 87.10: runtime: Cannot rename _sphera+2+0_.pdf to //_sphera+2+0.pdf for(int i=0; i <= 0; ++i) { real f(real x) {return sqrt(1-x^2);} pair F(real x) {return (x,f(x));} triple F3(real x) {return (x,f(x),0);} path p=graph(F,-1+i,-1+i+4/44); path3 p3=path3(p); revolution b=revolution(p3,X,0,360); draw(surface(b),green); real g(real x) {return sqrt(1-x^2);} pair G(real x) {return (x,f(x));} triple G3(real x) {return (x,g(x),0);} path q=graph(G,1-i-4/44,1-i); path3 q3=path3(q); revolution c=revolution(q3,X,0,360); draw(surface(c),red); axes3("$x$","$y$","$z$",Arrow3); a.add(); restore(); } erase(); label(a.pdf());
Ich habe diesen Code kopiert, indem ich die Spherea + 4.asy-Datei in TeXworks geöffnet habe. Dort ist die Codierung auf UTF-8 eingestellt:
Die Batchdatei ist ANSI-Codierung. Anscheinend wird deshalb mein Kommentar im Hauptteil des zweiten Batch-Dateizyklus durch die Quadrate in dieser .asy-Stub-Datei ersetzt, was jedoch die Verarbeitung durch Asymptote nicht beeinträchtigt. Nach dieser Verarbeitung wird dieser 2D-Frame aus dieser Datei abgerufen. Ich gebe ausdrücklich einen Link zum Herunterladen eines dieser 2D-Frames an und füge hier kein Bild dieses Frames ein, damit der Leser direkt sehen kann, um welchen 2D-Frame es sich handelt. Die Essenz anderer .asy-Stub-Dateien ist dieselbe, nur unterscheiden sie sich in den Werten der Argumente der Funktionen im Hauptteil der Schleife. Als nächstes werden die 2D-Frames in Sphären + 0 + 0.pdf, Sphären + 1 + 0.pdf, ..., Sphären + 44 + 0.pdf in _sphera + 0.pdf, _sphera + 1.pdf, ... umbenannt _sphera + 44.pdf und schließlich Asymptote, der eine Datei mit dem leeren Körper des sphärischen Zyklus verarbeitet. Das Ergebnis ist eine solche Animation. Ich habe einen Link zu .gif nur angegeben, weil beim Versuch, .gif selbst hier einzufügen, die Animation aus irgendeinem Grund nicht vollständig angezeigt wurde. Ich habe .gif verwendet, nicht .pdf, weil der Leser dieses Albtraums höchstwahrscheinlich weiß, dass die Animation im Browser, d. H. Hier, in .pdf nicht angezeigt wird, sondern in .gif. Ich habe gerade dieses .gif erhalten, indem ich die Batch-Datei ausgeführt habe, die ich gerade mit dem folgenden Inhalt geknebelt habe: cd /d %0\.. echo off set n=44 echo import graph; >sphera.asy echo settings.twice=true; >>sphera.asy echo usepackage("animate"); >>sphera.asy echo settings.tex="pdflatex"; >>sphera.asy echo import izgraphikigif; >>sphera.asy echo animation a; >>sphera.asy echo yequals(Label("$y=-1$",1.0),-1,extend=true,linetype("4 4")); >>sphera.asy echo int n=%n%; >>sphera.asy echo for(int i=0; i ^<= n; ++i) { >>sphera.asy echo a.add(); >>sphera.asy echo restore(); >>sphera.asy echo } >>sphera.asy echo erase(); >>sphera.asy echo a.movie(); >>sphera.asy for /l %%k in (0,1,%n%) do ( echo settings.twice=true; > sphera+%%k.asy echo usepackage("animate"^); >> sphera+%%k.asy echo import solids; >> sphera+%%k.asy echo settings.tex="pdflatex"; >> sphera+%%k.asy echo import animation; >> sphera+%%k.asy echo settings.outformat="pdf"; >> sphera+%%k.asy echo settings.axes3=true; >> sphera+%%k.asy echo import graph3; >> sphera+%%k.asy echo import palette; >> sphera+%%k.asy echo currentprojection=orthographic(1,1,1^); >> sphera+%%k.asy echo limits((-1.3,-1.3,-1.3^),(1.3,1.3,1.3^)^); >> sphera+%%k.asy echo unitsize(6cm^); >> sphera+%%k.asy echo animation a=animation(global=false^); // (global=false^) >>sphera+%%k.asy echo //C:\Program Files\Asymptote/plain_shipout.asy: 87.10: runtime: Cannot rename _sphera+2+0_.pdf to >>sphera+%%k.asy echo //_sphera+2+0.pdf >>sphera+%%k.asy echo for(int i=0; i ^<= 0; ++i^) { >>sphera+%%k.asy echo real f(real x^) {return sqrt(1-x^^2^);} >> sphera+%%k.asy echo pair F(real x^) {return (x,f(x^)^);} >> sphera+%%k.asy echo triple F3(real x^) {return (x,f(x^),0^);} >> sphera+%%k.asy echo path p=graph(F,-1+i,-1+i+%%k/%n%^); >> sphera+%%k.asy echo path3 p3=path3(p^); >> sphera+%%k.asy echo revolution b=revolution(p3,X,0,360^); >> sphera+%%k.asy echo draw(surface(b^),green^); >> sphera+%%k.asy echo real g(real x^) {return sqrt(1-x^^2^);} >> sphera+%%k.asy echo pair G(real x^) {return (x,f(x^)^);} >> sphera+%%k.asy echo triple G3(real x^) {return (x,g(x^),0^);} >> sphera+%%k.asy echo path q=graph(G,1-i-%%k/%n%,1-i^); >> sphera+%%k.asy echo path3 q3=path3(q^); >> sphera+%%k.asy echo revolution c=revolution(q3,X,0,360^); >> sphera+%%k.asy echo draw(surface(c^),red^); >> sphera+%%k.asy echo axes3("$x$","$y$","$z$",Arrow3^); >> sphera+%%k.asy echo a.add(^); >>sphera+%%k.asy echo restore(^); >>sphera+%%k.asy echo } >>sphera+%%k.asy echo erase(^); >>sphera+%%k.asy echo label(a.pdf(^)^); >>sphera+%%k.asy ) for /l %%l in (0,1,%n%) do ( asy sphera+%%l.asy taskkill /F /IM AcroRd32.exe ) rem for /l %%l in (0,1,%n%) do rename sphera+%%l+0.pdf _sphera+%%l.pdf asy sphera.asy
Ich werde das Funktionsprinzip dieser Batch-Datei nicht im Detail beschreiben, der Leser wird es verstehen, nachdem er den Prozess des Abrufens von .gif aus der lang leidenden Wheel.asy-Datei beobachtet hat. Ich stelle nur fest, dass das Fehlen einer Linie yequals(Label("$y=-1$",1.0),-1,extend=true,linetype("4 4"));
in der Dateiphera.asy führt dazu, dass nichts passiert. Ich konnte mir so etwas nicht einmal vorstellen, weil es absolut nichts gibt, mit dem ich es verknüpfen könnte, und deshalb habe ich es durch dummes Löschen / "Löschen abbrechen" in einer separaten ähnlichen .asy-Datei mit einem leeren Schleifenkörper herausgefunden. Schauen wir uns zum Vergleich das animierte .gif an, das Imagemagick aus 2D-Frames zusammengestellt hat:
Verdammt, wieder dasselbe. Hier ist ein Link zu fotokostinge oh, photohosting . Huh?
Ich habe es durch Ausführen eines Befehls erhalten magick *.eps sphere.gif
in der Befehlszeile, die aus dem Ordner gestartet wird, in dem sich 2D-Frames mit der Erweiterung .eps befinden. Ich habe immer noch diese Frames aus der .gif-Assembly mit der letzten oben angegebenen Batch-Datei. Wie sie sagen, finden Sie 10 Unterschiede)). Also, so scheint es, habe ich nichts vergessen. Es bleibt nur zu erzählen, wie ich versprochen habe, über die von mir modifizierten Module, die durch Ändern des gleichen Moduls animation.asy erhalten wurden. Warum habe ich dann versprochen, über ein Modul zu sprechen, und werde über mehrere (ungefähr zwei) Module sprechen? Weil ich beim Schreiben dieses Artikels ein animiertes GIF aus einer großen Anzahl von Frames erstellen musste. Es stellte sich heraus, dass das von mir verwendete Modul izgraphiki.asy - eine Modifikation des Moduls animation.asy - zum Erstellen von animiertem PDF mit einer großen Anzahl von Frames (möglicherweise mit (siehe)) verwendet wurdeoben) 3D-Grafiken auf ihnen) ist absolut nicht geeignet, um animierte .gif-Dateien mit einer großen Anzahl von Frames zu erstellen (möglicherweise mit einer Art (siehe oben) 3D-Grafiken). Ein aufmerksamer Leser könnte jedoch feststellen, dass ich zwei meiner eigenen Module selbst verwende. In „meinem“ Modul zum Generieren von PDF, für das ich durch Umbenennen der Datei animation.asy eine Kopie erhalten habe, musste ich die Definition (ich glaube, ich habe es mit der Definition gemacht) von allen 4 Zeilen kommentieren, die das Wesentliche dieser Definition ausmachen Das Objekt selbst zu belassen, aber mit einer leeren Definition: Das Löschen dieses Objekts zusammen mit seiner Definition verursachte einen Fehler: Es wurde angegeben, dass dieses Objekt unbekannt war. Das Speichern dieses Objekts im Modul, jedoch mit gelöschten (oder auskommentierten) Zeilen dieser Definition selbst, löste dieses Problem.Dies sind die Zeilen des Moduls animation.asy: string format=nativeformat(); plain.shipout(name,f,format=format,view=false); files.push(name+"."+format); shipped=false;
Und so sehen die gleichen Zeilen im Modul izgraphiki.asy aus: //string format=nativeformat(); //plain.shipout(name,f,format=format,view=false); //files.push(name+"."+format); //shipped=false;
Und hier ist das Modul izgraphiki.asy selbst:Modul izgraphiki.asy /***** * animation.asy * Andy Hammerlindl and John Bowman 2005/11/06 * * Produce GIF, inline PDF, or other animations. *****/ // animation delay is in milliseconds real animationdelay=50; typedef frame enclosure(frame); frame NoBox(frame f) { return f; } enclosure BBox(real xmargin=0, real ymargin=xmargin, pen p=currentpen, filltype filltype=NoFill) { return new frame(frame f) { box(f,xmargin,ymargin,p,filltype,above=false); return f; }; } struct animation { picture[] pictures; string[] files; int index; string prefix; bool global; // If true, use a global scaling for all frames; this requires // extra memory since the actual shipout is deferred until all frames have // been generated. void operator init(string prefix="", bool global=true) { prefix=replace(stripdirectory(outprefix(prefix))," ","_"); this.prefix=prefix; this.global=global; } string basename(string prefix=stripextension(prefix)) { return "_"+prefix; } string name(string prefix, int index) { return stripextension(prefix)+"+"+string(index); } private string nextname() { string name=basename(name(prefix,index)); ++index; return name; } void shipout(string name=nextname(), frame f) { // string format=nativeformat(); // plain.shipout(name,f,format="png",view=false); //generiruet!!!! //files.push(name+"."+format); // shipped=false; } void add(picture pic=currentpicture, enclosure enclosure=NoBox) { if(global) { ++index; pictures.push(pic.copy()); } else this.shipout(enclosure(pic.fit())); } void purge(bool keep=settings.keep) { if(!keep) { for(int i=0; i < files.length; ++i) delete(files[i]); } } int merge(int loops=0, real delay=animationdelay, string format="gif", string options="", bool keep=settings.keep) { string args="-loop " +(string) loops+" -delay "+(string)(delay/10)+ " -alpha Off -dispose Background "+options; for(int i=0; i < files.length; ++i) args += " " +files[i]; int rc=convert(args,prefix+"."+format,format=format); this.purge(keep); if(rc == 0) animate(file=prefix+"."+format,format=format); else abort("merge failed"); return rc; } void glmovie(string prefix=prefix, projection P=currentprojection) { if(!view() || settings.render == 0) return; fit(prefix,pictures,view=true,P); } // Export all frames with the same scaling. void export(string prefix=prefix, enclosure enclosure=NoBox, bool multipage=false, bool view=false, projection P=currentprojection) { if(pictures.length == 0) return; if(!global) multipage=false; bool inlinetex=settings.inlinetex; if(multipage) settings.inlinetex=false; frame multi; frame[] fits=fit(prefix,pictures,view=false,P); for(int i=0; i < fits.length; ++i) { string s=name(prefix,i); if(multipage) { add(multi,enclosure(fits[i])); newpage(multi); files.push(s+"."+nativeformat()); } else { if(pictures[i].empty3() || settings.render <= 0) this.shipout(s,enclosure(fits[i])); else // 3D frames files.push(s+"."+nativeformat()); } } if(multipage) { plain.shipout(prefix,multi,view=view); settings.inlinetex=inlinetex; } shipped=true; } string load(int frames, real delay=animationdelay, string options="", bool multipage=false) { if(!global) multipage=false; string s="\animategraphics["+options+"]{"+format("%.18f",1000/delay,"C")+ "}{"+basename(); if(!multipage) s += "+"; s += "}{0}{"+string(frames-1)+"}"; return s; } bool pdflatex() { return latex() && pdf(); } string pdf(enclosure enclosure=NoBox, real delay=animationdelay, string options="", bool keep=settings.keep, bool multipage=true) { if(settings.inlinetex) multipage=true; if(!global) multipage=false; if(!pdflatex()) abort("inline pdf animations require -tex pdflatex or -tex xelatex"); if(settings.outformat != "") settings.outformat="pdf"; string filename=basename(); string pdfname=filename+".pdf"; if(global) export(filename,enclosure,multipage=multipage); shipped=false; if(!keep) { exitfcn currentexitfunction=atexit(); void exitfunction() { if(currentexitfunction != null) currentexitfunction(); if(multipage || !settings.inlinetex) this.purge(); if(multipage && !settings.inlinetex) delete(pdfname); } atexit(exitfunction); } if(!multipage) delete(pdfname); return load(index,delay,options,multipage); } int movie(enclosure enclosure=NoBox, int loops=0, real delay=animationdelay, string format=settings.outformat == "" ? "gif" : settings.outformat, string options="", bool keep=settings.keep) { if(global) { if(format == "pdf") { export(enclosure,multipage=true,view=true); return 0; } export(enclosure); } return merge(loops,delay,format,options,keep); } } animation operator init() { animation a=animation(); return a; }
Ich stelle fest, dass die Linie plain.shipout(name,f,format="png",view=false); //generiruet!!!!
Dieses Modul unterscheidet sich von der Vorbildzeile im Modul animation.asy, aber dies ist eine Spur meiner Forschung. Ich habe es nicht geändert: Es stört nichts, wirkt sich jedoch aus, wenn diese Zeilen auskommentiert werden. Um jedoch animiertes .gif aus den Zeilen zu erhalten, die ich im Modul izgraphiki.asy auskommentiert habe, musste ich nur eine Zeile in der Datei animation.asy auskommentieren, die kopiert und in izgraphikigif.asy umbenannt wurde. plain.shipout(name,f,format= format,view=false);
d.h. diese Zeile im Modul izgraphikigif.asy sieht folgendermaßen aus: //plain.shipout(name,f,format= format,view=false);
Natürlich können Sie diese Zeile vollständig löschen. Daher unterscheiden sich dieModule animation.asy und izgraphikigif.asy im Allgemeinen nur in einer Zeile, aber dennoch. Der Versuch, mit dem Modul izgraphikigif.asy eine animierte PDF-Datei zu erstellen, war wiederum erfolglos. Daher funktioniert es nicht, diese beiden Module auf eins zu reduzieren. Obwohl ich vielleicht irgendwie durch, wenn ich nicht weiß, nichts sagen werde: Ich, wie sich herausstellt, kenne die Asymptote-Sprache heute nicht so gut. Ich stelle fest, dass es trotz der Tatsache, dass meine Verwendung von Batch-Dateien, ähnlich der Batch-Datei der oben beschriebenen Struktur, zum Erstellen anderer Animationen funktioniert hat, in einem Fall nicht gelungen ist - beim Versuch, ein animiertes Epizykloid durch Ausführen einer solchen Batch-Datei zu erhalten:Epizykloid fehlgeschlagen cd /d %0\.. echo off set n=2 set name=kriv echo settings.twice=true; >%name%.asy echo settings.prc=false; >> %name%.asy echo // Uncomment the following 2 lines to support pdf animations: >>%name%.asy echo usepackage("animate"^); >>%name%.asy echo settings.tex="pdflatex"; >>%name%.asy echo import sinoid; >>%name%.asy echo animation a; >>%name%.asy echo int n=%n%; >>%name%.asy echo for(int i=0; i ^<= n; ++i^) { >>%name%.asy echo a.add(^); // Add currentpicture to animation. >>%name%.asy echo restore(^); >>%name%.asy echo } >>%name%.asy echo erase(^); >>%name%.asy echo label(a.pdf(BBox(0.25cm^),delay=250,"controls",multipage=false^)^); >>%name%.asy for /l %%k in (0,1,%n%) do ( echo import graph; > %name%+%%k.asy echo settings.twice=true; >> %name%+%%k.asy echo usepackage("animate"^); >> %name%+%%k.asy echo settings.tex="pdflatex"; >> %name%+%%k.asy echo import animation; >> %name%+%%k.asy echo limits((-6.3,-6.3^),(6.3,6.3^)^); >> %name%+%%k.asy echo size(0,100^); >> %name%+%%k.asy echo animation a=animation(global=false^);>>%name%+%%k.asy echo for(int i=0; i ^<= 0; ++i^) { >>%name%+%%k.asy echo real r=0.925; >> %name%+%%k.asy echo real R=3.61; >> %name%+%%k.asy echo real d=1.39; >> %name%+%%k.asy echo real x(real t^) {return (R+r^)*cos(t^)-d*cos((R+r^)*t/r^);} >> %name%+%%k.asy echo real y(real t^) {return (R+r^)*sin(t^)-d*sin((R+r^)*t/r^);} >> %name%+%%k.asy echo draw(graph(x,y,0,2*pi*%%k/%n%^),green^); >> %name%+%%k.asy echo axes("$x$","$y$",Arrow^); >> %name%+%%k.asy echo a.add(^); // Add currentpicture to animation. >>%name%+%%k.asy echo restore(^); >>%name%+%%k.asy echo } >>%name%+%%k.asy echo erase(^); >>%name%+%%k.asy echo // Merge the images into a pdf animation. >>%name%+%%k.asy echo label(a.pdf(^)^); >>%name%+%%k.asy ) rem for /f %%l in (0,1,%n%) do asy '%name%+%%l'.asy rem asy *.asy for /l %%l in (0,1,%n%) do ( asy %name%+%%l.asy taskkill /IM AcroRd32.exe ) for /l %%l in (0,1,%n%) do rename %name%+%%l.pdf _%name%+%%l.pdf asy %name%.asy
.
Obwohl ich dich töten werde, verstehe ich nicht, warum es nicht funktioniert: Eine kriv.asy-Datei mit einer leeren Schleife wird gebildet, 2D-Frames.pdf werden gebildet, jede von ihnen hat Grafiken, alles ist in Ordnung, Asymptote verarbeitet die kriv.asy-Datei ohne Probleme. Wenn eine kriv.pdf-Datei ungleich Null angezeigt wird, öffnen Sie sie dort, wie es für .pdf üblich ist, die aus .asy-Dateien mit solchen Inhalten stammen: Animationssteuerungsschaltflächen, ein weißes Rechteck darüber, in dem Animationsrahmen flackern sollten. Sie müssen, aber sie sind nicht verpflichtet: Klicken Sie auf das weiße Rechteck oder die Wiedergabetaste, diese Schaltfläche wird durch die Pause-Schaltfläche ersetzt, alles ist in Ordnung, aber es gibt keine Rahmen und das wars, ein weißes Rechteck! Warum - eine millionste Frage. Hier ist übrigens noch etwas zu sehen, das mich verblüfft: Ich habe den Namen kriv anstelle des offensichtlichen Namens epicykloida verwendet.Bei dem Versuch, diesen Namen zu verwenden, ist nichts passiert, es hat nicht funktioniert. Wenn Sie eine andere Animation erstellen, verwenden Sie den Namen Astroida. Die Änderung in beiden Fällen in den Batch-Dateien des Werts nur eines Variablennamens in einem Fall auf krivaja, in dem anderen auf kriv führte sofort zum Erscheinen von .pdf mit normal angezeigter Animation. Es ist jedoch klar, dass dieses Problem durch Asymptote verursacht wird: Wenn Sie beispielsweise versuchen, eine Datei mit einem leeren Körper des Astroida.asy-Zyklus zu verarbeiten, wird dasselbe Problem beobachtet. Was die Produktion von MPG-Dateien aus einer willkürlich großen (ich wiederhole, in angemessenen Grenzen) Anzahl von Frames im Sinne dieses Artikels betrifft, habe ich mich noch nicht damit befasst, aber ich denke, es sollten keine unüberwindbaren Probleme auftreten. Ja, obwohl ich mich erinnerte, gilt dies nicht für die hier beschriebenen Batch-Dateien, sondern bezieht sich auf die Animation in Asymptote im Allgemeinen: eine .asy-Datei,von dem die animierte .pdf-Datei abgerufen wird, unterscheidet sich von der .asy-Datei, aus der die animierte .gif-Datei mit einer einzelnen letzten Zeile abgerufen wird.Die einfachste letzte Zeile einer ASI-Datei, die eine animierte PDF-Datei erzeugt, lautet: label(a.pdf());
Die einfachste letzte Zeile der ASI-Datei, aus der das animierte GIF hervorgeht, sieht folgendermaßen aus: a.movie();
Und die einfachste letzte Zeile der ASI-Datei, aus der eine funktionsfähige MPG-Datei hervorgeht, entspricht der einfachsten letzten Zeile der ASY-Datei, aus der die animierte GIF-Datei hervorgeht. Gleichzeitig wird bereits bei der Verarbeitung einer ASI-Datei eine funktionsfähige MPG-Datei angezeigt, in die die Zeile, nach der ich so lange gesucht habe, nicht geschrieben wurde settings.twice=true;
Nun, es scheint, das ist alles.