我怎样才能在 Beamer 中为 TikZ 绘图制作动画?

我怎样才能在 Beamer 中为 TikZ 绘图制作动画?

遗憾的是,我没有找到关于如何为 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允许循环遍历图片,例如TikZpictures。然而,此命令必须被\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有三个参数:

  1. number of frames:最大迭代次数/帧数。
  2. variables:迭代增量形式为: <variable name>=<initial value>+<increment>
  3. 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 来代替!!!

在此处输入图片描述

相关内容