LaTeX + Tikz で任意の多角形を描くにはどうすればいいの?
foreach を使わない例
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}
以下のように出力されます。
TeX で処理を繰り返す場合は,\foreach を使います。\foreach は Python でいう for に相当します。下のコードをみてください。Python での繰り返しの例です。1 から 4までのリストの中身をひとつひとつ頭から取り出し,変数 i に代入し,何らかの処理を続けるというものです。
for i in range(1, 5):
(何らかの処理)
TeX では次のように書きます。書き方は違いますが,構造は同じですね。
\foreach \i in { 1, ..., 4 } {
(何らかの処理)
}
おすすめの本
この記事が参加している募集
この記事が気に入ったらサポートをしてみませんか?