Animation dans Asymptote

Copié de mon blog afin de créer une autre source d'information en russe sur ce sujet.

Bonjour Lorsque moi, dans le processus de maîtrise du programme Asymptote, qui a eu lieu lorsque j'ai appris les nuances des paramètres de ce programme décrits ici dans ce hub , j'ai parfaitement maîtrisé le traitement des fichiers .asy qui n'ont pas d'animation, j'ai naturellement rencontré l'animation.

En-tĂŞte de spoiler
Donnez de l'animation aux masses!

Heureusement, pour cela, dans le cas du format de sortie .pdf, aucun des programmes supplémentaires décrits par moi dans le hub en utilisant le lien ci-dessus, après l'installation du programme ghostscript, vous n'avez pas besoin d'installer, et même le diable sait combien de temps il a creusé. Mais alors je ne savais pas à ce sujet, ce qui a compliqué la question à plusieurs reprises. Vous traitez le fichier wheel.asy et quoi? Eh bien, .pdf est apparu pendant le traitement dans TeXworks (voir le lien ci-dessus) dans le même dossier avec le fichier .asy traité, et lorsqu'il est ouvert dans Explorer (voir le même hub), dans le C:\Windows\System32 . Et alors? Il n'y avait aucune animation et c'est tout, même si vous craquez. Avant l'animation dans Asymptote, j'ai appris à faire des animations en tikz et pstricks . Je n'ai donc pas réussi jusqu'à ce que je supprime le fichier animate.sty du dossier C:\Program Files\MiKTeX 2.9\tex\latex\animate et que je mette le fichier du même nom téléchargé plus tard. Il est là . Ainsi, sachant que cette le package fonctionne avec tikz et pstricks, j'étais enclin à penser que cela ne fonctionne pas pour moi, très probablement, non pas à cause de problèmes avec TeX, mais pour une autre raison. J'ai donc fouillé l'ancien Internet pendant plusieurs années. Au début, j'ai cherché dans le navigateur IE, eh bien, il n'y a pas de traducteur pratique. Ensuite, j'ai reniflé que Google a un traducteur pratique. Également recherché, recherché, recherché, recherché, jusqu'à ce qu'il tombe sur cette page. Il s'est avéré que, pour une raison quelconque, dans tous les fichiers .asy du dossier C:\Program Files\Asymptote\examples\animations , pour obtenir d'eux .pdf avec animation, il n'y a pas assez de ligne unique

 settings.twice=true; 

J'ai ajouté cette ligne au fichier wheel.asy du sous-dossier d'animation du dossier d'exemples:

Enfin l'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)); 


Dans le même temps, afin de recevoir .pdf, connaissant 300 mots en anglais, j'ai réalisé que je devais décommenter sous la forme du fichier wheel.asy dans lequel l'utilisateur l'obtient des auteurs du programme Asymptote, 2 lignes:

 ....................... usepackage("animate"); settings.tex="pdflatex"; ....................... 

En regardant les commentaires sur ces lignes Ă  la fin du fichier wheel.asy:

 ........................ // 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)); 

, J'ai réalisé que pour obtenir .pdf, je dois refaire le code que j'ai obtenu des auteurs du programme et commenter la ligne

 a.movie(BBox(0.25cm),loops=10,delay=250); 

et décommenter la ligne

 label(a.pdf(BBox(0.25cm),delay=250,"controls",multipage=false)); 

