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) С кодом Джейка (надеюсь правильно использовать этот код)

Обновление версии 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) Обновление версии 2 с помощьюtkz-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.1под прямой линией справа. Тогда углы, где они пересекают окружность, равны asin(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 круг с линиями

Редактировать (после комментария Альтермундуса):Для изображениякак естьне имеет значения, где находится центр. Если вы добавляете дополнительные вещи в ту же среду изображения или используете 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}

Связанный контент