TikZ 和 PGF 出现“尺寸太大”错误

TikZ 和 PGF 出现“尺寸太大”错误

我改编了 TEXample.net 上的一个例子(原作者:Andreas Menge,http://www.texample.net/tikz/examples/3d-graph-model/) 用于创建平行六面体,并使用辅助网格提供透视效果。此功能运行良好,直到绘制某些边缘时出现错误Dimension too large

\documentclass[10pt]{article}
\usepackage{tikz}

\newcommand{\myGlobalTransformation}[3]
{
    \pgftransformcm{1}{0}{0.4}{0.5}{\pgfpoint{#1cm}{#2cm}}
}

\newcommand{\gridThreeD}[3]
{
\begin{scope}
    \myGlobalTransformation{#1}{#2};
    \draw [#3,step=1cm] grid (3,6);
\end{scope}
}

\newcommand{\drawLinewithBG}[2]
{
\draw[black,very thick] (#1) -- (#2);
}

\begin{document}
\begin{tikzpicture}

\gridThreeD{0}{0}{black!50};
\gridThreeD{0}{4}{black!50};

\begin{scope}
    \myGlobalTransformation{0}{0};

    \foreach \x in {1,2} {
        \foreach \y in {1,2} {
            \node (thisNode) at (\x,\y) [scale=0.01] {};
            {
               \pgftransformreset
                \draw[black,very thick] (thisNode) -- ++(0,4,-1.97); %----- anything less than z= -1.96 gives the error
           }
        }
    }

\end{scope}

\end{tikzpicture}    
\end{document}

(我在这里精简了代码以突出问题)。期望的结果是将线条绘制成一个正方形,角为 (1,4)(1,5)(2,4)(2,5),位于顶部辅助网格上。如果线条绘制成超出页面的范围(即当代码中的 z 坐标为 +1.97 时,实际上是将形状旋转 180 度),则似乎没有错误,因此这可能提供一个可能的解决方案。

之前有很多关于此错误的问题,通常的答案是建议使用fpu。我试过这个,但无济于事。而且乍一看,这里涉及的数字似乎没有超出~16384 的限制。

如有任何建议我将非常感谢,谢谢。

答案1

当您从 TikZ 收到“Dimension too large”错误时,有两个典型原因(以及许多其他非平凡原因)。要么是某些东西太小,要么是计算中使用的某些东西太短,导致除以几乎为零。TikZ 在大多数情况下都会捕获除以零的情况。

在这里,我懒得深入挖掘,但我认为如果我们fill=red向节点添加选项,使线变得非常细并放大,下面的屏幕截图可以说明为什么会发生这种情况。

在此处输入图片描述

由于 1/100 的缩放,节点形状缩小到极小的形状,但它仍然具有形状和形状边框。因此,当您引用节点进行线条绘制时,\draw (a) -- (b);它仍然会寻找形状边框上的点作为起点。这里由于某些数值原因,低于 -1.96 的 z 值会使数学引擎出错。

为了解决这个问题,您可以使用另一个节点形状,coordinate即除了中心锚点之外什么都没有,并且没有与之关联的背景/前景路径。因此可以将其视为命名位置。然后 TikZ 会跳过形状边框计算,我们又可以重新开始工作了。

我用 TikZ 样式稍微清理了一下代码。

\documentclass[10pt]{article}
\usepackage{tikz}

\tikzset{my global trafo/.style={cm ={1,0,0.4,0.5,#1}}}

\newcommand{\gridThreeD}[3]{
\begin{scope}[my global trafo={(#1,#2)}]
    \draw [#3,step=1cm] grid (3,6);
\end{scope}}

\newcommand{\drawLinewithBG}[2]{\draw[black,very thick] (#1) -- (#2);}

\begin{document}
\begin{tikzpicture}

\gridThreeD{0}{0}{black!50};
\gridThreeD{0}{4}{black!50};
\begin{scope}[my global trafo={(0,0)}]
    \foreach \x in {1,2} {
        \foreach \y in {1,2} {
            \coordinate (thisNode) at (\x,\y);
            \begin{scope}[reset cm]
                \draw[very thick] (thisNode) -- ++(0,4,-1.97);
            \end{scope}
        }
    }
\end{scope}

\end{tikzpicture}    
\end{document}

相关内容