TikZでグラフの交点の座標を求める方法

TikZでグラフの交点の座標を求める方法を書く。

1. タイプセット環境

macOS Sierra,texlive2016,lualatex

2. コードと実行結果
コード
%
%  preamble for lualatex
%
\RequirePackage{luatex85}
\documentclass[border={15pt,15pt,15pt,15pt}]{standalone}
\usepackage{luatexja}
%\usepackage{luatexja-fontspec} %フォントを変更
%\usepackage{fontspec} %フォントを変更
\usepackage{tikz}
\usetikzlibrary{math, intersections}
%\setmainfont{rounded-mplus-1m-light} %フォントを変更
%\setmainjfont{rounded-mplus-1m-light} %フォントを変更
\begin{document}
    \begin{tikzpicture}
        %
        %    交点を指定するときに参照できるよう,pathに名前をつける
        %
        \path[name path=s, draw] plot[domain=0:2*pi] ({\x}, {sin(\x r)});
        \path[name path=c, draw] plot[domain=0:2*pi] ({\x}, {cos(\x r)});
        %
        %    pathの交点に名前をつける(デフォルトではintersecion-<index>)
        %
        \path[name intersections={of=s and c},draw] node[draw, above=5mm] at (intersection-1) {The first point of collision};
        %
        %    交点が複数ある場合,インデックスが振られる
        %
        \path node[draw, below=5mm] at (intersection-2) {The second  point of collision};
        %
        %    交点を丸く塗る
        %
        \path node[circle,fill,draw,color=cyan] at (intersection-1) {};
        \path node[circle,fill,draw,color=brown] at (intersection-2) {};

        %
        %    交点の座標を参照する
        %
        \tikzmath{
            %
            %   座標型の変数を宣言
            %
            coordinate \c;
            coordinate \cbase;
            %
            %   実数型の変数を宣言
            %
            real \x;
            real \y;
            %
            %   座標を代入
            %
            \c1 = (intersection-1);
            \c{second} = (intersection-2);
            \cbase1 = (1,1);
            %
            %   pt -> x座標, y座標
            %
            \x1 = \cx1 / \cbasex1;
            \y1 = \cy1 / \cbasey1;
            \x2 = \cx{second} / \cbasex1;
            \y2 = \cy{second} / \cbasey1;
        };
        %
        %   tikzmathの中で定義した変数は,tikzmathの外でも参照できる。
        %
        \path node at (pi,-3) {$水色の点の座標は\quad ( \c1 )$};
        %
        %   座標\c1のx座標は\cx1に格納されている。
        %
        \path node at (pi,-4) {$水色の点のx座標は\quad \cx1$};
        %
        %   ptではなく座標軸の値を取得したい場合は,基準の座標で割る。
        %
        \path node at (pi,-5) {$水色の点の座標は\quad (\x1, \y1)$};
        %
        %   インデックスに数値以外を用いることもできる。ただし,その場合はインデックスを{}でくくる。
        %
        \path node at (pi,-6) {$茶色い点の座標は\quad ( \c{second})$};

    \end{tikzpicture}

\end{document}
実行結果
3. 説明
3.1. preambleの説明
%
%  preamble for lualatex
%
\RequirePackage{luatex85}
\documentclass[border={15pt,15pt,15pt,15pt}]{standalone}
\usepackage{luatexja}
%\usepackage{luatexja-fontspec} %フォントを変更
%\usepackage{fontspec} %フォントを変更
\usepackage{tikz}
\usetikzlibrary{math, intersections}
%\setmainfont{rounded-mplus-1m-light} %フォントを変更
%\setmainjfont{rounded-mplus-1m-light} %フォントを変更

追加したtikzlibrary

intersections
 交点の座標を求めるために追加。
math
 計算のために追加。

気分でフォントを変更したが,交点を求めることとは関係ないので該当箇所はコメントアウトしてある。

3.2. documentの説明
%
%    交点を指定するときに参照できるよう,pathに名前をつける
%
\path[name path=s, draw] plot[domain=0:2*pi] ({\x}, {sin(\x r)});
\path[name path=c, draw] plot[domain=0:2*pi] ({\x}, {cos(\x r)});

