我正在尝试使用 beamer 制作极坐标方程的动画,但我无法在这里或 Google 上找到与我的问题相关的任何内容,所以我的最后机会是寻求帮助。我尝试domain
从方程中取出命令,以便绘图可以读取 x 变量值(范围从 0 到 20)。但是这根本不起作用……之后我尝试制作domain=\x
但也没有用。有人对我的问题有任何解决方案(甚至提示)吗?
附言:我需要使用 Tikz 包。
提前致谢!
\documentclass{beamer}
\usepackage{tikz}
\begin{document}
\foreach \x in {0,1,...,20}{
\begin{frame}
\begin{tikzpicture}
\draw[align=center,color=orange,smooth] plot (canvas polar cs:angle=\x r,radius= {\x});
\end{tikzpicture}
\end{frame}
}
\end{document}
答案1
您需要将\foreach
循环放在框架内,并使用\draw
命令的叠加规范(这将在单个框架内产生多张幻灯片,然后为您提供动画效果);类似这样的内容:
\documentclass{beamer}
\usepackage{tikz}
\tikzset{
invisible/.style={opacity=0,text opacity=0},
visible on/.style={alt=#1{}{invisible}},
alt/.code args={<#1>#2#3}{%
\alt<#1>{\pgfkeysalso{#2}}{\pgfkeysalso{#3}}
},
beameralert/.style={alt=<#1>{fill=red!30,rounded corners,inner sep=1pt}{},anchor=base},
}
\begin{document}
\begin{frame}
\centering
\begin{tikzpicture}[scale=3]
\foreach \x in {0,...,10}
{
\draw[
color=orange,
domain=0:\x,
samples=200,
visible on=<\number\numexpr\x+1\relax->
]
plot (canvas polar cs:angle=\x r,radius= {\x});
}
\end{tikzpicture}
\end{frame}
\end{document}
我使用了以下visible on
样式(例如,这个答案) 来进行覆盖规范,以防止元素跳来跳去。
在上述解决方案中,每张幻灯片中都绘制了整个螺旋(“旧部分”和新部分),因此编译时间可能很长,计算量也会越来越大;为了防止这种情况,您可以使用
\documentclass{beamer}
\usepackage{tikz}
\tikzset{
invisible/.style={opacity=0,text opacity=0},
visible on/.style={alt=#1{}{invisible}},
alt/.code args={<#1>#2#3}{%
\alt<#1>{\pgfkeysalso{#2}}{\pgfkeysalso{#3}}
},
beameralert/.style={alt=<#1>{fill=red!30,rounded corners,inner sep=1pt}{},anchor=base},
}
\begin{document}
\begin{frame}
\centering
\begin{tikzpicture}[scale=3]
\xdef\lastx{0}
\foreach \x in {1,...,20}
{
\draw[
color=orange,
domain=\lastx:\x,
samples=200,
visible on=<\number\numexpr\x+1\relax->
]
plot (canvas polar cs:angle=\x r,radius= {\x});
\xdef\lastx{\x}
}
\end{tikzpicture}
\end{frame}
\end{document}
因此在每张新幻灯片中仅添加新部分。结果:
这是使用animate
包;只有一些 pdf 查看器(通常是 Acrobat Reader)才能正确支持动画:
\documentclass{beamer}
\usepackage{tikz}
\usepackage{animate}
\usepackage{ifthen}
\hypersetup{pdfpagemode=FullScreen}
\newcounter{tmp}
\stepcounter{tmp}
\begin{document}
\begin{frame}[fragile]{}
\begin{center}
\begin{animateinline}[loop,poster=first,controls]{2}
\whiledo{\thetmp<21}{%
\begin{tikzpicture}
\begin{scope}[scale=2]
\foreach \x in {1,...,\thetmp}
{
\draw[
color=red,
domain=0:\thetmp,
samples=200,
]
plot (canvas polar cs:angle=\x r,radius= {\x});
}
\end{scope}
\path[use as bounding box] (-3,-3) rectangle (3,3);
\end{tikzpicture}%
\stepcounter{tmp}
\ifthenelse{\thetmp<21}
{\newframe}
{\end{animateinline}\relax}
}
\end{center}
\end{frame}
\end{document}