
등에서 스케일 옵션을 사용할 때 \tikz[xscale=2]
TikZ 환경 내에서 스케일 설정에 액세스할 수 있는 방법이 있습니까?
답변1
Andrew가 말했듯이 현재 범위에 현재 적용된 모든 변환을 누적한 변환 매트릭스를 사용할 수 있습니다. 관련 세부 사항은 섹션 104.2.1 및 104.2.4에 나와 있습니다.PGF 매뉴얼(v3.0.0).
\getmytransformmatrix
변환 행렬의 PGF 내부 표현을 매크로 \mya
, \myb
, \myc
, \myd
, \mys
및 에 저장하는 명령을 정의했습니다 \myt
. 이는 좌표 변환에 해당합니다 (x,y) --> (a*x + b*y + s, c*x + d*y +t)
. 따라서 누적된 xscale
및 yscale
(글로벌 CS 기준)은 각각 \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
다음 검색된 값에서 이를 계산합니다.