我有一个由四条路径组成的形状,我想填充内部。这四条路径以参数形式给出,每对连续路径都只有一个共同点,所以我希望这是一个定义明确的问题。请注意,我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
弯曲的部分。