PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Einheitenwechsel in tikZ bei \path plot



Hobbykomiker
21-11-2013, 13:35
Hallo,

ich habe schon wieder ein (halb-gelöstes) Problem :)

Folgende Aufgabe wollte ich lösen:

Bestimme die Schnittpunkte einer Funktion mit einer Umrandung.
Dann plotte die Funktion nur zwischen den beiden Punkten.

Bemerkung: Die Möglichkeit, dies mit \path[clip] zu bewerkstelligen, wollte ich aus verschiedenen Gründen nicht anwenden.

Erstmal mein (wieder heruntergekochtes) Beispiel:


\documentclass[10pt]{scrartcl}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\begin{document}
\usetikzlibrary{intersections,calc}

\begin{tikzpicture}
\path[ draw,
name path=Rand
] (0,0) -- (1.5,0) -- (2,1) -- (1,2) -- (0,1.8) --cycle ;
\path[ samples=100,
variable=\xx,
name path=Funktion
] plot({\xx},{sin(deg(\xx))+.8}) ;
\path[name intersections={of=Funktion and Rand}] ;
\path[draw,fill=blue] (intersection-1) circle (.1cm) ;
\path[draw,fill=green] (intersection-2) circle (.1cm) ;
\path[ draw,
variable=\xx,
samples=100]
let \p1 = (intersection-1) ,
\p2 = (intersection-2) in
node[anchor=east] {\x1}
plot[domain=\x1:\x2] ({\xx/72.27*2.54},{sin(deg(\xx/72.27*2.54))+.8})
node[anchor=west] {\x2} ;
\end{tikzpicture}

\end{document}

Es wird also zweimal mittels 'plot' einfach eine Sinus-Funktion aufgerufen.
Beim zweiten Aufruf musste ich jedoch per Hand von pt auf cm umrechnen, damit das Gleiche passiert, wie beim ersten Aufruf.

Daher meine Frage: Gibt es die Möglichkeit, tikZ zu zwingen beide Male in cm (was meines Wissens Standard sein sollte - bitte um Korrektur wenn nicht) zu rechnen?

Danke im Voraus,
Thorsten

Hobbykomiker
21-11-2013, 14:01
Ich glaube das Problem liegt eher beim:


plot[domain=\x1:\x2] ...

Also, dass dort die Längen 'falsch' interpretiert werden.

Thorsten

esdd
21-11-2013, 14:32
Die mit let erhaltenen \x1 und \x2 sind Punktregister. Zum Beispiel enthält \x1 in deinem Beispiel den Wert 0pt.


\documentclass[margin=5mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{intersections,calc}

\tikzset{kreis/.style={draw,circle,minimum size=0.1cm,inner sep=0pt,fill=#1}}

\begin{document}

\begin{tikzpicture}
\draw[name path=Rand](0,0)--(1.5,0)--(2,1)--(1,2)--(0,1.8)--cycle;
\path[domain=0:2,samples=100,variable=\xx,name path=Funktion]plot({\xx},{sin(deg(\xx))+.8});
\draw[name intersections={of=Funktion and Rand},variable=\xx,samples=100]
let \p1 = (intersection-1) ,
\p2 = (intersection-2)
in
\pgfextra{\pgfmathsetmacro\s{\x1/1cm}\pgfmathsetmacro\e{\x2/1cm}}
node[kreis=blue,label=west:\s] at (\p1){}
plot[domain=\s:\e] ({\xx},{sin(deg(\xx))+.8})
node[kreis=green,label=east:\e] {} ;
\end{tikzpicture}

\end{document}

Auch beim ersten Plotten der Funktion würde ich eine domain vorgeben. Denn auch wenn dieser nicht gezeichnet wird, wird er trotzdem bei der Ermittlung der Größe der Zeichnung berücksichtigt.

Außerdem ist trotzdem mal noch ein Vorschlag mit \clip:


\documentclass[margin=5mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{intersections}

\begin{document}

\begin{tikzpicture}
\begin{scope}
\clip[name path=Rand][preaction=draw](0,0)--(1.5,0)--(2,1)--(1,2)--(0,1.8)--cycle;
\draw[samples=100,variable=\xx,name path=Funktion]plot({\xx},{sin(deg(\xx))+.8});
\path[name intersections={of=Funktion and Rand,name=i}];
\end{scope}
\draw[fill=blue](i-1)circle[radius=.1cm];
\draw[fill=green](i-2)circle[radius=.1cm];
\end{tikzpicture}

\end{document}

Gruß
Elke

Hobbykomiker
21-11-2013, 16:19
Das mit dem Punktregister habe ich wohl überlesen (oder nicht kapiert).

Weiterhin wusste ich nicht, wie ich intersections nach dem Ende einer scope
benutzen kann. Diese Option


\path[name intersections={...,name=i}];

war mir nicht bekannt (oder ich habe auch die überlesen :D).

Damit lässt sich das, was ich vorhabe, sicherlich super mit \clip lösen.
In meinem Bereich sind irgendwo zischen 20 und 50 Funktionen (in 3 foreach-Schleifen) und 50 und 250 Geraden (5 Schleifen) zu beschneiden, wobei ein Teil von beiden nur einen Teilbereich verwenden.

Vielen vielen vielen usw. Dank