見出し画像

LaTeX + Tikz で任意の多角形を描くにはどうすればいいの?



foreach を使わない例

Tikz で8角形を描いてみます。綺麗に書けますね

Tikz で描いた8角形

スクリプトは以下のとおりです。

\documentclass[dvipdfmx]{jsarticle}
\usepackage{tikz}

\begin{document}

\begin{tikzpicture}

  % 各座標を指定する
  \coordinate(A) at ({3*cos( 45)}, {3*sin( 45)});
  \coordinate(B) at ({3*cos( 90)}, {3*sin( 90)});
  \coordinate(C) at ({3*cos(135)}, {3*sin(135)});
  \coordinate(D) at ({3*cos(180)}, {3*sin(180)});
  \coordinate(E) at ({3*cos(225)}, {3*sin(225)});
  \coordinate(F) at ({3*cos(270)}, {3*sin(270)});
  \coordinate(G) at ({3*cos(315)}, {3*sin(315)});
  \coordinate(H) at ({3*cos(360)}, {3*sin(360)});
 
  % 8角形を描く
  \draw (A) -- (B) -- (C) -- (D)-- (E) -- (F) -- (G) -- (H) -- cycle;

  % 原点 (0,0) から各座標に線を引く
  \draw (0,0) -- (A);
  \draw (0,0) -- (B);
  \draw (0,0) -- (C);
  \draw (0,0) -- (D);
  \draw (0,0) -- (E);
  \draw (0,0) -- (F);
  \draw (0,0) -- (G);
  \draw (0,0) -- (H);
  
\end{tikzpicture}
\end{document}

8つの頂点をそれぞれ $${\sin}$$, $${\cos}$$ を用いて指定しています。今回は8角形ですから,指定する個数は8個で済みました。しかし,90 角形を描きたい場合はどうでしょう?90回,座標の指定をしなければなりません。任意の n 角形を描くようにスクリプトを描いていたほうがいいですね。

foreach を使った例

以下のスクリプトで任意の多角形を描くことができます。

\documentclass[dvipdfmx]{jsarticle}
\usepackage{tikz}
\usetikzlibrary{calc,fit}

\begin{document}
\begin{tikzpicture}

\newcounter{i}
\setcounter{i}{0}

% 多角形の頂点数(変更可能)
\def\n{90} % 任意の n を指定

% 座標を格納するリスト
\coordinate (fitpoints) at (0,0);

% 多角形の各頂点を計算
\foreach \k in {1, ..., \n} {
    \pgfmathsetmacro\theta{360/\n * (\k - 1)}
    \coordinate (point-\arabic{i}) at (\theta:2);
    
    % 座標をリストに追加
    \xdef\fitpoints{(fitpoints) (point-\arabic{i})};
    
    \stepcounter{i}
}

% n角形を描く
\path[draw] (point-0)
\foreach \x in {1, ..., \the\numexpr \n-1\relax} {
    -- (point-\x)
}
-- cycle;

\path[draw] (0,0) -- (2, 0) --cycle;
% ( 0, 0 ) から各頂点に線を引く
\draw[black]
\foreach \x in {1, ..., \the\numexpr \n-1\relax} {
    ( 0, 0) -- (point-\x)
}
-- cycle;

\end{tikzpicture}
\end{document}

以下のように出力されます。


90 角形

TeX で処理を繰り返す場合は,\foreach を使います。\foreach は Python でいう for に相当します。下のコードをみてください。Python での繰り返しの例です。1 から 4までのリストの中身をひとつひとつ頭から取り出し,変数 i に代入し,何らかの処理を続けるというものです。

for i in range(1, 5):
    (何らかの処理)

TeX では次のように書きます。書き方は違いますが,構造は同じですね。

\foreach \i in { 1, ..., 4 } {
    (何らかの処理)
}


おすすめの本


この記事が参加している募集

この記事が気に入ったらサポートをしてみませんか?