如何制作中间有 1 厘米锯齿状的 TikZ 装饰?
这是我目前所拥有的,但它不起作用:
\pgfdeclaremetadecoration{timearrow}{initial}{
\state{initial}[width=0pt, next state=arrow] {
\pgfsetlinewidth{1pt}
\pgfset{/pgf/decoration/segment length=8pt}
\pgfmathtruncatemacro{\blah}{\pgfmetadecoratedpathlength/2 - 1cm}
}
\state{arrow}[switch if less than=1cm to final,
width=\blah ,
next state=zigzag] {
\decoration{curveto}
\beforedecoration {\pgfpathmoveto{\pgfpointmetadecoratedpathfirst}}
}
\state{zigzag}[width=1cm,
next state=final] {
\decoration{zigzag}
}
\state{final}[] {
\decoration{curveto}
\beforedecoration{\pgfpathmoveto{\pgfpointmetadecoratedpathfirst}}
}
}
答案1
您的风格对我来说很有效,除了锯齿形部分没有正确居中,因为您将其移动了1cm
,而不是移动了0.5cm
。
我建议将装饰中尽可能多的长度保留为变量,而不是对值进行硬编码。如果设置\pgfset{/pgf/decoration/segment length=8pt}
,则您无法通过将其设置segment length=<value>
为装饰选项来更改锯齿波长。同样适用于\pgfsetlinewidth{1pt}
:如果您省略此线,则可以像使用任何其他 TikZ 路径一样指定线宽。如果您需要使用相同的值频繁绘制装饰,则可以定义一种为您设置这些值的新样式。
此外,您不需要\beforedecoration{\pgfpathmoveto{\pgfpointmetadecoratedpathfirst}}
在每个片段的开头说明各个片段是否连接在一起。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations,decorations.pathmorphing}
\pgfdeclaremetadecoration{middlezigzag}{straight}{
\state{straight}[switch if less than=\pgfmetadecorationsegmentlength to final,
width=\pgfmetadecoratedpathlength/2 - \pgfmetadecorationsegmentlength/2 ,
next state=zigzag] {
\decoration{curveto}
}
\state{zigzag}[width=\pgfmetadecorationsegmentlength,
next state=final] {
\decoration{zigzag}
}
\state{final}{
\decoration{curveto}
\beforedecoration{\pgfpathmoveto{\pgfpointmetadecoratedpathfirst}}
}
}
\tikzset{
middle zigzag/.style={
decorate,
decoration={
middlezigzag,
meta-segment length=#1,
segment length=0.5cm
}
},
middle zigzag/.default=1cm
}
\begin{document}
\begin{tikzpicture}
\draw [gray!50,yshift=-0.5cm] (0,0) grid (5,1);
\draw [middle zigzag, ultra thick] (0,0) -- (5,0);
\end{tikzpicture}
\end{document}