我想画一张波穿过一个物体(好吧,是几个物体)的图。或者在某些情况下看起来像是穿过一个空心圆柱体。由于所有这些都投射到 2d 平面上,因此这种效果实际上是在某个点停止绘制波。
我一直在使用蛇形装饰来做到这一点,但似乎如果我想要绘制的两个点之间的距离不是波的频率的整数倍,那么蛇的末端就会出现一条直线段。
关于这个问题已经有多个问题和解决方案,但所有给出的解决方案都涉及改变波的频率来拉伸或挤压波,以便 $n$ 个周期的波适合间隙。(这里,这里,这里, 和这里, 例如。)
从技术上讲,我绘制的波形应该始终具有恒定的频率,因此我真正想要的是一种截断波形的方法,而不管波形在周期中的哪个点结束。我尝试在下面说明这一点:
% straight line at end of snake
\draw [decorate, decoration=snake] (0,0) -- (1.2,0);
% changing the frequency to fit wave path length:
\draw [decorate, decoration=snake, segment length=13] (0,-1) -- (1.2,-1);
% the effect I'm after, truncated snake at any amplitude:
\draw [decorate, decoration=snake] (0,-2) -- (2,-2);
\fill [white] (1.2,-2.2) rectangle (2.1,-1.8);
我希望我已经表达清楚了,如果需要的话,请要求进一步澄清。
答案1
实际上,您可以将波绘制为正弦函数。然后,您可以设置要显示的确切函数并绘制它。波可以描述为
y(x) = A*sin(w*x + b)
因此,您可以将其绘制为\draw[domain=C:D] plot (\x,{A*sin(w*\x r + br)});
,其中r
代表弧度。哎呀,您甚至可以为此创建一个命令,将所有内容立即转换为弧度:
\newcommand{\sinewave}[4][]{\draw[#1] plot (\x,{#2*sin((#4*pi/180)r + 2*pi*#3*\x r)})}
这里你得到一个类似 的命令\sinewave[tikz options]{Amplitude}{Frequency, in Hz}{Phase angle, in degrees}
。该domain
选项设置正弦波的开始和结束,并samples
设置波的“平滑度”。
以下是完整的 MWE:
\documentclass[tikz,border=5mm]{standalone}
\newcommand{\sinewave}[4][]{\draw[#1] plot (\x,{#2*sin((#4*pi/180)r + 2*pi*#3*\x r)})}
\begin{document}
\begin{tikzpicture}[domain=0:1.2, samples=120]
\draw plot (\x,{0.1*sin(10*\x r)});
\draw[yshift=-1cm] plot (\x,{0.15*sin(13*\x r)});
\sinewave[yshift=-2cm]{0.2}{4}{90};
\end{tikzpicture}
\end{document}
答案2
Guilherme 的回答很好。另一种解决方案是使用密钥shorten >=
:
\documentclass[letterpaper]{article}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric, snakes}
\begin{document}
\footnotesize
\begin{tikzpicture}[thin]
\draw[snake=coil, segment aspect=0, color=red, semithick]%
(0.5in,2in) -- ++(0.375in,-0.75in);
\draw[snake=coil, segment aspect=0, color=blue, semithick, shorten >= 5pt]%
(1in,2in) -- ++(0.375in,-0.75in);
\end{tikzpicture}
\end{document}
不过,它确实需要摆弄您为该键使用的确切值。