TikZ:使用间谍库进行放大

TikZ:使用间谍库进行放大

在这篇文章中如何缩放 TiKZ 图片的局部?中,Martin Scharrer 演示了如何使用间谍库放大图片的某个部分TikZ

(1)是否有可能在监视窗口内构建不会出现在大图中的单独线条、节点等?

(2)我可以把间谍改成圆圈吗?

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{spy}
\usetikzlibrary{intersections}
\begin{document}
\begin{tikzpicture}[spy using outlines]
  \coordinate (F) at (2, 0);

  \draw[name path = line] (F) -- ++(30:1cm and 2cm) coordinate (A);
  \draw (F) -- ++(100:1cm) coordinate (P3);

  \draw[name path = arc] let
      \p0 = (F),
      \p1 = (A),
      \p2 = (P3),
      \n1 = {atan2(\x1 - \x0, \y1 - \y0)},
      \n2 = {atan2(\x2 - \x0, \y2 - \y0)},
      \n3 = {1cm},
      \n4 = {(\n2 + \n1) / 2}
    in (F) +(\n1:\n3) arc[radius = \n3, start angle = \n1, end angle = \n2]
    node[font = \scriptsize, fill = white, inner sep = 0cm] at
    ([shift = (F)] \n4:\n3) {\(\nu_A\)} coordinate (N);

    \path[name intersections = {of = line and arc, by = B}];
    \spy [blue, draw, height = .5cm, width = .5cm, magnification = 2,
    connect spies] on ($(F)!.5!(B)$) in node at ($(F)!.5!(B) + (0, -1)$);
\end{tikzpicture}
\end{document}

在此处输入图片描述

(1) 的一个例子是,我能否为所监视的线构建一条法线,该线仅显示在窗口中而不显示在原始图片中?


编辑1:

使用托拜厄斯法,我可以让 MWE 工作,但是当我使用我的代码时,图片不会在节点中绘制。它绘制在节点之外和图片之外。此外,一些来自父图片的线条应该在节点中,但却不存在。没有编译错误,代码很长。由于 MWE 没有这个问题,我该怎么做才能澄清我的问题,以便得到帮助?下面是一张显示正在发生的事情的图片:

在此处输入图片描述

我们可以看到,在图片的边缘,画出了线条,在 spy 窗口中,红色椭圆不见了,而在父图像中,有一个圆弧,圆弧上有 phi,它应该在 spy 中。同样,没有编译错误。

答案1

第二个问题看起来很容易解决。你可以使用spy using outlines=circle,你可以使用\spy [circle …] …

第一个问题的答案取决于您到底想做什么。

通常我们可以使用 来path picture实现与路径大小相同的矩形形状。path picture与命名节点并在稍后引用它(我也在下面的代码中这样做了)相比, 的优点是它会根据节点的形状路径进行裁剪,并且也会位于背景中。

这里的问题是,间谍机制是通过path picture自身实现的。任何其他额外内容path picture都会覆盖任何先前给定的路径图,或者被任何后续路径图(即执行间谍活动的路径图)覆盖。

不作任何保证,下面的解决方案包含一个附加path picture extra键,该键仅设置默认路径图片中硬编码的宏。请注意,内部的任何路径path picture都会从其自身继承样式spy on node

但是您无法引用原始图片中的任何内容,因为它已保存在 (TeX) 框中并且只是转换为spy on node

代码

\documentclass[tikz,convert=false]{standalone}
\usetikzlibrary{calc}
\usetikzlibrary{spy}
\usetikzlibrary{intersections}
\makeatletter
\tikzset{
  path picture/.code=\tikz@addmode{\def\tikz@path@picture{#1\tikz@path@picture@extra}},
  path picture extra/.code={\def\tikz@path@picture@extra{#1}}
}
\let\tikz@path@picture@extra\pgfutil@empty
\makeatother
\begin{document}
\begin{tikzpicture}
  \begin{scope}[spy using outlines]
  \coordinate (F) at (2, 0);

  \draw[name path = line] (F) -- ++(30:1cm and 2cm) coordinate (A);
  \draw (F) -- ++(100:1cm) coordinate (P3);

  \draw[name path = arc] let
      \p0 = (F),
      \p1 = (A),
      \p2 = (P3),
      \n1 = {atan2(\x1 - \x0, \y1 - \y0)},
      \n2 = {atan2(\x2 - \x0, \y2 - \y0)},
      \n3 = {1cm},
      \n4 = {(\n2 + \n1) / 2}
    in (F) +(\n1:\n3) arc[radius = \n3, start angle = \n1, end angle = \n2]
    node[font = \scriptsize, fill = white, inner sep = 0cm] at
    ([shift = (F)] \n4:\n3) {\(\nu_A\)} coordinate (N);

    \path[name intersections = {of = line and arc, by = B}];
    \spy [blue, circle, draw, height = .5cm, width = .5cm, magnification = 2, connect spies,
      path picture extra={
        \draw (path picture bounding box.north west) -- (path picture bounding box.south east);
        \draw[help lines, step=.1cm] (path picture bounding box.south west) grid (path picture bounding box.north east);
      }] on ($(F)!.5!(B)$) in node (s) at ($(F)!.5!(B) + (0, -1)$);
 \end{scope}
 \draw([shift=(left:.25)]s.west) arc [radius=.5, start angle=180, end angle=0];
\end{tikzpicture}
\end{document}

输出

在此处输入图片描述

相关内容