在 tikz 中在两个给定点之间画一道闪电?

在 tikz 中在两个给定点之间画一道闪电?

我需要绘制一个闪电,它从一个点开始,其尖锐的边缘在另一个点结束。例如,让我定义点

\documentclass[tikz,border=5mm]{standalone}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\coordinate (p1) at (1,3);
\coordinate (p2) at (5,5);
\end{tikzpicture}

现在我该如何在 p1 和 p2 之间绘制闪电。我知道如何绘制它,明确计算相对于 (1,3) 和 (5,5) 的坐标。但是,如果这些值发生变化,则必须重新进行计算,这不是一个干净的解决方案。

答案1

这是lightning bolt装饰。目前,它不能进行大量定制,因为螺栓的所有尺寸均由两点之间的距离决定:

\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{decorations}
\pgfdeclaredecoration{lightning bolt}{draw}{
\state{draw}[width=\pgfdecoratedpathlength]{
  \pgfpathmoveto{\pgfpointorigin}%
  \pgfpathlineto{\pgfpoint{\pgfdecoratedpathlength*0.6}%
    {-\pgfdecoratedpathlength*.1}}%
  \pgfpathlineto{\pgfpoint{\pgfdecoratedpathlength*0.55}{0pt}}%
  \pgfpathlineto{\pgfpoint{\pgfdecoratedpathlength}{0pt}}%
  \pgfpathlineto{\pgfpoint{\pgfdecoratedpathlength*0.4}%
    {\pgfdecoratedpathlength*.1}}%
  \pgfpathlineto{\pgfpoint{\pgfdecoratedpathlength*0.45}{0pt}}%
  \pgfpathclose%
}%
}
\begin{document}
\begin{tikzpicture}
\foreach \i [evaluate={\p=rnd*75+25;\q=rnd*75+25;}] in {1,...,50}
  \fill [yellow!\p!orange!\q!blue, decoration=lightning bolt, decorate] 
  (rand*4, rand*4) -- ++ (rand*180:rnd*4+2);
\end{tikzpicture}
\end{document}

在此处输入图片描述

这是一条lightning bolt to路径:

\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{calc}
\tikzset{lightning bolt to/.style={to path={
let \p1=(\tikztostart), \p2=(\tikztotarget), \n1={veclen(\y2-\y1,\x2-\x1)} in
  (\p1) -- ($($(\p1)!0.6!(\p2)$)!\n1*.1!-90:(\p2)$) -- ($(\p1)!0.55!(\p2)$) --
  (\p2) -- ($($(\p1)!0.4!(\p2)$)!\n1*.1!90:(\p2)$) -- ($(\p1)!0.45!(\p2)$) -- 
  cycle (\p2)% Move to end point
}}}
\begin{document}
\begin{tikzpicture}
\foreach \i [evaluate={\p=rnd*75+25;\q=rnd*75+25;}] in {1,...,50}
  \fill [yellow!\p!orange!\q!blue]
  (rand*4, rand*4) to [lightning bolt to] ++ (rand*180:rnd*4+2);
\end{tikzpicture}
\end{document}

结果与以前相同(除了随机性之外)。

答案2

这里是您使用环境的起点pic。您可以将两个坐标传递给,pic从而控制闪电路径的起点和终点。

以下代码使用静态偏移来绘制锯齿形(-.25 and .25),可以用动态计算的值替换。当以不同的长度和比例使用时,这可以使照明更加美观。

\documentclass[tikz, border=5mm]{standalone}

\usetikzlibrary{calc, arrows.meta}

\tikzset{
  pics/lightning/.style 2 args={code={
    \draw [thick, arrows={-Stealth[scale=2]}] (#1) -- 
               ($(#1)!.5!(#2) + (.25,-.25)$) -- 
               ($(#1)!.5!(#2) + (-.25,.25)$) --
               (#2);
  }}}

\begin{document}
  \begin{tikzpicture}
    \pic {lightning={0,2}{0,0}};
    \pic [blue] {lightning={1,3}{1,-1}};
    \pic [red] {lightning={0,3}{-2,0}};
  \end{tikzpicture}
\end{document}

渲染图像

相关内容