tikz:标签锚点对于负缩放和平移是否稳健?

tikz:标签锚点对于负缩放和平移是否稳健?

我仍在努力根据锚点定位标签,以便通过负缩放(镜像)正确地转换锚点。在线程中tikz:标签定位对于负缩放是否稳健?问题似乎解决了。新的锚点适用于(负)缩放和旋转,但在移位下会失效。有想法如何修改代码以anchor at angle适应移位吗?

在下面的测试图像中,显示了标签的边界框以及锚点。第一张图像是原始的、未转换的版本。第二张图像显示 y 轴上的镜像按预期工作:所有锚点都正确镜像。第三张和第四张图像表明,当移动图像时,这种情况不再成立。锚点似乎位于从中心开始沿着移位向量的线与边界框相交的地方。正确地说,第三张和第四张图像应该与第一张图像相同。

\documentclass[tikz]{standalone}
\makeatletter
\tikzset
 {anchor at angle/.code=
   {\pgfpointtransformed{\pgfpointpolar{#1}{1pt}}
    \pgfmathanglebetweenpoints{\pgfqpoint{-\pgf@x}{-\pgf@y}}{\pgfpointorigin}
    \def\tikz@anchor{\pgfmathresult}
   }
 }
\newcommand\test[1]%
 {\tikz[#1] \draw (0,0) node{#1}
  \foreach \A/\L in {0/a,30/b,60/c,90/d,120/e,150/f,180/g,210/h,240/i,270/j,300/k,330/l}
  { (\A:1.5cm) node[circle,draw,inner sep=0,minimum width=5mm] {} % circle
   +(\A:  4mm) node[anchor at angle=\A+180,inner sep=0,draw] {\L} % label
               node[circle,inner sep=0,fill=black,minimum width=0.5mm] {} % anchor marker
  };
 }
\begin{document}
\test{}
\test{xscale=-1}
\test{shift={(1,1)}}
\test{shift={(1,0)}}
\end{document}

我需要它的原因:我构建了图表,希望能够根据需要上下翻转或左右翻转。问题是将标签附加到位置(锚点)也会翻转的节点上。标准 tikz 标签不受负缩放的影响,翻转后将处于错误的位置。碰巧的是,这些图表有一些重复的结构,我通过将子图移到正确的位置来构建它们。这就是标签定位目前失败的地方。 enter image description here

答案1

@Emma 说出了正确答案: 是origin没有经过变换的原点。另一方面,\pgfpointpolar是有变换的。

因此,自然的解决方案是通过变换来引用这两个点,如下所示:

\pgfpointtransformed{\pgfpointpolar{#1}{1pt}}\pgf@xa\pgf@x\pgf@ya\pgf@y
\pgfpointtransformed{\pgfpointpolar{#1}{0pt}}\pgf@xb\pgf@x\pgf@yb\pgf@y
\pgfmathanglebetweenpoints{\pgfqpoint{-\pgf@xa}{-\pgf@ya}}{\pgfqpoint{-\pgf@xb}{-\pgf@yb}}
\def\tikz@anchor{\pgfmathresult}

答案2

在我看来,问题在于会\pgfpointorigin产生未移位的原点。我对 pgf 了解不够多,无法告诉您如何在不旋转它的情况下移动它。

但是,我确实有一个近似的解决方案:由于代码只是试图获取转换后的标签角度的真实角度,您可以通过将 1pt 偏移替换为非常\pgfpointpolar大的偏移(如 500cm),使这个差异可以忽略不计(只要您的图像大约是页面大小)。

相关内容