
Me gustaría ilustrar notas de conferencias sobre análisis complejo, que por su naturaleza trata en gran medida de cómo las líneas de integración discurren a través del plano complejo. Sin embargo, tengo problemas para encontrar una solución adecuada para tikz
hacerlo.
Tomemos, por ejemplo, el siguiente diagrama, que debería convertirse en un camino que viene desde el centro superior derecho, luego se une al círculo y sale nuevamente por el centro inferior derecho:
\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);
}
Ahora me gustaría recortar las formas que no pertenecen a los caminos individuales, para que quede algo así como
- He estado buscando algo como
\clip[inverse]
, pero aparentemente no existe. - También intenté calcular las intersecciones a mano (es decir, Mathematica) y luego usar arcos y otras cosas desagradables para hacer el truco, pero después de algunos diagramas pensé que no podía ser así.
- El
tikz
manual no ayudó (lo cual es sorprendente, para ser honesto). ¿Estoy pasando por alto alguna característica que hace lo que quiero?
Problema resuelto, básicamente utilizando una técnica de recorte inverso. Vea mi respuesta a continuación.
Respuesta1
A) Con el código de Jake (espero utilizar correctamente este código)
Actualización de la versión 1 (agregué un cip en todas las rutas para colorear la imagen)
\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) Actualizar la versión 2 contkz-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}
Respuesta2
En realidad, esto es bastante fácil usando algunas matemáticas... Si desea que las líneas del lado derecho estén 0.2
separadas (como en su ejemplo), una 0.1
arriba y otra 0.1
debajo de una línea recta a la derecha. Entonces los ángulos donde cortan al círculo son asin(0.1)
y 360-asin(0.1)
respectivamente. Entonces el siguiente código genera la imagen:
\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}
Luciendo así:
Editar (después del comentario de Altermundus):para la fotocomo esRealmente no importa dónde esté el centro. Si agrega cosas adicionales al mismo entorno de imagen o overlay
lo usa, puede volverse importante. La distancia entre las líneas horizontales depende del radio del círculo, no de si depende o no de otros objetos. Me pareció que escalar la distancia entre líneas era algo deseable. Si este no es el caso, se puede solucionar fácilmente dividiendo por el radio del círculo. En cuanto a la ubicación del centro, si es importante, también se puede solucionar fácilmente. Si parametrizamos todo un poco más obtenemos lo siguiente:
\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}
Lo que resulta en:
Tenga en cuenta que \path[fill] (0,0) circle (1pt);
solo está presente para demostrar el hecho de que el centro está realmente ubicado en (0,0)
.
Respuesta3
Encontré una respuesta a prácticamente exactamente lo que quería hacer, con muy poco carácter alternativo. Es prácticamente un comando de clip inverso. La respuesta está motivada por la parte amarilla del ejemplo que se encuentra enhttp://www.texample.net/tikz/examples/venn-diagram/
La idea es dividir las partes individuales del diagrama en sus propios ámbitos, es decir, un diagrama para las líneas y otro para el círculo. Luego, cada uno de estos obtiene el recorte apropiado. Un pequeño ejemplo:
\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:
La misma técnica nuevamente para el círculo, esta vez recortamos un rectá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:
Y finalmente, lo que quería lograr en mi publicación inicial, solo que esta vez no necesito que Gimp edite las piezas no deseadas :-)
\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}
Un ejemplo de esto aplicado en un problema de análisis complejo:
Respuesta4
Si realmente no te importa dónde dibujarás estas cosas (es decir, no quieres saber las coordenadas exactas, puedes hacerlo en una línea:
\draw (2,0) -- ++(-2,0) arc (10:350:3cm) -- ++(2,0);
. Sin embargo, no creo que este sea tu caso.
Aquí le he mostrado cómo se puede hacer (sin recortar), en el caso de diagramas circulares realmente no hay necesidad de recortar, tikz
hace un trabajo bastante bueno, además se salta muchos entornos de alcance.
Entonces, el código, he adjuntado también el ejemplo mínimo que es el mismo que el otro. Tenga en cuenta el uso de ángulos y radios fáciles de personalizar en el diagrama. Cambia \myRadius
y todo cambia. ¡Esto te ayudará a largo plazo!
\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}