将变换应用于使用命名节点定义的 tikz 图片

将变换应用于使用命名节点定义的 tikz 图片

我有一张 tikz 图片,我想旋转和移动它。如果我用数字坐标定义图片,效果很好。如果我用命名坐标(我为许多图片使用的方便参考点)定义图片,则变换不适用。

在此处输入图片描述

(呃,抱歉,图片比较小。我猜是因为默认单位是厘米?)。

在第一个例子中,我定义了一个named line从点 (A) 到 (B) 的图片。在下面的例子中,我定义了一个unnamed line从点 (0,0) 到 (1, 0) 的图片(分别是 A 和 B)。

然后我对图片应用变换 ( xscale=-1)。命名的线没有变换,而未命名的线变换了。

我猜想 (A) 和 (B) 的坐标定义对变换是不变的?有没有办法让它们服从变换?(我有相当多的坐标,我重复使用了好几次,如果只用标签而不是数字来引用它们就好了。我想我可以,\def\coordA{(0,0)}但我想知道是否有 Tikz 解决方案)。

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{scopes}
\tikzset{
  named line/.pic = {
    \draw (A) -- (B);
  },
  unnamed line/.pic = {
    \draw (0,0) -- (1, 0);
  }
}
\begin{document}
\begin{tikzpicture}
  \coordinate (A) at (0, 0);
  \coordinate (B) at (1, 0);

  \draw pic [red] {named line};
  \draw pic [blue,xscale=-1] {named line};

  \begin{scope}[yshift=-1cm] 
    \draw pic [red] {unnamed line};
    \draw pic [blue,xscale=-1] {unnamed line};
  \end{scope}
\end{tikzpicture}
\end{document}

答案1

需要注意的一点是,您可以\coordinate随意重新定义 s,因此您可能做的一件事就是定义以下命令:

\newcommand\setcoordinates{
  \coordinate (A) at (0, 0);
  \coordinate (B) at (1, 0);
}

\setcoordinates然后,每次需要转换时,都可以说。Tikz 坐标不应该被转换。但是,如果您确实想转换它们,则以下代码定义了一个键,(A)该键会更改查找节点坐标的方式以实现此目的:(B)transform coordinatestikz

\documentclass{article}
\usepackage{tikz}
\makeatletter
\def\tikz@calc@anchor@modified#1.#2\tikz@stop{%
  \bgroup
  \pgftransformreset
  \pgfpointanchor{\tikz@pp@name{#1}}{#2}%
  \edef\tikz@point@smuggle{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
  \expandafter\egroup
  \tikz@point@smuggle
}

\tikzset{transform coordinates/.code={\let\tikz@calc@anchor\tikz@calc@anchor@modified}}
\makeatother

\begin{document}
\begin{tikzpicture}
  \coordinate (A) at (0, 0);

  \draw (A) circle [radius=10pt];

\draw[xshift=1cm,red] (A) circle [radius=10pt];
\end{tikzpicture}


\begin{tikzpicture}[transform coordinates]
  \coordinate (A) at (0, 0);

  \draw (A) circle [radius=10pt];

\draw[xshift=1cm,red] (A) circle [radius=10pt];
\end{tikzpicture}

\begin{tikzpicture}
\coordinate (A) at (0, 0);

\draw (A) circle [radius=10pt];

\draw[xshift=1cm,red,transform coordinates] (A) circle [radius=10pt];
\end{tikzpicture}
\end{document}

输出:

在此处输入图片描述

相关内容