
Gostaria de ilustrar notas de aula sobre análise complexa, que por sua natureza tem muito a ver com como as linhas de integração percorrem o plano complexo. No entanto, estou tendo problemas para encontrar uma solução adequada para tikz
fazer isso.
Tomemos por exemplo o diagrama a seguir, que deve se tornar um caminho vindo do centro superior direito, depois juntando-se ao círculo, saindo novamente no centro inferior direito:
\tikz{
\draw[help lines] (-2,-2) grid (2,2);
\draw (0, 0.1) -- (2, 0.1);
\draw (0,-0.1) -- (2,-0.1);
\draw (0,0) circle (1);
}
Gostaria agora de recortar as formas que não pertencem aos caminhos individuais, para que fique algo como
- Tenho procurado algo parecido
\clip[inverse]
, mas aparentemente isso não existe. - Também tentei calcular as interseções manualmente (ou seja, Mathematica) e depois usar arcos e outras coisas desagradáveis para resolver o problema, mas depois de alguns diagramas pensei que não poderia ser isso.
- O
tikz
manual não ajudou (o que é surpreendente para ser honesto). Estou negligenciando algum recurso que faz o que desejo?
Problema resolvido, basicamente usando uma técnica de recorte inverso. Veja minha resposta abaixo.
Responder1
A) Com o código do Jake (espero usar corretamente este código)
Atualize a versão 1 (adicionei um cip em todo o caminho para colorir a imagem)
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}[remember picture,overlay]
\tikzstyle{reverseclip}=[insert path={(current page.north east) --
(current page.south east) --
(current page.south west) --
(current page.north west) --
(current page.north east)}
]
\begin{scope}
\path[clip] (1,-0.1)--(2,-0.1)--(2, 0.1)--(1,0.1)%
arc({asin(0.1)}:{360-asin(0.1)}:1cm)--cycle;
\fill[blue!20] (-1,-1) rectangle (2,1);
\end{scope}
\path[clip] (0,0.1) --(0,-0.1)--(2,-0.1)--(2, 0.1)--cycle[reverseclip];
\draw[clip] (0,0) circle (1) [reverseclip];
\draw[black] (0, 0.1) -- (2, 0.1);
\draw (0,-0.1) -- (2,-0.1);
\end{tikzpicture}
\end{document}
B) Atualize a versão 2 comtkz-euclide
\documentclass{scrartcl}
\usepackage{tkz-euclide}
\usetkzobj{all}
\begin{document}
\begin{tikzpicture}
\tkzDefPoint(0, 0.1){A}
\tkzDefPoint(0, -0.1){B}
\tkzDefPoint(2,- 0.1){C}
\tkzDefPoint(2, 0.1){D}
\tkzDefPoint(0,0){O}
\tkzInterLC[R](A,D)(O,1 cm) \tkzGetPoints{I1}{I2}
\tkzInterLC[R](B,C)(O,1 cm) \tkzGetPoints{J1}{J2}
\tkzDrawArc(O,I2)(J1)
\tkzDrawSegments (I2,D J1,C)
\tikzset{compass style/.append style={<->}}
\tkzDrawArc[R with nodes,color=blue](O,1.2cm)(I2,J1)
\end{tikzpicture}
\end{document}
Responder2
Na verdade, isso é muito fácil usando um pouco de matemática ... Se você quiser que as linhas do lado direito sejam 0.2
separadas (como no seu exemplo), uma 0.1
acima e outra 0.1
abaixo de uma linha reta à direita. Então os ângulos onde eles cruzam o círculo são asin(0.1)
e 360-asin(0.1)
respectivamente. Portanto, o código a seguir gera a imagem:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\draw (1,0) -- ++(-1,0) arc({asin(0.1)}:{360-asin(0.1)}:1cm) -- ++(1,0);
\end{tikzpicture}
\end{document}
Parecendo assim:
Editar (após o comentário de Altermundus):Para a fotocomo érealmente não importa onde está o centro. Se você adicionar coisas adicionais ao mesmo ambiente de imagem ou usá-las, overlay
elas podem se tornar importantes. A distância entre as linhas horizontais depende do raio do círculo, e não de depender ou não de outros objetos. Pareceu-me que dimensionar a distância entre as linhas era algo desejável. Se este não for o caso, pode ser facilmente resolvido dividindo pelo raio do círculo. No que diz respeito à colocação do centro, se isto for importante, também pode ser facilmente resolvido. Se parametrizarmos um pouco mais tudo, obteremos o seguinte:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\def\myCircleWithLines#1#2#3#4{
%#1: Radius of the circle
%#2: Length of the line segments on the right
%#3: y offset of line 1
%#4: y offset of line 2
\begin{tikzpicture}
\path[draw] (#1+#2,#3) -- ++(-#2,0) arc({asin(#3/#1)}:{360-asin(-#4/#1)}:#1 cm) -- ++(#2,0);
\path[fill] (0,0) circle (1pt);
\end{tikzpicture}
}
\myCircleWithLines{1}{1}{.1}{-.1}\\
\myCircleWithLines{2}{1}{.1}{-.1}
\end{document}
O que resulta em:
Observe que the \path[fill] (0,0) circle (1pt);
está presente apenas para demonstrar o fato de que o centro está realmente localizado em (0,0)
.
Responder3
Encontrei uma resposta exatamente para o que eu queria fazer, com muito poucas soluções alternativas. É praticamente um comando de clipe inverso. A resposta é motivada pela parte amarela do exemplo encontrado emhttp://www.texample.net/tikz/examples/venn-diagram/
A idéia é dividir as partes individuais do diagrama em seus próprios escopos, ou seja, um diagrama para as linhas e outro para o círculo. Cada um deles obtém o recorte apropriado. Um pequeno exemplo:
\begin{tikzpicture}
% Draw the full lines dashed to visualize what is clipped later
\foreach \x in {-0.5,0.5} {
\draw[dashed] (0,\x) -- (2,\x);
}
% Draw the two lines.
% Even odd rule is explained in the manual. Here, it's helping us to punch holes into a shape. For more complicated geometries, there's the nonzero rule.
\begin{scope}[even odd rule]
% This is the clipped area drawn in gray to visualize where drawing will be possible later. It's the same shape as the \clip below.
\draw[fill=black!10,draw=none] (-2,-2) rectangle (3,2) (0,0) circle (1);
% Draw a large rectangle, the subtract the parts of the second shape given (circle) from it. The result is a rectangle with a hole in it.
\clip (-2,-2) rectangle (3,2) (0,0) circle (1);
% Done. We can now draw in the gray area.
\foreach \x in {-0.5,0.5} {
\draw (0,\x) -- (2,\x);
}
\end{scope}
\end{tikzpicture}
Resultado:
A mesma técnica novamente para o círculo, desta vez recortando um retângulo:
\begin{tikzpicture}
\begin{scope}[even odd rule]
\draw[fill=black!10,draw=none] (-2,-2) rectangle (3,2) (0,0.5) rectangle (3,-0.5);
\clip (-2,-2) rectangle (3,2) (0,0.5) rectangle (3,-0.5);
\draw (0,0) circle (1);
\end{scope}
\end{tikzpicture}
Resultado:
E finalmente, o que eu queria alcançar no meu post inicial, só que desta vez não preciso do Gimp para editar as partes indesejadas :-)
\begin{tikzpicture}
\draw[black!20] (-2,-2) grid (3,2);
% draw the two lines
\begin{scope}[even odd rule]
\clip (-2,-2) rectangle (3,2) (0,0) circle (1);
\foreach \x in {-0.5,0.5} {
\draw (0,\x) -- (2,\x);
}
\end{scope}
% draw the circle
\begin{scope}[even odd rule]
\clip (-2,-2) rectangle (3,2) (0,0.5) rectangle (3,-0.5);
\draw (0,0) circle (1);
\end{scope}
\end{tikzpicture}
Um exemplo disso aplicado em um problema de análise complexo:
Responder4
Se você realmente não se importa onde irá desenhar essas coisas (ou seja, não quer saber as coordenadas exatas, isso pode ser feito em uma linha:
\draw (2,0) -- ++(-2,0) arc (10:350:3cm) -- ++(2,0);
. No entanto, não acho que esse será o seu caso.
Mostrei aqui como isso pode ser feito (sem recorte), no caso de diagramas circulares realmente não há necessidade de recorte, tikz
faz um trabalho muito bom, além de você pular muitos ambientes de escopo.
Então o código, anexei também o exemplo mínimo que é igual ao outro. Observe o uso de ângulos e raios fáceis de personalizar no diagrama. Mude \myRadius
e tudo muda. Isso irá ajudá-lo a longo prazo!
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\draw (2,0) -- ++(-2,0) node[above right] {$C_1$} arc (10:350:3cm) node[below right] {$C_2$} -- ++(2,0);
\end{tikzpicture}
\def\myAngle{10}
\def\myRadius{2cm}
\begin{tikzpicture}
\coordinate (C1) at (\myAngle:\myRadius);
\draw ($(C1)+(2,0)$) --
(C1) arc (\myAngle:360-\myAngle:\myRadius) coordinate (C2) -- ++(2,0);
\node[above right] at (C1) {$C_1$};
\node[below right] at (C2) {$C_2$};
\end{tikzpicture}
\end{document}