TikZでgifアニメを作る方法

TikZでgifアニメを作る方法をかく。

タイプセット環境は以下の通り。
macOS Sierra,texlive2016,lualatex

手順
1. pdfを作る

tikzが読み込むpgfforパッケージの\foreachコマンドを利用して,アニメーションに変換するためのpdfを作ります。

コード
%
% preamble for lualatex
%
\RequirePackage{luatex85}
\documentclass{ltjsarticle}
\usepackage[papersize=10cm]{geometry}
\usepackage{tikz}
\begin{document}
\foreach \t in {1,2,...,50}{
\begin{figure}
  \centering
  \begin{tikzpicture}
    \path[clip] (-3,-3) rectangle (3,3);
    \node[fill,circle,color=cyan!\t!magenta] at (7.2*\t:2cm){};
  \end{tikzpicture}
\end{figure}
\newpage
}
\end{document}
実行結果

:

2. pdfをgifに変換する

1.で作成したpdfを,ImageMagickmagickコマンドでgifに変換します。sample.pdfをsample.gifに変換するには,ターミナルで以下のように入力します。

magick -density 300 sample.pdf -alpha remove sample.gif

少し時間がかかるかもしれません。処理が終わればgifの完成です。

実行結果
注意
densityオプションの順序に注意してください。以下のように書くと,densityの指定が無視されるようです。

magick sample.pdf -density 300 -alpha remove sample.gif
3. \tikzmathの利用と\foreachの入れ子

\tikzmath\foreachの入れ子などを利用して,少しかっこいいgifを作ってみます。

コード
%
% preamble for lualatex
%
\RequirePackage{luatex85}
\documentclass[border=5pt]{ltjsarticle}
\usepackage{tikz}
\usepackage[papersize=14cm]{geometry}
\usetikzlibrary{math, calc}
\begin{document}
\foreach \t in {1,3,...,65}
{
  \begin{figure}
    \centering
    \begin{tikzpicture}
      \path[clip] (-2,-5) rectangle (10,5);
      \foreach \x in {1,2,...,\t}
      {
        \tikzmath{
          coordinate \c;
          real \r;
          \r = \x + 0.1;
          \c1 = ({0.1*\x}, {sin(0.1*\x r)});
          \c2 = ({0.1*\r}, {sin(0.1*\r r)});
          \c3 = (\c1) - (\c2);
        }
        \node[circle,fill,color=cyan!\x!magenta] (A) at ($(\c1) - 300*(\c3)$) {};
        \node[circle,fill,color=cyan!\x!magenta] (B) at ($(\c1) + 300*(\c3)$) {};
        \path[draw,color=cyan!\x!magenta] (A) -- (B);
      }
    \end{tikzpicture}
  \end{figure}
  \newpage
}\mbox{}
\foreach \t in {65,63,...,1}
{
  \begin{figure}
    \centering
    \begin{tikzpicture}
      \path[clip] (-2,-5) rectangle (10,5);
      \foreach \x in {1,2,...,\t}
      {
        \tikzmath{
          coordinate \c;
          real \r;
          \r = \x + 0.1;
          \c1 = ({0.1*\x}, {sin(0.1*\x r)});
          \c2 = ({0.1*\r}, {sin(0.1*\r r)});
          \c3 = (\c1) - (\c2);
        }
        \node[circle,fill,color=cyan!\x!magenta] (A) at ($(\c1) - 300*(\c3)$) {};
        \node[circle,fill,color=cyan!\x!magenta] (B) at ($(\c1) + 300*(\c3)$) {};
        \path[draw,color=cyan!\x!magenta] (A) -- (B);
      }
    \end{tikzpicture}
  \end{figure}
  \newpage
}
\end{document}
変換後のgif

参考:TikZによる連成振動アニメーション (1) ~ アニメーションGIF篇

コメントを残す

メールアドレスが公開されることはありません。

This site uses Akismet to reduce spam. Learn how your comment data is processed.