Et comment ma roue a roulé après ces mouvements du corps! La logique des auteurs du programme Asymptote est également incompréhensible: pour obtenir .gif, un programme supplémentaire est plus nécessaire que pour obtenir .pdf. Les fichiers contenant des exemples seront très probablement regardés par des utilisateurs qui ne savent pas du tout comment procéder. Eh bien, faites-le pour que lors de l'ouverture de ces fichiers à la fois, sans rien y changer, ces utilisateurs puissent recevoir un format qui nécessite moins de programmes supplémentaires - .pdf, non, ils ont créé .gif. Pourquoi ?? Eh bien oh bien. Oui, je noterai également que lors de l'ouverture du fichier wheel.asy dans l'Explorateur (voir mon hub ) pour en obtenir un .gif fonctionnel, la présence du fichier config.asy dans le même dossier que celui-ci (voir mon hub ) est facultative. Permettez-moi de vous rappeler que .gif dans ce cas (lorsqu'il est ouvert dans l'Explorateur) est formé dans le C:\Windows\System32 . Lors du traitement de ce fichier .asy dans TeXworks, la présence de config.asy dans le même dossier que le fichier à traiter est obligatoire (ou en incluant les lignes que j'ai décrites dans le lien précédent directement dans le fichier .asy traité lui-même). Eh bien, le voici. J'ai eu cette roue roulante droite, j'ai ri de partout, ravie. C'était la nuit. Je me suis couché. Je me suis réveillé et comp. Pendant que l'ordinateur s'allumait, il s'assit, se frottant les mains. Eh bien, je pense, maintenant je vais mathématiquement commencer à utiliser du mazout pour nous.) Ouais, maintenant. Les animations du sous-dossier d'exemples ont réussi à peu près tout, à l'exception de embeddedmovie.asy, externalmovie.asy et embeddedu3d.asy. J'ai attendu les 2 premiers fichiers plus tard, mais cela n'a pas fonctionné avec le dernier: là, si je comprends bien, certains fichiers dice.u3d doivent également être téléchargés de quelque part, et lequel est un grand secret pour une petite entreprise. Eh bien, cela: "Oh, le royaume ne suffit pas, il n'y a pas d'endroit où errer." J'ai écrit, il y avait un tel 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)); 

J'ai reçu l'erreur prometteuse suivante dans TeXworks :

 error: out of memory 

Lors de l'ouverture de ce fichier .asy dans l'Explorateur (voir le lien vers le hub juste au-dessus), l'erreur était la même. Ouais. J’ai cuit à la vapeur, j’ai cuit à la vapeur, j’ai été boueux, j’ai découvert que n=3il s'avère .pdf avec animation, mais déjà à n=4que cette erreur se produit également. Permettez-moi de demander au forum Asymptote lui-même . Mais les Anglo-Saxons sont des gens respectueux des lois qui n'aiment pas revenir en arrière par rapport aux instructions. Ils n'ont rien trouvé. Que faire Cela valait-il la peine de pelleter la moitié d'Internet pour tomber sur de telles ordures? Eh bien, rien, les Russes n’abandonnent pas! Et d'ailleurs, les héros normaux font toujours le tour ... J'ai commencé à observer le processus de traitement du fichier wheel.asy dans TeXworks et qu'est-ce que j'ai vu? Tout d'abord, les fichiers _wheel + 0.pdf, _wheel + 1.pdf, ..., _wheel + 10.pdf apparaissent, puis à partir de ces fichiers, un fichier multi-pages _wheel.pdf est formé et plus loin dans le programme. Et pour faire tout cela, le module d'animation est importé dans le fichier .asy à partir duquel ils vont obtenir l' animation . Et puis j'ai eu une idée. Mais que faire si dans ce module (fichier C:\Program Files\Asymptote\animation.asy ) vous trouvez un endroit qui génère des fichiers comme _wheel + 0.pdf et le désactivez? Tamponnez-vous ces fichiers avec des fichiers .asy de traitement Asymptote générés par bouclage dans un fichier batch? Ces fichiers .asy peuvent être créés avec les noms nom + 0.asy , nom + 1.asy , etc., aussi longtemps que nécessaire. Où le nom est un ensemble de lettres latines associées à l'animation en cours de création, que vous souhaiterez probablement modifier sur le pdf prêt à l'emploi avec animation. Mais ce sera plus tard. En attendant, après avoir créé les fichiers, le nom est + 0.asy , le nom est + 1.asy ... selon mon idée, le traitement par Asymptote devrait suivre. Cela créerait le nom des fichiers + 0.pdf , le nom + 1.pdf ... Et avant le code qui crée le nom des fichiers + 0.asy , le nom + 1.asy ..., je devais insérer des lignes dans le fichier de commandes pour créer le fichier name.asy ou plutôt, juste des lignes pour entrer dans ce fichier. Et le fichier name.asy serait formé simplement à la suite du fichier de commandes. Dans ce fichier, le nom est .asy, je prévoyais d'importer le module d'animation que j'ai converti au lieu du module d' animation lui-même. J'ai décidé de rendre le début de ce fichier name.asy le plus simple, dans l'esprit du début du fichier wheel.asy. Après la boucle, je viens de copier bêtement les lignes de ce fichier et de les coller dans le fichier batch comme ceci:

 echo  >> .asy 

