TikZ:复杂路径,例如复杂积分

TikZ:复杂路径,例如复杂积分

我想说明复分析的讲义,复分析本质上讲的是积分线如何穿过复平面。但是,我很难找到合适的解决方案tikz

比如下面的图,应该变成一条从右上中间出来,然后进入圆圈,再从右下中间出来:

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

在此处输入图片描述

我现在想剪掉不属于单个路径的形状,这样它就变成了类似

在此处输入图片描述

  • 我一直在寻找类似的东西\clip[inverse],但显然不存在。
  • 我也尝试过手动计算交点(例如 Mathematica),然后使用圆弧和其他棘手的东西来完成这个任务,但看了几张图表之后,我认为这是不可能的。
  • 手册tikz没有帮助(说实话这很令人惊讶)。我是否忽略了一些我想要的功能?

问题解决了,基本上使用逆剪辑技术。请参阅下面的回复。

答案1

A)使用Jake的代码(我希望正确使用此代码)

更新版本 1 (我在所有路径上都添加了一个 cip 来给图片上色)

\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)更新版本 2tkz-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}

在此处输入图片描述

答案2

这实际上很容易用数学来计算...如果您希望右侧的线条分开0.2(如您的示例所示),一条在右侧的直线上方,0.1一条在下方。那么它们与圆相交的角度分别为和。因此,以下代码生成图片:0.1asin(0.1)360-asin(0.1)

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

看起来像这样:

TikZ 带线条的圆圈

编辑(在 Altermundus 评论之后):对于图片照原样中心在哪里其实并不重要。如果你在同一图片环境中添加其他内容或使用overlay它,它就会变得很重要。水平线之间的距离取决于圆的半径,而不是它是否取决于其他对象。在我看来,缩放线之间的距离是可取的。如果不是这样,可以通过除以圆的半径来轻松解决。至于中心的位置,如果这很重要,也可以轻松处理。如果我们将整个事物再参数化一点,我们会得到以下结果:

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

其结果是:

TikZ 带线圆圈

请注意, 只是\path[fill] (0,0) circle (1pt);为了证明中心实际上位于(0,0)

答案3

我找到了一个答案,几乎完全符合我的要求,而且几乎没有变通方法。它基本上是一个逆剪辑命令。答案的灵感来自以下示例中的黄色部分:http://www.texample.net/tikz/examples/venn-diagram/

这个想法是将图表的各个部分划分到各自的范围内,即一个图表用于线条,另一个用于圆圈。然后每个部分都会得到适当的剪辑。一个小例子:

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

结果:

在此处输入图片描述

对于圆形再次使用同样的技术,这次我们裁剪出一个矩形:

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

结果:

在此处输入图片描述

最后,我想在我的第一篇文章中实现这个目标,只是这一次我不需要 Gimp 来编辑掉不需要的部分 :-)

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

在此处输入图片描述

这是一个应用于复杂分析问题的示例: 在此处输入图片描述

答案4

如果你真的不关心在哪里画这些东西(即不想知道确切的坐标),这可以在一行中完成: \draw (2,0) -- ++(-2,0) arc (10:350:3cm) -- ++(2,0);。然而我不认为你会遇到这种情况。

我在这里向您展示了如何做到这一点(无需剪辑),在圆形图的情况下确实不需要剪辑,tikz做得很好,此外您跳过了很多范围环境。

因此,代码中,我还附上了与其他代码相同的最小示例。请注意图表中易于自定义的角度和半径的使用。改变\myRadius一切就会改变。从长远来看,这将对您有所帮助!

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

相关内容