我仍在努力根据锚点定位标签,以便通过负缩放(镜像)正确地转换锚点。在线程中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 标签不受负缩放的影响,翻转后将处于错误的位置。碰巧的是,这些图表有一些重复的结构,我通过将子图移到正确的位置来构建它们。这就是标签定位目前失败的地方。
答案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),使这个差异可以忽略不计(只要您的图像大约是页面大小)。