,

 echo  >> .asy 

J'ai écrit le fichier batch pour que dans le fichier créé le nom. Facile, le corps de la boucle était vide, et où se trouvait, il se passerait comme ceci:

 for(int i=0; i <= n; ++i) { 

Dans le fichier de commandes, la ligne au-dessus de la ligne de code entrant cette ligne dans le nom de fichier .asy est une ligne

 echo int n=%n%; >>%name%.asy 

et les troisième et quatrième lignes de ce fichier de commandes sont les suivantes:
 set n=24 set name=OdnopGip 

, donc au début du traitement de la boucle dans le nom du fichier. Easy Asymptote connaît déjà la valeur de n dans ce cas et tout fonctionne. Le nom de la variable d'environnement signifie, en traduction dans la langue de cet article, le nom de name.asy . Déclarer dans ce cas les valeurs de nom ou n dans le fichier batch via set me semble extrêmement pratique: changer leurs valeurs en un seul endroit dans le fichier batch implique de changer tous les noms des fichiers .tex, .pdf générés lors du traitement d'un certain fichier ou numéro .asy images dans le pdf animé résultant, modifiant essentiellement les détails de l'animation. Eh bien, le voici. J'ai donc préparé les cadres nom + 0.pdf , nom + 1.pdf ... cependant, car après la préparation de chaque cadre ouvert, j'ai dû inclure une commande dans mon fichier batch pour le fermer. Étant donné que je ne savais pas comment fermer une fenêtre avec un titre spécifique à partir d'un fichier de commandes, j'ai inclus la commande suivante dans mon fichier de commandes dans le corps du cycle de traitement sans cadre .asy:
 taskkill /IM AcroRd32.exe 

, ce qui, comme il s'est avéré plus tard au cours de l'exécution de tout cela, est encore mieux que de fermer chaque image spécifique: parfois l'image n'a toujours pas le temps d'apparaître sur le moniteur, et le traitement du fichier .asy suivant commence déjà, à la fin duquel l'image suivante apparaît sur le moniteur, et la finale avec la commande de cette étape suivante du cycle, le cadre de cette étape suivante et le cadre de l'étape précédente, au-delà desquels le fichier de commandes en cours d'exécution est passé, seront fermés, bien qu'il soit clair qu'après avoir inclus cette commande dans le fichier de commandes lors de son exécution du livre en .pdf, ce n'est plus Je suis mauvais, oui. Plus loin dans la logique, je devais renommer les fichiers nom + 0.asy, nom + 1.asy, ... en _name + 0.asy, _name + 1.asy, ..., car la présence de fichiers avec exactement ces noms en un Le dossier avec le fichier .asy en cours de traitement, dans lequel il y a une animation, suppose que ce fichier est traité à condition que le module d'animation natif soit importé avant de commencer la production du nom de fichier.pdf (oui, je pourrais, à l'intérieur de la boucle du fichier batch avec la variable k, ne pas aligner les lignes du code constituant le cadre, pas dans le nom de fichier + k.asy, et le fichier _name + k.asy, mais cela nécessiterait plus de saisie du caractère "_". Et le traitement ultérieur des plaies asymptotes . Fichier E imya.asy créé Bref, selon l'idée originale était d'avoir un look de fichiers par lots comme celui-ci:

 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 

Ici, nous voyons que j'importe le module animation.asy que j'ai modifié ci-dessus. J'ai donné le nom simple izgraphiki.asy à ce module. Et pour le fichier d'animation .pdf que je reçois, je n'ai pas trouvé un nom meilleur que cvetok. Apparemment, à cause de la rareté de son imagination. Eh bien, allez, comment c'est. Je vais vous parler de «mon» module izgraphiki.asy à la toute fin de cette histoire, afin de ne pas perdre le fil de l'histoire maintenant, mais pour l'instant je noterai que j'essaie de donner à ce fichier le nom iz-graphiki.asy, puis d'essayer aussi iz + graphiki.asy n'a pas abouti au but recherché: le travail de mon fichier batch s'est arrêté en plein essor et n'a repris en aucun cas. Apparemment, les modules du programme Asymptote ne devraient contenir que des lettres de l' alphabet latin. Dans tous les cas, le respect de cette condition ne fera certainement pas de mal. Ainsi, le travail du fichier batch que j'ai cité ci-dessus s'est terminé avec l'apparition du fichier .pdf convoité avec une animation arbitrairement grande (dans des limites raisonnables, afin de ne pas attendre 3 heures, cela fonctionne, le .pdf animé apparaît, tout va bien, mais l'ordinateur a une vitesse d'exécution) les opérations ne sont que définitives). Permettez-moi de faire une construction animée d'objets 3D. Et puis un autre problème est devenu clair. J'ai réussi à tamponner des photos avec ces objets, mais, oh, c'est tout. Au niveau de ces cadres, ces objets se sont avérés tourner dans l'espace, tout va bien ici, mais juste à cause de cette présence de volume dans les cadres pdf, ils ne peuvent pas être utilisés pour construire des cadres en pdf avec animation. Laissez-moi réfléchir plus loin. Regarder le traitement d'un fichier sphere.asy légèrement modifié:

fichier sphère.asy légèrement modifié
 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()); 


, J'ai remarqué qu'au cours de ce traitement, toutes les images de l'animation apparaissent et ne disparaissent pas séquentiellement, mais seulement elles, si je peux dire, dans la version 2D: à mon avis, ce sont des graphiques 3D complets, mais si vous essayez de les visualiser de différents côtés dans la fenêtre de la visionneuse Abode Reader en se déplaçant avec le bouton gauche de la souris enfoncé, comme prévu à partir des graphiques 3D obtenus à l'aide d'Asymptote, sauf si la possibilité de cette considération est désactivée avant de commencer la production de .pdf avec animation dans un fichier .asy, cela s'avère impossible e. Les noms de ces cadres 2D: _sphere + 0.pdf, _sphere + 1.pdf, ... Ayant appris la génération de cadres 2D spatiaux lors du traitement de fichiers .asy qui ont une animation d'objets 3D, il m'est venu à l'esprit d'obtenir des cadres .pdf à partir d'un fichier batch pour une utilisation ultérieure dans le traitement du fichier .asy, dans lequel il y a un cycle avec un corps vide, que je génère au tout début du fichier de commandes, en traitant non seulement les fichiers .asy, mais aussi les fichiers .asy, chacun ayant un cycle. Ces boucles dans chacun de ces talons de fichier .asy pour en recevoir une image .pdf J'ai constitué une seule image: je n'ai pas fait ces talons pour obtenir .pdf avec une animation d'eux, mais pour obtenir une image 2D, d'ailleurs en cours de traitement de chacun des fichiers de raccord .asy. Afin de recevoir des fichiers vides .asy avec de telles boucles, j'ai fait en sorte que dans les boucles de tous les fichiers vides .asy, les variables de ces boucles au début et à la fin des boucles prennent la même valeur - 0. Les différences entre les images .pdf résultant du traitement play Asymptote de fichiers vides .asy sont causés par des différences dans les corps des fichiers de boucle de blanks.asy, lesquelles (différences) sont, à leur tour, dues à l'introduction de chacune des valeurs séquentielles de la variable de boucle de fichier batch dans les fonctions de corps des fichiers de boucle de blanks.asy, créées par le fichier batch lorsque sa variable qi Kla, prenant sa valeur suivante, se fige, en attendant la fin de la création du fichier d'approvisionnement.asy, correspondant à cette valeur de la variable de boucle du fichier batch. En bref, ces différences sont créées par la variable de boucle de fichier batch. Les noms de ces cadres 2d sont de la forme: nom + k + 0.pdf, où, parce que ces cadres 2d sont le résultat d'un changement dans la variable de boucle du fichier batch, kprend des valeurs de 0 à la valeur finale de la variable de boucle du fichier de commandes à l'étape 1. Pour obtenir le fichier .pdf animé du fichier .asy avec le corps vide de la boucle créé par le fichier de commandes plus tôt, les noms de cadre .pdf doivent avoir la forme suivante: _name + k.pdf. Par conséquent, la prochaine équipe du fichier de commandes a renommé ces cadres-.pdf. Je l'ai fait en boucle. Enfin, l'équipe de traitement a exécuté le fichier Asymptote .asy avec un corps de boucle vide. Après ce traitement, un .pdf avec animation apparaît. Dans le fichier batch, après cette commande, je n'ai pas écrit de commande pour ouvrir le fichier .pdf avec animation, car cette ouverture est supposée par défaut, ce fichier .pdf avec animation s'ouvre quand même à la fin de ce traitement, tout comme un fichier .pdf s'ouvre généré par Asymptote traitant un fichier .asy sans animation. Si le lecteur a observé le processus de traitement des fichiers .asy à partir d'un sous-dossier avec des animations du dossier d'exemples situé dans le dossier du programme Asymptote, il comprendra qu'une partie du nom de _name + k.pdf devrait coïncider avec le nom du fichier .asy avec un corps vide de la boucle. Les fichiers _name + k.pdf sont le résultat du renommage d'autres fichiers .pdf (nom de fichiers + k + 0.pdf), qui, à leur tour, sont un sous-produit du programme traitant certains fichiers .asy, donc, pour simplifier la tâche, j'ai fait ces fichiers .asy ont été créés par un fichier batch sous les noms nom + 0.asy, nom + 1.asy, ... Alors, bien, j'ai décrit le principe de travail d'un fichier batch que j'avais prévu, il est temps de donner un exemple d'un de ces fichiers batch. Par exemple, ceci:

 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 

Veuillez faire attention Ă  la ligne

 echo for(int i=0; i ^<= n; ++i) { >>sphera.asy 

étant donné que le symbole < a une signification spéciale pour l'interpréteur de ligne de commande, afin que cet interprète prenne ce symbole au sens littéral, j'ai échappé à ce symbole en plaçant le symbole ^ devant lui. ^ , . , , ,

 for /l %%k in (0,1,%n%) do ( 

, , . ( , , sphera.asy :

 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)); 

sphera+0.asy, sphera+1.asy,..., sphera+44.asy, Asymptote 2d- sphera+0.pdf, sphera+1.pdf,..., sphera+44.pdf. , sphera+4.asy :

 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()); 

, sphera+4.asy TeXworks', UTF-8:

image

ANSI. , - .asy, , , Asymptote. 2d- . 2d-, , , 2d-. - .asy , . 2d- sphera+0+0.pdf, sphera+1+0.pdf,..., sphera+44+0.pdf _sphera+0.pdf, _sphera+1.pdf,..., _sphera+44.pdf, , , Asymptote sphera.asy. . .gif , .gif - . .gif, .pdf , , , , . ., , .pdf , .gif . .gif , :

 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 

, , .gif wheel.asy. ,

 yequals(Label("$y=-1$",1.0),-1,extend=true,linetype("4 4")); 

sphera.asy , . , /« » .asy . .gif, Imagemagick 2d-:

image

, . , . Hein?

magick *.eps sphere.gif , , 2d- .eps. .gif . , 10 )). , , . , , , animation.asy. , ( ) ? .gif . , izgraphiki.asy – animation.asy – .pdf ( (. ) 3d ) .gif ( (. ) 3d ). , «» . «» .pdf, animation.asy, ( , ) - 4 , , -, : : , . , ( ) . animation.asy:

 string format=nativeformat(); plain.shipout(name,f,format=format,view=false); files.push(name+"."+format); shipped=false; 

