Com base em várias imagens dentro da mesma imagem tikz, como obter a transformação correta de coordenadas?

Com base em várias imagens dentro da mesma imagem tikz, como obter a transformação correta de coordenadas?

SeguindoDesenhando em uma imagem com TikZ, tive muitos casos bem-sucedidos de desenho em uma imagem comTikZ.

Porém, agora tenho um tikzpictureambiente comdiversosgráficos, e quero desenhar em cada um deles. No entanto, parece que a solução oferecida pelaDesenhando em uma imagem com TikZsó funciona para imagens centralizadas em (0, 0), pois se tento desenhar na minha segunda imagem, as coordenadas não se comportam conforme o esperado:

\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:

Não é o efeito desejado

Eu gostaria de um sistema de coordenadas transformado com a origem no canto inferior esquerdo da imagem e o ponto (1, 1) no canto superior direito. Isto funciona para a imagem localizada em (0, 0), mas não para a imagem localizada imediatamente à direita. Por que não e como consigo o efeito desejado?

Responder1

Isso ocorre porque você está dimensionando os vetores unitários, x=... , y=....mas os argumentos daqueles na segunda imagem não são vetores ortogonais. Porque image2está em outro lugar e não são (x0,0)e (0,y0)tipo de coordenadas. Em vez disso, são vetores com entradas diferentes de zero. É por isso que suas coordenadas são diagonais em vez de horizontais/verticais.

Para fazer o mesmo, você precisa zerar os componentes xor correspondentes. yExemplo

\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}

insira a descrição da imagem aqui

Aqui usei a calcbiblioteca para obter a largura e a altura da imagem. Mas você pode evitar tudo isso incluindo a imagem também no escopo, de modo que tudo seja definido localmente de forma idêntica. Então você muda esses escopos. Exemplo:

\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}

isso fornece uma saída idêntica.

informação relacionada