在示波器中使用 tikz spy 来相对定位两个图像/示波器中的点

在示波器中使用 tikz spy 来相对定位两个图像/示波器中的点

我正在继续我开始的例子这里,并希望在一张图片中放置两张彼此相对定位的图像,并使用两个范围作为“间谍”。以下 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 包含.pngs,这也是我在相对寻址中的目的,即(350/512,380/512)当然是512x512图像中的一个像素。

答案1

我仍然不确定我是否理解了这一点。但是,我确信代码既不会也不应该按照你的想法去做 :(。这不是答案,但对于评论来说太长了……

当你写作时

\begin{scope}[x={(some point)}, y={(some other point)}]

我认为,你设定的是测量单位。在您链接的原始示例中,图片有几个重要的特征:

  1. 用于设置这些点的图像的西南锚点位于图片的原点。
  2. (some point)是南方东方锚点。它与西南锚点(即整个图片的原点)垂直对齐。
  3. (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仍然必须在之前定义,因为这会导致计算内部的坐标。coordinatespyspyscope

相关内容