
私は TikZ パッケージを使用して、必要な複素数のセットが半径 2 の円の外側部分に含まれ、半径 1 の円がセットに含まれていない複素数のセットを表示しています。
内側の円を白にして、軸を完全に表示したいのですが、方法がわかりません。半透明の塗りつぶしが付いた 2 つの円を使用しています。外側の部分だけを塗りつぶす方法はありますか? 関連するコードは以下にあります。
(ほとんどのコードはここから入手しました:複素平面上に円を描きます。)
\begin{tikzpicture}
\begin{scope}[thick,font=\scriptsize][set layers]
\draw [->] (-4,0) -- (4,0) node [above left] {$\Re\{z\}$};
\draw [->] (0,-4) -- (0,4) node [below right] {$\Im\{z\}$};
\iffalse% Single
\draw (1,-3pt) -- (1,3pt) node [above] {$1$};
\draw (-1,-3pt) -- (-1,3pt) node [above] {$-1$};
\draw (-3pt,1) -- (3pt,1) node [right] {$i$};
\draw (-3pt,-1) -- (3pt,-1) node [right] {$-i$};
\else% Multiple
\foreach \n in {-3,...,-1,1,2,...,3}{%
\draw (\n,-3pt) -- (\n,3pt) node [above] {$\n$};
\draw (-3pt,\n) -- (3pt,\n) node [right] {$\n i$};
}
\fi
\end{scope}
\draw[solid] (0,-1) circle (1);
\draw[solid] (0,-1) circle (2);
\path [draw=none,fill=gray, fill opacity = 0.1] (0,-1) circle (2);
\path [draw=none,fill=white, fill opacity = 0.7] (0,-1) circle (1);
\node [below right,black] at (1.2,1.2) {$A=\{z\in\mathbb{C}:1\leq|z-(-i)|\leq2\}$};
\end{tikzpicture}
答え1
even odd rule
と呼ばれる、すべての偶数番号の閉じた領域を塗りつぶす別の塗りつぶしルールを使用できます。
したがって、2 つの異なる円の代わりに次の線を使用すると、ドーナツ塗りつぶしが得られます。
\path [draw=none,fill=gray, fill opacity = 0.1,even odd rule] (0,-1) circle (2) (0,-1) circle (1);
答え2
この特定のケースでは、描画順序を変更するだけで済みます。つまり、最初に円を描画します。
\documentclass[tikz]{standalone}
\usepackage{amsfonts}
\begin{document}
\begin{tikzpicture}
\path [draw=none,fill=gray, fill opacity = 0.1] (0,-1) circle (2);
\path [draw=none,fill=white] (0,-1) circle (1);
\begin{scope}[thick,font=\scriptsize][set layers]
\draw [->] (-4,0) -- (4,0) node [above left] {$\Re\{z\}$};
\draw [->] (0,-4) -- (0,4) node [below right] {$\Im\{z\}$};
\iffalse% Single
\draw (1,-3pt) -- (1,3pt) node [above] {$1$};
\draw (-1,-3pt) -- (-1,3pt) node [above] {$-1$};
\draw (-3pt,1) -- (3pt,1) node [right] {$i$};
\draw (-3pt,-1) -- (3pt,-1) node [right] {$-i$};
\else% Multiple
\foreach \n in {-3,...,-1,1,2,...,3}{%
\draw (\n,-3pt) -- (\n,3pt) node [above] {$\n$};
\draw (-3pt,\n) -- (3pt,\n) node [right] {$\n i$};
}
\fi
\end{scope}
\draw[solid] (0,-1) circle (1);
\draw[solid] (0,-1) circle (2);
% \path [draw=none,fill=gray, fill opacity = 0.1] (0,-1) circle (2);
% \path [draw=none,fill=white, fill opacity = 0.7] (0,-1) circle (1);
\node [below right,black] at (1.2,1.2) {$A=\{z\in\mathbb{C}:1\leq|z-(-i)|\leq2\}$};
\end{tikzpicture}
\end{document}
答え3
「偶奇ルール」を使用します。
\documentclass[tikz]{standalone}
\usepackage{amsfonts}
\begin{document}
\begin{tikzpicture}
\begin{scope}[thick,font=\scriptsize][set layers]
\draw [->] (-4,0) -- (4,0) node [above left] {$\Re\{z\}$};
\draw [->] (0,-4) -- (0,4) node [below right] {$\Im\{z\}$};
\iffalse% Single
\draw (1,-3pt) -- (1,3pt) node [above] {$1$};
\draw (-1,-3pt) -- (-1,3pt) node [above] {$-1$};
\draw (-3pt,1) -- (3pt,1) node [right] {$i$};
\draw (-3pt,-1) -- (3pt,-1) node [right] {$-i$};
\else% Multiple
\foreach \n in {-3,...,-1,1,2,...,3}{%
\draw (\n,-3pt) -- (\n,3pt) node [above] {$\n$};
\draw (-3pt,\n) -- (3pt,\n) node [right] {$\n i$};
}
\fi
\end{scope}
\draw[solid] (0,-1) circle (1);
\draw[solid] (0,-1) circle (2);
\path [draw=none, fill=gray, even odd rule, fill opacity = 0.1] (0,-1) circle (2) (0,-1) circle (1);
\node [below right,black] at (1.2,1.2) {$A=\{z\in\mathbb{C}:1\leq|z-(-i)|\leq2\}$};
\end{tikzpicture}
\end{document}
編集
percusse は偶奇ルールのソリューションでより高速でした (ただし、完全な MWE を提供しなかったことに注意してください)。内側の円を塗りつぶしたいが軸を上に置きたい場合に使用できるソリューションを次に示します。このソリューションでは、backgrounds
ライブラリを使用して内側の円を塗りつぶします。後ろに軸が上部に残るように、画像の残りの部分を削除します。
\documentclass[tikz]{standalone}
\usepackage{amsfonts}
\usetikzlibrary{backgrounds}
\begin{document}
\begin{tikzpicture}
\begin{scope}[thick,font=\scriptsize][set layers]
\draw [->] (-4,0) -- (4,0) node [above left] {$\Re\{z\}$};
\draw [->] (0,-4) -- (0,4) node [below right] {$\Im\{z\}$};
\iffalse % Single
\draw (1,-3pt) -- (1,3pt) node [above] {$1$};
\draw (-1,-3pt) -- (-1,3pt) node [above] {$-1$};
\draw (-3pt,1) -- (3pt,1) node [right] {$i$};
\draw (-3pt,-1) -- (3pt,-1) node [right] {$-i$};
\else% Multiple
\foreach \n in {-3,...,-1,1,2,...,3}{%
\draw (\n,-3pt) -- (\n,3pt) node [above] {$\n$};
\draw (-3pt,\n) -- (3pt,\n) node [right] {$\n i$};
}
\fi
\end{scope}
\draw[solid] (0,-1) circle (1);
\draw[solid] (0,-1) circle (2);
\path [fill=gray, fill opacity = 0.1] (0,-1) circle (2);
\begin{scope}[on background layer]
\path [fill=white, fill opacity=.7] (0,-1) circle (1);
\end{scope}
\node [below right,black] at (1.2,1.2) {$A=\{z\in\mathbb{C}:1\leq|z-(-i)|\leq2\}$};
\end{tikzpicture}
\end{document}
答え4
MetaPost (LuaLaTeX 経由) で完了しました。興味のある方はご覧ください。
透明な塗りつぶしに Metafun 形式を使用します。
fill ring withcolor transparent(1, 0.1, \mpcolor{gray});
リング自体は、円の 1 つを反転した他の円に追加することによって作成されます。
ring = circle1 -- reverse circle2 -- cycle;
(もちろん、最も大きな円を塗りつぶし、最も小さな円を塗りつぶさない方が簡単で早いのですが、このリング パスを作成して直接塗りつぶすのは興味深いと思いました。)
完全なコード:
\documentclass[12pt]{standalone}
\usepackage{amssymb, xcolor}
\usepackage{luamplib}
\mplibsetformat{metafun}
\mplibtextextlabel{enable}
\begin{document}
\begin{mplibcode}
u = 1.5cm; xmax = 3.9 = ymax = -ymin = -xmin; len = 6bp;
path circle[], ring;
circle1 = fullcircle scaled 2u shifted (0, -u);
circle2 = fullcircle scaled 4u shifted (0, -u);
ring = circle1 -- reverse circle2 -- cycle;
labeloffset := 6bp;
beginfig(1);
for i = ceiling(xmin) upto floor(xmax):
draw (i*u, -0.5len) -- (i*u, 0.5len);
if i <> 0: label.top("$" & decimal i & "$", (i*u, 0)); fi
endfor
for j = ceiling(ymin) upto floor(ymax):
draw (-0.5len, j*u) -- (0.5len, j*u);
if j <> 0: label.rt("$" & decimal j & "i$", (0, j*u)); fi
endfor
drawarrow (xmin*u, 0) -- (xmax*u, 0); label.top("$\Re\{ z \}$", (xmax*u, 0));
drawarrow (0, ymin*u) -- (0, ymax*u); label.rt("$\Im\{ z \}$", (0, ymax*u));
fill ring withcolor transparent(1, 0.1, \mpcolor{gray});
for i = 1,2: draw circle[i]; endfor
label.urt("$A = \{z \in \mathbb{C}: 1 \leqslant |z-(-i)| \leqslant2 \}$",
point 1.5 of circle2);
endfig;
\end{mplibcode}
\end{document}