Animación en asíntota

Copiado de mi blog para crear otra fuente de información en ruso sobre este tema.

Hola Cuando en el proceso de dominar el programa Asymptote, que tuvo lugar cuando aprendí los matices de la configuración de este programa que se describe aquí en este centro , dominé completamente el procesamiento de archivos .asy que no tienen animación, naturalmente me encontré con la animación.

Encabezado de spoiler
¡Da animación a las masas!

Afortunadamente, para esto, en el caso del formato de salida .pdf, ninguno de los programas adicionales descritos por mí en el centro utilizando el enlace anterior, después de instalar el programa ghostscript, no es necesario instalarlo, e incluso el diablo sabe cuánto tiempo estuvo cavando. Pero entonces no lo sabía, lo que complicaba el asunto muchas veces. ¿Procesas el archivo wheel.asy y qué? Bueno, .pdf apareció durante el procesamiento en TeXworks (consulte el enlace anterior) en la misma carpeta con el archivo .asy procesado, y cuando se abrió en el Explorador (consulte el mismo concentrador), en la C:\Windows\System32 . ¿Y qué? No había animación y eso es todo, a pesar de que te rompes. Antes de la animación en Asymptote, aprendí a hacer animaciones en tikz y pstricks . Así que no tuve éxito con esto hasta que eliminé el archivo animate.sty de la carpeta C:\Program Files\MiKTeX 2.9\tex\latex\animate y puse el archivo con el mismo nombre descargado más tarde. Ahí está . Por lo tanto, sabiendo que esto el paquete funciona con tikz y pstricks, me sentí inclinado a pensar que no me funciona, muy probablemente, no por problemas con TeX, sino por alguna otra razón. Así que busqué en el Viejo Internet durante varios años. Al principio busqué en el navegador IE, bueno, no hay un traductor conveniente allí. Luego olfateé que Google tiene un traductor conveniente. También buscó, buscó, buscó, buscó, hasta que encontró esta página. Resultó que por alguna razón en todos los archivos .asy de la carpeta C:\Program Files\Asymptote\examples\animations , para obtener de ellos .pdf con animación, no hay suficiente línea única

 settings.twice=true; 

Agregué esta línea al archivo wheel.asy de la subcarpeta de animación de la carpeta de ejemplos:

Finalmente animación !!!!!!!
 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)); 


Al mismo tiempo, para recibir .pdf, sabiendo 300 palabras en inglés, me di cuenta de que necesito descomentar en la forma del archivo wheel.asy en el que el usuario lo obtiene del autor (es) del programa Asymptote, 2 líneas:

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

Mirando los comentarios en estas líneas al final del archivo 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)); 

, Me di cuenta de que para obtener .pdf necesito rehacer el código que obtuve de los autores del programa y comentar la línea

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

y descomentar la línea

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

¡Y cómo rodó mi rueda después de estos movimientos corporales! La lógica de los autores del programa Asymptote también es incomprensible: para obtener .gif se necesita un programa adicional más que para obtener .pdf. Los archivos con ejemplos probablemente serán vistos por usuarios que no saben cómo hacerlo. Bueno, hágalo para que al abrir estos archivos de una vez, sin cambiar nada en ellos, estos usuarios puedan recibir un formato que requiere menos programas adicionales: .pdf, no, hicieron .gif. ¿Por qué? Bien oh bien Sí, también notaré que al abrir el archivo wheel.asy en el Explorador (vea mi concentrador ) para obtener un archivo .gif que funcione, la presencia del archivo config.asy en la misma carpeta (ver mi concentrador ) es opcional. Permítame recordarle que .gif en este caso (cuando se abre en Explorer) se forma en la C:\Windows\System32 . Al procesar este archivo .asy en TeXworks, la presencia de config.asy en la misma carpeta que el archivo a procesar es obligatoria (o incluye las líneas que describí en el enlace anterior directamente en el archivo .asy procesado). Pues aquí está. Tengo esta rueda rodante Recta, me reí por completo, encantada. Era de noche. Me fui a la cama Desperté y comp. Mientras la computadora se encendía, se sentó y se frotó las manos. Bueno, creo que ahora matemáticamente comenzaré a usar fuel oil para nosotros). Sí, ahora mismo Las animaciones de la subcarpeta de ejemplos tuvieron éxito prácticamente todo, excepto en embeddedmovie.asy, externalmovie.asy y embeddedu3d.asy. Esperé los primeros 2 archivos más tarde, pero no funcionó con el último: allí, según tengo entendido, algunos archivos dice.u3d deben descargarse adicionalmente desde algún lugar, y cuál es un gran secreto para una pequeña empresa. Bueno, eso, "Oh, el reino no es suficiente, no hay lugar para vagar". Escribí, había tal código:

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

