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

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

1. タイプセット環境

macOS Sierra,texlive2016,lualatex

2. コードと実行結果
コード
%
%   preamble for lualatex
%
\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}
実行結果
3. 説明
3.1. preambleの説明
%
%   preamble for lualatex
%
\RequirePackage{luatex85}
\documentclass[border={15pt,15pt,15pt,15pt}]{standalone}
\usepackage{luatexja}
\usepackage{tikz}
\usetikzlibrary{intersections,math,patterns}

追加したtikzlibrary

intersections
 交点の座標を求めるために追加。
math
 計算のために追加。
patterns
 領域をパターンで塗りつぶすために追加。
3.2. documentの説明
%
%   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で囲んだ領域を塗る
%
\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=\cos x\) をplotし,続いて\px2から\px1まで \(y=\sin x\) をplotして閉じたpathを作る。その内部を\pathのオプションに従って塗りつぶしている。top,bottom,middleで色を分けたが,単にcolor=purpleと書けば紫一色で塗りつぶされる。pathの流れを示す矢印を追加する際は,plotしたpath全体をyshiftオプションで上下に10ptずらしている。

%
%   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を用いることもできる。

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

内部を塗りつぶしたときに境界の曲線が欠けるのを防ぐため,最後に曲線を描画する。

おしまい。

コメントを残す

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