例えば,座標上の点$(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} |
と記述すると,
と表示されます.
コメント