我正在尝试创建一个有符号距离函数 S(x),其中我想将 S(x) = 0 与平面相交。问题不在于将两个函数放入一个图中,而是让两个函数在视觉上相互相交,即最近的表面位于前景中。目前,我有类似的东西:
\documentclass{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[grid=major]
\addplot3[surf,domain=-10:10,samples=40]
{-sqrt((x-0)^2/1 + (y-0)^2/1) + 5};
\addplot3[surf,domain=-10:10,samples=2,opacity=0.5]
{0*x+0*y};
\end{axis}
\end{tikzpicture}
\end{document}
这使:
如您所见,平面仅与函数重叠,而不相交。如何做到这一点?附加问题:是否可以在交叉点处在 3d surf 图上创建轮廓?
答案1
不幸的是,这不能自动完成,因为pgfplots
无法在不同的\addplot
命令之间进行 z 缓冲。
对于这个具体的应用,你可以“手动”构建情节:
首先,绘制圆锥体低于 0 的部分,然后绘制平面和圆,然后绘制圆锥体高于 0 的部分。
为此我使用了极坐标系,因为它使极坐标函数的输入更容易:
\documentclass[border=5mm]{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[grid=major,view={20}{40},z buffer=sort, data cs=polar]
\addplot3 [surf, domain=0:360, domain y=5:10,samples=30, samples y=10]
{-y+5};
\addplot3 [data cs=cart,surf,domain=-10:10,samples=2, opacity=0.5]
{0};
\addplot3 [domain=0:360, samples y=0, samples=30, thick, z buffer=auto]
(x,5.1,0);
\addplot3 [surf,domain=0:360, domain y=0:5,samples=30, samples y=10]
{-y+5};
\end{axis}
\end{tikzpicture}
\end{document}