使用 pgfplots 绘制多边形域的函数

使用 pgfplots 绘制多边形域的函数

我正在尝试使用 pgfplots 绘制域 [-1,1]x[-1,1] 中 Heaviside 函数和三角函数之间的乘积。我可以使用 Mathematica 获得所需的结果(见图),但使用 pgfplots 时,我会得到沿对角线的阶梯状结果,如图所示在这篇文章中。是否有适当的方法来指定 pgfplots 中的绘图域?Heaviside 函数Heaviside = If[x + y < 1/2, 1, 0];在 Mathematica 中的定义如下。

使用 Mathematica

该问题的 MWE 和结果是

\documentclass[tikz]{standalone}
\usepackage{pgfplots}

\pgfmathdeclarefunction{Heaviside}{2}{%
  \pgfmathparse{#1+#2<-0.5 ? 0 : 1}%
}

\begin{document}
\begin{tikzpicture}

\begin{axis}[view={-30}{30}]

\addplot3[surf, domain=-1:1, y domain=-1:1, samples=20]
  {-Heaviside(x,y)*sin(3*x*180/pi)};
  
\end{axis}
\end{tikzpicture}
\end{document}

pgfplots 结果

答案1

您指定域的方式并没有错:domain=-1:1, y domain=-1:1。域是绘制函数的区域。问题来自两件事。首先,与 Mathematica 不同,PGFPlots 不会对函数进行任何分析。PGFPlots 毕竟不是数学程序,而是在绘图程序(TikZ)之上绘图的软件包(是的,TikZ 是一个绘图程序)。其次,对函数进行求值的点(样本点)数量有限,并且没有准确的方法来控制在哪里。样本点均匀分布在由 控制的域上samples。唯一的其他方法是使用samples at=,但它无法帮助在此处获得不连续点周围的细间距样本。

一种解决方案是沿着不连续线在小矩形域中多次绘制函数,并采用较高的采样数。这需要人工考虑和细心,并且不会得到很好的结果。

另一种方法是使用这样的剪辑逐层手动进行:

\documentclass[tikz, border=1cm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
\usepgfplotslibrary{patchplots}
\begin{document}
\begin{tikzpicture}[line join=bevel]
\begin{axis}[view={-30}{30}]
\addplot3[surf, shader=faceted interp, domain=-1:0, y domain=0:1, samples=11, samples y=11] {-sin(3*x*180/pi)};
\addplot3[surf, shader=faceted interp, domain=0:1, y domain=-1:1, samples=11, samples y=21, forget plot] {-sin(3*x*180/pi)};
\begin{scope}
\draw[clip] plot[domain=-1:0.5, smooth] (\x, -0.5-\x, {-sin(3*\x*180/pi)}) -- (0.5,-1,0) -- (-1,0.5,0) -- cycle;
\addplot3[patch, shader=interp, patch type=rectangle, patch refines=3, forget plot] coordinates { (-1,0.5,-1) (0.5,-1,-1) (0.5,-1,1) (-1,0.5,1)};  
\end{scope}
\begin{scope}
\draw[clip] (-1,0.5,0) -- (0.5,-1,0) -- (-1,-1,0) -- cycle;
\addplot3[surf, domain=-1:1, y domain=-1:1, samples=21, forget plot] {0};
\end{scope}
\end{axis}
\end{tikzpicture}
\end{document}

不连续表面的 3D 图形

相关内容