TikZ: caminhos complicados, por exemplo, para integrais complexas

TikZ: caminhos complicados, por exemplo, para integrais complexas

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 tikzfazer 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);
}

insira a descrição da imagem aqui

Gostaria agora de recortar as formas que não pertencem aos caminhos individuais, para que fique algo como

insira a descrição da imagem aqui

  • 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 tikzmanual 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}

insira a descrição da imagem aqui

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}

insira a descrição da imagem aqui

Responder2

Na verdade, isso é muito fácil usando um pouco de matemática ... Se você quiser que as linhas do lado direito sejam 0.2separadas (como no seu exemplo), uma 0.1acima e outra 0.1abaixo 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:

Círculo TikZ com linhas

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, overlayelas 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:

Círculos TikZ com linhas

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:

insira a descrição da imagem aqui

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:

insira a descrição da imagem aqui

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}

insira a descrição da imagem aqui

Um exemplo disso aplicado em um problema de análise complexo: insira a descrição da imagem aqui

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, tikzfaz 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 \myRadiuse 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}

informação relacionada