Recibí el siguiente error prometedor en TeXworks :

 error: out of memory 

Al abrir este archivo .asy en Explorer (vea el enlace al concentrador justo arriba) el error fue el mismo. Si He cocido al vapor, he cocido al vapor, me he enlodado, descubrí que cuando n=3Resulta .pdf con animación, pero ya en n=4que este error también surge. Permítanme preguntar en el foro Asymptote en sí . Pero los anglosajones son personas respetuosas de la ley a las que no les gusta dar marcha atrás de las instrucciones. No se les ocurrió nada. Que hacer ¿Valió la pena palear la mitad de Internet para tropezar con tanta basura? ¡Pues nada, los rusos no se rinden! Y además, los héroes normales siempre andan ... Comencé a observar el proceso de procesamiento del archivo wheel.asy en TeXworks y ¿qué vi? Primero, aparecen los archivos _wheel + 0.pdf, _wheel + 1.pdf, ..., _wheel + 10.pdf, luego de estos archivos se forma un archivo de varias páginas _wheel.pdf y más adelante en el programa. Y para hacer todo esto, el módulo de animación se importa al archivo .asy del que van a obtener la animación . Y luego tuve una idea. Pero, ¿qué sucede si en este módulo (archivo C:\Program Files\Asymptote\animation.asy ) encuentra un lugar que genera archivos como _wheel + 0.pdf y lo apaga? ¿Marca estos archivos con los archivos .asy de procesamiento de asíntota generados por loopback en un archivo por lotes? Estos archivos .asy se pueden crear con los nombres name + 0.asy , name + 1.asy , etc., siempre que sea necesario. Donde el nombre es un conjunto de letras latinas asociadas con la animación que se está creando, lo más probable es que desee cambiar en el PDF listo con animación. Pero será más tarde. Mientras tanto, después de crear los archivos, el nombre es + 0.asy , el nombre es + 1.asy ... según mi idea, el procesamiento por Asymptote debería seguir. Esto crearía el nombre del archivo + 0.pdf , nombre + 1.pdf ... Y antes del código que crea el nombre del archivo + 0.asy , nombre + 1.asy ..., tuve que insertar líneas en el archivo por lotes para crear el nombre del archivo.asy o más bien, solo líneas para ingresar a este archivo. Y el archivo name.asy se formaría simplemente como resultado del archivo por lotes. En este archivo, el nombre es .asy, estaba planeando importar el módulo de animación que convertí en lugar del módulo de animación en sí. Decidí hacer el comienzo de este archivo name.asy el más simple, en el espíritu del comienzo del archivo wheel.asy. Después del ciclo, simplemente copié estúpidamente las líneas de este archivo y las pegué en el archivo por lotes de esta manera:

 echo  >> .asy 

,

 echo  >> .asy 

Escribí el archivo por lotes para que en el archivo creado el nombre. Fácil, el cuerpo del bucle estaba vacío, y donde estaba, resultaría así:

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

En el archivo por lotes, la línea sobre la línea de código que ingresa esta línea en el nombre del archivo .asy es una línea

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

, y las líneas tercera y cuarta de este archivo por lotes son:
 set n=24 set name=OdnopGip 

