![表面轮廓 – pgfplots 3D](https://linux22.com/image/412753/%E8%A1%A8%E9%9D%A2%E8%BD%AE%E5%BB%93%20%E2%80%93%20pgfplots%203D.png)
我想要展示一个表面的体积,为此,最好在我的双曲面周围有一个轮廓。
我怎样才能做到这一点?
\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}
答案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}
它似乎有效(但是,我不明白前面的系数1
,ucrit2(\a,\b,\c,\r)=180+1*\pgfkeysvalueof{/pgfplots/view/az}-ucrit1(5,3,10,x);
我\pgfkeysvalueof{/pgfplots/view/az}
认为它应该是2
)。
因此,底线是,原则上可以计算并绘制这些轮廓。
它可能会以pgfplots
数字方式计算轮廓,或者至少在构建绘图时原则上可以这样做。我对绘图处理程序的了解还不够多,无法声称它确实可以做到这一点,更不用说破解它们来为我们提供这些数据了。