在四个连续的参数路径之间进行填充

在四个连续的参数路径之间进行填充

我有一个由四条路径组成的形状,我想填充内部。这四条路径以参数形式给出,每对连续路径都只有一个共同点,所以我希望这是一个定义明确的问题。请注意,我tikz-3dplot在 MWE 中使用,因为最终的解决方案需要在tikz-3dplot环境中工作;如果我不在 3D 中,我可能会画一堆带有to控制点的线来制作形状...

\documentclass[margin=3mm,tikz]{standalone}
\usepackage{tikz}
\usepackage{tikz-3dplot}

\begin{document}
\begin{tikzpicture}
  
\tdplotsetmaincoords{130}{-45}
\tdplotsetrotatedcoords{270}{90}{90}

\begin{scope}[tdplot_rotated_coords]
  \draw %[fill=red]
    plot[variable=\t,domain=0:1] ({(8 * \t) - 4} ,3,{0.3*sin(\t*180)})
    plot[variable=\t,domain=0:1] ({(8 * \t) - 4} ,-3,{0.3*sin(\t*180)})
    plot[variable=\t,domain=0:1] (-4, {(6 * \t) - 3},{0.3*sin(\t*180)})
    plot[variable=\t,domain=0:1] (4, {(6 * \t) - 3},{0.3*sin(\t*180)});
\end{scope}

\end{tikzpicture}
\end{document}

如果没有该[fill=red]部分,这将呈现我想要的正确形状:

在此处输入图片描述

但是,如果我尝试填充它(通过取消注释[fill=red]),结果形状的内部根本没有被填充:

在此处输入图片描述

事实上,现在我把图片粘贴到这里,我注意到它在某种程度上与预期的形状有关——如果我用直边连接四个角并填充平行四边形,我只需要减去并合并我得到的输入上述代码,即可得到我想要的图片。

那么,我该如何实现这个目标呢?

答案1

请尝试以下操作:

\documentclass[margin=3mm]{standalone}
\usepackage{tikz}
\usepackage{tikz-3dplot}

\begin{document}
\begin{tikzpicture}

\tdplotsetmaincoords{130}{-45}
\tdplotsetrotatedcoords{270}{90}{90}

\begin{scope}[tdplot_rotated_coords]
  \draw [fill=red]
    plot[variable=\t,domain=0:1] (-4, {(6 * \t) - 3},{0.3*sin(\t*180)}) --
    plot[variable=\t,domain=0:1] ({(8 *\t) - 4},3,   {0.3*sin(\t*180)}) --
    plot[variable=\t,domain=0:1] (4,{-(6 * \t) + 3}, {0.3*sin(\t*180)}) --
    plot[variable=\t,domain=0:1] ({-(8 *\t) + 4},-3, {0.3*sin(\t*180)}) 
    ;
\end{scope}

\end{tikzpicture}
\end{document}

通过与您的代码的比较您可以看到,这改变了绘图的顺序,plot因此下一个开始的plot位置在前一个结束的位置,并且添加到这些对之间--(连接这两个图)。

编辑:plot随着s 顺序及其参数的 进一步排列,现在每个plot都有它的开始,而前一个有它的结束。

在此处输入图片描述

编辑(2): 代码较短的版本:

...

\begin{scope}[tdplot_rotated_coords]
  \draw [fill=red, variable=\t,domain=0:1]
    plot (-4, {(6 * \t) - 3},{0.3*sin(\t*180)}) --
    plot ({(8 *\t) - 4},3,   {0.3*sin(\t*180)}) --
    plot (4,{-(6 * \t) + 3}, {0.3*sin(\t*180)}) --
    plot ({-(8 *\t) + 4},-3, {0.3*sin(\t*180)})
    ;
\end{scope}
...

结果和以前一样。

答案2

我只是模糊地知道为什么,但以下方法有效:

\begin{scope}[tdplot_rotated_coords]
  \fill[fill=red, even odd rule]
    plot[variable=\t,domain=0:1] ({(8 * \t) - 4} ,3,{0.3*sin(\t*180)})
    plot[variable=\t,domain=0:1] ({(8 * \t) - 4} ,-3,{0.3*sin(\t*180)})
    plot[variable=\t,domain=0:1] (-4, {(6 * \t) - 3},{0.3*sin(\t*180)})
    plot[variable=\t,domain=0:1] (4, {(6 * \t) - 3},{0.3*sin(\t*180)})
    (-4,-3,0) -- ++ (8,0,0) -- ++ (0,6,0) -- ++ (-8,0,0) -- cycle;
\end{scope}

如果还要画出轮廓,则需要用第二笔画出\draw弯曲的部分。

相关内容