Animação em Assíntota

Copiado do meu blog para criar outra fonte de informações em russo sobre este tópico.

Olá Quando, no processo de dominar o programa Asymptote, que ocorreu quando eu aprendi as nuances das configurações deste programa descritas aqui neste hub , dominei completamente o processamento de arquivos .asy que não possuem animação, naturalmente eu a encontrei.

Título de spoiler
Dê animação às massas!

Felizmente, para isso, no caso do formato de saída .pdf, nenhum dos programas adicionais descritos por mim no hub usando o link acima, após a instalação do programa ghostscript, você não precisa instalar, e até o diabo sabe quanto tempo estava cavando. Mas então eu não sabia disso, o que complicou o assunto muitas vezes. Você processa o arquivo wheel.asy e o quê? Bem, .pdf apareceu durante o processamento no TeXworks (consulte o link acima) na mesma pasta com o arquivo .asy processado e, quando aberto no Explorer (consulte o mesmo hub), na C:\Windows\System32 . E daí? Não havia animação e é isso, mesmo que você decifre. Antes da animação no Asymptote, eu aprendi como fazer animações em tikz e pstricks . Portanto, não tive êxito até excluir o arquivo animate.sty da pasta C:\Program Files\MiKTeX 2.9\tex\latex\animate e colocar o arquivo com o mesmo nome baixado posteriormente. Lá está ele . Assim, sabendo que isso o pacote funciona com tikz e pstricks, eu estava inclinado a pensar que não funciona para mim, provavelmente, não por causa de problemas com o TeX, mas por algum outro motivo. Então, pesquisei na Internet antiga por vários anos. No começo eu procurei no navegador IE, bem, não há tradutor conveniente lá. Então cheirei que o Google tem um tradutor conveniente. Também procurou, procurou, procurou, procurou, até que ele apareceu nesta página. Descobriu-se que, por algum motivo, em todos os arquivos .asy da pasta C:\Program Files\Asymptote\examples\animations , para obtê-los .pdf com animação, não há linha única suficiente

 settings.twice=true; 

Adicionei esta linha ao arquivo wheel.asy da subpasta de animação da pasta de exemplos:

Finalmente animação !!!!!!!
 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)); 


Ao mesmo tempo, para obter .pdf, sabendo 300 palavras em inglês, percebi que era necessário descomentar o arquivo wheel.asy dessa forma, no qual o usuário o obtém do (s) autor (es) do programa Asymptote, 2 linhas:

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

Observando os comentários nessas linhas no final do arquivo 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)); 

, Percebi que para obter .pdf preciso refazer o código que recebi dos autores do programa e comentar a linha

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

e remova o comentário da linha

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

E como minha roda rolou após esses movimentos do corpo! A lógica dos autores do programa Asymptote também é incompreensível: para obter .g, é necessário mais um programa do que obter .pdf. Arquivos com exemplos provavelmente serão assistidos por usuários que não sabem como fazer isso. Bem, faça isso para que, ao abrir esses arquivos de uma vez, sem alterar nada neles, esses usuários possam receber um formato que exija menos programas adicionais - .pdf, não, eles criaram o .gif. Porque ?? Bem oh bem. Sim, também observarei que, quando você abre o arquivo wheel.asy no Explorer (consulte meu hub ) para obter um .gif em funcionamento, a presença do arquivo config.asy na mesma pasta com ele (consulte meu hub ) é opcional. Deixe-me lembrá-lo de que .gif nesse caso (quando aberto no Explorer) é formado na C:\Windows\System32 . Ao processar esse arquivo .asy no TeXworks, a presença de config.asy na mesma pasta que o arquivo a ser processado é obrigatória (ou inclui as linhas que descrevi no link anterior diretamente no próprio arquivo .asy processado). Bem, aqui está. Eu peguei essa roda em linha reta, ri todo, encantada. Já era noite. Eu fui dormir Acordei e comp. Enquanto o computador estava ligado, ele se sentou, esfregando as mãos. Bem, acho que agora vou começar matematicamente a usar óleo combustível para nós.) Sim, agora. As animações da subpasta de exemplos foram bem-sucedidas em praticamente tudo, exceto em Embeddedmovie.asy, externalmovie.asy e embeddedu3d.asy. Esperei pelos 2 primeiros arquivos mais tarde, mas ele não funcionou com o último: lá, pelo que entendi, é necessário fazer o download de algum arquivo dice.u3d em outro lugar e qual é um grande segredo para uma pequena empresa. Bem, isso "Oh, o reino não é suficiente, não há lugar para vagar". Eu escrevi, havia um código assim:

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

