TikZ cómo suspender temporalmente una línea en la intersección de dos líneas

TikZ cómo suspender temporalmente una línea en la intersección de dos líneas

Estoy trabajando en TikZ y estoy tratando de hacer que una línea se detenga y luego comience de nuevo antes y después de la intersección con otra línea. Intenté colocar un nodo en el punto de intersección y lo rellené de blanco, pero esto cortó ambas líneas. Sólo quiero que la línea azul se rompa y la línea negra continúe. ¡Cualquier ayuda sería genial!

Esto es lo que hace el siguiente código: ingrese la descripción de la imagen aquí

\documentclass{article}
\usepackage[dvipsnames]{xcolor}
\usepackage{tikz}%
\usetikzlibrary{arrows.meta,shapes.misc, positioning, shapes.geometric, intersections}%

\begin{document}
   \begin{tikzpicture}
    \draw [-Latex, RoyalBlue, name path = b1] (0,-1) -- (10,-1);
    \draw [-Latex, RoyalBlue, name path = b2] (0,-0.5) -- (10,-0.5);
    \draw [-Latex, RoyalBlue, name path = b3] (0,0) -- (10,0);
    \draw [-Latex, RoyalBlue, name path = b4] (0,0.5) -- (10,0.5);
    \draw [-Latex, RoyalBlue, name path = b5] (0,1) -- (10,1);

    \node[trapezium,
    draw = black,
    thick,
    rotate=90,
    minimum width = 2.5cm,
    minimum height= 1cm,
    trapezium left angle = 100,
    trapezium right angle = 80,
    trapezium stretches=true,
    trapezium stretches body =true,
    name path = trap1] (t) at (1,0) {};
    
    \draw[name intersections={of=b1 and trap1}] (intersection-1) node[fill=white] {};
    \draw[name intersections={of=b2 and trap1}] (intersection-1) node[fill=white] {};
    \draw[name intersections={of=b3 and trap1}] (intersection-1) node[fill=white] {};
    \draw[name intersections={of=b4 and trap1}] (intersection-1) node[fill=white] {};
    \draw[name intersections={of=b5 and trap1}] (intersection-1) node[fill=white] {};
    \end{tikzpicture}
\end{document}

Respuesta1

Aquí hay una solución que utiliza la spath3biblioteca TikZ. Usando esto, podemos definir los caminos relevantes, agregar espacios en los lugares relevantes y luego dibujarlos.

