
Estou usando o pacote TikZ para mostrar um conjunto de números complexos onde aqueles que eu quero estão na parte externa de um círculo com raio 2 e onde o círculo com raio 1 não está no conjunto:
Quero deixar o círculo interno branco, com os eixos aparecendo completamente, mas não consigo descobrir como. Estou usando dois círculos com recheios semitransparentes. Existe alguma maneira de preencher apenas a parte externa? Código relevante abaixo.
(Foi aqui que obtive a maior parte do código:Desenhar um círculo no plano complexo.)
\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}
Responder1
Você pode usar uma regra de preenchimento diferente chamada even odd rule
que preenche todas as regiões fechadas de números pares.
Portanto, se você usar a linha a seguir em vez de dois círculos distintos, obterá um preenchimento de rosca;
\path [draw=none,fill=gray, fill opacity = 0.1,even odd rule] (0,-1) circle (2) (0,-1) circle (1);
Responder2
Neste caso específico, você pode simplesmente alterar a ordem do desenho, ou seja, desenhar os círculos primeiro:
\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}
Responder3
Use a 'regra par ímpar':
\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}
EDITAR
Como a percussão foi mais rápida com a solução de regra par-ímpar (mas, observei, não forneceu um MWE completo), aqui está uma solução que você pode usar se quiser que o círculo interno seja preenchido, mas ainda queira os eixos no topo. Esta solução usa a backgrounds
biblioteca para preencher o círculo internoatráso resto da imagem, para que os eixos permaneçam no topo.
\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}
Responder4
Feito com MetaPost (via LuaLaTeX), para quem possa interessar.
Com a ajuda do formato Metafun para recheio transparente:
fill ring withcolor transparent(1, 0.1, \mpcolor{gray});
O anel em si é criado anexando um dos círculos ao outro círculo invertido:
ring = circle1 -- reverse circle2 -- cycle;
(É claro que um método mais simples e rápido teria sido preencher o círculo maior e desfazer o menor, mas achei interessante criar esse caminho de anel e preenchê-lo diretamente.)
O código completo:
\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}