遗憾的是,我没有找到关于如何为 tikz 图像制作动画的详细教程,我试图理解这个答案的代码问题但没有成功。所以我只想将下面的蓝色棒旋转 +45 度,然后旋转 -45 度。
\documentclass{beamer}
\usepackage{tikz}
\usepackage{textpos}
\begin{document}
\begin{textblock*}{50mm}(25mm,25mm)
\begin{tikzpicture}
\draw [fill=cyan] (0,0) rectangle (4,0.4);
\draw [fill=black] (2,0.2) circle (1mm);
%the following lines are not meant to be on the animation
\draw [>=stealth,->] (0,0.45) arc (180:90:10mm);
\node at (0,1.5) {$+45^\circ$};
\draw [>=stealth,->] (0,-0.05) arc (180:270:10mm);
\node at (0,-1.1) {$-45^\circ$};
\end{tikzpicture}
\end{textblock*}
\end{document}
答案1
在这种情况下,可以采用以下方法动画包和rotate around={<angle>:<coordinate>}
TikZ
选项。如果您的目标是演示,则可以使用beamer
文档类,如果不是,则可以使用其他类。
这动画包可以通过多种选项调用,请参见第 3-4 页包装文档。在所有命令中,\multiframe
允许循环遍历图片,例如TikZ
pictures。然而,此命令必须被\begin{animateinline}
and\end{animateinline}
环境(或任何\newframe
变体)包围,sp 5。
\usepackage{tikz}
\usepackage[options]{animate}
%...
%...
\begin{animateinline}[options]{...}{...}{...}{...}
\multiframe{<number of frames>}{[<variables>]}{
loop body
}
\end{animateinline}
环境还有其他选择,见第 6 章第 7-10 页。其中包括:
loop
:“动画结束后立即重新开始。”autoplay
:“页面打开后开始动画。”controls
:“在动画小部件下方插入控制按钮。”palindrome
:“动画连续向前和向后播放”
该命令\multiframe
有三个参数:
number of frames
:最大迭代次数/帧数。variables
:迭代增量形式为:<variable name>=<initial value>+<increment>
loop body
:带有和/或不带有变量的代码。在这里您可以定义您的tikzpicture
环境。
笔记
“与‘pspicture’不同,‘tikzpicture’环境能够根据其包含的图形对象确定其大小。然而,这可能会导致序列的帧大小不同,具体取决于图形对象的大小和位置。因此,为了确保序列的所有帧在动画小部件中以相同的比例显示,帧应该共享一个公共边界框。可以通过不可见的“矩形”对象提供边界框”,sp10:
\begin{tikzpicture}
\useasboundingbox (... , ...) rectangle (... , ...);
\end{tikzpicture}
或者您可以添加幻影节点以达到相同目的。
if-then
最后,可以使用以下语句更改摇杆方向:如果那么包裹:
\ifthenelse{boolean condition}{then clause}{else clause}
以下 MWE 给出了一种可能的解决方案:
\documentclass{beamer}
\usepackage{tikz}
\usepackage{animate}
\usepackage{ifthen}
\definecolor{darkgreen}{RGB}{10,90,10}
\begin{document}
\begin{frame}
\begin{animateinline}[controls,loop]{50}
\multiframe{180}{rt=-45+1}{%
\begin{tikzpicture}
\ifthenelse{\rt < 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
\end{tikzpicture}}%
\end{animateinline}
\end{frame}
\end{document}
答案2
我没有想到这个答案的声誉超过 3 个……
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)));
仅用于比较目的渐近线。
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)));
使用 PSTricks -我的第一个工具画图g(从我的 Asymptote 转换为 PSTricks)。
我用https://ezgif.com/pdf-to-gif将我的 PDF 转换为 gif!
\documentclass[pstricks,border=15pt]{standalone}
\usepackage{pstricks-add}
\begin{document}
\newcommand{\Picture}[2]{
\begin{pspicture}[showgrid](-1,-2)(5,2)
\psrotate(2,0.2){#1}{\psframe[fillcolor=#2,fillstyle=solid,framearc=0.5](0,0)(4,0.4)}
\psarc{->}(2,0.2){2.15}{185}{225}
\psarcn{->}(2,0.2){2.15}{175}{135}
\psdot(2,0.2)
\rput(0,1.75){$+45^\circ$}
\rput(0,-1.5){$-45^\circ$}
\end{pspicture}%
}
\multido{\i=0+1}{46}{%
\Picture{-\i}{cyan}
}
\multido{\i=-44+1}{90}{%
\Picture{\i}{red}
}
\multido{\i=44+-1}{44}{%
\Picture{\i}{blue}
}
\end{document}
从PSTricks code above
,我决定用 Asymptote 来代替它!!!