Seite 1 von 1

"Unterbrechung" zweier Linien an Schnittpunkt

Verfasst: Mi 5. Mär 2014, 19:44
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!

Verfasst: Do 6. Mär 2014, 02:51
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

Verfasst: Do 6. Mär 2014, 11:44
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.

Verfasst: Do 6. Mär 2014, 17:16
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

Verfasst: Do 6. Mär 2014, 18:10
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

Verfasst: Do 6. Mär 2014, 19:05
von Münzi
Vielen Dank für die Hinweise. Vor allem der Workaround von Felix bzw. Qrrbrbirbel ist natürlich top.

Verfasst: Fr 7. Mär 2014, 01:42
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.