コードDE描画

プログラミングで図を描く練習

【LaTeX】【tikz】ループと分岐を組みあわせて描画する例5選

数式を扱えるLaTeXには、線や円などを描けるtikzパッケージがある。

コマンドを使って描画するのだが、似た様な図形を何度も描くことがある。

その様な場合に便利なループや条件分岐を扱うための構文が存在する。

ここではループの中で条件分岐を使った描画の具体例を5つ示す。

今回は次の4つの構文を扱う。

  • ifnum
  • ifodd
  • pgfmathparse
  • pgfmathresult

準備

tikzパッケージを使用するためには、プリアンブル(\\begin\{document\}の前)に次のように記述して、tikzパッケージを使えるようにさせる。

\usepackage{tikz}

ここでエラーが出る場合は、使っている環境にtikzパッケージがインストールされていないので、別途インストールする必要がある。

具体例

ifコマンドのみを使って単純な条件分岐

ifnumコマンドと不等号を使用

数値を比較して条件分岐を実装する構文がifnumコマンドでアル。次のような文法になっている。

\ifnum数値1比較演算子数値2
真の場合に実行する
\else
偽の場合に実行する
\fi

以下に不等号を使用 した例を示す。

\begin{tikzpicture}
\foreach \x/\iro in {0/red,60/orange,120/yellow,180/green,240/blue,300/purple}
{
    \fill [\iro] (\x:2) circle [radius=1] node [text=\ifnum\x<60 white\else\ifnum\x>180white\else black\fi\fi] {\LARGE{hello}};
}
\end{tikzpicture}
  • 実行結果

ifnumコマンドと不等号を使用
ifnumコマンドと不等号を使用

角度で文字色を分けた。角度xが$0<x<240$の時は白、それ以外は黒にした。オプションに空白や改行が入るとエラ〜になるため、条件分機の部分を1行で記述している。

使用できる比較演算子は次の3つである。

  • 大なり:$>$
  • 小なり:$<$
  • イコール:$=$

イコールを含んだ不統合は使用出来ない。そのような条件を使いたい場合は、elseを利用する。

ifnumコマンドと等号を使用

上記のように0/redと数字と文字列の2篇数を1つのループ出使った場合、数字をイコールで比較するとエラーになる場合がある。 その場合は以下のように数字のみ改めてループを作って処理をする。

\begin{tikzpicture}
\foreach \x/\iro in {0/red,60/orange,120/yellow,180/green,240/blue,300/purple}
{
    \fill [\iro] (\x:2) circle [radius=1];
}
\foreach \x in {0,60,...,300}
{
    \def\iro{\ifnum\x=180black\else\ifnum\x=120black\else\ifnum\x=60black\else white\fi\fi\fi}
    \node [text=\iro]  at (\x:2) {\LARGE{hello}};
}
\end{tikzpicture}
  • 実行結果

ifnumコマンドと等号を使用
ifnumコマンドと等号を使用

ifoddコマンド

数値が偶数か奇数かを判断する条件分岐コマンドが特別に用意されている。文法は次の通りである。

\ifodd数値
奇数の場合
\else
偶数の場合
\fi

具体例として、斜めからの立方体の見取図を描。

ソースコード

\begin{tikzpicture}
\foreach \x in {0,...,6}
{
    \draw [\ifodd\x dashed\fi] (0,0) -- (30+\x*60:2);
    \draw (30+\x*60:2) -- ({30+(\x+1)*60}:2);
}
\end{tikzpicture}
  • 実行結果

立方体
立方体

ifコマンドとpgfmathコマンドを使って複雑な条件分岐

数式を使う

条件に数式を使うことでより複雑な条件を作ることができる。

まず次のようなコマンドを使って数式を定義する。

\pgfmathparse{数式}

上記のコマンドの使用後に次のようなコマンドを使うと計算結果を取得できる。

\pgfmathresult

以下に計算式を使った一例を示す。mod関数は剰余を求める計算式である。

\begin{tikzpicture}
\foreach \x in {0,...,10}
    \foreach \y in {0,...,15}
    {
        \pgfmathparse{int(mod(\x-\y+16,4))}
        \foreach \i/\iro in {0/red,1/yellow,2/green,3/blue}
        {
            \ifnum\pgfmathresult=\i
            \fill [\iro] (\x*0.5,\y*0.5) circle (0.1);
            \fi
        }
    }
\end{tikzpicture}
  • 実行結果

数式を使う
数式を使う

使える関数を以下列挙する。

  • 論理演算関数
    • and
    • or
    • not
  • 三角関数
    • sin
    • cos
    • tan
  • 三角関数逆関数
  • 三角関数の逆数関数
    • sec
    • cosec
    • cot
  • ハイパボリック関数
  • その他の関数

    • sqrt:平方根
    • exp: 自然対数の底の冪乗
    • ln:自然対数
    • pow:第一引数の第二引数乗
    • abs:絶対値
    • max:最大値
    • min:最小値
    • mod:剰余

    ここで次のような注意事項がある。

  • 論理演算子の引数は0をfalse,1をtrueとして扱う。戻り値は0、1のいずれかとなる

  • 三角関数や逆三角関数は度数ではなくラジアンで扱う。tikzパッケージ全体と異なるので注意
  • 自然対数はlogではなくlnであり、log関数は存在しない
論理演算式を使う

以下のように論理式を使うと、複雑な条件を作ることができる。

\begin{tikzpicture}
\foreach \x in {0,...,10}{
    \foreach \y in {0,...,15}{
    % x%3=0 & y%5=0 
    \pgfmathparse{and(equal(mod(\x,3),0), equal(mod(\y,5),0))}
        \ifnum\pgfmathresult=1
            \def\iro{yellow}
        \fi
        
    % x%3=0 & y%5!=0
    \pgfmathparse{and(equal(mod(\x,3),0), not(equal(mod(\y,5),0)))}
    \ifnum\pgfmathresult=1
        \def\iro{blue}
    \fi
    
    % x%3!=0 & y%5=0 
    \pgfmathparse{and(not(equal(mod(\x,3),0)), equal(mod(\y,5),0))}
    \ifnum\pgfmathresult=1
        \def\iro{red}
    \fi
    
    % not( x%3=0 | y%5=0 ) 
    \pgfmathparse{not(or((equal(mod(\x,3),0), equal(mod(\y,5),0)))}
    \ifnum\pgfmathresult=1
        \def\iro{black}
    \fi
    
    \fill [\iro] (\x*0.5,\y*0.5) circle (0.1);
    }
}
\end{tikzpicture}
  • 実行結果

論理演算式を使う
論理演算式を使う

まとめ

tikzパッケージでのループの中で条件分岐する構文は次の2つである。

  • ifnum数値1比較演算子数値2
  • ifodd数値

また、次のような構文で複雑計算をすることができる。

```tex \pgfmathparse{数式} \ifnum\pgfmathresult=数値 コマンド \else コマンド \fi

### 参考リンク

[tikz wiki](https://texwiki.texjp.org/?TikZ)
[texマクロwiki](https://texwiki.texjp.org/?TeX入門%2Fマクロの作成)