Desenhe uma função 3D em forma de tigela pairando sobre um cenário

Desenhe uma função 3D em forma de tigela pairando sobre um cenário

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:

insira a descrição da imagem aqui

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

insira a descrição da imagem aqui

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}

insira a descrição da imagem aqui

Observe que você também pode usar filtros, mas os limites parecem um pouco pixelados em geral.

informação relacionada