Recebi o seguinte erro promissor no TeXworks :

 error: out of memory 

Ao abrir esse arquivo .asy no Explorer (veja o link para o hub logo acima), o erro foi o mesmo. Sim Eu cozinhei, cozinhei, fiquei turvo, descobri que quando n=3acontece .pdf com animação, mas já em n=4que esse erro também ocorra. Deixe-me perguntar no próprio fórum Asymptote. Mas os anglo-saxões são pessoas cumpridoras da lei que não gostam de voltar atrás nas instruções. Eles não inventaram nada. O que fazer Valia a pena cavar metade da Internet para tropeçar em tal lixo? Bem, nada, os russos não desistem! Além disso, heróis normais sempre andam por aí ... Comecei a observar o processo de processamento do arquivo wheel.asy no TeXworks e o que eu vi? Primeiro, os arquivos _wheel + 0.pdf, _wheel + 1.pdf, ..., _wheel + 10.pdf aparecem e, a partir desses arquivos, um arquivo de várias páginas _wheel.pdf é formado e posteriormente no programa. E, para fazer tudo isso, o módulo de animação é importado para o arquivo .asy do qual eles obterão a animação . E então eu tive uma ideia. Mas e se, neste módulo (arquivo C:\Program Files\Asymptote\animation.asy ), você encontrar um local que gere arquivos como _wheel + 0.pdf e o desative? Você carimba esses arquivos com o processamento de assíntotas .asy arquivos gerados por loopback no arquivo em lotes? Esses arquivos .asy podem ser criados com os nomes nome + 0.asy , nome + 1.asy e assim por diante, pelo tempo que for necessário. Onde o nome é um conjunto de letras latinas associadas à animação que está sendo criada, que você provavelmente deseja alterar no pdf pronto com animação. Mas será mais tarde. Enquanto isso, depois de criar os arquivos, o nome é + 0.asy , o nome é + 1.asy ... de acordo com a minha ideia, o processamento pelo Asymptote deve seguir. Isso criaria o nome dos arquivos + 0.pdf , nome + 1.pdf ... E antes do código que cria os arquivos nome + 0.asy , nome + 1.asy ..., eu precisava inserir linhas no arquivo em lotes para criar o nome do arquivo.asy ou melhor, apenas linhas para entrar nesse arquivo. E o nome do arquivo.asy seria formado simplesmente como resultado do arquivo em lote. Neste arquivo, o nome é .asy, eu estava planejando importar o módulo de animação que converti em vez do próprio módulo de animação . Decidi tornar o início desse arquivo name.asy o mais simples, no espírito do início do arquivo wheel.asy. Após o loop, eu apenas estupidamente copiei as linhas deste arquivo e colei-as no arquivo em lotes assim:

 echo  >> .asy 

,

 echo  >> .asy 

Eu escrevi o arquivo em lotes para que, no arquivo criado, o nome.Fácil, o corpo do loop estava vazio e, onde estava, ficaria assim:

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

No arquivo em lotes, a linha acima da linha de código inserindo essa linha no nome do arquivo.asy é uma linha

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

, e a terceira e quarta linhas desse arquivo em lotes são:
 set n=24 set name=OdnopGip 

