TikZで図を描くとき,座標上の点$(1,2)$を何度も使うなら,点$(1,2)$に名前を付けて何度も書く手間を省くことができます.
点に名前をつけておくメリットは「何度も書く必要がない」という以外にも,「簡単に点を書き換えられる」ということが挙げられます.
たとえば,点$(1,2)$をあとで「点$(2,3)$に書き換えたい!」と思ったとき,もし点$(1,2)$に名前をつけていなければ,全ての (1,2)の記述を (2,3)に書き換える必要があります.
一方,もし前もって点$(1,2)$を(A)と名付けておけば,(A)の定義を$(2,3)$に書き換えるだけで,全ての$(1,2)$が一斉に$(3,2)$に置き換わります.
このように点の定義は適切に利用すれば,TikZの記述の編集は非常にラクになります.
なお,本稿では以下のように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の使い方」の一連の記事
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を表示することができます.
曲線の交点に名前を定義する
ライブラリ 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[blue] (intersection-1) circle (0.06) node[above left]{A}; %1つ目の交点の左にA \fill[magenta] (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[blue] (A) circle (0.06) node[above left]{A}; %1つ目の交点の左にA \fill[magenta] (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毎に代入した処理が行われる.
座標の計算
ライブラリ 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($xy$平面上の楕円)
例えば,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
\begin{tikzpicture} \coordinate[label=below left:O] (O) at (0,0); %原点O \coordinate(XS)at(-0.5,0); \coordinate(XL)at(6,0); \draw[semithick,->,>=stealth](XS)--(XL)node[right]{\$x\$}; %x軸 \coordinate(YS)at(0,-0.5); \coordinate(YL)at(0,4); \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 |
\begin{tikzpicture}[xscale=2.5] \coordinate[label=below left:O] (O) at (-2,0); %原点O \coordinate(XS)at(-2.2,0); \coordinate(XL)at(2,0); \draw[semithick,->,>=stealth](XS)--(XL)node[right]{\$x\$}; %x軸 \coordinate(YS)at(-2,-0.5); \coordinate(YL)at(-2,5); \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} |
と記述すると,
と表示されます.
コメント