Tikz \draw 控件范围有限

Tikz \draw 控件范围有限

如何将用 \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}

输出

在此处输入图片描述 在此处输入图片描述 在此处输入图片描述

相关内容