, portanto, no início do processamento do loop no nome do arquivo, o Easy Asymptote já sabe o valor de n nesse caso e tudo funciona. O nome da variável de ambiente significa, na tradução para o idioma deste artigo, o nome de name.asy . Declarar neste caso os valores de nome ou n no arquivo em lotes via conjunto me parece extremamente conveniente: alterar seus valores em apenas um lugar no arquivo em lotes implica alterar todos os nomes de arquivos .tex, .pdf gerados durante o processamento de qualquer arquivo ou número .asy específico quadros no pdf animado resultante, alterando essencialmente os detalhes da animação. Bem, aqui está. Então, eu preparei o nome dos quadros + 0.pdf , nome + 1.pdf ..., no entanto, uma vez que após a preparação de cada quadro aberto, tive que incluir um comando no meu arquivo em lotes para fechá-lo. Como não sabia como fechar uma janela com um título específico de um arquivo em lotes, incluí o seguinte comando no meu arquivo em lotes no corpo do ciclo de processamento do quadro em branco.
 taskkill /IM AcroRd32.exe 

, que, como ficou mais adiante no processo de execução de tudo isso, é ainda melhor do que fechar cada quadro específico: às vezes, o quadro não tem tempo para aparecer no monitor, mas o processamento do próximo arquivo .asy começa, no final do qual o próximo quadro aparece no monitor e o final com o comando desta próxima etapa do ciclo, o quadro da próxima etapa e o quadro da etapa anterior, após o qual o arquivo em lotes em execução é passado, serão fechados, embora seja claro que depois de incluir esse comando no arquivo em lote durante a execução do livro em .pdf, não será mais Eu sou ruim sim Mais adiante na lógica, eu precisei renomear os arquivos nome + 0.asy, nome + 1.asy, ... para _name + 0.asy, _name + 1.asy, ..., desde a presença de arquivos com exatamente esses nomes em um A pasta com o arquivo .asy sendo processado, na qual há animação, pressupõe que esse arquivo seja processado, desde que o módulo de animação nativo seja importado antes de iniciar a produção do nome do arquivo.pdf (sim, eu poderia, dentro do loop do arquivo em lotes com a variável k, não alinhar as linhas do código que compõe o quadro, não o nome do arquivo + k.asy e o arquivo _name + k.asy, mas isso exigiria mais entrada do caractere "_". E processamento adicional de feridas de assíntota . Arquivo E criado imya.asy Em suma, de acordo com a idéia original era ter um arquivo de lote parece com isso:

 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 

Aqui vemos que estou importando o módulo animation.asy que modifiquei acima. Eu dei o nome simples izgraphiki.asy a este módulo. E para o arquivo .pdf de animação que recebo, não criei um nome melhor que cvetok. Aparentemente, por causa da escassez de sua imaginação. Bem, vamos lá, como é. Vou falar sobre o módulo "my" izgraphiki.asy no final desta história, para não perder o fio da história agora, mas por enquanto observarei que é feita uma tentativa de dar a esse arquivo o nome de iz-graphiki.asy e iz + graphiki.asy para testes não levou ao objetivo pretendido: o trabalho do meu arquivo em lotes parou a todo vapor e não foi retomado sob nenhuma circunstância. Aparentemente, os módulos do programa Asymptote devem conter apenas letras do alfabeto latino. De qualquer forma, o cumprimento dessa condição certamente não fará mal. Portanto, o trabalho do arquivo em lotes que citei acima terminou com a aparência do cobiçado arquivo .pdf com animação de um tamanho arbitrariamente grande (dentro de limites razoáveis, para não esperar 3 horas, ele funciona, o .pdf animado aparece, está tudo bem, mas o computador tem uma velocidade de execução operações são apenas finais). Deixe-me fazer construção animada de objetos 3D. E então outros problemas se tornaram claros. Consegui carimbar fotos com esses objetos, mas, é isso. Nesses quadros, esses objetos eram rotacionados no espaço, tudo está bem aqui, mas apenas por causa dessa presença de volume nos quadros em pdf, eles não podem ser usados ​​para criar quadros em pdf com animação. Deixe-me pensar mais. Observando o processamento de um arquivo sphere.asy ligeiramente modificado:

arquivo sphere.asy ligeiramente 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()); 


