绘制一个碗状的 3D 函数,悬停在集合上方

绘制一个碗状的 3D 函数,悬停在集合上方

我想知道是否有任何简单的方法来绘制在集合(其域)上定义的 3D 函数。域应绘制为“平放”在地面上,函数应绘制为“悬停”在域上方。我想到以下两个例子:

在此处输入图片描述

请注意,函数和域都是凸的(如果您熟悉这个概念,则意味着您可以假设集合是“土豆状的”,而函数是“碗状的”)。

答案1

当然可以。下面是一个例子。如果你使用编译的话,lualatex编译速度会更快。

\documentclass[tikz,border=3mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\begin{document}
\begin{tikzpicture}[declare function={f(\x,\y)=1+\x*\x+\y*\y;}]
\matrix[column sep=3em]{
\begin{axis}[hide axis,domain=0:1,domain y=0:360,smooth,samples=25,samples y=61]
 \addplot3[surf,shader=flat] ({x*cos(y)},{0.8*x*sin(y)},{0}); 
 \addplot3[surf,shader=interp,z buffer=sort] ({x*cos(y)},{0.8*x*sin(y)},{f(x*cos(y),0.8*x*sin(y))});
\end{axis}
&
\begin{axis}[hide axis,domain=0:1,domain y=0:360,smooth,samples=25,samples y=61]
 \addplot3[surf,shader=flat] ({x*cos(y)*(2+sin(3*y))},{0.8*x*sin(y)*(2+sin(3*y)},{0}); 
 \addplot3[surf,shader=interp,z buffer=sort] ({x*cos(y)*(2+sin(3*y)},{0.8*x*sin(y)*(2+sin(3*y)},{f(x*cos(y),0.8*x*sin(y))});
\end{axis}\\
};
\end{tikzpicture}
\end{document}

在此处输入图片描述

或者具有三角域。

\documentclass[tikz,border=3mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\begin{document}
\begin{tikzpicture}[declare function={f(\x,\y)=1+\x*\x+\y*\y;}]
\matrix[column sep=3em]{
\begin{axis}[hide axis,domain=0:1,domain y=0:360,smooth,samples=25,samples y=61,
    declare function={myx(\x,\y)=\x*cos(\y);myy(\x,\y)=\x*sin(\y);}]
 \addplot3[surf,shader=flat] ({myx(x,y)},{myy(x,y)},{0}); 
 \addplot3[surf,shader=interp,z buffer=sort] 
    ({myx(x,y)},{myy(x,y)},{f(myx(x,y),myy(x,y))});
\end{axis}
&
\begin{axis}[hide axis,domain=-1:1,domain y=0:1,samples=25,samples y=61,
 declare function={myx(\x,\y)=\x;myy(\x,\y)=\y*(1-abs(\x));}]
 \addplot3[surf,shader=flat] ({myx(x,y)},{myy(x,y)},{0}); 
 \addplot3[surf,shader=interp,z buffer=sort] 
    ({myx(x,y)},{myy(x,y)},{f(myx(x,y),myy(x,y))});
\end{axis}\\
};
\end{tikzpicture}
\end{document}

在此处输入图片描述

请注意,您也可以使用过滤器,但边界总体上看起来会有点像素化。

相关内容