
SiguienteDibujar sobre una imagen con TikZ, He tenido muchos casos exitosos de dibujar en una imagen conTikZ.
Sin embargo, ahora tengo unatikzpicture
entorno convariosgráficos, y quiero dibujar en cada uno de ellos. Sin embargo, parece que la solución ofrecida porDibujar sobre una imagen con TikZsólo funciona para imágenes centradas en (0, 0), porque si intento dibujar en mi segunda imagen, las coordenadas no se comportan como se esperaba:
\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}
Resultado:
Me gustaría un sistema de coordenadas transformado con el origen en la parte inferior izquierda de la imagen y el punto (1, 1) en la parte superior derecha. Esto funciona para la imagen ubicada en (0, 0), pero no para la imagen ubicada inmediatamente a la derecha. ¿Por qué no y cómo consigo el efecto deseado?
Respuesta1
Esto se debe a que está escalando los vectores unitarios, x=... , y=....
pero el argumento de los de la segunda imagen no son vectores ortogonales. Porque image2
está en otro lugar y no son (x0,0)
y (0,y0)
tipo de coordenadas. En cambio, son vectores con entradas distintas de cero. Es por eso que tus coordenadas son diagonales en lugar de horizontales/verticales.
Para hacer lo mismo es necesario poner a cero los x
componentes correspondientes y
. Ejemplo
\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}
Aquí he usado la calc
biblioteca para obtener el ancho y el alto de la imagen. Pero puede evitar todo esto incluyendo la imagen también en el alcance, de modo que todo se defina localmente de manera idéntica. Luego cambias esos ámbitos. Ejemplo:
\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}
esto da el mismo resultado.