Greifen Sie in der TikZ-Umgebung auf die Skalierungsoption zu

Greifen Sie in der TikZ-Umgebung auf die Skalierungsoption zu

Gibt es bei Verwendung der Skalierungsoption in \tikz[xscale=2]etc. eine Möglichkeit, innerhalb der TikZ-Umgebung auf die Skalierungseinstellung zuzugreifen?

Antwort1

Wie Andrew sagt, können Sie die Transformationsmatrix verwenden, die eine Ansammlung aller Transformationen ist, die derzeit auf den aktuellen Bereich angewendet werden. Die relevanten Details finden Sie in den Abschnitten 104.2.1 und 104.2.4 desPGF-Handbuch(v3.0.0).

Ich habe einen Befehl definiert \getmytransformmatrix, der die interne Darstellung der Transformationsmatrix von PGF in den Makros \mya, \myb, \myc, \myd, \mys, und speichert \myt. Diese entsprechen der Koordinatentransformation (x,y) --> (a*x + b*y + s, c*x + d*y +t). Daher werden die akkumulierten xscaleund yscale(globale CS-Basis) jeweils in \myaund gespeichert \myd. Ebenso werden die Dimensionen xshiftund jeweils in und yshiftgespeichert .\mys\myt

Diese bleiben nicht über Bereichsgrenzen/-ebenen hinweg bestehen, daher \getmytransformmatrixmuss der Befehl in jedem Bereich erscheinen, in dem Sie die Informationen verwenden möchten.

Der Code (mit kurzer Illustration)

\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}

Die Ausgabe

Bildbeschreibung hier eingeben

Beachten Sie, dass die Matrix außerhalb des Gültigkeitsbereichs nicht „gespeichert“ wird und dass dies die akkumulierte Transformation ( xshift=2ptaus der ursprünglichen Umgebung ) zeigtUnd yshift=-5ptaus dem Anwendungsbereich).

Die zusätzlichen Variablen bund ckönnten für andere Berechnungen verwendet werden, beispielsweise um die effektive Rotation zu berechnen ( atan(\myd/\mya)würde nur ab (-90,90) funktionieren).

Antwort2

Die Antwort darauf hängt davon ab, zu welchem ​​Zweck Sie die speichern xscale. Mir fallen da zwei Möglichkeiten ein:

  1. Sie möchten wissen, was über übergeben wurde xscale.
  2. Sie möchten xscaleden aktuellen Umfang erfahren.

Das Erste ist ganz einfach, das Zweite hängt davon ab, was Sie damit meinen xscale.

Der Grund, warum das erste nicht trivial ist, liegt darin, dass TikZ sich nicht die Mühe macht, den von Ihnen eingegebenen Wert zu speichern, sondern ihn einfach anwendet und dann vergisst. Sie müssen also einen Wrapper um den xscaleSchlüssel hinzufügen, der den Wert für die spätere Verwendung speichert. Hier ist ein Code dafür:

\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}

(Dies ist möglicherweise nicht die eleganteste Art, dies zu erreichen.)

Die Schwierigkeiten bei der zweiten Option liegen darin, dass TikZbeliebigaffine Transformation auf Teile einer Zeichnung. Sie müssen sich also eine Bedeutung für eine beliebige affine Transformation ausdenken xscale. Betrachten Sie die beiden folgenden Szenarien:

  1. Sie wenden xscale=2eine Drehung um π/2 (gegen den Uhrzeigersinn) an. Die resultierende Matrix ist

    [0 -1]
    [2  0]
    
  2. Sie wenden zuerst die Rotation an und führen dann Folgendes aus yscale=2. Die resultierende Matrix ist

    [0 -1]
    [2  0]
    

Diese beiden Operationen führen also zur gleichen Matrix. Ist diese Matrix xscalegleich 2oder yscalegleich 2? Oder sind beide 0?

Betrachten wir nun die Rotation und dann xscale=2. Dies ergibt:

[0 -2]
[1  0]

Sie müssen also für alle diese Szenarien entscheiden, was xscalesein soll. Es gibt sinnvolle Definitionen, aber was genau, hängt davon ab, was Sie damit machen möchten.

Das Beste, was Sie tun können, ist also, die Matrix zu untersuchenals Ganzesund berechnen Sie eine Zahl, die für das, was Sie tun möchten, funktioniert. Da dies in der Frage jedoch nicht angegeben ist, ist eine Beantwortung nicht möglich.

Um die Einträge der Matrix selbst (also die Matrix und die Übersetzung) zu erhalten, können Sie den PGF-Befehl verwenden \pgfgettransformentries. Dann machen Sie damit, was Sie wollen. Wenn Sie zum Beispiel wissen möchten,gesamtSkala, Sie könnten die Quadratwurzel des Absolutwerts seiner Determinante ziehen. Wenn Sie die Länge des (1,0)letztendlich resultierenden Vektors wissen möchten, könnten Sie diese berechnen.

In Summe:

  1. Um die an übergebenen kumulierten Werte zu speichern xscale, speichern Sie sie einfach, bevor Sie sie übergeben.
  2. Um die xscaleaus der Transformationsmatrix zu extrahieren, verwenden Sie die PGF-Befehle für den Zugriff auf die Matrix, finden Sie heraus, was Sie mit xscaleeiner beliebigen Matrix meinen, und berechnen Sie sie dann aus den abgerufenen Werten.

verwandte Informationen