结合随机步骤和法线向量的装饰

结合随机步骤和法线向量的装饰

我正在尝试使用随机步骤和方向来装饰一条路径,并且在每个段上绘制正常的箭头。

我面临多个问题:

  • 随机部分单独运行良好,但为了绘制箭头,我需要重新定位起点,该起点必须位于线段上,我无法确定最后一段结束的位置;我尝试使用 获取其坐标\pgfgetlastxy,但它们似乎仅限于状态范围,并且在进入新状态时重置为 0(即使重复相同的状态)。在状态的开头而不是结尾使用此命令没有帮助。因此,我得到了一条“断裂”的路径。
  • 法向量看起来不正常(第二个除外);但是两个箭头在同一条线上,指向相反的方向,正如预期的那样。我不明白原因:这是机器精度问题吗?可以解决吗?
  • 该命令的选项drawred,thick在这种情况下)仅适用于最后一段。

这是我使用的代码(\newcommand第 6 行用于在状态中出现三次相同的随机角度而不是三个不同的随机角度)和相对输出。

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{decorations.pathmorphing,positioning,calc,arrows}

\pgfdeclaredecoration{irregularArrows}{start}{
  \newcommand{\SetAngle}{\pgfmathsetmacro{\Angle}{\pgfmathresult * \pgfdecorationsegmentangle}}
  \pgfmathsetmacro{\Startx}{\pgfdecorationsegmentlength}
  \pgfmathsetmacro{\Starty}{0}
  \state{start}[width=\pgfdecorationsegmentlength]{
    \pgfmathrand{}
    \SetAngle{}
    \pgfmathsetmacro{\Startx}{\Startx - \pgfdecorationsegmentlength}
    \pgfsetarrowsend{>}
    \pgfpathmoveto{\pgfpoint{\Startx}{\Starty}}
    \pgfpathlineto{\pgfpointadd{\pgfpoint{\Startx}{\Starty}}{\pgfpointpolar{\Angle + 90}{6}}}
    \pgfusepath{stroke}
    \pgfpathmoveto{\pgfpoint{\Startx}{\Starty}}
    \pgfpathlineto{\pgfpointadd{\pgfpoint{\Startx}{\Starty}}{\pgfpointpolar{\Angle - 90}{6}}}
    \pgfusepath{stroke}
    \pgfpathmoveto{\pgfpoint{\Startx}{\Starty}}
    \pgfpathlineto{\pgfpointadd{\pgfpoint{\Startx}{\Starty}}{\pgfpointpolar{\Angle}{random * \pgfdecorationsegmentlength}}}
    \pgfgetlastxy{\Startx}{\Starty}
  }
  \state{final}{
    \pgfpathlineto{\pgfpointdecoratedpathlast}
  }
}

\tikzset{
  boundaryArrows/.style={decoration={irregularArrows, segment length = 3cm, angle = 30},
    decorate,
  },
}

\begin{document}
\pgfmathsetseed{3}
\begin{tikzpicture}
  \node[coordinate] (left) at (-10cm, 0) {};
  \node[coordinate] (right) at (10cm, 0) {};
  \draw[red,thick]{decorate[boundaryArrows]{(left) -- (right)}};
\end{tikzpicture}
\end{document}

输出


上述代码力求简洁;然而,万一我的实际问题更简单,我也会将其包括在内:我需要的只是一对箭头(我可以使用更多状态来实现),位于该线段的中间(我相信一旦我理解了如何获取起点的坐标,我就能确定)。

答案1

欢迎!我无法完全理解您的代码,因为宏的名称很长,而且有点难以理解。这个答案是为了提醒您可以嵌套装饰。因此,为了将箭头添加到每个线段,可以使用适当的适配show path construction。这可以在受装饰影响的路径上使用random steps

\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{arrows.meta,calc,decorations.pathmorphing,decorations.pathreplacing}
\tikzset{some arrow/.style={decorate,
decoration={show path construction, 
moveto code={},
lineto code={
\draw[-Stealth] (\tikzinputsegmentfirst) --  (\tikzinputsegmentlast);
\draw[latex-latex] 
($(\tikzinputsegmentfirst)!6pt!90:(\tikzinputsegmentlast)$) 
-- ($(\tikzinputsegmentfirst)!6pt!-90:(\tikzinputsegmentlast)$);
},
curveto code={},
closepath code={},
}}}

\tikzset{
  rrr/.style={decoration={random steps,amplitude=6pt, 
  segment length = 1.5cm},
    decorate,
  }}

\begin{document}
\pgfmathsetseed{3}
\begin{tikzpicture}
  \node[coordinate] (left) at (-10cm, 0) {};
  \node[coordinate] (right) at (10cm, 0) {};
  \draw[red,thick,some arrow]{decorate[rrr]{(left) -- (right)}};
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容