在制作更复杂的图片时,我偶然发现了操作plot
中命令的意外行为let
。经过相当多的实验,我很确定我已经确定了问题所在,但让我先向你展示一下我在说什么。下面的 MWE 有点愚蠢,因为let
那里的操作实际上没有必要,但它足以说明问题。如果我是对的,这实际上并不plot
相关,但这是我遇到问题的背景,我认为它有助于展示正在发生的事情。
\documentclass[tikz,border=1cm]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
% A few values
\pgfmathsetmacro\freq{10}
\pgfmathsetmacro\zmax{2*pi}
\pgfmathsetmacro\zextra{pi/2}
% Denote the starting point
\draw[black!40,dashed] (0,-1) -- (0,1);
% Draw the angled sine curve from 0 to zmax
\draw[domain=0:\zmax,smooth,samples=100,variable=\z] plot ({\z},{sin(\freq*180*\z/pi)}) coordinate (midpoint);
% Draw the extra bit from zmax to zmax+zextra
% (in principle this should be (x1+z-zmax, y1+f(z)-f(zmax)) but the specific value of zmax and periodicity of the sine function render this unnecessary in this particular case)
\draw[red,domain=0:\zextra,smooth,samples=100,variable=\z] let \p1=(midpoint) in plot ({\x1+\z},{\y1+sin(\freq*180*\z/pi)});
% Draw the extra bit in another way, by explicitly calculating x1 and y1
\draw[green,domain=0:\zextra,smooth,samples=100,variable=\z] plot ({\z+\zmax},{sin(\freq*180*\z/pi)});
\end{tikzpicture}
\end{document}
我确信这是一个单位问题。事实上,如果我将红色曲线的代码更改为
\draw[red,domain=0:\zextra,smooth,samples=100,variable=\z] let \p1=(midpoint) in plot ({\x1+1cm*\z},{\y1+1cm*sin(\freq*180*\z/pi)});
PGF/TikZ 手册提到该let
操作以 TeX 点为单位存储坐标,而 TikZ 坐标的默认单位是厘米。所以我猜想,由于\x1
上面的内容扩展为类似的东西36pt
,并且总和中的第二项没有单位,因此第二项可能也被认为是以点为单位测量的。由于正弦只是在 -1 和 1 之间振荡,我可以简单地将其乘以以1cm
获得与其余图形一致的结果。或者,我也可以在其余图形中使用点单位(我试过了,它有效),但这似乎不切实际。
长话短说,我想我的问题是:我可以更改操作的默认单位let
以与我在其余部分使用的单位一致tikzpicture
吗?
答案1
这与在 tikz 中使用斜率方程继续绘制一条新线无法按预期工作。
一旦坐标成为图片的一部分,PGF / TikZ 只知道它在画布坐标系中的位置,而你通常无法将其恢复到坐标坐标系。(不过,在大多数情况下,你实际上可以这样做。)
但是,由于您要做的只是将一个坐标添加到另一个坐标,因此您不需要任何计算或坐标的单独值。 PGF/TikZ 可以满足您的转换要求shift
。
因此,您可以直接执行 , 而不是 。使用库,这可以写成 。 但在这种情况下,由于移位参数不依赖于,您可以将其移出绘图坐标:(x₁ + x₂, y₁ + y₂)
([shift=(p₁)] p₂)
calc
($(p₁)+(p₂)$)
\z
\draw[red, domain=0:zextra, shift=(midpoint)] plot (\z,{Sin(freq,\z)});
无需计算(让 PGF/TikZ 来完成)。
代码
\documentclass[tikz]{standalone}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}[
variable=\z, smooth, samples=100,
declare function={
Sin(\freq,\t) = sin(deg(\freq)*\t);
freq = 10;
zmax = 2*pi;
zextra = pi/2;}]
\draw[black!40,dashed] (0,-1) -- (0,1);
%
\draw[domain=0:zmax] plot (\z,{Sin(freq,\z)}) coordinate (midpoint);
\draw[domain=0:zextra, shift=(midpoint)] % recommended
plot (\z,{Sin(freq,\z)}) [red];
% also possible:
\draw[domain=0:zextra] plot ([shift={(midpoint)}]\z,{Sin(freq,\z)}) [blue];
\draw[domain=0:zextra] plot ({$(midpoint)+(\z,{Sin(freq,\z)})$}) [green];
\draw[domain=0:zextra] let \p0 = (midpoint) in
plot ({$(\x0,\y0) +(\z,{Sin(freq,\z)})$}) [yellow];
\end{tikzpicture}
\end{document}