見出し画像

TikZで曲線に囲まれた領域を塗る方法

TikZで曲線に囲まれた領域を塗る方法を書く。

コードの全体はこちらのOverLeafでご確認下さい。
=> 最下部に貼りました.(Feb. 3rd, 2020)

手順

%
%   pathを作って名前をつける
%
\path[name path=s,domain=0:2.5*pi] plot (\x,{sin(\x r)});
\path[name path=c,domain=0:2.5*pi] plot (\x,{cos(\x r)});
%
%   交点をintersection-1,intersection-2と参照できるようにする
%
\path node[name intersections={of=s and c}] {};
%
%   交点の座標を取得する
%
\tikzmath{
   coordinate \c;
   coordinate \cbase;
   real \px;
       \c1 = (intersection-1);
       \c2 = (intersection-2);
       \c3 = (intersection-3);
       \cbase1 = (1,1);
       \px1 = \cx1 / \cbasex1;
       \px2 = \cx2 / \cbasex1;
       \px3 = \cx3 / \cbasex1;
}

まず交点の座標を取得します。ここの処理の説明は,こちらの記事を参照。

%
%   pathで囲んだ領域を塗る
%
\path[fill,top color=white, bottom color=white,middle color=purple] plot[domain=\px1:\px2] ({\x},{sin(\x r)}) plot[domain=\px2:\px1] ({\x},{cos(\x r)});
%
%   pathの流れを示す矢印を追加
%
\path[draw,yshift=-10pt,>=stealth,thick,->,dashed] plot[domain=\px1:\px2] (\x,{cos(\x r)});
\path[draw,yshift=10pt,>=stealth,thick,->,dashed]
plot[domain=\px2:\px1] (\x,{sin(\x r)});

\px1から\px2まで y=cosx をplotし,続いて\px2から\px1まで y=sinx をplotして閉じたpathを作ります。その内部を\pathのオプションに従って塗りつぶします。

%
%   pathで囲んだ領域を塗る
%
\path[pattern=horizontal lines,pattern color=orange] plot[domain=\px2:\px3] ({\x},{sin(\x r)}) plot[domain=\px3:\px2] ({\x},{cos(\x r)});

patternによる塗りつぶし。斜線で塗りつぶしたいときは,clipとforeachを利用するとうまくできます。こちらを参照。

%
%   グラフを描く
%
\path[domain=0:2.5*pi,draw] plot (\x,{sin(\x r)});
\path[domain=0:2.5*pi,draw] plot (\x,{cos(\x r)});

最後に,グラフを描画して領域を縁取り,完成です。

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

\RequirePackage{luatex85}
\documentclass[border={15pt,15pt,15pt,15pt}]{standalone}
\usepackage{luatexja}
\usepackage{tikz}
\usetikzlibrary{intersections,math,patterns}
\begin{document}
   \begin{tikzpicture}
       %
       %   pathを作って名前をつける
       %
       \path[name path=s,domain=0:2.5*pi] plot (\x,{sin(\x r)});
       \path[name path=c,domain=0:2.5*pi] plot (\x,{cos(\x r)});
       %
       %   交点をintersection-1,intersection-2と参照できるようにする
       %
       \path node[name intersections={of=s and c}] {};
       %
       %   交点の座標を取得する
       %
       \tikzmath{
           coordinate \c;
           coordinate \cbase;
           real \px;
               \c1 = (intersection-1);
               \c2 = (intersection-2);
               \c3 = (intersection-3);
               \cbase1 = (1,1);
               \px1 = \cx1 / \cbasex1;
               \px2 = \cx2 / \cbasex1;
               \px3 = \cx3 / \cbasex1;
       }
       %
       %   pathで囲んだ領域を塗る
       %
       \path[fill,top color=white, bottom color=white,middle color=purple] plot[domain=\px1:\px2] ({\x},{sin(\x r)}) plot[domain=\px2:\px1] ({\x},{cos(\x r)});
       %
       %   pathの流れを示す矢印を追加
       %
       \path[draw,yshift=-10pt,>=stealth,thick,->,dashed] plot[domain=\px1:\px2] (\x,{cos(\x r)});
       \path[draw,yshift=10pt,>=stealth,thick,->,dashed] plot[domain=\px2:\px1] (\x,{sin(\x r)});
       %
       %   pathで囲んだ領域を塗る
       %
       \path[pattern=horizontal lines,pattern color=orange] plot[domain=\px2:\px3] ({\x},{sin(\x r)}) plot[domain=\px3:\px2] ({\x},{cos(\x r)});
       %
       %   グラフを描く
       %
       \path[domain=0:2.5*pi,draw] plot (\x,{sin(\x r)});
       \path[domain=0:2.5*pi,draw] plot (\x,{cos(\x r)});    
   \end{tikzpicture}
\end{document}


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