如何将用 \draw..controls.. 定义的曲线的绘制限制在特定范围内?
例如:\draw 定义到 x=9,但我想在 x>=8 时停止 \draw
\draw[->]
(3,1) .. controls (3.75,1.4) and (4.25,1.4) ..
(5,1) .. controls (5.75,0.6) and (6.25,0.6) ..
(7,1) .. controls (7.75,1.4) and (8.25,1.4) ..
(9,1);
答案1
在你的简单情况下——因为你想在长度的一半处停止曲线和\pgfpathcurvebetweentime
时间——您可以使用没有适当的 TikZ 路径操作的PGF 级别命令。
代替
(7,1) .. controls (7.75,1.4) and (8.25,1.4) .. (9,1)
你需要写
(7,1) to[shorten controls={0 .. (7.75,1.4) and (8.25,1.4) .. .5}] (9,1)
0
其中曲线仅在时间和之间绘制1 - .5
。(如果两者都是,0
则将绘制曲线的全部。)
您不能沿着该路径放置节点(但我相信这可以很容易地实现)。
对于更复杂的情况,我认为最好的方法是使用spath3
图书馆。
我还添加了一条非常相似的曲线sin
,虽然cos
它没有给出完全相同的曲线,但在您的情况下可能已经足够好了。
代码
\documentclass[tikz]{standalone}
\makeatletter
\tikzset{
shorten controls/.code args={#1..#2..#3}{
\pgfutil@in@{and}{#2}%
\ifpgfutil@in@\expandafter\pgfutil@firstoftwo
\else\expandafter\pgfutil@secondoftwo\fi
{\pgfkeysvalueof{/tikz/@shorten controls/.@cmd}#1..#2..#3\pgfeov}
{\pgfkeysvalueof{/tikz/@shorten controls/.@cmd}#1..#2and#2..#3\pgfeov}%
},
@shorten controls/.style args={#1..#2and#3..#4}{
to path={
\pgfextra
\pgfpathcurvebetweentime{#1}{1-(#4)}
{\tikz@scan@one@point\pgfutil@firstofone(\tikztostart)}
{\tikz@scan@one@point\pgfutil@firstofone#2}
{\tikz@scan@one@point\pgfutil@firstofone#3}
{\tikz@scan@one@point\pgfutil@firstofone(\tikztotarget)}%
\endpgfextra
}
}
}
\makeatother
\begin{document}
\begin{tikzpicture}[dashed]
\draw[->, red, dash phase=3pt]
(3,1) .. controls (3.75,1.4) and (4.25,1.4) ..
(5,1) .. controls (5.75,0.6) and (6.25,0.6) ..
(7,1) to[shorten controls={0 .. (7.75,1.4) and (8.25,1.4) .. .5}]
(9,1);
\draw[->, blue]
(3,1) sin ++(1,.3) cos ++(1,-.3) sin ++(1,-.3) cos ++(1,.3) sin ++(1,.3);
\end{tikzpicture}
\tikz\draw[->]
(3,1) .. controls (3.75,1.4) and (4.25,1.4) ..
(5,1) .. controls (5.75,0.6) and (6.25,0.6) ..
(7,1) to[shorten controls={0 .. (7.75,1.4) and (8.25,1.4) .. .5}]
(9,1);
\tikz\draw[->]
(3,1) sin ++(1,.3) cos ++(1,-.3) sin ++(1,-.3) cos ++(1,.3) sin ++(1,.3);
\end{document}