TikZ: So unterbrechen Sie eine Linie am Schnittpunkt zweier Linien vorübergehend

TikZ: So unterbrechen Sie eine Linie am Schnittpunkt zweier Linien vorübergehend

Ich arbeite in TikZ und versuche, eine Linie zu stoppen und dann vor und nach der Kreuzung mit einer anderen Linie wieder zu beginnen. Ich habe versucht, einen Knoten am Kreuzungspunkt zu setzen und ihn mit Weiß zu füllen, aber dadurch wurden beide Linien durchtrennt. Ich möchte nur, dass die blaue Linie unterbrochen und die schwarze Linie fortgesetzt wird. Jede Hilfe ist willkommen!

Der folgende Code bewirkt Folgendes: Bildbeschreibung hier eingeben

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

Antwort1

Hier ist eine Lösung unter Verwendung der spath3TikZ-Bibliothek. Mit dieser können wir die entsprechenden Pfade definieren, an den entsprechenden Stellen Lücken hinzufügen und diese anschließend zeichnen.

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

Hier ist das Ergebnis:

Fünf Linien, die ein Trapez kreuzen, wobei in die Linien und das Trapez Unterbrechungen eingefügt sind, um den Eindruck zu erwecken, als würden die Linien durch das Trapez verlaufen.

Antwort2

Ich weiß, dass es nur ein Workaround ist, aber Sie können diesen Knoten zweimal verwenden: erstens für Schnittpunkte und zweitens, um ihn tatsächlich zu zeichnen.

Um die Dinge ein wenig einfacher zu machen, können Sie auch einen Stil für den Knoten hinzufügen, sodass Sie ihn bei Bedarf jederzeit wiederverwenden können. Dasselbe können Sie mit Koordinaten machen, sodass Sie benannte Koordinaten für die Mehrfachverwendung haben können.

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

Bildbeschreibung hier eingeben

BEARBEITEN. Beispiel basierend auf scopeund der backgroundEbene.

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

Antwort3

Ich würde die Tatsache ausnutzen, dass TikZ die Zeichenreihenfolge beachtet. Die Idee ist, die blauen Pfeile mit Weiß zu überzeichnen und dann das Trapez zu zeichnen. Ich habe noch ein paar zusätzliche Verbesserungen vorgenommen.

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

Bildbeschreibung hier eingeben

Die line capLösung ist immer noch nicht perfekt, da die Kappe nicht parallel zur y-Achse ist. Um dies zu vermeiden, können Sie \drawdas gesamte Trapez auf einmal abschneiden oder Ihre trapeziumForm verwenden. Dadurch geht jedoch die Eigenschaft verloren, dass die blauen Pfeile oben auf der rechten Seite des Trapezes liegen.

Antwort4

Nun, das Arbeiten mit Schnittpunkten kann notwendig sein, wenn Sie das Bild auf einem mehrfarbigen Hintergrund platzieren müssen, aber wenn der gesamte Hintergrund eine bestimmte Farbe haben soll, in diesem Fall Weiß, können Sie mit den Ebenen spielen und einige Zeichnungen in derselben Farbe wie der Hintergrund verwenden, um die Schnitte zu emulieren. Nutzen Sie dann den Vorteil 3D library, dass Sie beispielsweise kein Trapez verwenden müssen. Im Beispiel habe ich die Linien in der XYEbene gezeichnet, um mit der manuellen Positionierung der 3D-Ebene zu arbeiten, dann eine quadratische Form in einer senkrechten Ebene, die jedoch durch die Mittelachse geteilt ist, sodass ein Teil auf einer anderen Ebene gezeichnet wird. In den Zeichenstiloptionen können Sie dann durch eine vorherige Aktion eine weiße Linie mit einer größeren Breite als das Original zeichnen und die erforderliche visuelle Trennung emulieren. Ich habe die Breiten erhöht, damit alles visualisiert wird.

In diesem Fall \hookswird es mit zwei Zeichenanweisungen definiert, eine in der Hintergrundebene, die einem ersten Halbquadrat entspricht, und das Komplement in normalen Ebenen; Optionen #1und #2sind so platziert, dass ich für jede Zeicheneigenschaften festlegen kann. Im Beispiel kann ich also für die erste beide unterschiedliche Farben festlegen und für die dritte den Voraktionsstil mit einer größeren Weißbreite hinzufügen, schließlich dasselbe, aber für jedes Bild natürlich alles in YZEbenen gezeichnet.

ERGEBNIS:

Bildbeschreibung hier eingeben

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}

verwandte Informationen