あかり描像のブログ

思ったことや学習記録を適当に書いていきます。お気軽にコメントください

【TikZ】TikZ で三角関数の単位円の図を描く

TikZ で三角関数の単位円の図を描きました。
主に私が高校生に三角関数を教えるときに頻繫に使ってきた図です。
これまでは手で直接描いたり CAD を使って描いたりしていたのですが、今回は思い切って TikZ を用いて描いてみました。

この記事ではその図を描画するために作成したコードを公開します。

今回作成したもの

改行・インデントは適当です。すみません。

\documentclass[dvipdfmx, tikz]{standalone}

\newcommand\Height[0]{1.9}
\newcommand\InterceptColor[0]{blue}
\newcommand\TanColor[0]{magenta}
\newcommand\AngleColor[0]{olive}

\begin{document}
\begin{tikzpicture}[scale=5]
 
% 点線
\foreach \i in {1/2, sqrt(2)/2, sqrt(3)/2} {
  \draw[dashed] ({\i}, {sqrt(1-(\i)^2)})--(-{\i}, {sqrt(1-(\i)^2)});
  \draw[dashed] ({\i}, -{sqrt(1-(\i)^2)})--(-{\i}, -{sqrt(1-(\i)^2)});
  \draw[dashed] ({\i}, -{sqrt(1-(\i)^2)})--({\i}, {sqrt(1-(\i)^2)});
  \draw[dashed] (-{\i}, -{sqrt(1-(\i)^2)})--(-{\i}, {sqrt(1-(\i)^2)});
}

% 斜めの線
\foreach \i in {sqrt(3)/3, 1, sqrt(3)} {
  \draw[very thin] (-1, -{\i})--(1, {\i});
  \draw[very thin] (-1, {\i})--(1, -{\i});
}

% 座標
\draw[\InterceptColor] (-1, 0) node[below left, fill=white] {$-1$};
\draw[\InterceptColor] (-{sqrt(3)/2}, 0) node[below, fill=white] {$-\frac{\sqrt{3}}{2}$};
\draw[\InterceptColor] (-{sqrt(2)/2}, 0) node[below, fill=white] {$-\frac{\sqrt{2}}{2}$};
\draw[\InterceptColor] (-1/2, 0) node[below, fill=white] {$-\frac{1}{2}$};
\draw[\InterceptColor] (1/2, 0) node[below, fill=white] {$\frac{1}{2}$};
\draw[\InterceptColor] ({sqrt(2)/2}, 0) node[below, fill=white] {$\frac{\sqrt{2}}{2}$};
\draw[\InterceptColor] ({sqrt(3)/2}, 0) node[below, fill=white] {$\frac{\sqrt{3}}{2}$};
\draw[\InterceptColor] (1, 0) node[below right, fill=white] {$1$};

\draw[\InterceptColor] (0, -1) node[below left, fill=white] {$-1$};
\draw[\InterceptColor] (0, -{sqrt(3)/2}) node[left, fill=white] {$-\frac{\sqrt{3}}{2}$};
\draw[\InterceptColor] (0, -{sqrt(2)/2}) node[left, fill=white] {$-\frac{\sqrt{2}}{2}$};
\draw[\InterceptColor] (0, -1/2) node[left, fill=white] {$-\frac{1}{2}$};
\draw[\InterceptColor] (0, 1/2) node[left, fill=white] {$\frac{1}{2}$};
\draw[\InterceptColor] (0, {sqrt(2)/2}) node[left, fill=white] {$\frac{\sqrt{2}}{2}$};
\draw[\InterceptColor] (0, {sqrt(3)/2}) node[left, fill=white] {$\frac{\sqrt{3}}{2}$};
\draw[\InterceptColor] (0, 1) node[above left, fill=white] {$1$};

\draw[\TanColor] (1, -{sqrt(3)}) node[right, fill=white] {$-\sqrt{3}$};
\draw[\TanColor] (1, -1) node[right, fill=white] {$-1$};
\draw[\TanColor] (1, -{sqrt(3)/3}) node[right, fill=white] {$-\frac{\sqrt{3}}{3}$};
\draw[\TanColor] (1, 0) node[above right, fill=white] {$0$};
\draw[\TanColor] (1, {sqrt(3)/3}) node[right, fill=white] {$\frac{\sqrt{3}}{3}$};
\draw[\TanColor] (1, 1) node[right, fill=white] {$1$};
\draw[\TanColor] (1, {sqrt(3)}) node[right, fill=white] {$\sqrt{3}$};

\draw[\TanColor] (-1, {sqrt(3)}) node[left, fill=white] {$-\sqrt{3}$};
\draw[\TanColor] (-1, 1) node[left, fill=white] {$-1$};
\draw[\TanColor] (-1, {sqrt(3)/3}) node[left, fill=white] {$-\frac{\sqrt{3}}{3}$};
\draw[\TanColor] (-1, 0) node[above left, fill=white] {$0$};
\draw[\TanColor] (-1, -{sqrt(3)/3}) node[left, fill=white] {$\frac{\sqrt{3}}{3}$};
\draw[\TanColor] (-1, -1) node[left, fill=white] {$1$};
\draw[\TanColor] (-1, -{sqrt(3)}) node[left, fill=white] {$\sqrt{3}$};

% 角度
\draw[\AngleColor] (1, 0) 
	node[above left, fill=white] {$0^\circ$} 
	node[above right] {\hspace{12pt}$0$};

