填充 3D 对象图

填充 3D 对象图

我想绘制一个 3D 对象并完全填充它。该对象在 [0,1]^3 中定义,我知道上限函数和下限函数。问题是我知道如何绘制上限和下限,但我不知道如何在两者之间填充(并且两者之间的填充不起作用……或者至少我没有实现让它起作用!)。这是我当前的代码:

\begin{tikzpicture}[declare function={
    pbar(\x, \y)=min(0.5+0.4*\y, 0.5+0.4-0.4*\x); 
    plow(\x, \y)=max(0.5-0.25+(0.4-0.15)*\y, 0.5-0.25*\x); 
}]
\pgfdeclarelayer{pre main}
\pgfsetlayers{pre main,main}
\begin{axis}[
zmax=1.00, zmin=0, ymin=0, ymax=1, xmax=1, xmin=0,
view/h=55,
grid=minor,
colormap={mycol}{color=(blue), color=(red)},
xlabel = $X$,
ylabel = $Y$,
zlabel = {$F$},
]
\begin{pgfonlayer}{pre main}
\addplot3[name path=pmax,  
    surf,
    faceted color=gray, 
    samples=15, opacity=0.3, 
    domain=0:1,y domain=0:1
] {pbar(x,y)};

\addplot3[name path=pmin, 
    surf,
    faceted color=gray,  
    samples=15, opacity=0.3, 
    domain=0:1,y domain=0:1
] {plow(x,y)};
\end{pgfonlayer}
\end{axis}
\end{tikzpicture}

我得到的结果如下:在此处输入图片描述 我希望它是一个完整的“封闭形状”,即一个填充的多边形。(也可能改变视图以使其更明显,但那是以后的事了)。

答案1

PGFPlots 或 TikZ 中没有 3D。3D 填充在图形中也没有多大意义。一切都是 2D 的,并按照代码中的顺序绘制,因此您需要在绘制下表面之后绘制上表面。如果您希望背面和正面填充颜色,您可以像下面这样操作。如果您想要一个网格,您可以使用\clipmeshsurf图绘制方形网格,也可以使用patch具有三角形网格的图。

\documentclass[tikz, border=1cm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
\begin{document}
\begin{tikzpicture}[
declare function={
pbar(\x,\y)=min(0.5+0.4*\y, 0.5+0.4-0.4*\x); 
plow(\x,\y)=max(0.5-0.25+(0.4-0.15)*\y, 0.5-0.25*\x); 
}]
\begin{axis}[
view/h=55,
xmin=0, xmax=1,
ymin=0, ymax=1,
zmin=0, zmax=1,
grid=minor,
colormap={mycol}{color=(blue), color=(red)},
xlabel = $X$, ylabel = $Y$, zlabel = {$F$},
]
\fill[teal, opacity=0.1]
  (0,0,{plow(0,0)}) -- (0,1,{plow(0,1)}) -- (1,1,{plow(1,1)}) -- 
  (1,1,{pbar(1,1)}) -- (0,1,{pbar(0,1)}) -- (0,0,{pbar(0,0)}) -- cycle;
\addplot3[ 
surf,
faceted color=gray,  
samples=15, opacity=0.5, 
domain=0:1, y domain=0:1,
] {plow(x,y)};
\addplot3[  
surf,
faceted color=gray, 
samples=15, opacity=0.6, 
domain=0:1, y domain=0:1,
] {pbar(x,y)};
\fill[red, opacity=0.5]
  (0,0,{plow(0,0)}) -- (1,0,{plow(1,0)}) -- (1,1,{plow(1,1)}) -- 
  (1,1,{pbar(1,1)}) -- (1,0,{pbar(1,0)}) -- (0,0,{pbar(0,0)}) -- cycle;
\draw[gray] (1,0,{plow(1,0)}) -- (1,0,{pbar(1,0)});
\end{axis}
\end{tikzpicture}
\end{document}

3D 图形中的彩色形状

编辑:覆盖patch有地块的表面:

\documentclass[tikz, border=1cm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
\begin{document}
\begin{tikzpicture}[
declare function={
pbar(\x,\y)=min(0.5+0.4*\y, 0.5+0.4-0.4*\x); 
plow(\x,\y)=max(0.5-0.25+(0.4-0.15)*\y, 0.5-0.25*\x); 
}]
\begin{axis}[
view/h=55,
xmin=0, xmax=1,
ymin=0, ymax=1,
zmin=0, zmax=1,
grid=minor,
colormap={mycol}{color=(blue), color=(red)},
xlabel = $X$, ylabel = $Y$, zlabel = {$F$},
]
\addplot3[
patch, patch type=triangle, patch refines=6, 
faceted color=gray, opacity=0.6] coordinates {
  (0,0,{plow(0,0)}) (0,1,{plow(0,1)}) (0,1,{pbar(0,1)}) 
  (1,1,{plow(1,1)}) (0,1,{plow(0,1)}) (0,1,{pbar(0,1)})};
\addplot3[ 
surf,
faceted color=gray,  
samples=15, opacity=0.6, 
domain=0:1, y domain=0:1,
] {plow(x,y)};
\addplot3[  
surf,
faceted color=gray, 
samples=15, opacity=0.6, 
domain=0:1, y domain=0:1,
] {pbar(x,y)};
\addplot3[
patch, patch type=triangle, patch refines=6, 
faceted color=gray, opacity=0.6] coordinates {
  (0,0,{plow(0,0)}) (1,0,{plow(1,0)}) (1,0,{pbar(1,0)}) 
  (1,1,{plow(1,1)}) (1,0,{plow(1,0)}) (1,0,{pbar(1,0)})};
\end{axis}
\end{tikzpicture}
\end{document}

图形中带有网格的彩色 3D 形状

相关内容