tikz演示动态绘制线条的过程,使用animate宏包,几乎所有tikz相关的宏包和beamer,实现如下:

\documentclass{beamer}
%====================================================
\input{../setup/preamble.tex}  
\input{../setup/tikzall.tex} %包含所有的tikz包
%====================================================
\begin{document}
%%====================================================
\begin{frame}[fragile]
%演示动态绘制线条的过程
\begin{animateinline}[autoplay,loop]{10}  
%总共生成40帧画面,以每秒10帧的速度自动播放    
\multiframe{40}{Rpos=0.1+0.1}{%Rpos=0.1,0.2,...,4
\begin{tikzpicture}[allow upside down,line width=1.5pt]
	\useasboundingbox[draw,dashed,thin] (0,0)grid(4cm,3cm);
	\draw[dashed,name path=curve1,green] (0,0) .. controls(2,3) and (2,2) .. (3,0);
    %设置绘图区域	
    \clip[draw,name path=clip path] (0,0)rectangle(\Rpos,3cm)++(0.1,0);
    \draw[blue] (0,0) .. controls(2,3) and (2,2) ..(3,0);%绘制蓝色线条
    %求交点,便于绘制箭头    
    \path[name path=curve1] (0,0) .. controls(2,3) and (2,2) ..(3,0);
    \path[name path=curve2] (\Rpos,0cm)++(-0.05,0) rectangle(\Rpos,3cm)++(0.05,0);
    %将交点总数记为\t,命名交点的前缀为i,则(i-1),(i-2)为交点
   \path [name intersections={of=curve1 and curve2,name =i,total =\t}];
   %\path [name intersections={of=curve1 and curve2,by={A,B}]; %将两个交点分别命名为A和B
   %使用判断函数ifthenelse,注意不是命令,是函数
   {\t < 2}?{}:{\draw[->,red,>=stealth] (i-1)--(i-2);}%ifthenelse此处有bug出现
\end{tikzpicture}
}%
\end{animateinline}

\end{frame}
%====================================================
\end{document}
效果图: aA8777CK5a 生成的pdf动画中,箭头会随曲线移动,自行修改可以得到你想要的其他效果。上面的例子用到了很关键的一点技巧,就是求解两条曲线的交点坐标并命名。 frame加选项[fragile]是为了告诉beamer,帧里面的命令很脆弱,需优先调用执行。 这个选项对tikz里面的命令,尤其是函数和数学计算环境的支持改善很多。没有[fragile],源文件有时甚至都无法通过编译。上面的ifthenelse函数是tikz自带的函数,底层使用PGF实现.如果改为宏包ifthen中的命令\ifthenelse{}{}{},发现不能识别\t变量.也许是bug,或者对ifthen的支持不够好. 下面的代码,使用PGF的命令实现,更简单一点:
\documentclass[CJK]{beamer}
%====================================================
\input{../setup/tikzall.tex} %包含所有的tikz包
%====================================================
\usepackage{CJK}
\usepackage{animate}
\setbeamertemplate{navigation symbols}{} %取消导航图表
%====================================================
%\usepackage[active,tightpage]{preview}  
%\PreviewEnvironment{tikzpicture}  
%%设置tikz输出图像的空白边界大小  
%\setlength{\PreviewBorder}{0.5bp} 
%====================================================
\begin{document}
%%====================================================
\begin{CJK*}{UTF8}{song}
%%====================================================  
\begin{frame}[fragile]  
%演示动态绘制线条的过程  
\begin{animateinline}[poster=last,autoplay,loop]{5}    
%总共生成20帧画面,以每秒5帧的速度自动播放      
\multiframe{20}{Rpos=0.05+0.05}{%Rpos=0.05,0.10,...,1  
\begin{tikzpicture}[line width=1pt]  
    \useasboundingbox[draw] (-0.5,-0.5)rectangle(3.5cm,2.5cm); 
    \draw [dashed,blue] (0,0) .. controls (0,2) and (3,0) .. (3,2);
    \begin{scope}[->]
	    \pgfpathcurvebetweentime{0}{\Rpos}{\pgfpointxy{0}{0}}{\pgfpointxy{0}{2}}
	    {\pgfpointxy{3}{0}}{\pgfpointxy{3}{2}}
	    \pgfsetstrokecolor{red} %设置线条颜色
	    \pgfsetstrokeopacity{0.5} %设置透明度
	    \pgfsetlinewidth{3pt}
	    \pgfusepath{stroke}%对笔画线条     
     \end{scope}
\end{tikzpicture}  
}%  
\end{animateinline}  
  
\end{frame}  
%====================================================
\end{CJK*}
%====================================================
\end{document}
动画的最后一幅画面是: 1366020633_9302

但是PGF命令不太好用

选自:http://blog.csdn.net/rumswell/article/details/8795584

点赞(2)

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部