我正在继续我开始的例子这里,并希望在一张图片中放置两张彼此相对定位的图像,并使用两个范围作为“间谍”。以下 MWE 包括第一种方法(没有范围),我通过自己的计算定义坐标和间谍节点。但我想使用第二个示例中的范围,以便独立于我选择的图像大小(我必须更改.24\textwidth
第一张图片中的每个)。我认为相对于图像寻址(在[0,1]^2
)会更好。然而,第二个示例并没有按预期工作,甚至似乎没有遵循我能看到的规则。
简而言之,我想要一个与第一个图像一样的结果,使用范围如第二个示例中所示。
在第二种基于范围的方法中我做错了什么?
\documentclass{scrartcl}
\usepackage{amsmath, amsthm, amssymb}
\usepackage{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[english]{babel}
\usepackage{graphicx}
\usepackage{hyperref}
\usepackage{environ,ifthen,tikz,pgfplots}
\usetikzlibrary{shadings,spy,calc}
\begin{document}
What i have\\
\begin{tikzpicture}[spy using outlines={circle,size=.1\textwidth, magnification=3, connect spies}]
% image 1
\node[anchor=south west,inner sep=0pt,label={270:{(a) Image 1}}] (image1) %
at (-.375\textwidth,0) {% Dummy image 1
\begin{tikzpicture}
\path [top color=blue, bottom color=black]
(0,0) rectangle (.24\textwidth,.24\textwidth);
\end{tikzpicture}};
\node (spy1) at ($ (image1.south west) + (350/512*.24\textwidth,380/512*.24\textwidth) $) {};
\coordinate (spy1to) at ($ (image1.center) + (-.03\textwidth,.23\textwidth) $);
\spy [black,thick] on (spy1) in node at (spy1to);%
% ---
\node[anchor=south west,inner sep=0pt,%
label={[align=left]270:{(b) Image 2.}}] %
(image2) at %
(-.125\textwidth,.125\textwidth) {%
\begin{tikzpicture}
\path [top color=green, bottom color=black]
(0,0) rectangle (.24\textwidth,.24\textwidth);
\end{tikzpicture}};
\node (spy1a) at %
($ (image2.south west) + (350/512*.24\textwidth,380/512*.24\textwidth) $) {};
\coordinate (spy1ato) at ($ (image2.center) + (-.18\textwidth,.065\textwidth) $);
\spy [black,thick] on (spy1a) in node at (spy1ato);%
\end{tikzpicture}
What i would like to have but it does not work
\begin{tikzpicture}[spy using outlines={circle,size=.1\textwidth, magnification=3, connect spies}]
% image 1
\node[anchor=south west,inner sep=0pt,label={270:{(a) Image 1}}] (image1) %
at (-.375\textwidth,0) {% Dummy image 1
\begin{tikzpicture}
\path [top color=blue, bottom color=black]
(0,0) rectangle (.24\textwidth,.24\textwidth);
\end{tikzpicture}};
\begin{scope}[x={(image1.south west)}, y={(image1.north east)}] % [0,0] - [1,1] as scope of the image
\node (spy1n) at (350/512,380/512) {};%relative pixel
\coordinate (spy1nto) at (-.5,1);
\spy [black,thick] on (spy1n) in node at (spy1nto);%
\end{scope}
% ---
\node[anchor=south west,inner sep=0pt,%
label={[align=left]270:{(b) Image 2.}}] %
(image2) at %
(-.125\textwidth,.125\textwidth) {%
\begin{tikzpicture}
\path [top color=green, bottom color=black]
(0,0) rectangle (.24\textwidth,.24\textwidth);
\end{tikzpicture}};
\begin{scope}[x={(image2.south west)}, y={(image2.north east)}] % [0,0] - [1,1] as scope of the image
\node (spy2) at (350/512,380/512) {};%relative pixel
\coordinate (spy2to) at (.5,1);
\spy [black,thick] on (spy2) in node at (spy2to);%
\end{scope}
\end{tikzpicture}
\end{document}
生成的文件
编辑:正如@cfr 指出的那样:嵌套当然不是一个好主意tikzpictures
,我在这里这样做只是为了让图像打开\spy
,一般来说image
-nodes 包含.png
s,这也是我在相对寻址中的目的,即(350/512,380/512)
当然是512x512
图像中的一个像素。
答案1
我仍然不确定我是否理解了这一点。但是,我确信代码既不会也不应该按照你的想法去做 :(。这不是答案,但对于评论来说太长了……
当你写作时
\begin{scope}[x={(some point)}, y={(some other point)}]
我认为,你设定的是测量单位。在您链接的原始示例中,图片有几个重要的特征:
- 用于设置这些点的图像的西南锚点位于图片的原点。
(some point)
是南方东方锚点。它与西南锚点(即整个图片的原点)垂直对齐。(some other point)
是北方西方锚点。它与西南锚点(即整个图片的原点)水平对齐。
这意味着如果所有坐标都按 缩放,x
并且y
距离对应于{(image's south east anchor)}
,{(image's north west anchor)}
那么您可以写出(a.b)
将缩放到(xa,yb)
,这看起来好像坐标位于相对于图像的坐标系中。但实际情况是 被x
按 给出的向量(?) 缩放,(some point)
并且y
被 给出的向量缩放(some other point)
。
\documentclass[border=10pt, mult, varwidth, tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\node[anchor=south west,inner sep=0] (image) at (0,0) {\includegraphics{example-image-a}};
\begin{scope}[x={(image.south east)},y={(image.north west)}]
\foreach \i in {0,.1,...,1.1}
\foreach \j in {0,.1,...,1.1}
\path [fill=red] (\i,\j) circle (1pt);;
\end{scope}
\end{tikzpicture}
\end{document}
但这是特殊情况。如果上述条件不成立,则效果会有所不同。(也就是说,它将是通过相关向量缩放事物的效果,看起来不像相对于图像的坐标系统。)
例如:
\documentclass[border=10pt, mult, varwidth, tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\node[anchor=south west,inner sep=0] (image) at (-5,5) {\includegraphics{example-image-a}};
\begin{scope}[x={(image.south east)},y={(image.north west)}]
\foreach \i in {0,.1,...,1.1}
\foreach \j in {0,.1,...,1.1}
\path [fill=red] (\i,\j) circle (1pt);;
\end{scope}
\end{tikzpicture}
\end{document}
或者,更改(-5,5)
为(5,5)
:
因此,要使用此技巧,您需要将西南锚点置于图片的原点。显然,您无法对放置在同一张图片内不同位置的两幅图像执行此操作。所以你需要另一种方法......
答案2
以下解决方案基于 @cfr 在其(非常好的)解释中给出的提示
\begin{scope}[x={(some point)}, y={(some other point)}]
确实如此。我当时意识到,在这个问题之前,我不知道它是如何x=
工作y=
的。但多亏了他的解释,我才明白另一种方法所以解决了我的问题,虽然它没有太大的不同。对于以下解决方案,可以省略节点的锚点,imageX
因为范围通过以下方式处理该问题:
- 缩放
x=
到图像的真正宽度 - 缩放
y=
到图像的真实高度 - 改变范围,使其
image.south west
对应于(0,0)
范围内
在第一个范围内,该点(-.5,1)
指向图像顶部边界左侧的一个点,用于放置spy in
,对于第二个范围,我选择了(.5,1)
图像顶部的中心。两个spy on
节点仍然以分数形式给出,以表示像素值,准确地说,它们都指向图像中相同的相对点。以下解决方案仍然使用 atikzpicture
内部的 atikzpicture
进行说明 - 在实际代码中,您不应该在图像节点中使用它。
\documentclass{scrartcl}
\usepackage{amsmath, amsthm, amssymb}
\usepackage{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[english]{babel}
\usepackage{graphicx}
\usepackage{hyperref}
\usepackage{environ,ifthen,tikz,pgfplots}
\usetikzlibrary{shadings,spy,calc}
\begin{document}
\begin{tikzpicture}[spy using outlines={circle,size=.1\textwidth, magnification=3, connect spies}]
% image 1
\node[inner sep=0pt,label={270:{(a) Image 1}}] (image1) %
at (-.375\textwidth,0) {% Dummy image 1
\begin{tikzpicture}
\path [top color=blue, bottom color=black]
(0,0) rectangle (.24\textwidth,.24\textwidth);
\end{tikzpicture}};
\begin{scope}[x={($ (image1.south east) - (image1.south west) $ )},y={( $ (image1.north west) - (image1.south west)$ )}, shift={(image1.south west)}]
\node (spy1n) at (350/512,380/512) {};%relative pixel
\coordinate (spy1nto) at (-.5,1);
\spy [black,thick] on (spy1n) in node at (spy1nto);%
\end{scope}
%
\node[anchor=south west,inner sep=0pt,label={[align=left]270:{(b) Image 2.}}] %
(image2) at (-.125\textwidth,.125\textwidth) {%
\begin{tikzpicture}
\path [top color=green, bottom color=black]
(0,0) rectangle (.24\textwidth,.24\textwidth);
\end{tikzpicture}};
\begin{scope}[x={($ (image2.south east) - (image2.south west) $ )},y={( $ (image2.north west) - (image2.south west)$ )}, shift={(image2.south west)}]
\node (spy2) at (350/512,380/512) {};%relative pixel
\coordinate (spy2to) at (.5,1);
\spy [black,thick] on (spy2) in node at (spy2to);%
\end{scope}
\end{tikzpicture}
\end{document}
生成的图像是
正是我想要的,现在甚至包括避免anchor=south west
,其目的我也只能通过 cfrs 的回答才能理解。
综上所述,scope
此答案的构造使得relative adressing
能够针对节点大小(及其西南边缘作为原点)进行计算。尽管如此,的和node
仍然必须在之前定义,因为这会导致计算内部的坐标。coordinate
spy
spy
scope