Accede a la opción de escala dentro del entorno TikZ

Accede a la opción de escala dentro del entorno TikZ

Cuando se utiliza la opción de escala en \tikz[xscale=2]etc., ¿hay alguna forma de acceder a la configuración de escala desde el entorno TikZ?

Respuesta1

Como dice Andrew, puede usar la matriz de transformación, que es una acumulación de todas las transformaciones aplicadas actualmente al alcance actual. Los detalles relevantes se encuentran en las Secciones 104.2.1 y 104.2.4 de laManual PGF(v3.0.0).

Definí un comando que almacena la \getmytransformmatrixrepresentación interna de PGF de la matriz de transformación en las macros \mya,,,,, y . Estos corresponden a la transformación de coordenadas . Entonces, el acumulado y (base CS global) se almacenan en y , respectivamente. De manera similar, las dimensiones y se almacenan en y , respectivamente.\myb\myc\myd\mys\myt(x,y) --> (a*x + b*y + s, c*x + d*y +t)xscaleyscale\mya\mydxshiftyshift\mys\myt

Estos no son persistentes a través de los límites/niveles del ámbito, por lo que el comando \getmytransformmatrixdebe aparecer en cada ámbito en el que desee utilizar la información.

El Código (con breve ilustración)

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

La salida

ingrese la descripción de la imagen aquí

Tenga en cuenta que la matriz no se "recuerda" fuera del alcance y que esto muestra la transformación acumulada ( xshift=2ptdel entorno originaly yshift=-5ptdel alcance).

Las variables adicionales by cpodrían usarse para otros cálculos; por ejemplo, para calcular la rotación efectiva ( atan(\myd/\mya)solo funcionaría desde (-90,90)).

Respuesta2

La respuesta a esto depende de cuál sea su propósito al guardar el archivo xscale. Hay dos posibilidades que se me ocurren:

  1. Quiere saber qué se pasó a través de xscale.
  2. Quiere conocer xscaleel alcance actual.

Lo primero es bastante fácil, lo segundo depende de lo que quieras decir con xscale.

La razón por la que lo primero no es trivial es porque TikZ no se molesta en guardar el valor que pasas, simplemente lo aplica y luego lo olvida. Por lo tanto, debe agregar un contenedor alrededor de la xscaleclave que guarde el valor para su uso posterior. Aquí hay un código para eso:

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

(Puede que esta no sea la forma más elegante de lograrlo).

Las dificultades con el segundo se deben a que TikZ puede aplicarsecualquiertransformación afín a partes de un dibujo. Por lo tanto, debes encontrar un significado para xscaleuna transformación afín arbitraria. Considere los dos escenarios siguientes:

  1. Aplica xscale=2y luego aplica una rotación de π/2 (en sentido antihorario). La matriz resultante es

    [0 -1]
    [2  0]
    
  2. Primero aplicas la rotación y luego lo haces yscale=2. La matriz resultante es

    [0 -1]
    [2  0]
    

Entonces estas dos operaciones conducen a la misma matriz. ¿Esa matriz tiene xscaleigual 2o yscaleigual a 2? ¿O son ambos 0?

Ahora considere hacer la rotación y luego xscale=2. Esto produce:

[0 -2]
[1  0]

Entonces, para todos estos escenarios debes decidir cuál xscaledebería ser. Existen definiciones razonables, pero exactamente cuál dependerá de lo que quieras hacer con ellas.

Por lo tanto, lo mejor que puedes hacer es examinar la matriz.como un todoy calcule algún número que funcione para lo que sea que desee hacer, pero como esto no se especifica en la pregunta, no es factible responderlo.

Para obtener las entradas de la propia matriz (bueno, la matriz y la traducción), puede utilizar el comando PGF\pgfgettransformentries . Luego haz lo que quieras con ellos. Por ejemplo, si quieres saber elen generalescala, podrías tomar la raíz cuadrada del valor absoluto de su determinante. Si quieres saber la longitud del vector que (1,0)finalmente se convierte, puedes calcularla.

En resumen:

  1. Para almacenar los valores acumulados pasados ​​a xscale, simplemente guárdelos antes de pasarlos,
  2. Para extraer xscalede la matriz de transformación, use los comandos PGF para acceder a la matriz, averigüe qué quiere decir con xscaleuna matriz arbitraria y luego calcule a partir de los valores recuperados.

información relacionada