我改编了 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}