
Gostaria de saber se existe alguma maneira fácil de desenhar uma função 3D definida em um conjunto (seu domínio). O domínio deve ser desenhado “plano” no chão, e a função deve ser desenhada “pairando” acima do domínio. Estou pensando em dois exemplos abaixo:
Observe que a função e o domínio são convexos (se você estiver familiarizado com o conceito, isso significa que você pode assumir que o conjunto tem "parência de batata" e a função tem "formato de tigela").
Responder1
Claro. Aqui está um exemplo. Se você compilar com lualatex
a compilação é mais rápida.
\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}
Ou com domínio triangular.
\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}
Observe que você também pode usar filtros, mas os limites parecem um pouco pixelados em geral.