我有一个可绘图函数,其归一化域为 [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 支持xshift
、yshift
和属性来实现坐标变换。但是,使用坐标算法手动计算和xscale
属性似乎需要隔离yscale
xscale
yscale
X和是(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}