这个特定的椭圆抛物面 sqrt(-xy^2+8) 的图如下所示。我尝试过参数化表面、以不同形式写出方程式,并调整域。我大多数时候得到的错误与 z 轴有关,并且行数和列数不匹配。有人能帮我找出使表面变得光滑并且看起来不像这样的方法吗?
\usepackage{pgfplots}
\usetikzlibrary{3d, calc}
\pgfplotsset{compat=1.18}
\usepackage{tikz-3dplot}
\begin{document}
\begin{tikzpicture}
\begin{axis}[axis lines=center]
\addplot3[domain=-3:3, y domain=-3:3, samples=10, surf, shader=interp] {sqrt(-x-y^2+8)};
\end{axis}
\end{tikzpicture}
\end{document}
答案1
问题
由于 PGFPlots 在域 [−3,3] × [−3,3] 内采样点,因此通过评估构建一个图是-坐标,在尝试绘制这个特定表面时,我们遇到了两个不幸的问题。首先,方程是= 平方根(−X − y 2 + 8) 在域的子集上是复数,但 PGFPlots 无法绘制复数值。我们可以使用 来unbounded coords=jump
解决第一个问题——这告诉 PGFPlots 在坐标为 的地方进行跳跃nan
。
第二个问题更难处理。PGFPlots 不会沿着曲面的下界均匀采样,这种情况发生在是 = 0。当 PGFPlots 尝试将评估点拼接成完整图形时,这将导致图形底部出现一系列锯齿状尖峰。解决此问题的方法是使用 if 语句将足够小的值(小于 0.2)设置为零,从而消除图形底部的一些粗糙度。
结果
代码
\documentclass{standalone}
\usepackage{pgfplots}
\usetikzlibrary{3d, calc}
\pgfplotsset{compat=1.18}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
axis lines = center,
xmin = -4,
xmax = 4,
ymin = -4,
ymax = 4,
axis equal image,
unbounded coords = jump
]
\addplot3[
domain = -3:3,
samples = 80,
shader = interp,
surf,
] {-x-y^2+8 < 0.2 ? 0 : sqrt(-x-y^2+8)};
\end{axis}
\end{tikzpicture}
\end{document}
说实话,我不确定是否有办法改变第二个问题的 PGFPlots 采样间隔,但如果可以改进,我很乐意在评论中提供反馈。
答案2
\documentclass[tikz, border=1cm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
%axis lines=center,
]
\addplot3[
surf, shader=faceted interp, line join=round,
%z buffer=sort,
domain=-3:3, y domain=-3:3,
samples=30,
unbounded coords=jump,
] {sqrt(-x-y^2+8)};
\end{axis}
\end{tikzpicture}
\end{document}