\draw[\AngleColor] ({sqrt(3)/2}, 1/2) 
	node[below left, fill=white] {$30^\circ$} 
	node[above right, fill=white] {$\frac{\pi}{6}$};
\draw[\AngleColor] ({sqrt(2)/2}, {sqrt(2)/2}) 
	node[below left, fill=white] {$45^\circ$} 
	node[above right, fill=white] {$\frac{\pi}{4}$};
\draw[\AngleColor] (1/2, {sqrt(3)/2}) 
	node[below left, fill=white] {$60^\circ$} 
	node[above right, fill=white] {$\frac{\pi}{3}$};
\draw[\AngleColor] (0, 1) 
	node[below right, fill=white] {$90^\circ$} 
	node[above right, fill=white] {$\frac{\pi}{2}$};
\draw[\AngleColor] (-1/2, {sqrt(3)/2}) 
	node[below right, fill=white] {$120^\circ$} 
	node[above left, fill=white] {$\frac{2}{3}\pi$};
\draw[\AngleColor] (-{sqrt(2)/2}, {sqrt(2)/2}) 
	node[below right, fill=white] {$135^\circ$} 
	node[above left, fill=white] {$\frac{3}{4}\pi$};
\draw[\AngleColor] (-{sqrt(3)/2}, 1/2) 
	node[below right, fill=white] {$150^\circ$} 
	node[above left, fill=white] {$\frac{5}{6}\pi$};

\draw[\AngleColor] (-1, 0) 
	node[above right, fill=white] {$180^\circ$} 
	node[above left] {$\pi$\hspace{10pt} \ };

\draw[\AngleColor] (-{sqrt(3)/2}, -1/2) 
	node[above right, fill=white] {$210^\circ$} 
	node[below left, fill=white] {$\frac{7}{6}\pi$};
\draw[\AngleColor] (-{sqrt(2)/2}, -{sqrt(2)/2}) 
	node[above right, fill=white] {$225^\circ$} 
	node[below left, fill=white] {$\frac{5}{4}\pi$};
\draw[\AngleColor] (-1/2, -{sqrt(3)/2}) 
	node[above right, fill=white] {$240^\circ$} 
	node[below left, fill=white] {$\frac{4}{3}\pi$};
\draw[\AngleColor] (0, -1) 
	node[above right, fill=white] {$270^\circ$} 
	node[below right, fill=white] {$\frac{3}{2}\pi$};
\draw[\AngleColor] (1/2, -{sqrt(3)/2}) 
	node[above left, fill=white] {$300^\circ$} 
	node[below right, fill=white] {$\frac{5}{3}\pi$};
\draw[\AngleColor] ({sqrt(2)/2}, -{sqrt(2)/2}) 
	node[above left, fill=white] {$315^\circ$} 
	node[below right, fill=white] {$\frac{7}{4}\pi$};
\draw[\AngleColor] ({sqrt(3)/2}, -1/2) 
	node[above left, fill=white] {$330^\circ$} 
	node[below right, fill=white] {$\frac{11}{6}\pi$};


% 軸
\draw[-stealth] (-1.2, 0)--(1.2, 0) node[right] {\LARGE$\cos$};
\draw[-stealth] (0, -\Height)--(0, \Height) node[above] {\LARGE$\sin$};
\draw[-stealth] (1, -\Height)--(1, \Height) node[above] {\LARGE$\tan$};
\draw[-stealth] (-1, \Height)--(-1, -\Height) node[below] {\LARGE$\tan$};

% 単位円
\draw[thick] (0, 0) circle[radius=1];

\end{tikzpicture}
\end{document}



f:id:bakkyalo:20200104232523p:plain
実行結果

本記事は三角関数がテーマではないので、ここではこの図の意味することや使い方については触れないことにします。(後に別の記事で書くことはあるかもしれませんが、それも気分次第...)
工夫次第ではもっと簡潔に書けると思います。

コードの補足説明

一見複雑そうに見えますが、やっていることは地道で単純なので、ここではコードについて詳しく説明するつもりはありません。
(気が向いたら加筆する可能性はあり)

foreach 文について

カッコ付けて foreach 文なんか使っちゃっていますが、これは図中の点線や斜めの線をまとめて描くために利用したものです。
他のプログラミング言語for 文と似たような書き方ですが、変数は \i のようにバックスラッシュを付けて書きます。

変数を TikZ 内の計算で利用するには \i( ) で囲う必要があるようです( { } ではない)。本コードでは変数  i に対して  \sqrt{1-i^2} を計算させていますが、そのために sqrt(1-(\i)^2) のように \i( ) で囲って利用しています。

更に外側にある { } はひとまとまりとなる範囲を明示するもので、これを付けないとエラーを吐きます。

単位円の描き方

加えて円についてですが、以下の記事では円弧の描き方を2通り紹介しました。
bakkyalo.hatenablog.jp

今回は円の一部ではなく全体を描くので

% 単位円
\draw[thick] (0, 0) circle[radius=1];

と書くだけでいいので結構楽です。
もちろんこれは中心  (0, 0) 、半径  1 の円を描け、という意味ですね。

軸と単位円を描くタイミング

軸と単位円を描く部分が最後に来ているのは、座標や角度を振るときに後ろの点線等にかぶらないように設定した fill=white に消されないようにするためです。
Word で図を最前面に設定するのと同じ感覚です。
TikZ はコードの上から順番に図を描画するので、後ろにあるものほど後に描かれることになります。
このような性質があるので、軸と円が図中の数字に消されないようにするために軸と単位円を描く部分を最後に書いた、という訳です。