![在 TikZ 环境中访问比例选项](https://linux22.com/image/281380/%E5%9C%A8%20TikZ%20%E7%8E%AF%E5%A2%83%E4%B8%AD%E8%AE%BF%E9%97%AE%E6%AF%94%E4%BE%8B%E9%80%89%E9%A1%B9.png)
当在 etc 中使用比例选项时\tikz[xscale=2]
,有没有办法从 TikZ 环境中访问比例设置?
答案1
正如 Andrew 所说,您可以使用变换矩阵,它是当前应用于当前范围的所有变换的累积。相关详细信息请参阅PGF 手册(v3.0.0)。
我定义了一个命令,\getmytransformmatrix
将 PGF 的变换矩阵内部表示存储到宏\mya
、\myb
、\myc
、和 中。这些对应于坐标变换。因此,累积和(全局 CS 基础)分别存储在和 中。类似地,维度和分别存储在和 中。\myd
\mys
\myt
(x,y) --> (a*x + b*y + s, c*x + d*y +t)
xscale
yscale
\mya
\myd
xshift
yshift
\mys
\myt
这些不是跨范围边界/级别的持久性,因此命令\getmytransformmatrix
必须出现在您希望使用该信息的每个范围内。
守则(附简要说明)
\documentclass{standalone}
\usepackage{tikz}
\newcommand\getmytransformmatrix{%
\pgfgettransformentries{\mya}{\myb}{\myc}{\myd}{\mys}{\myt}%
% coordinate (x,y) is transformed to (ax + by + s, cx + dy + t)
}
\newcommand\drawmyaxes[1][]{% just for convenience
\draw (0,0) -- ++(1,0) node[right] {$x#1$};
\draw (0,0) -- ++(0,1) node[above] {$y#1$};
}
\newcommand\myvar[2]{\texttt{#1~=~#2}} % just for convenience
\begin{document}
\begin{tikzpicture}[xshift=2pt]
\getmytransformmatrix
\drawmyaxes
\node[align=left] at (-5,0) {Outside the scope, we have\\
\myvar{xscale}{\mya}, \myvar{yscale}{\myd}.};
\begin{scope}[yshift=-5pt,rotate=45]
\getmytransformmatrix
\drawmyaxes[']
\node[align=left] at (-1,-1) {Inside the scope, we have\\
\myvar{xscale}{\mya}, \myvar{yscale}{\myd}.\\
We also see that \myvar{xshift}{\mys}\\
and \myvar{yshift}{\myt}.};
\end{scope}
\node[align=left] at (5,0) {Outside the scope again, we have\\
\myvar{xscale}{\mya}, \myvar{yscale}{\myd}.};
\end{tikzpicture}
\end{document}
输出
请注意,矩阵不会在范围之外被“记住”,并且这显示了累积的变换(xshift=2pt
来自原始环境和 yshift=-5pt
从范围)。
附加变量b
和c
可用于其他计算;例如,计算有效旋转(atan(\myd/\mya)
仅从(-90,90)开始起作用)。
答案2
答案取决于你保存的目的是什么xscale
。我能想到两种可能性:
- 您想知道通过 传递了什么
xscale
。 - 您想知道
xscale
当前范围。
第一个相当容易,第二个取决于你的意思xscale
。
第一种方法之所以不简单,是因为 TikZ 不会费心保存您传入的值,它只是应用它然后忘记它。因此,您需要在键周围添加一个包装器,xscale
以保存该值以供以后使用。以下是一些代码:
\documentclass{article}
%\url{http://tex.stackexchange.com/q/151147/86}
\usepackage{tikz}
\tikzset{
saved xscale/.initial=1,
save xscale/.style={
xscale=#1,
save the xscale=#1
},
save the xscale/.code={%
\pgfmathparse{#1 * \pgfkeysvalueof{/tikz/saved xscale}}%
\pgfkeysalso{saved xscale/.expand once=\pgfmathresult}%
}
}
\begin{document}
\begin{tikzpicture}
\begin{scope}[save xscale=2]
\node at (0,0) {\pgfkeysvalueof{/tikz/saved xscale}};
\begin{scope}[save xscale=2]
\node at (1,0) {\pgfkeysvalueof{/tikz/saved xscale}};
\end{scope}
\end{scope}
\node at (2,0) {\pgfkeysvalueof{/tikz/saved xscale}};
\end{tikzpicture}
\end{document}
(这可能不是实现这一目标的最优雅的方式。)
第二个的困难在于 TikZ 可以应用任何仿射变换到绘图的各个部分。因此,您必须为任意仿射变换想出一个含义xscale
。考虑以下两种情况:
你应用
xscale=2
并应用 π/2 旋转(逆时针)。结果矩阵为[0 -1] [2 0]
先应用旋转,然后执行
yscale=2
。得到的矩阵是[0 -1] [2 0]
因此这两个操作会导致相同的矩阵。该矩阵是否等于xscale
或2
等于yscale
?2
或者两者都是0
?
现在考虑进行旋转,然后xscale=2
。结果如下:
[0 -2]
[1 0]
因此,对于所有这些场景,你必须决定xscale
应该怎么做。有合理的定义,但具体怎么做取决于你想用它们做什么。
因此,你能做的最好的事情就是检查矩阵整体而言并计算出一些适用于您想要做的事情的数字,但由于问题中没有指定,因此无法回答这个问题。
要获取矩阵本身的条目(即矩阵和平移),可以使用 PGF 命令\pgfgettransformentries
。然后对它们进行任意处理。例如,如果您想知道全面的尺度,你可以取其行列式绝对值的平方根。如果你想知道(1,0)
最终得到的向量的长度,你可以计算出来。
总之:
- 要存储传递给的累积值
xscale
,只需在传入之前将其存储起来, - 要从变换矩阵中提取
xscale
,请使用 PGF 命令访问矩阵,弄清楚任意矩阵的含义xscale
,然后根据检索到的值计算它。