![如何在 Tikz 中使用控件和 +、++ 符号?](https://linux22.com/image/400859/%E5%A6%82%E4%BD%95%E5%9C%A8%20Tikz%20%E4%B8%AD%E4%BD%BF%E7%94%A8%E6%8E%A7%E4%BB%B6%E5%92%8C%20%2B%E3%80%81%2B%2B%20%E7%AC%A6%E5%8F%B7%EF%BC%9F.png)
我想使用贝塞尔控制点绘制一条曲线路径,并带有以下符号
<a> .. controls <b> and <c> ... <d>;
我还想指定坐标 b 和 c相对地彼此相对(b 相对 a,c 相对 b)。为此,我想使用“+”和/或“++”符号。我以为我理解了(阅读手册和另一篇类似的(旧)帖子这里),但我显然遗漏了一些东西。
这是我的做法:
\draw[->, thin] (alpha.east) .. controls ++(2.5cm,0) and ++(0,1cm) .. (beta.west);
\draw [red] (alpha.east) -- ++(2.5cm,0) -- ++(0,1cm) -- (beta.west);
第二行代码只是为了帮助我理解我在做什么。它给出的是:
因此,它从 alpha.east 开始,显然朝向位于其右侧 2.5 厘米处的点,这是可以的。但是,根据 Tikz 手册:“那么曲线确实会在 beta.west 处结束,并且曲线在点 beta.west 处的切线将经过第二个控制点。“
这里我在 beta 附近的箭头指向下方,这显然表明曲线在 beta.west 处的切线才不是指向我的第二个控制点!
我理解错了什么吗?
多谢!
编辑:
感谢 daleif 的回答。因此,为了给出一个可行的示例,我在下面答案中改编了 daleif 给出的代码。代码如下:
\documentclass[tikz]{standalone}
\usetikzlibrary{decorations.pathreplacing}
\tikzset{%
show curve controls/.style={
postaction={
decoration={
show path construction,
curveto code={
\draw [blue]
(\tikzinputsegmentfirst) -- (\tikzinputsegmentsupporta)
(\tikzinputsegmentlast) -- (\tikzinputsegmentsupportb);
\fill [red, opacity=0.5]
(\tikzinputsegmentsupporta) circle [radius=.2ex]
(\tikzinputsegmentsupportb) circle [radius=.2ex];
}
},
decorate
}}}
\begin{document}
\begin{tikzpicture}
\node (alpha) at (0,-2) {\includegraphics[width=.17\textwidth]{alpha.png}};
\node (beta) at (7,0) {\includegraphics[width=.25\textwidth]{beta.png}};
\draw [show curve controls]
(alpha.east)
.. controls ++(2.5cm,0) and ++ (0,1cm) ..
(beta.west);
\end{tikzpicture}
\end{document}
以下是它的结果:
所以,我发现我的第二个控制点的位置并不如我所愿,但我仍然不明白为什么。为什么它不位于第一个控制点上方 1cm 处?
再次感谢!
答案1
好的,找到了。
我没有在手册中查找到正确的位置。以下是解释(手册第 13.4.1 节):
“有一种特殊情况,相对坐标的解释不同。如果使用相对坐标作为贝塞尔曲线的控制点,则适用以下规则:首先,相对第一个控制点是相对于曲线的起点取的。其次,相对第二个控制点是相对于曲线的终点取的。第三,曲线的相对终点是相对于曲线的起点取的。”
答案2
评论太长了
顺便说一句:请始终提供自包含的完整最小示例,而不是像这样的片段。自包含的示例更易于测试。
下面是一个显示相对控制点的示例。我在这里使用极坐标。
\documentclass[tikz]{standalone}
\usetikzlibrary{decorations.pathreplacing}
\tikzset{%
show curve controls/.style={
postaction={
decoration={
show path construction,
curveto code={
\draw [blue]
(\tikzinputsegmentfirst) -- (\tikzinputsegmentsupporta)
(\tikzinputsegmentlast) -- (\tikzinputsegmentsupportb);
\fill [red, opacity=0.5]
(\tikzinputsegmentsupporta) circle [radius=.2ex]
(\tikzinputsegmentsupportb) circle [radius=.2ex];
}
},
decorate
}}}
\begin{document}
\begin{tikzpicture}
\coordinate (A) at (0,0);
\coordinate (B) at (5,5);
\draw [show curve controls]
(A)
.. controls ++(0:5) and ++ (0:5) ..
(B)
;
\end{tikzpicture}
\end{document}