具有非正方形单位的 Tikz 坐标矩阵变换

具有非正方形单位的 Tikz 坐标矩阵变换

x我正在尝试使用坐标变换矩阵,但是当和y单位设置不相等时,它似乎无法与未变换的对象正确对齐。

\documentclass{standalone}
\usepackage{tikz}
\begin{document}

\begin{tabular}{cc}
    \begin{tikzpicture}[x=2cm,y=2cm]
        \fill[cyan, cm={1, .2, 0, .8, (0, 0)}] (4, 4) rectangle (6, 6);
        \draw (4, 4) rectangle (6, 6);
    \end{tikzpicture} &
    \begin{tikzpicture}[x=1.6cm,y=2cm]
        \fill[cyan, cm={1, .2, 0, .8, (0, 0)}] (4, 4) rectangle (6, 6);
        \draw (4, 4) rectangle (6, 6);
    \end{tikzpicture}
\end{tabular}

\end{document}

未对齐的变换

左侧图像为方格坐标,右侧图像为非方格坐标。左侧图像中,变换后的矩形与边界框的左下角和右上角相交。

我原本期望单位大小的差异不会影响转换,从而导致转换后的形状和未转换的形状像右边那样错位。

除了将其画成正方形并使用 之外,还有什么方法可以纠正这个问题吗resizebox

答案1

首先,xy值(或实际上是向量)指定了坐标坐标系(没有单位,三维)和画布坐标系统(有单位,总是二维的)。
指定的变换矩阵cm应用于画布坐标系的坐标上。

让我们应用第一个变换(坐标→ 画布)之后,我们再进一步了解一下:

\begin{tikzpicture}
\fill[cyan, cm={1, .2, 0, .8, (0, 0)}] (8cm, 8cm)  rectangle (12cm, 12cm);
\draw                                  (8cm, 8cm)  rectangle (12cm, 12cm);
\end{tikzpicture}
\begin{tikzpicture}
\fill[cyan, cm={1, .2, 0, .8, (0, 0)}] (6.4cm, 8cm) rectangle (9.6cm, 12cm);
\draw                                  (6.4cm, 8cm) rectangle (9.6cm, 12cm);
\end{tikzpicture}

这两个图看起来仍然和你的一样。

现在,当你使用时,你设置了一个转换,将输入坐标转换为cm = {a, b, c, d, (x, y)}s= (s₁,s₂)(始终在画布坐标系中)转换为 TeX 坐标= (₁,₂)根据
在此处输入图片描述
IE
在此处输入图片描述

  • A= 1,
  • b= 0.2,
  • C= 0 且
  • d= 0.8 以及
  • X== 0

这意味着

代码

\documentclass{standalone}
\usepackage{tikz, amsmath}
\tikzset{
  debug coordinate node/.style={node font=\tiny, xscale=.75},
  dcn/.style={debug coordinate node/.append style={#1}},
  save cm/.code=\pgfgettransformentries\pgfcma\pgfcmb\pgfcmc\pgfcmd\pgfcmx\pgfcmy,
  debug coordinate/.style args={#1/#2:#3}{insert path={
    [save cm] node[centered, inner sep=+1pt, circle, fill]{}
    node[debug coordinate node] {$ \begin{alignedat}{2}
      #3_1 &= \pgfcma\cdot\mathrm{#1} + \pgfcmc\cdot\mathrm{#2} + \mathrm{\pgfcmx}
        && = \pgfmathprint{(\pgfcma*(#1)+\pgfcmc*(#2)+\pgfcmx)/1cm}\mathrm{cm}\\
      #3_2 &= \pgfcmb\cdot\mathrm{#1} + \pgfcmd\cdot\mathrm{#2} + \mathrm{\pgfcmy}
        && = \pgfmathprint{(\pgfcmb*(#1)+\pgfcmd*(#2)+\pgfcmy)/1cm}\mathrm{cm}\\
    \end{alignedat}$}}}}
\begin{document}
\begin{tabular}{cc}
\begin{tikzpicture}
\fill[cyan, cm={1, .2, 0, .8, (0, 0)}]
             (8cm,  8cm) [below right, debug coordinate= 8cm/ 8cm:m]
  rectangle (12cm, 12cm) [above left,  debug coordinate=12cm/12cm:m];
\draw        (8cm,  8cm) [above right, debug coordinate= 8cm/ 8cm:n]
  rectangle (12cm, 12cm) [below left,  debug coordinate=12cm/12cm:n];
\end{tikzpicture} &
\begin{tikzpicture}
\fill[cyan, cm={1, .2, 0, .8, (0, 0)}]
            (6.4cm,  8cm) [below right, debug coordinate=6.4cm/ 8cm:m]
  rectangle (9.6cm, 12cm) [above left,  debug coordinate=9.6cm/12cm:m];
\draw       (6.4cm,  8cm) [above right, debug coordinate=6.4cm/ 8cm:n]
  rectangle (9.6cm, 12cm) [above left, dcn={yshift=.25cm},
                                        debug coordinate=9.6cm/12cm:n];
\end{tikzpicture}
\end{tabular}
\end{document}

输出

在此处输入图片描述

相关内容