Basta ya de buscar en otros sitios ya que has llegado al lugar correcto, poseemos la respuesta que buscas sin complicaciones.
Solución:
En este caso, se puede realizar un acercamiento con el paquete animado y el rotate around=
TikZ
-opción. Si su objetivo es una presentación, puede utilizar el beamer
clase de documento y si no puede utilizar otras clases.
El paquete animado se puede invocar con varias opciones, s. págs. 3-4 de la documentación del paquete. De todos los comandos el multiframe
uno permite bucles alrededor de imágenes, como TikZ
imágenes. Sin embargo, este comando debe estar rodeado de beginanimateinline
y endanimateinline
medio ambiente (o por cualquiera de los newframe
variantes), sp 5.
usepackagetikz
usepackage[options]animate
%...
%...
beginanimateinline[options]............
multiframe[]
loop body
endanimateinline
El medio ambiente también tiene otras opciones, s. págs. 7-10, Capítulo 6. Entre otros:
loop
: “La animación se reinicia inmediatamente después de llegar al final”.autoplay
: “Iniciar la animación después de que se haya abierto la página”.controls
: “Inserta botones de control debajo del widget de animación”.palindrome
: “La animación se reproduce continuamente hacia adelante y hacia atrás”
El comando multiframe
tiene tres argumentos:
number of frames
: el número máximo de iteraciones / fotogramas.variables
: incremento de iteración en la forma:
= + loop body
: código con y / o sin variables. Aquí puedes definir tutikzpicture
medio ambiente.
Nota
“A diferencia de ‘pspicture’, el entorno ‘tikzpicture’ es capaz de determinar su tamaño a partir de los objetos gráficos que contiene. Sin embargo, esto puede resultar en marcos de diferentes tamaños de una secuencia, según el tamaño y la posición de los objetos gráficos. Por lo tanto, Para garantizar que todos los fotogramas de la secuencia se muestren a la misma escala en el widget de animación, los fotogramas deben compartir un cuadro delimitador común. Se puede proporcionar un cuadro delimitador mediante un objeto ‘rectángulo’ invisible “, sp10 :
begintikzpicture
useasboundingbox (... , ...) rectangle (... , ...);
endtikzpicture
O puede agregar nodos fantasmas para el mismo propósito.
Finalmente, la dirección del stick se puede cambiar con un if-then
declaración utilizando el paquete ifthen:
ifthenelseboolean conditionthen clauseelse clause
Una posible solución viene dada por el siguiente MWE:
documentclassbeamer
usepackagetikz
usepackageanimate
usepackageifthen
definecolordarkgreenRGB10,90,10
begindocument
beginframe
beginanimateinline[controls,loop]50
multiframe180rt=-45+1%
begintikzpicture
ifthenelsert < 45
draw[rounded corners,fill=cyan,rotate around=180-rt:(2,0.2)] (0,0) rectangle (4,0.4);draw [fill=white] (2,0.2) circle (1mm);draw[fill=darkgreen] (2,0.2) circle (0.5mm);
draw[rounded corners,fill=darkgreen,rotate around=90+rt:(2,0.2)] (0,0) rectangle (4,0.4);draw [fill=white] (2,0.2) circle (1mm);draw[fill=cyan] (2,0.2) circle (0.5mm);;
% draw [fill=black] (2,0.2) circle (1mm);
%the following lines are not meant to be on the animation
draw [>=stealth,->,very thick] ([shift=(175:2.15)]2,0.2) arc (175:135:2.15) node[xshift=-5pt,left] $+45^circ$;
draw [>=stealth,->,very thick] ([shift=(185:2.15)]2,0.2) arc (185:225:2.15) node[xshift=-5pt,left] $-45^circ$;
node at (4.0,4.0) ; %phantom node
node at (-4.0,-4.0) ; %phantom node
endtikzpicture%
endanimateinline
endframe
enddocument
No pensé que esta respuesta tuviera más de 3 reputaciones …
import animate;
import roundedpath;
settings.tex="pdflatex";
animation Ani;
unitsize(1cm);
path roundedbox=roundedpath(box((0,0),(4,0.4)),0.15);
path Arc=reverse(arc((2,0.2),2.15,135,175));
draw(Label("$+45^circ$",Relative(.9),LeftSide),Arc,Arrow);
draw(Label("$-45^circ$",Relative(.9)),reflect((2,0.2),(2.1,0.2))*Arc,Arrow);
for(int a=0; a<=45;++a)
save();
filldraw(rotate(-a,(2,0.2))*roundedbox,cyan);
dot((2,0.2),linewidth(3bp));
Ani.add();
restore();
for(int a=44; a >=-45; --a)
save();
filldraw(rotate(-a,(2,0.2))*roundedbox,red);
dot((2,0.2),linewidth(3bp));
Ani.add();
restore();
for(int a=44; a>0;--a)
save();
filldraw(rotate(a,(2,0.2))*roundedbox,blue);
dot((2,0.2),linewidth(3bp));
Ani.add();
restore();
erase();
Ani.movie(BBox(Fill(white)));
Solo para el propósito de comparar con Asymptote.
import animate;
settings.tex="pdflatex";
animation Ani;
unitsize(1cm);
for(int a=0; a<=45;++a)
save();
filldraw(rotate(-a,(2,0.2))*box((0,0),(4,0.4)),cyan);
dot((2,0.2));
Ani.add();
restore();
for(int a=44; a >=-45; --a)
save();
filldraw(rotate(-a,(2,0.2))*box((0,0),(4,0.4)),cyan);
dot((2,0.2));
Ani.add();
restore();
for(int a=44; a>=0;--a)
save();
filldraw(rotate(a,(2,0.2))*box((0,0),(4,0.4)),cyan);
dot((2,0.2));
Ani.add();
restore();
erase();
Ani.movie(BBox(Fill(white)));
Con PSTricks – mi primera herramienta dibujandog (se convierte de mi Asymptote a PSTricks).
¡Utilizo https://ezgif.com/pdf-to-gif para convertir mi PDF a gif!
documentclass[pstricks,border=15pt]standalone
usepackagepstricks-add
begindocument
newcommandPicture[2]
beginpspicture[showgrid](-1,-2)(5,2)
psrotate(2,0.2)#1psframe[fillcolor=#2,fillstyle=solid,framearc=0.5](0,0)(4,0.4)
psarc->(2,0.2)2.15185225
psarcn->(2,0.2)2.15175135
psdot(2,0.2)
rput(0,1.75)$+45^circ$
rput(0,-1.5)$-45^circ$
endpspicture%
multidoi=0+146%
Picture-icyan
multidoi=-44+190%
Pictureired
multidoi=44+-144%
Pictureiblue
enddocument
De PSTricks code above
, He decidido usar Asymptote para reemplazar eso !!!
Si te ha sido de provecho nuestro post, agradeceríamos que lo compartas con otros seniors y nos ayudes a dar difusión a nuestro contenido.