如何使用 int 或 floor 计算坐标

如何使用 int 或 floor 计算坐标

我想用双重黎曼和来说明曲面下体积的近似值。我在 6x6 矩形网格上从后到前、从左到右绘制 3d 框(画家算法)。这是我的 MWE:

\documentclass[12pt]{article}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\usetikzlibrary{calc}
\usetikzlibrary{math}

\begin{document}

\hfil\begin{tikzpicture}[scale=2]
\begin{axis}[
axis lines = middle,
xmin=-1,xmax=7,
ymin=-1,ymax=7,
zmin = 0, zmax = 2,
ticks = none
]
\pgfplotsinvokeforeach{0,...,18}{
    \draw [fill=red] ({#1-int(#1/6)*6},{6-int(#1/6)},0)
    -- ++(axis direction cs:1,0,0)
    -- ++(axis direction cs:0,0,{0.02*((6-int(#1/6))^2+(#1-int(#1/6)*6)^2)})
    -- ++(axis direction cs:-1,0,0)
    -- cycle;
    \draw [fill=red] ({#1-int(#1/6)*6+1},{6-int(#1/6)},0)
    -- ++(axis direction cs:0,1,0)
    -- ++(axis direction cs:0,0,{0.02*((6-int(#1/6))^2+(#1-int(#1/6)*6)^2)})
    -- ++(axis direction cs:0,-1,0)
    -- cycle;
    \draw [fill=red] ({#1-int(#1/6)*6},{6-int(#1/6)},{0.02*((6-int(#1/6))^2+(#1-int(#1/6)*6)^2)})
    -- ++(axis direction cs:0,1,0)
    -- ++(axis direction cs:1,0,0)
    -- ++(axis direction cs:0,-1,0);
}
\end{axis}
\end{tikzpicture}
\end{document}

以下是代码创建的(正确)图片:

18 盒

但是,如果我通过将范围更改为\pdfplotsinvokeforeach来添加一个框{0,...,18},则下一个框的位置不正确:

19 盒

但是随后的框(直到 36 个)都位置正确! 36 盒

18 出现了一些数值问题,我不知道如何解决。我尝试了floor而不是int,但没有成功(我也无法mod工作,但这对我没什么影响)。

任何帮助将不胜感激。

答案1

这确实是计算中的舍入误差int(#1/6)*6。可以使用类似方法克服这些错误int((#1+.5)/6)*6

我建议将大部分数量放在一些本地宏中,以使代码更透明,并避免复制错误。使用未分组版本\pgfplotsforeach...与内部版本相结合更容易做到这一点\edef,如文档中所示pgfplots

我特意改变了颜色,只是为了看看每个\draw命令在做什么。

示例输出

\documentclass[12pt]{article}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\usetikzlibrary{calc}
\usetikzlibrary{math}

\begin{document}

\hfil\begin{tikzpicture}[scale=2]
\begin{axis}[
axis lines = middle,
xmin=-1,xmax=7,
ymin=-1,ymax=7,
zmin = 0, zmax = 2,
ticks = none
]
\pgfplotsforeachungrouped \x in {0,...,18} {
    \def\xxt{int((\x+.5)/6)}
    \def\xx{\x-\xxt*6}
    \def\yy{6-\xxt}
    \def\hh{0.02*((\yy)^2+(\xx)^2)}
    \edef\temp{
    \noexpand\draw [fill=green] ({\xx},{\yy},0)
    -- ++(axis direction cs:1,0,0)
    -- ++(axis direction cs:0,0,{\hh})
    -- ++(axis direction cs:-1,0,0)
    -- cycle;
    \noexpand\draw [fill=red] ({\xx+1},{\yy},0)
    -- ++(axis direction cs:0,1,0)
    -- ++(axis direction cs:0,0,{\hh})
    -- ++(axis direction cs:0,-1,0)
    -- cycle;
    \noexpand\draw [fill=blue] ({\xx},{\yy},{\hh})
    -- ++(axis direction cs:0,1,0)
    -- ++(axis direction cs:1,0,0)
    -- ++(axis direction cs:0,-1,0);
    }
    \temp
}
\end{axis}
\end{tikzpicture}
\end{document}

相关内容