"Unterbrechung" zweier Linien an Schnittpunkt

Tabellen und Grafiken erstellen und anordnen


Münzi
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 78
Registriert: Fr 24. Apr 2009, 09:53

"Unterbrechung" zweier Linien an Schnittpunkt

Beitrag von Münzi »

Hallo mal wieder,

nach längerer Abstinenz habe ich mal wieder ein kleines Anliegen an euch. Ich nutze TIKZ um Fließbilder anzulegen. Dabei kommt es häufiger dazu, dass sich zwei Linien schneiden. Am Schnittpunkt wird zur besseren Unterscheidung der Linien meist die eine Linie mit einem Bogen über die andere gezeichnet. Das konnte bisher mit der Lösung aus http://tex.stackexchange.com/questions/ ... ed-in-tikz erreicht werden.
Bild
Das oben gezeigte Bild wird dabei durch folgenden Code erreicht:
\documentclass[tikz]{standalone}
\usetikzlibrary{intersections,backgrounds}
\usetikzlibrary{calc}
\begin{document}

\begin{tikzpicture}
\tikzset{
    connect/.style args={(#1) to (#2) over (#3) to (#4) by #5}{
        insert path={
            \pgfextra{
                \pgfinterruptpath
                    \path [name path=a] (#1) -- (#2);
                    \path [name path=b] (#3) -- (#4);
                    \path [name intersections={of=a and b,by=inter}];
                \endpgfinterruptpath                
            }
            let \p1=($(#1)-(inter)$), \n1={veclen(\x1,\y1)}, 
                            \n2={atan2(\x1,\y1)}, \n3={abs(#5)}, \n4={#5>0 ?180:-180}  in 
                            (#1) -- ($(#1)!\n1-\n3!(inter)$) 
                            arc (\n2:\n2+\n4:\n3) -- (#2)
        }
    },
}
\begin{pgfonlayer}{background}
\draw[fill=yellow] (0.25,0.5) rectangle (1.75,1.5);
\end{pgfonlayer}

\draw  (0,0) -- (2,2);

\draw [red, very thick, connect={(0,2) to (2,0) over (0,0) to (2,2) by -5pt}];
\draw [connect={(0,2) to (2,0) over (0,0) to (2,2) by 3pt}];

\end{tikzpicture}
\end{document}
Allerdings musste ich heute nach einem Update meiner Pakete feststellen, dass sich etwas an der Berechnung verändert haben muss. Der gleiche Code wie oben erzeugt nun folgendes Bild:

Bild

und in meinem konkreten Fall verwandelt sich der Output von
Bild
zu
Bild.

Weiß jemand zufällig woran das liegt (ich tippe auf eine Veränderung der Intersection-Bibliothek von TikZ) und wie ich das alte Ergebnis zurück bekomme?

Beste Grüße und schonmal vielen Dank!
Windows XP, TexLive 2013, TexStudio 2.6.4
Windows 7, TexLive 2013, TexStudio 2.6.4

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

Vermutlich wurde die Syntax von atan2 geändert. Du musst dort nur \x1 und \y1 vertauschen, dann klappt es wieder.
\documentclass[tikz]{standalone} 
\usetikzlibrary{intersections,backgrounds} 
\usetikzlibrary{calc} 
\begin{document} 

\begin{tikzpicture} 
\tikzset{ 
     connect/.style args={(#1) to (#2) over (#3) to (#4) by #5}{ 
         insert path={ 
             \pgfextra{ 
                 \pgfinterruptpath 
                     \path [name path=a] (#1) -- (#2); 
                     \path [name path=b] (#3) -- (#4); 
                     \path [name intersections={of=a and b,by=inter}]; 
                 \endpgfinterruptpath                 
             } 
             let \p1=($(#1)-(inter)$), \n1={veclen(\x1,\y1)}, 
                             \n2={atan2(\y1,\x1)}, \n3={abs(#5)}, \n4={#5>0 ?180:-180}  in 
                             (#1) -- ($(#1)!\n1-\n3!(inter)$) 
                             arc (\n2:\n2+\n4:\n3) -- (#2) 
         } 
     }, 
} 
\begin{pgfonlayer}{background} 
\draw[fill=yellow] (0.25,0.5) rectangle (1.75,1.5); 
\end{pgfonlayer} 

\draw  (0,0) -- (2,2); 

\draw [red, very thick, connect={(0,2) to (2,0) over (0,0) to (2,2) by -5pt}]; 
\draw [connect={(0,2) to (2,0) over (0,0) to (2,2) by 3pt}]; 
\end{tikzpicture} 
\end{document} 
Gruß
Elke

Edit: Ursache ist geänderte Reihenfolge der Argumente für atan2

Münzi
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 78
Registriert: Fr 24. Apr 2009, 09:53

Beitrag von Münzi »

Großartig Elke, vielen Dank. Wie bzw. wo hast du das denn rausgefunden? Ein Changelog oder ähnliches hatte ich im Internet leider nicht gefunden.
Windows XP, TexLive 2013, TexStudio 2.6.4
Windows 7, TexLive 2013, TexStudio 2.6.4

Studi
Forum-Century
Forum-Century
Beiträge: 185
Registriert: So 5. Jan 2014, 20:18

Beitrag von Studi »

Es gibt ein Changelog, was z.B. im TDS-Download bei sourceforge zu kriegen ist, da sah ich es zumindest, das ist sicher auch bei CTAN dabei. Jedoch sah ich zu einer Änderung von atan2 nur: "Increased accuracy of atan, atan2 and \pgfmathanglebetweenpoints."

Ansonsten las ich mal, dass die ursprüngliche Reihenfolge der Arumente nicht zum Üblichen passt, es also als Bugfix zu verstehen ist, dass es jetzt die gewohnte erwartete Reihenfolge der Argumente versteht.

Studi

Felix
Forum-Century
Forum-Century
Beiträge: 210
Registriert: Sa 25. Jan 2014, 13:57

Beitrag von Felix »

Hab mal sowas gelesen und mir notiert - :
\tikzset{declare function={atan3(\a,\b)=ifthenelse(atan2(0,1)==90, atan2(\a,\b),atan2(\b,\a));}}
Ich weiß noch, dass es in einem längeren Beitrag von Qrrbrbirlbel mal drin war. Er ging so auf Nummer sicher mit dem Argumentetausch, der mit der CVS-Version absehbar war.

Felix
Ein TikZ Süchtiger :-)

Münzi
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 78
Registriert: Fr 24. Apr 2009, 09:53

Beitrag von Münzi »

Vielen Dank für die Hinweise. Vor allem der Workaround von Felix bzw. Qrrbrbirbel ist natürlich top.
Windows XP, TexLive 2013, TexStudio 2.6.4
Windows 7, TexLive 2013, TexStudio 2.6.4

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

Münzi hat geschrieben:Wie bzw. wo hast du das denn rausgefunden?
In dem ich in deinem Code nach der Ursache für die falsche Winkelberechnung und nach Korrekturmöglichkeiten gesucht habe. Erst nach dem Vertauschen der Argumente habe ich im Manual gesehen, dass sich die Syntax entsprechend geändert hat.

Den Tipp von Felix/Qrrbrbirbel finde ich auch extrem hilfreich.

Antworten