pgf:3D 图形 sqrt(-xy^2+8) 导致表面锯齿状

pgf:3D 图形 sqrt(-xy^2+8) 导致表面锯齿状

这个特定的椭圆抛物面 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)设置为零,从而消除图形底部的一些粗糙度。

结果

沿负 x 轴展开的抛物面在 z 为正值的图表上显示。这实际上显示了抛物面的一半。

代码

\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}

曲面图

相关内容