使用 pgfplots 可视化两个图形之间的旋转体积

使用 pgfplots 可视化两个图形之间的旋转体积

我正在尝试可视化通过围绕 x 轴旋转两个图形所生成的体积。例如,对于函数 f(x) = x^3 + 1 和 g(x) = x + 1(在区间 [0,1] 上)。以下是我迄今为止尝试过的方法:

\begin{document}

  \begin{tikzpicture}
  \pgfmathsetmacro{\u}{1.5}
 \begin{axis}[
   x={(3.2*\u cm,0.0cm)}, 
   y={(0cm,\u cm)},
   z={(-\u*0.3535cm,-\u*0.3535cm)},  
   axis lines=center,
   xmin=0
   ]
  \addplot3[opacity=0.3,surf,shader=flat,
  samples=40,
  domain=0:1,y domain=0:2*pi,
  z buffer=sort]
  (x,{(x + 1)*cos(deg(y))}, {(x+1) * sin(deg(y))});

   \addplot3[opacity=0.3,surf,shader=flat,
  samples=40,
  domain=0:1,y domain=0:2*pi,
  z buffer=sort]
  (x,{(x^3 + 1)*cos(deg(y))}, {(x^3 + 1) * sin(deg(y))});
 \end{axis}
\end{tikzpicture}

在此处输入图片描述

我不是 pgfplots 专家,所以我不知道如何才能从视觉上改善这张图片(即体积结构变得更加清晰)。体积可能已填充,也可能未填充。

那么如何才能使这个例子看起来更清楚呢?

唯一的限制是轴方向应该保持与我的例子一样。

答案1

我不确定我是否正确理解了你的问题,所以这只是“希望”,这就是你正在寻找的东西。

首先说明一下:
希望您已经清楚,目前 PGFPlots 无法“组合”多个\addplot3s 来获得真正的透视图。\addplot3s 只是按出现的顺序绘制(参见手册(v1.14)第 123 页第 4.6.1 节“开始使用 3D 之前”)。

现在有一个可能的解决方案:
由于上述原因,您只能使两个图的“对比度”更大。一种方法是给它们赋予不同的颜色,例如...

\documentclass[border=2mm]{standalone}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
    \pgfplotsset{compat=1.12}
\begin{document}
    \begin{tikzpicture}
        \pgfmathsetmacro{\u}{1.5}
        \begin{axis}[
            x={(3.2*\u cm,0.0cm)},
            y={(0cm,\u cm)},
            z={(-\u*0.3535cm,-\u*0.3535cm)},
            axis lines=center,
            xmin=0,
            %
            % moved all common keys of the plots here
            every axis plot/.append style={
                opacity=0.3,
                surf,
                shader=flat,
                samples=40,
                domain=0:1,
                y domain=0:2*pi,
                z buffer=sort,
            },
        ]
            \addplot3 [
                draw=blue!80,
                fill=blue!50,
            ] (x,{(x + 1)*cos(deg(y))}, {(x+1) * sin(deg(y))});

            \addplot3 [
                draw=red!80,
                fill=red!50,
            ] (x,{(x^3 + 1)*cos(deg(y))}, {(x^3 + 1) * sin(deg(y))});

        \end{axis}
    \end{tikzpicture}
\end{document}

这导致

该图显示了上述代码的结果

(如果你需要真实的透视结果,也许包tikz-3dplot可以帮助?)

答案2

您可以将外部图分成不同的部分,一个在前景,一个在背景,然后使用图层来增强 3D 效果。

\documentclass[tikz,border=3.14mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\begin{document}

  \begin{tikzpicture}
  \pgfmathsetmacro{\u}{1.5}
 \begin{axis}[set layers,
   x={(3.2*\u cm,0.0cm)}, 
   y={(0cm,\u cm)},
   z={(-\u*0.3535cm,-\u*0.3535cm)},  
   axis lines=center,
   xmin=0
   ]
  \addplot3[opacity=0.2,surf,shader=flat,on layer=axis background,
  samples=20,
  domain=0:1,y domain=pi:2*pi,
  z buffer=sort]
  (x,{(x + 1)*cos(deg(y))}, {(x+1) * sin(deg(y))});

   \addplot3[opacity=0.4,surf,shader=flat,on layer=main,
  samples=40,
  domain=0:1,y domain=0:2*pi,
  z buffer=sort]
  (x,{(x^3 + 1)*cos(deg(y))}, {(x^3 + 1) * sin(deg(y))});

  \addplot3[opacity=0.2,surf,shader=flat,on layer=axis foreground,
  samples=20,
  domain=0:1,y domain=0:pi,
  z buffer=sort]
  (x,{(x + 1)*cos(deg(y))}, {(x+1) * sin(deg(y))});
 \end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容