TikZ/PGF 中是否有更优雅的适合边界框坐标变换的实现?

TikZ/PGF 中是否有更优雅的适合边界框坐标变换的实现?

我有一个可绘图函数,其归一化域为 [0,1],其归一化范围为 [-1,1]。我还有两个 TikZ 坐标,(BOTLEFT)(TOPRIGHT)定义了我希望绘图出现的边界框的左下角和右上角。

我想实现无倾斜、无旋转的仿射线性坐标变换,以便绘图域/范围与边界框完全匹配。也就是说,每个点 (x,y) 都映射到

(x,y)→ (BOTLEFT)+((TOPRIGHT)- (BOTLEFT))·((x,y)-(0,-1))÷((1,1)-(0,-1))

例如,正弦波

\draw[domain = 0:1, samples = 256] plot (\x,{sin(\x*4*pi r)});

当进行变换时,应该完全适合边界框

\draw[red] (-2,5) rectangle (1,8);

如果(BOTLEFT)是(-2,5)并且(TOPRIGHT)是(1,8)。

TikZ 支持xshiftyshift和属性来实现坐标变换。但是,使用坐标算法手动计算和xscale属性似乎需要隔离yscalexscaleyscaleX(BOTLEFT)和的组件(TOPRIGHT)。我知道这可以做到(例如,通过指令let):

\coordinate (BOTLEFT) at ({-.2},.5);
\coordinate (TOPRIGHT) at (.1,.8);

\draw let
    \p1 = (BOTLEFT),
    \p2 = (TOPRIGHT) in [domain = 0:1, samples = 256,
        xshift = \x1,
        xscale = (\x2 - \x1)\pts,
        yshift = (\y1 + (\y2 - \y1)/2),
        yscale = ((\y2 - \y1)/2)\pts
        ] plot (\x,{sin(\x*4*pi r)});
\draw[red] (BOTLEFT) rectangle (TOPRIGHT);

其中\pts是一个宏,它扩展为*<constant>将 pts 转换为图形的缩放单位,但这似乎非常混乱,尤其是对于 TikZ/PGF。我不禁想到 TikZ 有某种内置功能可以处理这个问题。如果转换scope也可以是 -d,那将特别有用。也就是说,

\begin{scope}[<set transform here>]
    \draw[domain = 0:1, samples = 256] plot (\x,{sin(\x*4*pi r)});
    <more commands in same coordinate frame>
    ...
\end{scope}

在 TikZ 中是否有更优雅的方式来处理这个问题,或者我是否只能用这种方式来破解坐标数学?


澄清 #1

坐标(BOTLEFT)(TOPRIGHT)是使用涉及节点锚点的表达式计算的,而不是像示例中那样使用数字文字计算。

答案1

这将 (0,0) 到 (1,1) 拟合到 (左下) 到 (右上)。它涉及我能想到的最少的数学或转换步骤。

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}

\begin{document}
\begin{tikzpicture}
\coordinate (BOTLEFT) at (-1,-1);
\coordinate (TOPRIGHT) at (2,1);
\fill[black] (BOTLEFT) rectangle (TOPRIGHT);

\coordinate (BOTRIGHT) at (BOTLEFT-|TOPRIGHT);
\coordinate (xscale) at ($(BOTRIGHT)-(BOTLEFT)$);% (3,0)
\coordinate (yscale) at ($(TOPRIGHT)-(BOTRIGHT)$);% (0,2)

\pgfscope
\pgfsetxvec{\pgfpointanchor{xscale}{center}}%
\pgfsetyvec{\pgfpointanchor{yscale}{center}}%
\begin{scope}[shift=(BOTLEFT)]
\node[gray] at (0.5,0.5) {test};
\draw[red] (0,0) rectangle (1,1);
\end{scope}
\endpgfscope
\end{tikzpicture}
\end{document}

答案2

我只是在情节中运用了这种转变。

\documentclass{article}
\usepackage{tikz}
\begin{document}

\begin{tikzpicture}[
  declare function={
    xmin = -.2;
    xmax = .1;
    ymin = .5;
    ymax = .8;
    xaxis(\x) = (xmax - xmin) * \x + xmin;
    yaxis(\y) = (ymax - ymin) * (\y + 1) / 2 + ymin;
  }]

  \draw (xmin,ymin) rectangle (xmax,ymax);
  \draw plot[domain=0:1,samples=256] ({xaxis(\x)},{yaxis(sin(\x*4*pi r))});
  
\end{tikzpicture}

\end{document}

在此处输入图片描述

相关内容