\documentclass{article}
%\url{https://tex.stackexchange.com/q/715947/86}
\usepackage[dvipsnames]{xcolor}
\usepackage{tikz}%
\usetikzlibrary{
  arrows.meta,
  shapes.misc,
  positioning,
  shapes.geometric,
  intersections,
  spath3
}%

\begin{document}

\begin{tikzpicture}[>=Latex]

% Create and save the arrow paths
\foreach \k in {1,...,5} {
  \path [spath/save global=b\k] (0,-1.5 + \k/2) -- ++(10,0);
}

% Create the trapezium shape
\node[
  trapezium,
    rotate=90,
    minimum width = 2.5cm,
    minimum height= 1cm,
    trapezium left angle = 100,
    trapezium right angle = 80,
    trapezium stretches=true,
    trapezium stretches body =true,
    spath/save global=trap1
] (t) at (1,0) {};

% Split the trapezium and each of the arrows where they meet,
% then insert gaps in the arrow paths at one of the intersections,
% then remove the split in the arrow paths where we didn't insert a gap.
\foreach \k in {1,...,5} {
  \tikzset{
    spath/split globally at intersections={trap1}{b\k},
    spath/insert gaps globally after components={b\k}{5pt}{1},
    spath/spot weld globally={b\k},
  }
}

% This inserts the gaps in the trapezium path, we make an alias style
% just to shorten the code.
\tikzset{
  do stuff/.style={
    spath/insert gaps after components={trap1}{5pt}{#1},
  },
  do stuff/.list={5,6,7,8,9},
}

% Now render the arrow paths
\foreach \k in {1,...,5} {
  \draw[spath/use=b\k, ->, RoyalBlue];
}

% Now render the trapezium path
\draw[black,thick,spath/use=trap1];

\end{tikzpicture}
\end{document}

Aquí está el resultado:

Cinco líneas que cruzan un trapecio, con rupturas insertadas en las líneas y el trapecio para dar el efecto de las líneas que pasan por el trapecio.

Respuesta2

Sé que es sólo una solución alternativa, pero puedes usar ese nodo dos veces: primero para las intersecciones y segundo para dibujarlo.

Para facilitar un poco las cosas, también puedes agregar un estilo para el nodo para poder reutilizarlo cuando lo necesites. Lo mismo se puede hacer con las coordenadas, de modo que pueda tener coordenadas con nombre para uso múltiple.

\documentclass{article}
\usepackage[dvipsnames]{xcolor}
\usepackage{tikz}%
\usetikzlibrary{arrows.meta,shapes.misc, positioning, shapes.geometric, intersections}%

\tikzset{
    tnode/.style = {
        trapezium,
        thick,
        rotate=90,
        minimum width = 2.5cm,
        minimum height= 1cm,
        trapezium left angle = 100,
        trapezium right angle = 80,
        trapezium stretches=true,
        trapezium stretches body =true,
        name path = trap1,
    },
 }


\begin{document}
   \begin{tikzpicture}
    \coordinate (ct) at (1,0);
    \node[tnode] (t) at (ct) {};
    
    \draw [-Latex, RoyalBlue, name path = b1] (0,-1) -- (10,-1);
    \draw [-Latex, RoyalBlue, name path = b2] (0,-0.5) -- (10,-0.5);
    \draw [-Latex, RoyalBlue, name path = b3] (0,0) -- (10,0);
    \draw [-Latex, RoyalBlue, name path = b4] (0,0.5) -- (10,0.5);
    \draw [-Latex, RoyalBlue, name path = b5] (0,1) -- (10,1);

    \draw[name intersections={of=b1 and trap1}] (intersection-1) node[fill=white] {};
    \draw[name intersections={of=b2 and trap1}] (intersection-1) node[fill=white] {};
    \draw[name intersections={of=b3 and trap1}] (intersection-1) node[fill=white] {};
    \draw[name intersections={of=b4 and trap1}] (intersection-1) node[fill=white] {};
    \draw[name intersections={of=b5 and trap1}] (intersection-1) node[fill=white] {};

    \node [tnode, draw] at (ct) {};
\end{tikzpicture}
\end{document}

ingrese la descripción de la imagen aquí

EDITAR. Ejemplo basado en scopey la backgroundcapa.

\documentclass{article}
\usepackage[dvipsnames]{xcolor}
\usepackage{tikz}

\usetikzlibrary{
    arrows.meta,
    shapes.misc,
    positioning,
    shapes.geometric,
    intersections,
    backgrounds,        % For a background layer
}


\begin{document}
   \begin{tikzpicture}
    \node[
        trapezium,
        draw = black,
        thick,
        rotate=90,
        minimum width = 2.5cm,
        minimum height= 1cm,
        trapezium left angle = 100,
        trapezium right angle = 80,
        trapezium stretches=true,
        trapezium stretches body =true,
        name path = trap1,
    ] (t) at (1,0) {};

    \begin{scope}[on background layer]
        \foreach \c [evaluate=\c as \y using {\c/2}] \n in {-2,...,2} {
            \draw [-Latex, RoyalBlue, name path={b\c}] (0,\y) -- (10,\y);
            \path [name intersections={of={b\c} and trap1, name=i}] (i-1) node[fill=white] {};
        };
    \end{scope}
\end{tikzpicture}
\end{document}

Respuesta3

Aprovecharía el hecho de que TikZ respeta el orden de dibujo. La idea es sobredibujar las flechas azules con blancas y luego dibujar el trapezoide. Hice algunas mejoras adicionales.

\documentclass{article}
\usepackage[dvipsnames]{xcolor}
\usepackage{tikz}
\usetikzlibrary{arrows.meta}

\begin{document}
    \begin{tikzpicture}
        % Drawing from background to foreground.
        % Note that the blue arrows will be on top of the right side of the trapezoid.
        \draw[xshift=1cm, thick] (.5,1.2) -- (.5,-1.1);
        % \foreach loop, my favourite features in TikZ
        \foreach \y in {-1,-.5,...,1}
            \draw [-Latex, RoyalBlue] (0,\y) -- (10,\y);
        % Overdrawing blue arrows with white.
        % Width is "ultra thick" (1.6pt) + "thick" (.8pt) + "ultra thick" (1.6pt).
        \draw[xshift=1cm, white, line width=4pt] (-.5,1.1) -- (-.5,-1.2);
        % The thick lines of the trapezoid's sides at the top and bottom right corners don't look good.
        % I added line cap to make it almost unnoticeable, but still not perfect.
        \draw[xshift=1cm, thick, line cap=rect] (.5,1.2) -- (-.5,1.1) -- (-.5,-1.2) -- (.5,-1.1);
     \end{tikzpicture}
\end{document}

ingrese la descripción de la imagen aquí

La line capsolución aún no es perfecta ya que la tapa no es paralela al eje y. Para evitar esto, puedes hacer \drawtodo el trapezoide de una sola vez o usar tu trapeziumforma. Sin embargo, esto perderá la propiedad de que las flechas azules van en la parte superior derecha del trapezoide.

Respuesta4

Bueno, trabajar con intersecciones puede ser necesario si necesitas colocar esa imagen sobre un fondo multicolor, pero si todo el fondo va a ser de un color específico, en este caso blanco, puedes jugar con las capas y usar algunos dibujos como fondo. mismo color de fondo para emular los cortes, luego aprovecha usando 3D library, para no tener que usar un trapezoide por ejemplo, en el ejemplo he dibujado las líneas en el XYplano para trabajar con posicionamiento manual del plano 3D, luego una forma cuadrada en un plano perpendicular pero que está dividido por el eje mediano, de manera que se dibuja una parte en una capa diferente, luego en las opciones de estilo de dibujo mediante una acción previa puedes dibujar una línea blanca de mayor ancho que la original y la separación visual que Se necesita emular, he aumentado los anchos para que se visualice todo.

En este caso \hooksse define con dos instrucciones de dibujo una en la capa de fondo, que corresponde a un primer semicuadrado y el complemento en capas normales; opciones #1y #2están colocados para que pueda colocar propiedades de dibujo para cada una, así en el ejemplo para la primera puedo colocar ambos colores diferentes, y para la tercera agregar el estilo preacción con mayor ancho de blanco, finalmente lo mismo pero para cualquier imagen. por supuesto todo dibujado en YZaviones.

RESULTADO:

ingrese la descripción de la imagen aquí

MWE:

\documentclass[border=0.5cm]{standalone}
\usepackage{tikzducks}
\usepackage[dvipsnames]{xcolor}
\usetikzlibrary{3d,graphs,arrows.meta}
\pgfdeclarelayer{background layer}
\pgfdeclarelayer{foreground layer}
\pgfsetlayers{background layer,main}

\begin{document}
    
    \begin{tikzpicture}
        \def\hooks#1#2{
            \draw[#1, rounded corners=3pt, line width=2pt] (0,1.2) -| (1,0) |- (0,-1.2););
            \begin{pgfonlayer}{background layer}
            \draw[#2, rounded corners=3pt, line width=2pt] (0,1.2) -| (-1,0) |- (0,-1.2);
            \end{pgfonlayer}
        }
    
        \begin{scope}[canvas is xy plane at z=0]
            \foreach \y in {-1,-.5,...,1}
            \draw [-Latex, RoyalBlue,line width=2pt,preaction={draw=white,line width=3.5pt}] (0,\y) -- (7,\y);
        \end{scope}
        \begin{scope}[canvas is zy plane at x=0.75]
            \hooks{blue}{red}
        \end{scope}
        \begin{scope}[canvas is zy plane at x=2]
            \hooks{black}{black}
        \end{scope}
        \begin{scope}[canvas is zy plane at x=3.25]
            \hooks{green!50!blue,preaction={draw=white,line width=3.5pt,shorten <=1pt,shorten >=1pt}}{green!50!blue}
        \end{scope}
        \begin{scope}[canvas is zy plane at x=5]
            \clip(2.5,1.5) rectangle (0,-1.5);
            \draw(0,0)node[transform shape]{\includegraphics[height=2.2cm]{example-image-duck}};
            \begin{pgfonlayer}{background layer}
                \clip(-2.5,1.5) rectangle (0,-1.5);
                \draw(0,0)node[transform shape]{\includegraphics[height=2.2cm]{example-image-duck}};
            \end{pgfonlayer}
            
        \end{scope}

    \end{tikzpicture}
    
\end{document}

información relacionada