name pathオプションで,pathに名前をつけられる。

%
%    pathの交点に名前をつける(デフォルトではintersecion-<index>)
%
\path[name intersections={of=s and c},draw] node[draw, above=5mm] at (intersection-1) {The first point of collision};

name intersections={of=s and c}で,sとcの交点にintersection-<index>という名前がつく。pathにつける名前を指定することもできて,name intersections={of=s and c, by=hoge}とすれば,sとcの交点にhogeという名前がつく。{}内に指示を足していく。名前をつけた直後,それ(intersection-1)を使って座標を指定し,nodeを配置している。

%
%    交点が複数ある場合,インデックスが振られる
%
\path node[draw, below=5mm] at (intersection-2) {The second  point of collision};

pathに交点が複数ある場合,自動的にインデックスが振られる。今回は交点が二つあるのでインデックス1と2が振られ,intersection-1intersection-2という名前がついた。一度交点に名前をつければ,それ以降はpathのオプションにintersectionsを記述しなくても交点の名前を参照できる。

%
%   交点を丸く塗る
%
\path node[circle,fill,draw,color=cyan] at (intersection-1) {};
\path node[circle,fill,draw,color=brown] at (intersection-2) {};

交点の名前を使って座標を指定し,nodeを置いて水色と茶色に塗る。nodeには{}が必須。たとえ配置するテキストが何もなかろうとも。

%
%   交点の座標を参照する
%
\tikzmath{
    %
    %   座標型の変数を宣言
    %
    coordinate \c;
    coordinate \cbase;
    %
    %   実数型の変数を宣言
    %
    real \x;
    real \y;
    %
    %   座標を代入
    %
    \c1 = (intersection-1);
    \c{second} = (intersection-2);
    \cbase1 = (1,1);
    %
    %   pt -> x座標, y座標
    %
    \x1 = \cx1 / \cbasex1;
    \y1 = \cy1 / \cbasey1;
    \x2 = \cx{second} / \cbasex1;
    \y2 = \cy{second} / \cbasey1;
};

tikzmathの中では,変数を宣言して代入するなど,一般的なプログラミング言語と同じような記述ができる。ただ,ちょっと特殊な部分があって,例えばcoordinate \c;と変数を宣言すると,\c1\c2などと数字を後ろにくっつけて書いた変数は,全て\cと同じcoordinate型の変数になり,変数名の末尾の数字はインデックスと解釈される。このことは,coordinate以外の型の変数でも同様。ただし,数字以外をインデックスとして使うこともできて,その場合は,\c{second}のように{}でくくる。また,座標型の変数には,\変数名xインデックス\変数名yインデックスという名称の対応する配列が自動的に作られ,例えば\cx1は,座標\c1のx座標を参照することができる。しかし,これによって参照できるx,y座標はpt単位の数値である。座標軸の値として取得したければ,軸の単位あたりの幅で割って換算する。

%
%   tikzmathの中で定義した変数は,tikzmathの外でも参照できる。
%
\path node at (pi,-3) {$水色の点の座標は\quad ( \c1 )$};

tikzmathの中で定義した変数は,tikzmathの外でも参照できる。座標はpt単位。

%
%   座標\c1のx座標は\cx1に格納されている。
%
\path node at (pi,-4) {$水色の点のx座標は\quad \cx1$};

\c1のx座標は\cx1に格納されている。これもpt単位。

%
%   ptではなく座標軸の値を取得したい場合は,基準の座標で割る。
%
\path node at (pi,-5) {$水色の点の座標は\quad (\x1, \y1)$};

座標軸の値としてx,y座標を得るには,座標軸の単位あたりの幅で割って換算する。

%
%   インデックスに数値以外を用いることもできる。ただし,その場合はインデックスを{}でくくる。
%
\path node at (pi,-6) {$茶色い点の座標は\quad ( \c{second})$};

インデックスに数値以外を用いる時は,{}でくくる。

おしまい。

コメントを残す

メールアドレスが公開されることはありません。