使用装饰时,如何使用 \pgfdecoratedpathlength 进行计算?

使用装饰时,如何使用 \pgfdecoratedpathlength 进行计算?

我想用 tikz 画一幅画,并使用“装饰”在一条线上显示单个脉冲。

编译后的 Latex 输出正确:A——B

正如您所看到的,我的代码不适用于多个段(A--C--B)。

\documentclass{scrreprt}

\usepackage{pgfplots}
\usepackage{tikz}
\usetikzlibrary{decorations}

\begin{document}
\begin{figure}
    \begin{tikzpicture}[ pulse after/.style={
% does not work with two segments:
            decorate,decoration={snake,pre length=#1, post length=(\pgfdecoratedinputsegmentlength-(#1)-2mm),amplitude=5mm, segment length=3mm},thick}]
% doesn't work at all:
%           decorate,decoration={snake,pre length=#1, post length=(\pgfdecoratedpathlength-(#1)-(2mm)),amplitude=5mm, segment length=3mm},thick}] 

    \node(a){A} node(b) at (5,1) {B} node(c) at (2,-1) {C};

    \draw[->,pulse after=10mm] (a)--(b);
    \draw[->,pulse after=10mm] (a)--(c)--(b);

    \end{tikzpicture}
\end{figure}
\end{document}

我尝试使用\pgfdecoratedpathlength代替 来表示多个片段,但\pgfdecoratedinputsegmentlength根本不起作用。它只是不显示任何装饰: 使用 <code>\pgfdecoratedpathlength</code> 而不是 <code>\pgfdecoratedinputsegmentlength</code> 的结果

例如,如果你使用 ,, post length=(\pgfdecoratedpathlength/2),就会有波浪,但当然不止一个。使用 有什么问题\pgfdecoratedpathlength

我想在精确 10 毫米后绘制一个“脉冲”,不管采用哪种方式以及有多少个段。还有其他方法可以做到这一点吗?

_

问题的补充描述:(编辑:2013-10-04)

我想绘制一个同时采用不同信号路径的脉冲位置图。如果脉冲从aAc到A 的路径上b,例如距离 A 30 毫米,则它位于 C 和 B 之间的线段上(以及 A 和 B 之间)。我想在更复杂的示例中绘制此图,只需指定路径和距起点的距离,而无需计算路径前几段的距离。

答案1

发生这种情况的原因是,前部和后部长度适用于完整装饰路径。因此,如您所见,装饰在前后继续进行(c)。在您的pgfpathdecoratedpathlength例子中,10mm 加上后部长度使距离对于蛇来说太小,因此切换到最终状态。

我建议使用自定义装饰,这样生活会变得轻松一些。因为如果你放大调整后的蛇形,你会看到路径没有连接,而是由于连续蛇形的突然停止而被切断了。你可以简单地绘制一个脉冲,然后继续绘制一条更平滑的线。

\documentclass[tikz]{standalone}
\usetikzlibrary{decorations.pathmorphing}

\pgfdeclaredecoration{single pulse}{initial}{
\state{initial}[width=\pgfdecoratedinputsegmentlength]
{%
    \pgfpathlineto{\pgfpoint{10mm}{0mm}}%    
    \pgfpathsine{\pgfpoint{0.5\pgfdecorationsegmentlength}{\pgfdecorationsegmentamplitude}}%
    \pgfpathcosine{\pgfpoint{0.5\pgfdecorationsegmentlength}{-\pgfdecorationsegmentamplitude}}%
    \pgfpathlineto{\pgfpointdecoratedinputsegmentlast}%
}
\state{final}{}%
}
\begin{document}
    \begin{tikzpicture}
    \node[draw](a){A} node[draw](b) at (5,1) {B} node[draw](c) at (2,-1) {C};
    \draw[->,thick,
         decoration={single pulse,amplitude=5mm,segment length=2mm},
         decorate] (a)--(c)--(b)--(a);
    \end{tikzpicture}
\end{document}

在此处输入图片描述

距离是硬编码的,脉冲方向也不是直立的,但这些肯定可以用较少的努力来实现。

编辑:对于单个脉冲,您执行一次脉冲状态

\documentclass[tikz]{standalone}
\usetikzlibrary{decorations.pathmorphing}

\pgfdeclaredecoration{single pulse}{initial}{
\state{initial}[width=\pgfdecoratedinputsegmentlength,next state=justdraw]
{%
\pgfpathlineto{\pgfpoint{10mm}{0mm}}%
\pgfpathsine{\pgfpoint{0.5\pgfdecorationsegmentlength}{\pgfdecorationsegmentamplitude}}%
\pgfpathcosine{\pgfpoint{0.5\pgfdecorationsegmentlength}{-\pgfdecorationsegmentamplitude}}%
\pgfpathlineto{\pgfpointdecoratedinputsegmentlast}%
}
\state{justdraw}[width=\pgfdecoratedinputsegmentlength]
{%
    \pgflineto{\pgfpointdecoratedinputsegmentlast}%
}
\state{final}{}%
}
\begin{document}
    \begin{tikzpicture}
    \node[draw](a){A} node[draw](b) at (5,1) {B} node[draw](c) at (2,-1) {C};
    \draw[->,thick,
        decoration={single pulse,amplitude=5mm,segment length=2mm},
        decorate] (a)--(c)--(b)--(a);
    \end{tikzpicture}
\end{document}

在此处输入图片描述

编辑 2:无论沿途有多少路径段,只在正确的距离内包含脉冲。我不确定当距离对应于节点时会发生什么。我可以修改代码,这样如果剩余路径中没有足够的空间,就将脉冲推到下一个段,但这有点作弊。所以我会保持原样,这也是作弊 :)

\documentclass[tikz]{standalone}
\usetikzlibrary{decorations.pathmorphing}

\makeatletter
\pgfdeclaredecoration{single pulse}{initial}{
\c@pgf@countd=0%
\pgfutil@tempdimb=0pt%
\state{initial}[
    width=\pgfdecoratedinputsegmentlength,
    persistent precomputation={%
  \ifnum\the\c@pgf@countd>0\relax%Nevermind
    \c@pgf@countd=2\relax%
  \else%
    \pgfmathsetlength\pgfutil@tempdimb{%}
       \pgfdecoratedcompleteddistance+\pgfdecoratedinputsegmentlength
    }%
    \ifdim\pgfutil@tempdimb<\pgfmetadecorationsegmentlength\relax%
      \c@pgf@countd=0%
      \else%
      \c@pgf@countd=1\relax%
      \fi%
   \fi%
     }
]
{%
\ifnum\the\c@pgf@countd=1\relax%
  \pgfpathlineto{\pgfpoint{%}
    \pgfmetadecorationsegmentlength-\pgfdecoratedcompleteddistance}{0mm}
  }%
  \pgfpathsine{\pgfpoint{0.5\pgfdecorationsegmentlength}{\pgfdecorationsegmentamplitude}}%
  \pgfpathcosine{\pgfpoint{0.5\pgfdecorationsegmentlength}{-\pgfdecorationsegmentamplitude}}%
  \pgfpathlineto{\pgfpointdecoratedinputsegmentlast}%
\else%
  \pgfpathlineto{\pgfpointdecoratedinputsegmentlast}%
\fi%
}%
\state{final}{}%
}
\makeatother
\begin{document}
    \begin{tikzpicture}
    \node[draw](a){A} 
     node[draw](b) at (5,1) {B} 
     node[draw](c) at (2,-1){C} 
     node[draw](d) at (0,1) {D}
     node[draw](e) at (1,2) {E}
     node[draw](f) at (2,2) {F};
    \draw[->,thick,
        decoration={single pulse,amplitude=5mm,segment length=2mm,meta-segment length=16mm},
        decorate] (a)--(c)--(b);
        \draw[->,thick,
        decoration={single pulse,amplitude=5mm,segment length=2mm,meta-segment length=15mm},
        decorate] (a)--(b);
        \draw[->,thick,
        decoration={single pulse,amplitude=5mm,segment length=2mm,meta-segment length=15mm},
        decorate] (a)--(d)--(e)--(f)--(b);
    \end{tikzpicture}
\end{document}

在此处输入图片描述

我们还可以将详细设置包装在样式中

\tikzset{
 pulse/.style args={#1w#2h#3o}{decoration={single pulse,amplitude=#2,segment length=#1,meta-segment length=#3},decorate}
}

然后你可以使用

\draw[->,thick,pulse=3mm w 5mm h 30 mm o] (a)--(c)--(b);

用于宽度、高度和偏移尺寸。

相关内容