例えば,座標上の点$(1,2)$を何度も用いるなら,$(1,2)$を何度も書くのは面倒です.
TikZでは点$(1,2)$を(A)と定義することができ,(A)と書けばこれを全て点$(1,2)$として処理させることができます.
こうすると,$(1,2)$を$(3,2)$に書き換えたいとき,(A)の定義を$(3,2)$に書き換えるだけで全ての$(1,2)$が$(3,2)$に置き換わりとても便利です.
このように点の定義は適切に利用すれば,TikZの記述の編集は非常に簡単になります.
また,
- ライブラリ”calc”を用いることで,座標の計算ができ,
- ライブラリ”intersections”を用いることで,曲線の交点の座標を定義できます.
なお,本稿では以下のように3つのライブラリ”intersections”, “calc”, “arrows.meta”を用います.
1 2 3 4 5 6 7 |
\documentclass[dvipdfmx]{jsarticle} \usepackage{tikz} \usetikzlibrary{intersections,calc,arrows.meta} \begin{document} \end{document} |
なお,ライブラリについては最初の記事で説明しています.
「TikZの使い方」の一連の記事
座標上の点の定義
ここでは,座標上の点の定義の仕方を説明します.
座標上の点の定義
例えば,
1 2 3 4 5 6 7 8 9 |
\begin{tikzpicture} \coordinate (A) at (0,0); %点Aの定義 \coordinate (B) at (3,0); %点Bの定義 \coordinate (C) at (2,2); %点Cの定義 \draw (A) node[left] {A}; %点A \draw (B) node[right] {B}; %点B \draw (C) node[above] {C}; %点C \draw (A)--(B)--(C)--cycle; %三角形ABC \end{tikzpicture} |
と記述すれば,
と表示されます.つまり,
1 |
\coordinate (X) at (a,b); |
と記述すれば,座標上の点$(a,b)$を(X)と定義することができるということですね.
一行で点の定義と文字の入力をする
上のように点の定義と文字を別々に
1 2 |
\coordinate (A) at (0,0); \draw (A) node[left] {A}; |
としても問題ありませんが,少々記述が嵩張ってしまいます.
1 2 3 4 5 6 |
\begin{tikzpicture} \coordinate[label=left:A] (A) at (0,0); %点Aの定義 \coordinate[label=right:B] (B) at (3,0); %点Bの定義 \coordinate[label=above:C] (C) at (2,2); %点Cの定義 \draw (A)--(B)--(C)--cycle; %三角形ABC \end{tikzpicture} |
と点の定義と文字の入力を一行で記述することもでき,上の図と同じものが表示されます.
つまり,
1 |
\coordinate [label=(文字の位置):X] (X) at (a,b); |
と記述すれば,座標上の点$(a,b)$を(X)で定義し,文字Xを表示させることができます.
なお, (文字の位置) は右 right,左 left,上 above,下 below の他に
1 |
\coordinate[label=200:A] (A) at (0,0); |
とすると,Aから見て偏角$200^\circ$の位置に文字Aを表示することができます.
曲線の交点の定義
TikZでは,ライブラリ”intersections”を用いることで,交点の座標を定義することができます.
例えば,
1 2 3 4 5 6 7 |
\begin{tikzpicture} \draw[name path=C1] (0,0) circle (1); %円C1 \draw[name path=C2] (2,1) circle (2); %円C2 \path[name intersections={of= C1 and C2}]; %円C1と円C2の交点の定義 \fill[red] (intersection-1) circle (0.06) node[above left]{A}; %1つ目の交点の左にA \fill[red] (intersection-2) circle (0.06) node[below]{B}; %2つ目の交点の下にB \end{tikzpicture} |
と記述すれば,
と表示されます.つまり,
1 2 3 |
\draw[name path=(曲線1の名前)] 曲線1; \draw[name path=(曲線2の名前)] 曲線2; \path[name intersections={of= (曲線1の名前) and (曲線2の名前)}]; |
と記述すれば,$n$個目の交点が (intersection-n) で定義されます.
交点の名前を自分で付けたい場合には,
1 2 3 4 5 6 7 |
\begin{tikzpicture} \draw[name path=C1] (0,0) circle (1); %円C1 \draw[name path=C2] (2,1) circle (2); %円C2 \path[name intersections={of= C1 and C2, by={A,B}}]; %円C1と円C2の交点の定義 \fill[red] (A) circle (0.06) node[above left]{A}; %1つ目の交点の左にA \fill[red] (B) circle (0.06) node[below]{B}; %2つ目の交点の下にB \end{tikzpicture} |
のように by={(交点1の名前),(交点2の名前),……}と記述すれば,交点の名前を順に名付けることができます.
繰り返し処理
上の三角形で頂点A, B, Cを黒丸で塗りつぶしたいとき,
1 2 3 |
\fill[black] (A) circle (0.06); \fill[black] (B) circle (0.06); \fill[black] (C) circle (0.06); |
とすることもできますが,これをまとめて
1 |
\foreach \P in {A,B,C} \fill[black] (\P) circle (0.06); |
と繰り返し処理で実行することもできます.例えば,
1 2 3 4 5 6 7 |
\begin{tikzpicture} \coordinate [label=left:A] (A) at (0,0); %点A \coordinate [label=right:B] (B) at (3,0); %点B \coordinate [label=above:C] (C) at (2,2); %点C \foreach \P in {A,B,C} \fill[black] (\P) circle (0.06); %点A,B,Cに黒丸 \draw (A)--(B)--(C)--cycle; %三角形ABC \end{tikzpicture} |
と記述すると,
と表示されます.すなわち,
1 |
\foreach \P in {X,Y,Z} (\Pに関する命令); |
と記述すれば, (\Pに関する命令) の \P にX, Y, Zを代入した処理が行われます.この \P は \t などとしても構いません.
なお,規則的な代入をするときには,以下のように省略して記述することもできます.
- \foreach \P in {A,B,...,Z} は \P にAからZまでのアルファベットを代入した処理が行われる.
- \foreach \t in {1,2,...,10} は \t に1から10までの整数を代入した処理が行われる.
- \foreach \t in {10,20,...,100} は \t に10から100までの整数を10毎に代入した処理が行われる.
座標の計算
TikZでは,ライブラリ”calc”を用いることで,座標計算を行うことができます.
ただし,以下では$\mrm{A}(a,b)$, $\mrm{B}(c,d)$, $\mrm{P}(x,y)$と定義されているとします.つまり,
1 2 3 |
\coordinate (A) at (a,b); \coordinate (B) at (c,d); \coordinate (P) at (x,y); |
とします.また,$k,t,a$を実数とします.
このとき,以下のコマンドにより座標の計算ができます.
計算結果 | 記述 |
---|---|
点$(a+b,c+d)$ | (\$(A)+(B)\$) |
点$(ka,kb)$ | (\$k*(A)\$) |
線分ABの$t:(1-t)$内分点 ($0<t<1$) | (\$(A)!t!(B)\$) |
線分ABの$-t:(1-t)$外分点 ($t<0$) | (\$(A)!t!(B)\$) |
線分ABの$t:(t-1)$外分点 ($t>1$) | (\$(A)!t!(B)\$) |
Pから直線ABに下ろした垂線の足 | (\$(A)!(P)!(B)\$) |
Aとの距離$t[\mrm{cm}]$のBへ向かう点 | (\$(A)!t cm!(B)\$) |
線分ABの$t:(1-t)$内分点を,A中心で$a^\circ$回転させた点 | (\$(A)!t!a:(B)\$) |
なお,内分点,外分点はいずれも (\$(A)!t!(B)\$)でよく,
- $t<0$ならA側の外分点
- $0<t<1$なら内分点
- $1<t$ならB側の外分点
となるだけで本質的には同じです.
例1
例えば,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
\begin{tikzpicture} \coordinate[label=below left:O] (O) at (0,0); %原点O \coordinate (XS) at (-0.5,0); %x軸最小 \coordinate (XL) at (6,0); %x軸最大 \coordinate (YS) at (0,-0.5); %y軸最小 \coordinate (YL) at (0,4); %y軸最大 \draw[semithick,->,>=stealth] (XS)--(XL) node[right] {\$x\$}; %x軸 \draw[semithick,->,>=stealth] (YS)--(YL) node[above] {\$y\$}; %y軸 \coordinate[label=below left:P] (P) at (3,2); %楕円の中心 \draw (P) circle [x radius=2, y radius=1]; %(x径,y径)=(2,1)の楕円 \coordinate (Pr) at (5,2); %右頂点 \coordinate (Pl) at (1,2); %左頂点 \coordinate (Pa) at (3,3); %上頂点 \coordinate (Pb) at (3,1); %下頂点 \draw[dashed] (\$(XS)!(Pr)!(XL)\$)node[below]{5}--(Pr)--(\$(YS)!(Pr)!(YL)\$)node[left]{2}; %右頂点から各軸への垂線 \draw[dashed] (\$(XS)!(Pl)!(XL)\$)node[below]{1}--(Pl); %左頂点からx軸への垂線 \draw[dashed] (\$(XS)!(Pa)!(XL)\$)node[below]{3}--(Pa)--(\$(YS)!(Pa)!(YL)\$)node[left]{3}; %上頂点から各軸への垂線 \draw[dashed] (\$(YS)!(Pb)!(YL)\$)node[left]{1}--(Pb); %下頂点からy軸への垂線 \fill (P) circle (0.05); %Pの塗りつぶし \draw (Pa) node[above right] {\$\displaystyle\frac{(x-3)^2}{4}+(y-2)^2=1\$}; \end{tikzpicture} |
と記述すると,
と表示されます.
例2
例えば,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
\begin{tikzpicture}[xscale=2.5] \coordinate[label=below left:O] (O) at (-2,0); %原点O \coordinate (XS) at (-2.2,0); %x軸最小 \coordinate (XL) at (2,0); %x軸最大 \coordinate (YS) at (-2,-0.5); %y軸最小 \coordinate (YL) at (-2,5); %y軸最大 \draw[semithick,->,>=stealth] (XS)--(XL) node[right] {\$x\$}; %x軸 \draw[semithick,->,>=stealth] (YS)--(YL) node[above] {\$y\$}; %y軸 \draw[samples=100,domain=-2.2:1.5,very thick] plot(\x,\x*\x*\x+\x*\x-2*\x+2) node[above] {\$y=f(x)\$}; %y=f(x)のグラフ \foreach \t in {-2,-1.9,...,1.5} \draw (\t,0)--(\t,\t*\t*\t+\t*\t-2*\t+2)--(\t+0.1,\t*\t*\t+\t*\t-2*\t+2)--(\t+0.1,0); %x=t,x=t+1の間の短冊 \draw (1.5,0) node [below] {1}; %点(1,0) \draw (\$(XS)!0.5!(XL)+(0,-0.5)\$) node[below] {\$\displaystyle\int_{0}^{1}f(x)\,dx \approx \frac{1}{n}\sum_{k=0}^{n-1}f\left(\frac{k}{n}\right)\$}; %図のx軸の中点+(0,-1)の位置に区分求積の式 \end{tikzpicture} |
と記述すると,
と表示されます.
コメント