見出し画像

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

TikZでグラフの交点の座標を求める方法を書く。コードの全体は最下部に貼りました。

手順

%
%    交点を指定するときに参照できるよう,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>という名前をつけます。交点の名前をhogeとしたいときは,name intersections={of=s and c, by=hoge}とします。

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

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

%
%   交点の座標を参照する
%
\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に交点の座標を代入し,x座標とy座標を取り出しています。\cのx座標は,\cxとすれば取得できます。ただし,\cxや\cyで取得できるx,y座標はpt単位の数値のため,座標軸の値として取得したければ,軸の単位あたりの幅で割って換算します。

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

tikzmathの中で定義した変数は,tikzmathの外でも参照できます。これで,二つのグラフの交点の座標を求められました。

以下,まるごとのTeXソースです.

\RequirePackage{luatex85}
\documentclass[border={15pt,15pt,15pt,15pt}]{standalone}
\usepackage{luatexja}
\usepackage{tikz}
\usetikzlibrary{math, intersections}
\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}


お役に立ったらスキしてください. サポートは投稿を続けるモチベーションになります. ありがとうございます.