TikZ 动画的奇怪行为

TikZ 动画的奇怪行为

我试图创建一个动画太极符号与 TikZ 和animate包一起使用,遇到了以下问题:

如果我不向中添加更大的边界框tikzpicture,那么生成的动画中的某些帧将会“缩小”。

以下 MWE 说明了这个问题:

\documentclass{article}
\usepackage{tikz}
\usepackage{animate}

\begin{document}
\centering

This is wrong.\\
\newcommand\TaiChiWrong[1]{
  \begin{tikzpicture}[scale=3]
    \fill[white](#1+180:1)arc(#1+180:#1:1)--cycle;  % black half-circle
    \fill(#1:1)arc(#1:#1-180:1)--cycle;             % white half-circle
    \fill(#1+180:.5)circle[radius=.5];              % black head
    \fill[white](#1:.5)circle[radius=.5];           % white head
    \fill(#1:.5)circle[radius=.1];                  % black eye
    \fill[white](#1+180:.5)circle[radius=.1];       % white eye
    \draw[gray](0,0)circle[radius=1cm];             % border
    \draw[red](-1,-1)rectangle(1,1);
    % \draw[blue](-1.3,-1.3)rectangle(1.3,1.3);
  \end{tikzpicture}
}
\begin{animateinline}[loop]{10}
  \multiframe{36}{i=90+-10}{\TaiChiWrong{\i}}
\end{animateinline}

\bigskip

This is correct.\\
\newcommand\TaiChi[1]{
  \begin{tikzpicture}[scale=3]
    \fill[white](#1+180:1)arc(#1+180:#1:1)--cycle;  % black half-circle
    \fill(#1:1)arc(#1:#1-180:1)--cycle;             % white half-circle
    \fill(#1+180:.5)circle[radius=.5];              % black head
    \fill[white](#1:.5)circle[radius=.5];           % white head
    \fill(#1:.5)circle[radius=.1];                  % black eye
    \fill[white](#1+180:.5)circle[radius=.1];       % white eye
    \draw[gray](0,0)circle[radius=1cm];             % border
    \draw[red](-1,-1)rectangle(1,1);
    \draw[blue](-1.3,-1.3)rectangle(1.3,1.3);
  \end{tikzpicture}
}
\begin{animateinline}[loop]{10}
  \multiframe{36}{i=90+-10}{\TaiChi{\i}}
\end{animateinline}

\end{document}

唯一的区别是错误的正确的版本的区别在于,后者会绘制更大的边界框(蓝色框)。此外,更大的边界框必须“足够大”:例如,如果蓝色框是,\draw[blue](-1.1,-1.1)rectangle(1.1,1.1);问题仍然存在。

我怀疑这个问题与此无关,因为当我使用它创建一系列图像animate时问题仍然存在。\foreach

我的问题是:为什么更大的边界框会产生不同的效果?

答案1

TikZ 会自动创建一个边界框来适应内容。要覆盖,您可以指定

\draw[use as bounding box](-1.3,-1.3)rectangle(1.3,1.3);

这可能是必要的,因为帧序列的自动创建的边界矩形会随着图片中元素的位置变化而变化。

您可能还想剪辑到这个矩形。

编辑以回应以下评论:在当前情况下,问题在于圆弧的 TikZ 边界框实际上不是圆弧的真正边界框。比较

\begin{tikzpicture}
    \draw (0,0) arc[start angle=0,end angle=180,radius=5cm];
    \draw[color=blue] (current bounding box.south west) rectangle (current bounding box.north east);
\end{tikzpicture}

\begin{tikzpicture}
    \draw (0,0) arc[start angle=20,end angle=200,radius=5cm];
    \draw[color=blue] (current bounding box.south west) rectangle (current bounding box.north east);
\end{tikzpicture}

造成这种情况的原因(猜测)是计算出的边界框包括圆弧的贝塞尔控制点,而这些控制点实际上位于路径之外。

我对 animate 包不是 100% 熟悉,但它似乎将第一幅图像的边界框作为“画布”,然后缩放所有后续图像以适应。由于图像的自动边界框是错误的(如上所述),这会产生观察到的行为。

因此,按照我之前的建议,这样的事情确实有效(我已经检查过了)

\newcommand\TaiChiFixed[1]{
  \begin{tikzpicture}[scale=3]
    \path[clip,use as bounding box](-1,-1)rectangle(1,1);
    \fill[white](#1+180:1)arc(#1+180:#1:1)--cycle;  % black half-circle
    \fill(#1:1)arc(#1:#1-180:1)--cycle;             % white half-circle
    \fill(#1+180:.5)circle[radius=.5];              % black head
    \fill[white](#1:.5)circle[radius=.5];           % white head
    \fill(#1:.5)circle[radius=.1];                  % black eye
    \fill[white](#1+180:.5)circle[radius=.1];       % white eye
    \draw[gray](0,0)circle[radius=1cm];             % border
    \draw[red](-1,-1)rectangle(1,1);
  \end{tikzpicture}
}

相关内容