TikZ: komplizierte Pfade, zB für komplexe Integrale

TikZ: komplizierte Pfade, zB für komplexe Integrale

Ich möchte Vorlesungsunterlagen zur Komplexen Analysis illustrieren, in denen es naturgemäß viel darum geht, wie die Integrationslinien durch die komplexe Ebene verlaufen. Ich habe jedoch Probleme, eine geeignete Lösung dafür zu finden tikz.

Nehmen Sie beispielsweise das folgende Diagramm, das zu einem Pfad werden sollte, der von der oberen rechten Mitte kommt, dann in den Kreis mündet und unten rechts in der Mitte wieder austritt:

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

Bildbeschreibung hier eingeben

Ich möchte nun die Formen ausschneiden, die nicht zu den einzelnen Pfaden gehören, so dass es so etwas wird wie

Bildbeschreibung hier eingeben

  • Ich habe nach etwas wie gesucht \clip[inverse], aber das gibt es anscheinend nicht.
  • Ich habe auch versucht, die Schnittpunkte per Hand zu berechnen (also mit Mathematica) und dann Bögen und andere fiese Dinge zu verwenden, um den Trick zu machen, aber nach ein paar Diagrammen dachte ich, das kann es nicht sein.
  • Das tikzHandbuch hat nicht geholfen (was ehrlich gesagt überraschend ist). Übersehe ich eine Funktion, die das tut, was ich will?

Problem gelöst, im Grunde mithilfe einer umgekehrten Clipping-Technik. Siehe meine Antwort unten.

Antwort1

A) Mit Jakes Code (ich hoffe, diesen Code richtig zu verwenden)

Update Version 1 (Ich habe einen CIP zum gesamten Pfad hinzugefügt, um das Bild einzufärben)

\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}

Bildbeschreibung hier eingeben

B) Update Version 2 Mittkz-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}

Bildbeschreibung hier eingeben

Antwort2

Mit etwas Mathematik ist das eigentlich ganz einfach ... Wenn Sie möchten, dass die Linien auf der rechten Seite 0.2(wie in Ihrem Beispiel) getrennt sind, eine 0.1über und eine 0.1unter einer geraden Linie nach rechts. Dann sind die Winkel, in denen sie den Kreis schneiden, asin(0.1)und 360-asin(0.1)bzw. Der folgende Code generiert also das Bild:

\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}

Sieht so aus:

TikZ Kreis mit Linien

Bearbeiten (nach Altermundus' Kommentar):Zum Bildwie es istes ist eigentlich egal, wo sich der Mittelpunkt befindet. Wenn Sie der gleichen Bildumgebung oder -nutzung zusätzliche Dinge hinzufügen, overlaykann dies wichtig werden. Der Abstand zwischen den horizontalen Linien hängt vom Radius des Kreises ab, nicht davon, ob er von anderen Objekten abhängt oder nicht. Es schien mir, als wäre eine Skalierung des Abstands zwischen den Linien wünschenswert. Wenn dies nicht der Fall ist, kann dies leicht durch Division durch den Radius des Kreises erledigt werden. Was die Platzierung des Mittelpunkts betrifft, kann dies, wenn dies wichtig ist, auch leicht erledigt werden. Wenn wir das Ganze etwas mehr parametrisieren, erhalten wir Folgendes:

\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}

Was dazu führt:

TikZ Kreise mit Linien

Beachten Sie, dass das \path[fill] (0,0) circle (1pt);nur vorhanden ist, um die Tatsache anzuzeigen, dass sich das Zentrum tatsächlich bei befindet (0,0).

Antwort3

Ich habe eine Antwort gefunden, die ziemlich genau das beschreibt, was ich tun wollte, und die kaum Workarounds erfordert. Es handelt sich im Grunde genommen um einen inversen Clip-Befehl. Die Antwort ist motiviert durch den gelben Teil des Beispiels unterhttp://www.texample.net/tikz/examples/venn-diagram/

Die Idee ist, die einzelnen Teile des Diagramms in eigene Bereiche aufzuteilen, also ein Diagramm für die Linien, eines für den Kreis. Jeder dieser Bereiche erhält dann entsprechende Ausschnitte. Ein kleines Beispiel:

\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}

Ergebnis:

Bildbeschreibung hier eingeben

Dieselbe Technik noch einmal für den Kreis, dieses Mal schneiden wir ein Rechteck aus:

\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}

Ergebnis:

Bildbeschreibung hier eingeben

Und schließlich das, was ich in meinem ursprünglichen Beitrag erreichen wollte, nur dass ich dieses Mal Gimp nicht brauche, um die unerwünschten Teile herauszuschneiden :-)

\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}

Bildbeschreibung hier eingeben

Ein Beispiel hierfür, angewandt auf ein komplexes Analyseproblem: Bildbeschreibung hier eingeben

Antwort4

Wenn es Ihnen wirklich egal ist, wo Sie diese Dinge zeichnen (d. h. Sie möchten die genauen Koordinaten nicht wissen), können Sie dies in einer Zeile erledigen: \draw (2,0) -- ++(-2,0) arc (10:350:3cm) -- ++(2,0);. Ich glaube jedoch nicht, dass dies bei Ihnen der Fall sein wird.

Ich habe Ihnen hier gezeigt, wie es geht (ohne Clipping). Bei Kreisdiagrammen ist Clipping wirklich nicht erforderlich. Es tikzfunktioniert ziemlich gut und außerdem überspringen Sie viele Bereichsumgebungen.

Also, ich habe den Code angehängt, und auch das Minimalbeispiel, das mit dem anderen identisch ist. Bitte beachten Sie die Verwendung leicht anpassbarer Winkel und Radien des Diagramms. Ändern Sie es \myRadiusund alles wird geändert. Das wird Ihnen auf lange Sicht helfen!

\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}

verwandte Informationen