存取 TikZ 環境中的縮放選項

存取 TikZ 環境中的縮放選項

在等中使用縮放選項時\tikz[xscale=2],有什麼方法可以從 TikZ 環境中存取縮放設定?

答案1

正如安德魯所說,您可以使用變換矩陣,它是目前應用於目前範圍的所有變換的累積。相關詳細資訊請參閱《條例》第 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)。因此,累積的xscaleyscale(全局 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從範圍來看)。

附加變數bc用於其他計算;例如,計算有效旋轉(atan(\myd/\mya)僅適用於 (-90,90) )。

答案2

這個問題的答案取決於您保存xscale.我能想到有兩種可能性:

  1. 您想知道 via 傳入的內容xscale
  2. 您想知道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任意仿射變換的意思。考慮以下兩種情況:

  1. 您應用xscale=2,然後應用 π/2(逆時針)旋轉。得到的矩陣是

    [0 -1]
    [2  0]
    
  2. 您首先應用旋轉,然後執行yscale=2。得到的矩陣是

    [0 -1]
    [2  0]
    

所以這兩個運算會產生相同的矩陣。該矩陣是否xscale等於2yscale等於2?或者兩者都是0

現在考慮進行旋轉,然後xscale=2。這產生:

[0 -2]
[1  0]

因此,對於所有這些場景,您必須決定xscale應該做什麼。有一些合理的定義,但具體定義取決於您想用它們做什麼。

因此你能做的最好的事情就是檢查矩陣作為一個整體並計算一些適用於您想做的任何事情的數字,但由於問題中沒有指定這一點,所以回答這個問題是不可行的。

若要取得矩陣本身的條目(矩陣和平移),您可以使用 PGF 指令\pgfgettransformentries。然後和他們一起做你喜歡做的事。例如,如果您想了解全面的尺度,你可以取其行列式絕對值的平方根。如果你想知道最終向量的長度(1,0),你可以計算它。

總之:

  1. 要儲存傳遞給 的累積值xscale,只需在傳遞它們之前儲存它們,
  2. 要從變換矩陣中提取xscale,請使用 PGF 命令存取矩陣,弄清楚任意矩陣的含義xscale,然後根據檢索到的值進行計算。

相關內容