我想用双重黎曼和来说明曲面下体积的近似值。我在 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}
以下是代码创建的(正确)图片:
但是,如果我通过将范围更改为\pdfplotsinvokeforeach
来添加一个框{0,...,18}
,则下一个框的位置不正确:
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}