TikZ 実用例(11)~\tikzmath~
またまた久しぶりの投稿です(すみません…)。
今回は \tikzmath を紹介します。(今までにも使った例を出してはいますが)
図中で計算させる!
\tikzmath を使うと、変数を設定できます。(という認識なのですがあってます?)
例えば
\begin{tikzpicture}
  \tikzmath{
    \a = 3;
    \b = 2;
  }
  \draw (0,0) node {$\a$}
        (1,0) node {$\b$}
        ;
\end{tikzpicture}とすると
と出力されます。
これは、\tikzmath の中で、\a を 3、\b を 2 と定義して、座標 (0, 0) に \a、(1, 0) に \b を出力しているということです。
もちろん、これだけなら \tikzmath を使う必要はありません。
次に、座標 (2, 0) に和 \a+\b の値を出力したいと思います。
例えば
\begin{tikzpicture}
  \tikzmath{
    \a = 3;
    \b = 2;
  }
  \draw (0,0) node {$\a$}
        (1,0) node {$\b$}
        (2,0) node {$\a+\b$}
        ;
\end{tikzpicture}としても
となるだけで、和の値は計算されません。
ただ \a+\b と出力するだけになってしまいます。
そこで
\begin{tikzpicture}
  \tikzmath{
    \a = 3;
    \b = 2;
    int \s;
    \s = \a+\b;
  }
  \draw (0,0) node {$\a$}
        (1,0) node {$\b$}
        (2,0) node {$\s$}
        ;
\end{tikzpicture}とすると
となって,和が計算されて「5」と出力されます!
これは
int \s; で「整数値の変数 \s」を用意しておき、
\s = \a+\b; でその \s を \a+\b の計算結果と定義している
ということです。
サイコロ2個の36マス
自分は『場合の数・確率』の基本は「数え上げ!」と教えています。
だから、樹形図や表を多用して説明するのです。
そうすると、「サイコロ2個」の問題で36マスの表を描くことが多いわけです。
例えば
「2個のサイコロを投げるとき、目の和が3の倍数となる確率は?」
なんて問題に対する解答として、自分は36マスを描いて和の値を書き込みたいのです。
それがこれ!
これを数えて、答えは 12/36 = 1/3 です。
まぁ、これぐらいなら他の方法でも効率よく答えを得られますが、今はそんなことはどーでもよくて、とにかく「36マスの表」を描きたいのです!
これは
\begin{tikzpicture}[scale=0.5]
  \draw (-1,1) grid[step=1] (6,-6)
        (-1,1)--(0,0)
        (-0.7,0.3) node {$a$}
        (-0.3,0.7) node {$b$}
        ;
  \draw[very thick] (0,1)--(0,-6) (-1,0)--(6,0);
  \foreach \a in{1,...,6}{
    \draw (-0.5,-\a+0.5) node {$\a$}
          (\a-0.5,0.5) node {$\a$}
          ;
    \foreach \b in{1,...,6}{
      \tikzmath{
        int \s;
        \s = \a+\b;
      }
      \draw (\b-0.5,-\a+0.5) node {$\s$};
    }
  }
\end{tikzpicture}と入力しています。
解説
どういうことかというと、まず
\draw (-1,1) grid[step=1] (6,-6)
      (-1,1)--(0,0)
      (-0.7,0.3) node {$a$}
      (-0.3,0.7) node {$b$}
      ;
\draw[very thick] (0,1)--(0,-6) (-1,0)--(6,0);で、次図のように格子状の線(プラスα)を描いています。
(位置を分かりやすくする為に、赤い座標軸を入れてあります)
そして、\foreach で \a を1、2、…、6まで動かしながら
\foreach \a in{1,...,6}{
    \draw (-0.5,-\a+0.5) node {$\a$}
          (\a-0.5,0.5) node {$\a$}
          ;
}とすると
となります。
つまり、座標 (-0.5, -\a+0.5) と (\a-0.5, 0.5) に \a の値を出力しています。
そして、この \foreach の中で、さらに \foreach を重ねて \b を1から6まで動かすのですが、まずは \b = 1 で固定した場合を見てみましょう。
\foreach \a in{1,...,6}{
    \draw (-0.5,-\a+0.5) node {$\a$}
          (\a-0.5,0.5) node {$\a$}
          ;
  \foreach \b in{1}{
      \tikzmath{
        int \s;
        \s = \a+\b;
      }
      \draw (\b-0.5,-\a+0.5)node{$\s$};
    }
}このようにすると、座標 (1-0.5, -\a+0.5) に和 \s = \a+1 の値を出力して
となります。
したがって、\b を1から6まで動かして
\foreach \a in{1,...,6}{
    \draw (-0.5,-\a+0.5) node {$\a$}
          (\a-0.5,0.5) node {$\a$}
          ;
  \foreach \b in{1,...,6}{
      \tikzmath{
        int \s;
        \s = \a+\b;
      }
      \draw (\b-0.5,-\a+0.5)node{$\s$};
    }
}とすると
となります♪
和以外の例
したがって、\s の定義をいじることで、違うパターンの36マスも作れるわけです。
例えば
\begin{tikzpicture}[scale=0.5]
  \draw (-1,1) grid[step=1] (6,-6)
        (-1,1)--(0,0)
        (-0.7,0.3) node {$a$}
        (-0.3,0.7) node {$b$}
        ;
  \draw[very thick] (0,1)--(0,-6) (-1,0)--(6,0);
  \foreach \a in{1,...,6}{
    \draw (-0.5,-\a+0.5) node {$\a$}
          (\a-0.5,0.5) node {$\a$}
          ;
    \foreach \b in{1,...,6}{
      \tikzmath{
        int \s;
        \s = \a*\b;  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 変更箇所はここだけ
      }
      \draw (\b-0.5,-\a+0.5) node {$\s$};
    }
  }
\end{tikzpicture}とすれば、積 \s = \a*\b の値を出力して
となるし
\begin{tikzpicture}[scale=0.5]
  \draw (-1,1) grid[step=1] (6,-6)
        (-1,1)--(0,0)
        (-0.7,0.3) node {$a$}
        (-0.3,0.7) node {$b$}
        ;
  \draw[very thick] (0,1)--(0,-6) (-1,0)--(6,0);
  \foreach \a in{1,...,6}{
    \draw (-0.5,-\a+0.5) node {$\a$}
          (\a-0.5,0.5) node {$\a$}
          ;
    \foreach \b in{1,...,6}{
      \tikzmath{
        int \s;
        \s = mod(\a*\b,4);  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 変更箇所はここだけ
      }
      \draw (\b-0.5,-\a+0.5) node {$\s$};
    }
  }
\end{tikzpicture}とすれば、積 \a*\b を4で割った余りを出力して
となります。
(ちなみに、これは 2013 年の北海道大(理系)前期の問題)
以前の記事でも、三角形の外接円や内接円のときに \tikzmath を使っているので、ご参考にしていただければ幸いです。
それでは、また、いつの日か!
この記事が気に入ったらサポートをしてみませんか?


コメント