Para cada página física, el motor PDF establece un sistema de coordenadas que permite referirse a cada punto de la página. A todos los efectos, este sistema de coordenadas es inmutable y es el único sistema de coordenadas que el núcleo del motor "entiende".
Las transformaciones de los PDF son gestionadas por una capa intermedia entre el usuario y el núcleo del motor; el propio núcleo es ajeno al concepto de transformaciones. La capa intermedia intercepta todas las coordenadas generadas por el usuario, y las resuelve a sus representaciones absolutas en el sistema de coordenadas del núcleo, antes de pasarlas al núcleo.
La capa intermedia compone una secuencia de transformaciones sobre un último Ven, primero base aplicada. Así, si el usuario aplica la siguiente secuencia de transformaciones: $T_1, \dots, T_n$ la transformación efectiva aplicada por la capa intermedia es $T_1\circ\cdots\circ T_n$ .
En el ejemplo del diagrama, las transformaciones que se ejecutan en la segunda línea son: escala ( $S$ ), la rotación ( $R$ ), y la traducción ( $T$ ), en este orden. Por lo tanto, las transformaciones efectivas aplicadas por la capa intermedia después de cada paso son: $S$ , $S\circ R$ y $S\circ R\circ T$ respectivamente. En particular, si, una vez ejecutada la rotación, una coordenada $v$ es mencionado por el usuario, será resuelto por la capa intermedia al punto en coordenadas absolutas $S\big(R(v)\big)$ .
Supongamos que la transformación de escala escala el $x$ -eje por $2$ , pero deja el $y$ sin cambios, y supongamos que la transformación de rotación gira por $45^\circ$ en sentido contrario a las agujas del reloj. Veamos cómo los vectores unitarios $u=(1,0)$ y $v=(0,1)$ se transforman.
En primer lugar, los vectores unitarios se giran por $45^\circ$ en sentido contrario a las agujas del reloj. Como la rotación preserva los ángulos, los vectores resultantes $u'=Ru$ y $v'=Ru$ serán perpendiculares entre sí, y simétricas respecto a la $y$ -eje.
A continuación, se realiza el escalado. Como el escalado no es uniforme, y el factor de escalado a lo largo del $y$ -El eje es $1$ el efecto será un cizallamiento paralelo a la $x$ -eje, y $u'$ y $v'$ serán "arrastrados" en direcciones opuestas, lo que hará que el ángulo entre ellos aumente. En particular, los vectores resultantes $u''=S(u')$ y $v''=S(v')$ ya no serán perpendiculares entre sí.
Es importante entender que todas las transformaciones se interpretan en relación con el sistema de coordenadas original entendido por el núcleo del motor. Por ejemplo, en nuestro ejemplo la escala $S$ no se interpreta en relación con el sistema de coordenadas determinado por los vectores unitarios girados $u'$ y $v'$ . Si este fuera el caso, entonces $S$ se mapearía $u'$ a $2u'$ y el mapa $v'$ a sí mismo, de modo que los nuevos vectores unitarios $u''$ y $v''$ se mantendrían perpendiculares entre sí. En cambio, $S$ mapas $u$ a $2u$ y $v$ a sí mismo, haciendo que el ángulo entre $u''$ y $v''$ para aumentar, como se describe en el párrafo anterior.
He aplicado esta teoría para recrear la ilustración del manual en PDF utilizando XeLaTeX con TikZ/PGF. No sé qué tipo de letra se utilizó en el manual, así que he utilizado la mejor aproximación que he podido encontrar, pero no es del todo igual.
Las matrices de transformación utilizadas son:
- $T$ : Una traducción de $(.5cm,.9cm)$ .
- $R$ : Una rotación por $30^\circ$ en sentido contrario a las agujas del reloj.
- $S$ : Una escalada de $3$ a lo largo del $x$ -eje.
Para recrear la primera línea, se aplicaron las siguientes matrices de transformación $T$ , 2. $TR$ , 3. $TRS$ .
Para recrear la segunda línea, se aplicaron las siguientes matrices de transformación $S$ , 2. $SR$ , 3. $SRT$ .
Aquí está el código completo.
\documentclass[landscape]{article}
\usepackage[hmargin=2cm,vmargin=1.5in]{geometry}
\usepackage{fontspec}
\setmainfont{heroout}[
Extension = .ttf,
Path = /Users/evanaad/Fonts/
]
\usepackage{tikz}
\begin{document}
\fontsize{50}{50}\selectfont
\begin{tikzpicture}
\matrix
{
\draw[dashed] (-.99,-.99) grid (.99,.99);
\draw[red] (0,0) rectangle (1.2,1);
\node[anchor=south west,inner sep=0pt] at (0,0.01) {n};
&[.5cm]
\tikzset{cm={1,0,0,1,(.5,.9)}}
\draw[dashed] (-.99,-.99) grid (.99,.99);
\draw[red] (0,0) rectangle (1.2,1);
\tikzset{reset cm}
\makeatletter
\pgfsys@transformcm{1}{0}{0}{1}{.5cm}{.9cm}
\makeatother
\draw[dashed] (-.99,-.99) grid (.99,.99);
\node[anchor=south west,inner sep=0pt] at (0,0.01) {n};
&[0.2cm]
\tikzset{cm={.866,.5,-.5,.866,(.5,.9)}}
\draw[dashed] (-.99,-.99) grid (.99,.99);
\draw[red] (0,0) rectangle (1.2,1);
\tikzset{reset cm}
\makeatletter
\pgfsys@transformcm{1}{0}{0}{1}{.5cm}{.9cm}
\pgfsys@transformcm{.866}{.5}{-.5}{.866}{0pt}{0pt}
\makeatother
\draw[dashed] (-.99,-.99) grid (.99,.99);
\node[anchor=south west,inner sep=0pt] at (0,0.01) {n};
&[0.4cm]
\tikzset{cm={2.598,1.5,-.5,.866,(.5cm,.9cm)}}
\draw[dashed] (-.99,-.99) grid (.99,.99);
\draw[red] (0,0) rectangle (1.2,1);
\tikzset{reset cm}
\makeatletter
\pgfsys@transformcm{1}{0}{0}{1}{.5cm}{.9cm}
\pgfsys@transformcm{.866}{.5}{-.5}{.866}{0pt}{0pt}
\pgfsys@transformcm{3}{0}{0}{1}{0pt}{0pt}
\makeatother
\draw[dashed] (-.99,-.99) grid (.99,.99);
\node[anchor=south west,inner sep=0pt] at (0,0.03) {n};
\\[3cm]
\draw[dashed] (-.99,-.99) grid (.99,.99);
\draw[red] (0,0) rectangle (1.2,1);
\node[anchor=south west,inner sep=0pt] at (0,0.01) {n};
&
\tikzset{cm={3,0,0,1,(0,0)}}
\draw[dashed] (-.99,-.99) grid (.99,.99);
\draw[red] (0,0) rectangle (1.2,1);
\tikzset{reset cm}
\makeatletter
\pgfsys@transformcm{3}{0}{0}{1}{0pt}{0pt}
\makeatother
\draw[dashed] (-.99,-.99) grid (.99,.99);
\node[anchor=south west,inner sep=0pt] at (0,0.01) {n};
&
\tikzset{cm={2.598,.5,-1.5,.866,(0,0)}}
\draw[dashed] (-.99,-.99) grid (.99,.99);
\draw[red] (0,0) rectangle (1.2,1);
\tikzset{reset cm}
\makeatletter
\pgfsys@transformcm{3}{0}{0}{1}{0pt}{0pt}
\pgfsys@transformcm{.866}{.5}{-.5}{.866}{0pt}{0pt}
\makeatother
\draw[dashed] (-.99,-.99) grid (.99,.99);
\node[anchor=south west,inner sep=0pt] at (0,0.01) {n};
&
\tikzset{cm={2.598,.5,-1.5,.866,(-1pt,29pt)}}
\draw[dashed] (-.99,-.99) grid (.99,.99);
\draw[red] (0,0) rectangle (1.2,1);
\tikzset{reset cm}
\makeatletter
\pgfsys@transformcm{3}{0}{0}{1}{0pt}{0pt}
\pgfsys@transformcm{.866}{.5}{-.5}{.866}{0pt}{0pt}
\pgfsys@transformcm{1}{0}{0}{1}{.5cm}{.9cm}
\makeatother
\draw[dashed] (-.99,-.99) grid (.99,.99);
\node[anchor=south west,inner sep=0pt] at (0,0.03) {n};
\\
};
\end{tikzpicture}
\end{document}