, izgraphiki.asy:

 //string format=nativeformat(); //plain.shipout(name,f,format=format,view=false); //files.push(name+"."+format); //shipped=false; 

izgraphiki.asy:

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; } 


,

 plain.shipout(name,f,format="png",view=false); //generiruet!!!! 

- animation.asy, , : , . .gif , izgraphiki.asy, izgraphikigif.asy animation.asy —
 plain.shipout(name,f,format= format,view=false); 

, . . izgraphikigif.asy :

 //plain.shipout(name,f,format= format,view=false); 

, . , animation.asy
izgraphikigif.asy , . , izgraphikigif.asy .pdf , 2 . , , - if, , : , , Asymptote. , , , , , , – :

 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 


. , , : kriv.asy , 2d-.pdf , , , kriv.asy Asymptote , kriv.pdf , , , .pdf, .asy : , , . , : play , , , , ! – . , , , : kriv epicykloida. , Astroida. name krivaja, – kriv .pdf . , Asymptote: , , Astroida.asy, . .mpg (, ) , , , , - . , , , Asymptote : .asy, .pdf .asy, .gif, -, , .

.asy, .pdf, :

 label(a.pdf()); 

.asy, .gif, :

 a.movie(); 

.asy, .mpg, , .asy, .gif. .mpg .asy,

 settings.twice=true; 

, , .

Source: https://habr.com/ru/post/fr468125/


All Articles