下列的使用 TikZ 在图像上绘图,我曾多次成功地用蒂克兹。
但现在我有一个tikzpicture
环境一些图形,我想在每个图形上绘图。但是,似乎使用 TikZ 在图像上绘图仅适用于以 (0, 0) 为中心的图片,因为如果我尝试在第二张图片上绘图,坐标将不会按预期运行:
\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}
结果:
我想要一个转换后的坐标系,原点位于图片左下角,点 (1, 1) 位于右上角。这适用于位于 (0, 0) 的图片,但不适用于位于右侧的图像。为什么不行?我该如何实现所需的效果?
答案1
这是因为您正在通过缩放单位向量,x=... , y=....
但第二幅图中的参数不是正交向量。因为image2
它们在其他地方,它们不是坐标(x0,0)
类型(0,y0)
。相反,它们是具有非零项的向量。这就是为什么您的坐标是对角线而不是水平/垂直的。
x
要执行相同操作,您需要将相应的或组件清零y
。示例
\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}
这里我使用calc
库来获取图像的宽度和高度。但是,您可以通过将图像也包含在范围内来避免所有这些问题,这样所有内容在本地都定义相同。然后您可以转移这些范围。示例:
\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}
这给出了相同的输出。