, Notei que durante esse processamento todos os quadros da animação aparecem e não desaparecem sequencialmente, mas somente eles, se assim posso dizer, na versão 2d: na minha opinião, são gráficos 3D completos, mas se você tentar visualizá-los de lados diferentes na janela do visualizador Abode Leitor movendo-se com o botão esquerdo do mouse pressionado, como esperado nos gráficos 3D obtidos com o Asymptote, a menos que a possibilidade dessa consideração seja desativada intencionalmente antes de iniciar a produção de .pdf com animação em um arquivo .asy, isso se torna impossível th. Os nomes desses quadros 2d: _sphere + 0.pdf, _sphere + 1.pdf, ... Depois de aprender sobre a geração de quadros 2d espaciais ao processar arquivos .asy que possuem animação de objetos 3D, ocorreu-me obter quadros .pdf a partir de um arquivo em lotes para uso posterior no processamento do arquivo .asy, no qual existe um ciclo com um corpo vazio, que eu gero no início do arquivo em lotes, processando não apenas arquivos .asy, mas processando arquivos .asy, cada um com um ciclo. Esses loops em cada um desses stubs de arquivo .asy para receber um quadro .pdf dele formam um único quadro: não fiz esses stubs para obter .pdf com animação deles, mas para obter um quadro 2d, aliás no processo de processamento de cada arquivo stasy .asy. Para receber arquivos .asy em branco com esses loops, fiz com que, nos loops de todos os arquivos em branco .asy, as variáveis ​​desses loops no início e no final dos loops tenham o mesmo valor - 0. As diferenças entre os quadros .pdf resultantes do processamento play Asymptote of blank files .asy são causadas por diferenças nos corpos dos arquivos de loop dos espaços em branco.asy, que (diferenças) são, por sua vez, devido à introdução de cada um dos valores seqüenciais da variável de loop do arquivo em lote nas funções do corpo dos arquivos de loop do blanks.asy, criados pelo arquivo em lote quando sua variável qi O Kla, levando seu próximo valor, congela, aguardando a conclusão da criação do arquivo de compras.asy, correspondente a esse valor da variável de loop do arquivo em lote. Em resumo, essas diferenças são criadas pela variável de loop do arquivo em lotes. Os nomes desses quadros 2D são da forma: nome + k + 0.pdf, onde, porque esses quadros 2D são o resultado de uma alteração na variável de loop do arquivo em lotes, kleva valores de 0 ao valor final da variável de loop do arquivo em lotes na etapa 1. Para obter o .pdf animado do arquivo .asy com o corpo vazio do loop criado pelo arquivo em lotes anteriormente, os nomes dos quadros .pdf devem ter o seguinte formato: _name + k.pdf. Portanto, a próxima equipe no arquivo em lotes renomeei esses quadros-.pdf. Eu fiz isso em um loop. E, finalmente, a equipe de processamento executa o arquivo .asy do Asymptote com um corpo de loop vazio. Após esse processamento, um arquivo .pdf com animação é exibido. No arquivo em lotes, após esse comando, não escrevi um comando para abrir o arquivo .pdf com animação, porque essa abertura é assumida por padrão; esse arquivo .pdf com animação é aberto de qualquer maneira no final deste processamento, assim como um arquivo .pdf é aberto. gerado pelo Asymptote processando um arquivo .asy sem animação. Se o leitor observou o processo de processamento de arquivos .asy de uma subpasta com animações da pasta de exemplos localizada na pasta do programa Asymptote, ele entenderá que parte do nome de _name + k.pdf deve coincidir com o nome do arquivo .asy com um corpo de loop vazio. Os arquivos _name + k.pdf são o resultado da renomeação de outros arquivos .pdf (nome dos arquivos + k + 0.pdf), que, por sua vez, são um subproduto do programa que processa alguns arquivos .asy, portanto, para simplificar a tarefa, criei esses arquivos .asy foram criados por um arquivo em lotes sob os nomes nome + 0.asy, nome + 1.asy, ... Então, bem, descrevi o princípio do trabalho de um arquivo em lote que planejei, é hora de dar um exemplo de um desses arquivos em lotes. Por exemplo, isto:

 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 

Por favor, preste atenção à linha

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

como o símbolo < tem um significado especial para o intérprete da linha de comando, para que esse intérprete tome esse símbolo no significado literal, escapei desse símbolo colocando o símbolo ^ na frente dele. ^ , . , , ,

 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:

imagem

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

imagem

, . , . ?

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


All Articles