, así que al comienzo del procesamiento del bucle en el nombre del archivo, Easy Asymptote ya conoce el valor de n en este caso y todo funciona. El nombre de la variable de entorno significa, en traducción al idioma de este artículo, el nombre de name.asy . Declarar en este caso los valores de nombre o n en el archivo por lotes a través de set me parece extremadamente conveniente: cambiar sus valores en un solo lugar en el archivo por lotes implica cambiar todos los nombres de archivos .tex, .pdf que se generan al procesar un determinado archivo o número .asy fotogramas en el pdf animado resultante, esencialmente cambiando los detalles de la animación. Pues aquí está. Así que preparé el nombre de los cuadros + 0.pdf , nombre + 1.pdf ..., sin embargo, dado que después de la preparación de cada cuadro se abrió, tuve que incluir un comando en mi archivo por lotes para cerrarlo. Como no sabía cómo cerrar una ventana con un título específico de un archivo por lotes, incluí el siguiente comando en mi archivo por lotes en el cuerpo del ciclo de procesamiento de marco en blanco .asy:
 taskkill /IM AcroRd32.exe 

, que, como resultó más adelante en el proceso de ejecutar todo esto, es incluso mejor que cerrar cada fotograma específico: a veces el fotograma todavía no tiene tiempo para aparecer en el monitor, y el procesamiento del siguiente archivo .asy ya comienza, al final del cual aparece el siguiente fotograma en el monitor, y el final con el comando de este próximo paso del ciclo, tanto el marco del siguiente paso como el marco del paso anterior, pasado el cual se ejecutó el archivo por lotes en ejecución, se cerrarán, aunque está claro que después de incluir este comando en el archivo por lotes durante su ejecución del libro en .pdf, ya no está Soy malo, si. Más adelante en la lógica, necesitaba cambiar el nombre de los archivos nombre + 0.asy, nombre + 1.asy, ... a _name + 0.asy, _name + 1.asy, ..., ya que la presencia de archivos con exactamente estos nombres en uno La carpeta con el archivo .asy que se está procesando, en el que hay animación, supone que este archivo se procesa siempre que se importe el módulo de animación nativo antes de comenzar la producción del nombre de archivo.pdf (sí, podría, dentro del bucle de archivo por lotes con la variable k, no alinear las líneas del código que componen el marco, no el nombre del archivo + k.asy, y el archivo _name + k.asy, pero esto requeriría más entrada del carácter "_". Y un mayor procesamiento de las heridas de la asíntota . E archivo creado imya.asy En resumen, de acuerdo con la idea original era tener un archivo por lotes es similar al siguiente:

 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 

Aquí vemos que estoy importando el módulo animation.asy que modifiqué anteriormente. Le di el nombre simple izgraphiki.asy a este módulo. Y para el archivo de animación .pdf que obtengo, no se me ocurrió un nombre mejor que cvetok. Aparentemente, debido a la escasez de su imaginación. Bueno, vamos, cómo está. Te contaré sobre el módulo izgraphiki.asy my ’al final de esta historia para que no pierda el hilo de la historia, pero por ahora notaré que trato de darle a este archivo el nombre iz-graphiki.asy, y luego iz + graphiki.asy para probar no condujo a la meta prevista: el trabajo de mi archivo por lotes se detuvo en su apogeo y no se reanudó bajo ninguna circunstancia. Aparentemente, los módulos del programa Asymptote deberían contener solo letras del alfabeto latino. En cualquier caso, el cumplimiento de esta condición ciertamente no hará daño. Entonces, el trabajo del archivo por lotes que cité anteriormente terminó con la aparición del codiciado archivo .pdf con animación de uno arbitrariamente grande (dentro de límites razonables, para no esperar 3 horas, funciona, aparece el .pdf animado, todo está bien, pero la computadora tiene una velocidad de ejecución las operaciones son solo finales). Déjame hacer una construcción animada de objetos en 3D. Y luego se aclararon otros problemas. Logré estampar disparos con estos objetos, pero, eso es todo. En estos cuadros, estos objetos resultaron rotados en el espacio, todo está bien aquí, pero solo por esta presencia de volumen en cuadros de pdf, no se pueden usar para construir cuadros en pdf con animación. Déjame pensar más. Mirando el procesamiento de un archivo ligeramente modificado.

archivo ligeramente modificado.
 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()); 


