表面轮廓 – pgfplots 3D

表面轮廓 – pgfplots 3D

我想要展示一个表面的体积,为此,最好在我的双曲面周围有一个轮廓。

我怎样才能做到这一点?

\documentclass[12pt]{article}
\usepackage{amsmath}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}

\begin{document}

\begin{tikzpicture}
\begin{axis}
[
axis lines = center,
axis line style = thick,
xlabel=$x$, ylabel=$y$, zlabel=$z$,
ylabel style={left},
ymin=-10,
ymax=10,
xmin=-10,
xmax=10,
zmin=-5,
zmax=25,
unit vector ratio=1 1 1,
width=30cm,
xtick=\empty,
ytick=\empty,
ztick=\empty,
clip=false,
view={20}{25},
colormap={cm}{color(0)=(gray!20) color(1)=(gray!20)}
]
\addplot3[surf,z buffer=sort,
shader=interp,opacity=0.7,
samples=12,samples y=61,domain=0:sqrt(3),domain y=0:360]
({x*cos(y)*5},{x*sin(y)*3},{10*sqrt(1+x*x)});

\addplot3 [domain=0:360, samples=50] ({sqrt(75)*cos(x)}, {sqrt(27)*sin(x)}, {20}); 
\end{axis}
\end{tikzpicture}

\end{document}

我想要这样的东西。 PS 这里我在照片编辑器中画了一个不准确的轮廓。 在此处输入图片描述

答案1

这个答案不太严肃,但也许对某些人有用。我们可以按如下方式计算轮廓。给定一个参数为

F(u,v) = (fx(u,v),fy(u,v),fz(u,v))

可以计算切向量

 dF(u,v)/du   and   dF(u,v)/dv

法线由下式给出:

 n(u,v) =  dF(u,v)/du x dF(u,v)/dv .

然后通过以下解给出表面的轮廓

 n(u,v) . n_screeen = 0 ,

在 pgfplots 中,屏幕上的法线由以下公式给出

 (cos(el)*sin(az), -cos(el)*cos(az), sin(el)) .

仰角和方位角存储在同名的 pgf 键中,见下文。此方程可以求解 u 或 v。但是,解析解很混乱。我用 Mathematica 解决了这个问题,并用 pgfplots 绘制了结果。

\documentclass[12pt]{article}
\usepackage{amsmath}
\usepackage{pgfplots}
\pgfplotsset{compat=1.17}

\begin{document}

\begin{tikzpicture}
\begin{axis}
[
axis lines = center,
axis line style = thick,
xlabel=$x$, ylabel=$y$, zlabel=$z$,
ylabel style={left},
ymin=-10,
ymax=10,
xmin=-10,
xmax=10,
zmin=-5,
zmax=25,
unit vector ratio=1 1 1,
width=30cm,
xtick=\empty,
ytick=\empty,
ztick=\empty,
clip=false,
view={20}{25},
colormap={cm}{color(0)=(gray!20) color(1)=(gray!20)},
declare function={
ucrit1(\a,\b,\c,\r)=-acos((\a*\b*\b*\c*\r*sqrt(1+\r*\r)*sin(\pgfkeysvalueof{/pgfplots/view/az})*
tan(\pgfkeysvalueof{/pgfplots/view/el})-%
(1/pow(cos(\pgfkeysvalueof{/pgfplots/view/el}),2))*%
sqrt(\a*\a*\c*\c*\r*\r*pow(cos(\pgfkeysvalueof{/pgfplots/view/az}),2)*%
pow(cos(\pgfkeysvalueof{/pgfplots/view/el}),4)*%
(\a*\a*\c*\c*\r*\r*pow(cos(\pgfkeysvalueof{/pgfplots/view/az}),2)+%
\b*\b*(\c*\c*\r*\r*pow(sin(\pgfkeysvalueof{/pgfplots/view/az}),2)-%
\a*\a*(1+\r*\r)*pow(tan(\pgfkeysvalueof{/pgfplots/view/el}),2)))))/%
(\c*\c*\r*\r*(\a*\a*pow(cos(\pgfkeysvalueof{/pgfplots/view/az}),2)+%
\b*\b*pow(sin(\pgfkeysvalueof{/pgfplots/view/az}),2))));%
ucrit2(\a,\b,\c,\r)=180+1*\pgfkeysvalueof{/pgfplots/view/az}-ucrit1(5,3,10,x);%
}]
\addplot3[surf,z buffer=sort,
shader=interp,opacity=0.7,
samples=12,samples y=61,domain=0:sqrt(3),domain y=0:360]
({x*cos(y)*5},{x*sin(y)*3},{10*sqrt(1+x*x)});
% 
\addplot3 [domain={0.15}:{sqrt(3)},samples y=0] 
({5*x*cos(ucrit1(5,3,10,x))}, {3*x*sin(ucrit1(5,3,10,x))},{10*sqrt(1+x*x)}); 

\addplot3 [domain={0.15}:{sqrt(3)},samples y=0] 
({5*x*cos(ucrit2(5,3,10,x))}, 
{3*x*sin(ucrit2(5,3,10,x))},
{10*sqrt(1+x*x)}); 


\addplot3 [domain=0:360, samples=50] ({sqrt(75)*cos(x)}, {sqrt(27)*sin(x)}, {20}); 
\end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

它似乎有效(但是,我不明白前面的系数1ucrit2(\a,\b,\c,\r)=180+1*\pgfkeysvalueof{/pgfplots/view/az}-ucrit1(5,3,10,x);\pgfkeysvalueof{/pgfplots/view/az}认为它应该是2)。

因此,底线是,原则上可以计算并绘制这些轮廓。

它可能会以pgfplots数字方式计算轮廓,或者至少在构建绘图时原则上可以这样做。我对绘图处理程序的了解还不够多,无法声称它确实可以做到这一点,更不用说破解它们来为我们提供这些数据了。

相关内容