在 JPEG 顶部的缩放坐标位置添加一个圆角矩形节点,并使用缩放的内部 xsep 和 ysep

在 JPEG 顶部的缩放坐标位置添加一个圆角矩形节点,并使用缩放的内部 xsep 和 ysep

假设我们有以下链接中给出的蘑菇的 JPEG 文件: 维基百科蘑菇

为了更容易地在 JPEG 中找到所需的点,让我们按照以下链接中 Jake 的回答在图像顶部绘制一个标记网格: JPEG 顶部的 Jake 标签网格 按照 Jake 的回答,我们定义了一个坐标系,其 (0,0) 位于 JPEG 的西南方向,(1,1) 位于 JPEG 的东北方向。假设我们想要在 JPEG 的缩放 (0.5, 0.5) 处添加一个圆角矩形节点,其内部 xsep= 0.2 单位,内部 ysep= 0.2 缩放单位。以下是我的代码:

\documentclass{standalone} 
\usepackage{tikz}
\usetikzlibrary {shapes.misc}
\usepackage{anyfontsize}
\newcommand{\midfont}{\usefont{T1}{cmr}{b}{n}\fontsize{15}{\baselineskip} \selectfont}
\begin{document} 
\begin{tikzpicture}
\node[anchor=south west,inner sep=0] (image) at (0,0) {\includegraphics[width=0.9\textwidth] 
{mushrooms.jpg}};
\begin{scope}[x={(image.south east)},y={(image.north west)}]
    \draw[help lines,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}; }
\node at ( {.5+0},.5) [ red, line width=2 pt, shape=rounded rectangle,draw, inner xsep=30, 
inner ysep=20] (rect){};
\node at ( {.5-.2},{.5+.2}) (text){\textcolor{red}{\midfont{Center is Here}}};
\draw [line width=3 pt, red][->] (rect) -- (text);
\end{scope}
\end{tikzpicture}
\end{document}

我有以下两个问题:

  1. 范围声明后 [x={(image.south east)},y={(image.north west)}] 是什么意思?
  2. 我想使用 0.2 个缩放单位作为内部 x sep 和 y sep,以使我的圆角矩形节点沿 x 方向跨越 0.2 个单位,沿 y 方向跨越 0.2 个单位。但为了做到这一点,我必须使用内部 xsep=30、内部 ysep=20。我通过反复试验做到了这一点。有没有更准确的方法来获取内部 xsep 和 ysep 的正确值,从而为矩形节点的 x 和 y 方向获得精确的 0.2 个缩放单位? 结果

答案1

x={(image.south east)}, y={(image.north west)}在可选参数中scope定义给定的/tikz/x/tikz/y单位向量scope,以便在低级 PGF 绘图系统中:

  • X坐标/tikz/x是图像的宽度(以点为单位),其坐标为0pt

  • X的坐标/tikz/y0pt及其坐标是图像的高度(以点为单位)。

这是有效的,因为前面的代码:

\node[anchor=south west, inner sep=0] (image) at (0,0)
  {\includegraphics[width=0.9\textwidth]{mushrooms.jpg}};

定义image为图像周围的紧密矩形节点,其south west角位于原点(0,0)

关于你想要实现的目标,大多数 Ti期望长度的 Z 选项将无单位输入解释为长度,这就是为什么你必须反复试验,并给和赋予“大”值inner xsepinner ysep我宁愿使用minimum widthminimum height选项来确定节点所需的宽度和高度rect。你仍然需要给它们明确的单位,或者提供长度我将使用简单的\getxlength和宏来轻松存储和的\getylength当前长度/tikz/x/tikz/y,以点表示(其他技术可以在以下答案中找到这个问题)。

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc, shapes.misc}

\newcommand{\midfont}{\fontsize{15}{18}\usefont{T1}{lmss}{m}{n}}

\makeatletter
% These assume that the /tikz/x vector is “horizontal” and /tikz/y “vertical”.
\newcommand*{\getxlength}[1]{\edef#1{\the\pgf@xx}}
\newcommand*{\getylength}[1]{\edef#1{\the\pgf@yy}}
\makeatother

\begin{document}

\centering
\begin{tikzpicture}
\node[anchor=south west, inner sep=0] (image) at (0,0)
  {\includegraphics[width=0.9\textwidth]{mushrooms.jpg}};

\begin{scope}[x={(image.south east)}, y={(image.north west)}]
  \draw[help lines, 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}; }

  % Get the unit vector lengths in points
  \getxlength{\xLen} \getylength{\yLen}
  \node[draw, red, line width=1pt, shape=rounded rectangle, inner sep=0,
        minimum width=0.2*\xLen, minimum height=0.2*\yLen]
     at (.5,.5) (rect) {};
  \node[red, font=\midfont] at (0.5-0.2, 0.5+0.2) (text) {Center is here};
  \draw[line width=1pt, red, ->] (text) -- (rect);
\end{scope}
\end{tikzpicture}

\end{document}

在此处输入图片描述

答案2

  1. [x={(image.south east)},y={(image.north west)}]定义了x 向量y 向量在范围坐标系中。

  2. inner sep参数(如inner xsepinner ysep)是绝对长度。其默认单位是pt。因此inner xsep=30相当于inner xsep=30pt

    要定义符合您要求的节点,您可以使用calcfit库。

    注意:形状的圆形部分rounded rectangle不能包含文本(查看红色和橙色节点之间的差异)。

在此处输入图片描述

\documentclass{standalone} 
\usepackage{tikz}
\usetikzlibrary {shapes.misc,fit,calc}
\usepackage{anyfontsize}
\newcommand{\midfont}{\usefont{T1}{cmr}{b}{n}\fontsize{15}{\baselineskip} \selectfont}
\begin{document} 
\begin{tikzpicture}
  \node[anchor=south west,inner sep=0] (image) at (0,0) {\includegraphics[width=0.9\textwidth] 
    {Mycena_interrupta.jpg}};
  \begin{scope}[x={(image.south east)},y={(image.north west)}]
    \draw[help lines,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}; }
    %\node at ( {.5+0},.5) [ red, line width=2 pt, shape=rounded rectangle,draw, inner xsep=30pt,inner ysep=20pt] (rect){};
    \node[fit={($(.5,.5)+(.2,.2)$)($(.5,.5)+(-.2,-.2)$)},shape=rounded rectangle,draw=red,inner sep=0,line width=2pt](rect){};
    \node at ( {.5-.3},{.5+.3}) (text){\textcolor{red}{\midfont{Center is Here}}};
    \draw [line width=3 pt, red][->] (text) -- (rect);
    \node[fit={($(.5,.5)+(.2,.2)$)($(.5,.5)+(-.2,-.2)$)},shape=rectangle,draw=orange,inner sep=0]{};
  \end{scope}
\end{tikzpicture}
\end{document}

相关内容