我需要绘制一个闪电,它从一个点开始,其尖锐的边缘在另一个点结束。例如,让我定义点
\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}