这可能是这些问题的后续: 旋转 tikzpicture 弄乱了交叉点一个为什么这些 TikZ 交叉点缩放不正确?
让我们使用这个 MWE:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{intersections}
\begin{document}
\begin{tikzpicture}[scale=1]
\draw[name path=line 1] (1,1) -- +(-20:5);
\draw[name path=line 2] (1,-1) -- +(20:5);
\path[name intersections={of=line 1 and line 2}] (intersection-1) node (i){};
\fill (i) circle[radius=0.05cm];
\draw[blue] ([shift={(i.center)}]20:1) arc[radius=1, start angle=20, end angle= -20];
\end{tikzpicture}
\end{document}
这定义了一个交点 (i),并在两条线之间绘制了一个圆(用于检查位置)和一条圆弧。效果非常好:
但是当我将比例增加到例如 2 时,它就不再正确了:
请注意,黑点位于正确的位置,因此它不是上述两个线程中已知的错误。
由于在两种情况下手动设置移位坐标都会(3.7, 0)
产生近乎完美的输出,因此arc
命令本身一定是没问题的。
我已经尝试过其他帖子中的修复方法,例如
\path[name intersections={of=line 1 and line 2,by={i}}];
和
\path[coordinate, name intersections={of=line 1 and line 2}] (intersection-1) node (i){};
但都没有用。
有任何想法吗?
答案1
罪魁祸首似乎是[shift=...]
。 像 这样的坐标(i.center)
以绝对单位给出,但shift
似乎无论如何都应用了比例因子。 请参阅[shift only]
关键(第 359 页)。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{intersections}
\begin{document}
\begin{tikzpicture}[scale=2]
\draw[name path=line 1] (1,1) -- +(-20:5);
\draw[name path=line 2] (1,-1) -- +(20:5);
\path[name intersections={of=line 1 and line 2}] (intersection-1) node (i){};
\fill (i) circle[radius=0.05cm];
\draw[blue] (i) ++(20:1) arc[radius=1, start angle=20, end angle= -20];
\draw[red] (i.center) -- ([shift=(i.center)] 0,0);& demonstrate difference
\draw[green, shift only] (i.center) -- ([shift=(i.center)] 0,0);% fix
\end{tikzpicture}
\end{document}
答案2
这是一个使用 calc 库的解决方案,只需对代码和思维进行最少的更改
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{intersections,calc}
\begin{document}
\begin{tikzpicture}[scale=2.5]
\draw[name path=line 1] (1,1) -- +(-20:5);
\draw[name path=line 2] (1,-1) -- +(20:5);
\path[name intersections={of=line 1 and line 2}] (intersection-1) node (i){};
\fill (i) circle[radius=0.05cm];
\draw[red] ($(i.center)+(20:1)$) arc[radius=1, start angle=20, end angle= -20];
\end{tikzpicture}
\end{document}
编辑(问题解释)
下一个代码是使用来回移位命令,可以使用 x,y 移位,也可以使用极轴移位:
\documentclass{article}
\usepackage{tikz}
\usepackage{pgf}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}[scale=2.5]
\def\CenterX{0.}
\def\CenterY{0.}
\def\DistanceFTarget{1}
\def\AngleFTarget{30}
\def\DistanceSTarget{2}
\def\AngleSTarget{-30}
\node at (\CenterX,\CenterY) (Center) {};
\fill[black] (Center) circle (0.2);
\pgfmathsetmacro\Xft{\CenterX+\DistanceFTarget*cos(\AngleFTarget)}
\pgfmathsetmacro\Yft{\CenterY+\DistanceFTarget*sin(\AngleFTarget)}
\pgfmathsetmacro\FTargetDistX{\Xft-\CenterX}
\pgfmathsetmacro\FTargetDistY{\Yft-\CenterY}
\pgfmathsetmacro\Xst{\CenterX+\DistanceSTarget*cos(\AngleSTarget)}
\pgfmathsetmacro\Yst{\CenterY+\DistanceSTarget*sin(\AngleSTarget)}
\pgfmathsetmacro\STargetDistX{\Xst-\CenterX}
\pgfmathsetmacro\STargetDistY{\Yst-\CenterY}
\draw[fill=blue] (\Xft,\Yft) node[right] {target1} circle (0.1);
\draw[->,ultra thick,red] (Center)--([shift=(Center)]\FTargetDistX,\FTargetDistY);
\draw[->,green,thin] (Center)--([shift=(Center)]\AngleFTarget:\DistanceFTarget);
\draw[fill=green] (\Xst,\Yst) node[right] {target2} circle (0.1);
\draw[->,ultra thick,orange] ([shift=(Center)]\STargetDistX,\STargetDistY) --(Center);
\draw[->,green,blue] ([shift=(Center)]\AngleSTarget:\DistanceSTarget) --(Center);
\end{tikzpicture}
\end{document}
我们得到下一个输出:
即使图片已经发生移动,输出也正是我们从代码中期望的。
但是如果我们改变中心(用于转移到除当前(0,0)之外的其他点 - 比如说(1,3)-)并重新缩放(scale=1 就可以了),我们会得到以下结果:
所以问题在于缩放(不是 x 缩放或 y 缩放)不尊重我们的移位中心,必须避免。