, Noté que durante este procesamiento aparecen todos los cuadros de la animación y no desaparecen secuencialmente, pero solo ellos, si puedo decirlo, en la versión 2d: en mi opinión, se trata de gráficos 3D completos, pero si intenta verlos desde diferentes lados en la ventana del visor de Abode Lector moviéndose con el botón izquierdo del mouse presionado, como se esperaba de los gráficos en 3D obtenidos con Asymptote, a menos que la posibilidad de esta consideración se desactive intencionalmente antes de comenzar la producción de .pdf con animación en un archivo .asy, esto resulta imposible XX. Los nombres de estos marcos 2D: _sphere + 0.pdf, _sphere + 1.pdf, ... Habiendo aprendido sobre la generación de marcos 2d espaciales al procesar archivos .asy que tienen animación de objetos 3D, se me ocurrió obtener marcos .pdf de un archivo por lotes para su uso posterior en el procesamiento del archivo .asy, en el que hay un ciclo con un cuerpo vacío, que genero al comienzo del archivo por lotes, procesando no solo archivos .asy, sino procesando archivos .asy, cada uno de los cuales tiene un ciclo. Estos bucles en cada uno de estos apéndices de archivo .asy para recibir un marco .pdf de él hice un solo cuadro: no hice estos apéndices para obtener .pdf con animaciones de ellos, sino para obtener un marco 2D, por cierto en el proceso de procesar cada uno de los archivos stub .asy. Para recibir archivos en blanco .asy con dichos bucles, hice que en los bucles de todos los archivos en blanco .asy, las variables de estos bucles al principio y al final de los bucles tomen el mismo valor - 0. Las diferencias entre los marcos .pdf resultantes del procesamiento reproducir asíntota de archivos en blanco .asy son causados ​​por diferencias en los cuerpos de los archivos de bucle de los espacios en blanco, que (diferencias) son, a su vez, debido a la introducción de cada uno de los valores secuenciales de la variable de bucle de archivo por lotes en las funciones del cuerpo de los archivos de bucle de los espacios en blanco, creado por el archivo por lotes cuando su variable qi Kla, tomando su siguiente valor, se congela, esperando la finalización de la creación del archivo de adquisición.asy, correspondiente a este valor de la variable de bucle del archivo por lotes. En resumen, estas diferencias son creadas por la variable de bucle de archivo por lotes. Los nombres de estos marcos 2d tienen la forma: nombre + k + 0.pdf, donde, debido a que estos marcos 2d son el resultado de un cambio en la variable de bucle del archivo por lotes, ktoma valores desde 0 hasta el valor final de la variable de bucle del archivo por lotes con el paso 1. Para obtener el .pdf animado del archivo .asy con el cuerpo vacío del bucle creado por el archivo por lotes anteriormente, los nombres de los marcos .pdf deben tener la siguiente forma: _name + k.pdf. Por lo tanto, el siguiente equipo en el archivo por lotes renombré estos marcos-.pdf. Lo hice en un bucle. Y finalmente, el equipo de procesamiento ejecuta el archivo .asy Asymptote con un cuerpo de bucle vacío. Después de este procesamiento, aparece un .pdf con animación. En el archivo por lotes, después de este comando, no escribí un comando para abrir el archivo .pdf con animación, porque se supone que esta apertura es predeterminada, este archivo .pdf con animación se abre de todos modos al final de este procesamiento, al igual que se abre un archivo .pdf generado por la asíntota procesando un archivo .asy sin animación. Si el lector observó el proceso de procesar archivos .asy desde una subcarpeta con animaciones de la carpeta de ejemplos ubicada en la carpeta del programa Asymptote, entonces comprenderá que parte del nombre de _name + k.pdf debe coincidir con el nombre del archivo .asy con un cuerpo vacío del bucle. Los archivos _name + k.pdf son el resultado de renombrar algunos otros archivos .pdf (nombre de archivo + k + 0.pdf), que, a su vez, son un subproducto del programa que procesa algunos archivos .asy, por lo tanto, para simplificar la tarea, hice estos archivos .asy fueron creados por un archivo por lotes con los nombres name + 0.asy, name + 1.asy, ... Entonces, bueno, describí el principio de trabajo de un archivo por lotes que planeé, es hora de dar un ejemplo de uno de esos archivos por lotes. Por ejemplo, esto:

 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 

Presta atención a la línea.

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

Como el símbolo < tiene un significado especial para el intérprete de línea de comando, para que este intérprete tome este símbolo en significado literal, escapé de este símbolo al colocar el símbolo ^ delante de él. ^ , . , , ,

 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:

imagen

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-:

imagen

, . , . ?

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/468125/


All Articles