TikZ:更改“let”操作使用的单位

TikZ:更改“let”操作使用的单位

在制作更复杂的图片时,我偶然发现了操作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}

输出(不含替代方案)

在此处输入图片描述

相关内容