
GefolgtMit TikZ auf einem Bild zeichnen, ich habe viele erfolgreiche Fälle erlebt, in denen ich auf ein Bild gezeichnet habe mitTikZ.
Jetzt habe ich jedoch eine tikzpicture
Umgebung mitmehrereGrafiken, und ich möchte auf jede davon zeichnen. Es scheint jedoch, dass die Lösung vonMit TikZ auf einem Bild zeichnenfunktioniert nur für Bilder, die auf (0, 0) zentriert sind, denn wenn ich versuche, auf meinem zweiten Bild zu zeichnen, verhalten sich die Koordinaten nicht wie erwartet:
\documentclass[final, 12pt]{standalone}
\usepackage{tikz}
\newcommand{\helplines}[0]{
\draw[help lines,semithick,xstep=.1,ystep=.1] (0,0) grid (1,1);
\foreach \x in {0,1,...,9} { \node [anchor=north] at (\x/10,0) {0.\x}; }
\foreach \y in {0,1,...,9} { \node [anchor=east] at (0,\y/10) {0.\y}; }
}
\begin{document}%
\begin{tikzpicture}%
\node[anchor=south west,inner sep=0] (image1) at (0, 0)
{\rule{3cm}{3cm}};
\begin{scope}[x={(image1.south east)},y={(image1.north west)}]
% draw stuff
%\helplines
\end{scope}
\node[anchor=south west,inner sep=0] (image2) at (image1.south east)
{\rule{3cm}{3cm}};
\begin{scope}[x={(image2.south east)},y={(image2.north west)}]
\helplines
% draw more stuff, but coordinates do not map as desired
\end{scope}
\end{tikzpicture}
\end{document}
Ergebnis:
Ich hätte gern ein transformiertes Koordinatensystem mit dem Ursprung unten links beim Bild und dem Punkt (1, 1) oben rechts. Das funktioniert zwar für das Bild, das bei (0, 0) liegt, aber nicht für das Bild, das direkt rechts daneben liegt. Warum nicht und wie erreiche ich den gewünschten Effekt?
Antwort1
Dies liegt daran, dass Sie die Einheitsvektoren über skalieren, x=... , y=....
aber das Argument derjenigen im zweiten Bild sind keine orthogonalen Vektoren. Weil image2
es woanders ist und sie nicht (x0,0)
vom (0,y0)
Typ Koordinaten sind. Stattdessen sind es Vektoren mit Einträgen ungleich Null. Deshalb sind Ihre Koordinaten diagonal statt horizontal/vertikal.
Um dasselbe zu tun, müssen Sie die entsprechenden x
oder y
Komponenten auf Null setzen. Beispiel
\documentclass[final, 12pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\newcommand{\helplines}[0]{
\draw[help lines,semithick,xstep=.1,ystep=.1] (0,0) grid (1,1);
\foreach \x in {0,1,...,9} { \node [anchor=north] at (\x/10,0) {\tiny .\x}; }
\foreach \y in {0,1,...,9} { \node [anchor=east] at (0,\y/10) {\tiny .\y}; }
}
\begin{document}%
\begin{tikzpicture}%
\node[anchor=south west,inner sep=0] (image1) at (0, 0)
{\color{red}\rule{3cm}{3cm}};
\begin{scope}[x={(image1.south east)},y={(image1.north west)}]
% draw stuff
\helplines
\end{scope}
\node[anchor=south west,inner sep=0] (image2) at (image1.south east)
{\color{blue}\rule{3cm}{3cm}};
\begin{scope}[
x={($(image2.north east)-(image2.north west)$)},
y={($(image2.north west)-(image2.south west)$)},
shift={(image2.south west)}]
\helplines
\end{scope}
\end{tikzpicture}
\end{document}
Hier habe ich die calc
Bibliothek verwendet, um die Breite und Höhe des Bildes zu ermitteln. Sie können dies alles jedoch vermeiden, indem Sie das Bild auch in den Gültigkeitsbereich einschließen, sodass alles lokal identisch definiert ist. Dann verschieben Sie diese Gültigkeitsbereiche. Beispiel:
\documentclass[tikz]{standalone}
\newcommand{\helplines}[0]{
\draw[help lines,semithick,xstep=.1,ystep=.1] (0,0) grid (1,1);
\foreach \x in {0,1,...,9} { \node [anchor=north] at (\x/10,0) {\tiny .\x}; }
\foreach \y in {0,1,...,9} { \node [anchor=east] at (0,\y/10) {\tiny .\y}; }
}
\begin{document}%
\begin{tikzpicture}%
\node[anchor=south west,inner sep=0] (image1) at (0, 0)
{\color{red}\rule{3cm}{3cm}};
\begin{scope}[x={(image1.south east)},y={(image1.north west)}]
% draw stuff
\helplines
\end{scope}
\begin{scope}[shift={(image1.south east)}] % Shift the scope
\node[anchor=south west,inner sep=0] (image2) at (0,0) %still at the origin of this scope
{\color{blue}\rule{3cm}{3cm}};
\begin{scope}[x={(image2.south east)},y={(image2.north west)}]
\helplines
\end{scope}
\end{scope}
\end{tikzpicture}
\end{document}
Dies führt zum identischen Ergebnis.