我想用 tikz 画一幅画,并使用“装饰”在一条线上显示单个脉冲。
正确: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
根本不起作用。它只是不显示任何装饰:
例如,如果你使用 ,, post length=(\pgfdecoratedpathlength/2),
就会有波浪,但当然不止一个。使用 有什么问题\pgfdecoratedpathlength
?
我想在精确 10 毫米后绘制一个“脉冲”,不管采用哪种方式以及有多少个段。还有其他方法可以做到这一点吗?
_
问题的补充描述:(编辑:2013-10-04)
我想绘制一个同时采用不同信号路径的脉冲位置图。如果脉冲从a
Ac
到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);
用于宽度、高度和偏移尺寸。