裁剪范围的边界框

裁剪范围的边界框

在以下示例中,我\clip截取了一个 3x3 矩形图像。我期望结果scope具有 3x3 的边界框,因此两个文本应该node与裁剪图片的范围对齐。相反,如果我(0,0)(3,3)没有剪辑图像。

\documentclass[margin=3mm,tikz]{standalone}
\usepackage{tikz}
\usepackage{mwe}

\begin{document}

\begin{tikzpicture}

\begin{scope}
  \clip (9, 5) rectangle ++ (-3,-3);
  \node[anchor=south west,inner sep=0] at (0,0)
    {\includegraphics[width=0.9\textwidth]{example-image.jpg}};
\end{scope}

\draw (0,0) node{(0,0)};
\draw (3,3) node{(3,3)};

\end{tikzpicture}

\end{document}

在此处输入图片描述

我如何剪辑scope以便其边界框从(0,0)(3,3)同时保持与当前相同的内容?例如,我想要这样:

在此处输入图片描述

(请注意,这是一个简化的示例。在我的实际用例中,有很多绘制发生(并且不涉及图像)scope,所以这与使用图像无关)

答案1

正如@SebGlav 所提到的,您似乎正在寻找两个命令的组合clip(定义图像的哪部分可见)和shift(改变原点)。

为了简化这个双重命令,您可以定义一个clip and shift完成该任务的新样式。

\documentclass[tikz,border=7pt]{standalone}
\tikzset{
  % usage in scope style: clip and shift={path}
  clip and shift/.code = {
    \clip #1 (current path bounding box.south west)
      coordinate (clip and shift origin);
  },
  clip and shift/.append style = {shift={(clip and shift origin)}}
}
\begin{document}
  \begin{tikzpicture}

    \fill[red] (9,5) circle(3pt) node[above right]{(9,5)};
    \fill[red] (7,2) circle(3pt) node[below left]{(7,2)};

    \begin{scope}[clip and shift={(9,5) rectangle +(-2,-3)}]
      \node[anchor=south west,inner sep=0] at (0,0)
        {\includegraphics[width=0.9\textwidth]{example-image.jpg}};

      \fill[blue] (0,0) circle(3pt) node[above right]{(0,0)};
      \fill[blue] (2,3) circle(3pt) node[below left]{(2,3)};
    \end{scope}
  \end{tikzpicture}
\end{document}

编辑:该代码已根据评论中的@cactus 请求进行修改。

在此处输入图片描述

答案2

也许你会发现use as bounding box语法很有趣。然后使用带有移动坐标系的范围。

用作边界框

\documentclass[border=3.14mm,tikz]{standalone}

\begin{document}
    \begin{tikzpicture}
        \begin{scope}
        \clip (6,2) rectangle (9,5);
        \node[anchor=south west,inner sep=0] at (0,0)
            {\includegraphics[width=0.9\textwidth]{example-image.jpg}};
        \useasboundingbox (6,2) rectangle (9,5);
        \end{scope}
        \begin{scope}[xshift=6cm,yshift=2cm]
            \draw[red] (0,0) grid (3,3);
            \path (0,0) node{(0,0)};
            \path (3,3) node{(3,3)};
        \end{scope}
    \end{tikzpicture}
\end{document}

编辑

如果您想将剪辑用作边界框(而不是再次输入它),您可以将剪辑定义为可重复使用的路径:

\documentclass[border=3.14mm,tikz]{standalone}

\begin{document}
    \begin{tikzpicture}
        \def\clipbox{(6,2) rectangle (9,5)} % <--- Define here
        \begin{scope}
        \clip \clipbox; % <--- Use here
        \node[anchor=south west,inner sep=0] at (0,0)
            {\includegraphics[width=0.9\textwidth]{example-image.jpg}};
        \useasboundingbox \clipbox; % <--- And use there
        \end{scope}
        \begin{scope}[xshift=6cm,yshift=2cm]
            \draw[red] (0,0) grid (3,3);
            \path (0,0) node{(0,0)};
            \path (3,3) node{(3,3)};
        \end{scope}
    \end{tikzpicture}
\end{document}

相关内容