我可以画出图片中的黑色部分,但我不能以角度 alpha 旋转并绘制红色部分并填充它。另外,很明显,图形的两侧旋转,一侧固定,另一侧只是在 z 方向上移动。
\documentclass{standalone}
\usepackage{tikz,tikz-3dplot}
\begin{document}
\begin{tikzpicture}
\draw[->] (0,0,0)--++(5,0,0) node[right]{$x$};
\draw[->] (0,0,0)--++(0,5,0) node[above]{$y$};
\draw[->] (0,0,0)--++(0,0,8) node[below left]{$z$};
\draw[ultra thick] (4,0,0) arc[start angle=0, end angle=60, radius=4] --++(0,0,8.5) arc[start angle=60, end angle=0, radius=4]--cycle;
\filldraw[ fill=blue, nearly transparent, ,looseness=.6](4,0,0) arc[start angle=0, end angle=60, radius=4] --++(0,0,8.5) arc[start angle=60, end angle=0, radius=4]--cycle;
\end{tikzpicture}
\end{document}
答案1
我不确定这是否会有很大帮助。[但至少请参见下面的旋转版本,它可能更有用。]您需要一个对该软件包了解更多(阅读“任何内容”)的人tikz-3dplot。这更多的是我最初的实验,而不是答案。
据我了解(但并不十分清楚),该软件包基于不同的坐标系工作。因此,其理念是,若要在 3D 中绘制弧线,您需要找出正确的 x'y' 平面来告诉 TikZ 进行绘制,因为 TikZ 只能在 2D 中绘制弧线,而不是 3D。因此,该软件包所做的一件事是提供一个命令,该命令根据给定的角度来计算该平面。
\tdplotsetthetaplanecoords{30}
这有效地建立了一个旋转坐标系统,让您可以在适当的 x'y' 平面上使用圆弧绘制东西。
... 我认为 ...
要使用此功能,您需要首先设置主要的、非旋转的坐标系。
\tdplotsetmaincoords{45}{150}
这个选择有点随意。毫无疑问,你会想要不同的值。这将设置主坐标系,该坐标系围绕 z 轴和 x 轴旋转指定的量。
\tdplotsetmaincoords{45}{150}
\begin{tikzpicture}[tdplot_main_coords]
\draw[->] (0,0,0) -- (5,0,0) node[anchor=north east]{$x$};
\draw[->] (0,0,0) -- (0,5,0) node[anchor=north west]{$y$};
\draw[->] (0,0,0) -- (0,0,8) node[anchor=south]{$z$};
\end{tikzpicture}
这样我们就可以绘制并填充未旋转的形状。
\draw [ultra thick, preaction={fill=blue, nearly transparent}] (4,0,0) arc[start angle=0, end angle=60, radius=4] -- ++(0,0,8.5) arc[start angle=60, end angle=0, radius=4] coordinate [pos=.75] (a) -- cycle;
然后我们使用任意角度(例如 30 度)指定旋转的坐标系。
\tdplotsetthetaplanecoords{30}
现在如果我们绘制,坐标将相对于旋转系统。我想。因此,我们只需要通过在第一个命令中使用的值上添加 30 来补偿结束和开始圆弧时圆上的不同位置\draw
。
\draw [ultra thick, preaction={fill=red, nearly transparent}] (4,0,0) arc[start angle=30, end angle=90, radius=4] -- ++(0,0,8.5) arc[start angle=90, end angle=30, radius=4] coordinate [pos=.75] (b) -- cycle;
最后,我们可以在顶部稍微粗略地添加角度。
\draw [green, ultra thick, ->] (a) [bend right]to (b) node [above] {$\alpha$};
完整代码:
\documentclass[border=5pt, multi, tikz]{standalone}
\usepackage{tikz-3dplot}
\begin{document}
\tdplotsetmaincoords{45}{150}
\begin{tikzpicture}[tdplot_main_coords]
\draw[->] (0,0,0) -- (5,0,0) node[anchor=north east]{$x$};
\draw[->] (0,0,0) -- (0,5,0) node[anchor=north west]{$y$};
\draw[->] (0,0,0) -- (0,0,8) node[anchor=south]{$z$};
\draw [ultra thick, preaction={fill=blue, nearly transparent}] (4,0,0) arc[start angle=0, end angle=60, radius=4] -- ++(0,0,8.5) arc[start angle=60, end angle=0, radius=4] coordinate [pos=.75] (a) -- cycle;
\tdplotsetthetaplanecoords{30}
\draw [ultra thick, preaction={fill=red, nearly transparent}] (4,0,0) arc[start angle=30, end angle=90, radius=4] -- ++(0,0,8.5) arc[start angle=90, end angle=30, radius=4] coordinate [pos=.75] (b) -- cycle;
\draw [green, ultra thick, ->] (a) [bend right]to (b) node [above] {$\alpha$};
\end{tikzpicture}
\end{document}
编辑
您可以通过旋转常规 TikZ 坐标系来根据需要旋转图片,rotate around <axis>=<angle>
如 Ktree 所示这里。例如,如果我改变tikz-3d主坐标变换为
\tdplotsetmaincoords{-35}{0}
并使用
rotate around y=-10
然后对角度的绘制和轴的标记进行适当的调整,可以得到以下结果:
完整代码:
\documentclass[border=5pt, multi, tikz]{standalone}
\usepackage{tikz-3dplot}
\begin{document}
\tdplotsetmaincoords{-35}{0}
\begin{tikzpicture}[tdplot_main_coords]
\begin{scope}[rotate around y=-10]
\draw[->] (0,0,0) -- (5,0,0) node[anchor=west]{$x$};
\draw[->] (0,0,0) -- (0,5,0) node[anchor=south]{$y$};
\draw[->] (0,0,0) -- (0,0,8) node[anchor=north]{$z$};
\draw [ultra thick, preaction={fill=blue, nearly transparent}] (4,0,0) arc[start angle=0, end angle=60, radius=4] coordinate [pos=.25] (a) -- ++(0,0,8.5) arc[start angle=60, end angle=0, radius=4] -- cycle;
\tdplotsetthetaplanecoords{30}
\draw [ultra thick, preaction={fill=red, nearly transparent}] (4,0,0) arc[start angle=30, end angle=90, radius=4] coordinate [pos=.2] (b) -- ++(0,0,8.5) arc[start angle=90, end angle=30, radius=4] -- cycle;
\draw [green!75!black, ultra thick, <->] (a) [bend right] to (b);
\node [green!75!black, yshift=5pt, anchor=south] at (b) {$\alpha$};
\end{scope}
\end{tikzpicture}
\end{document}
答案2
在问题1(此处重复问题),我展示了一个使用范围进行旋转并save path
实现填充的解决方案。这是
- 复杂且
- 路径没有连通,因此角落可能看起来很丑陋。
当我理解如何仅将变换应用于路径的一部分时,我发现了一个更简单的解决方案:
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
%coordinate system
\draw[->] (0,0,0)--++(5,0,0) node[right]{$x$};
\draw[->] (0,0,0)--++(0,5,0) node[above]{$y$};
\draw[->] (0,0,0)--++(0,0,10) node[below left]{$z$};
% cylinder:
\draw[preaction={fill=blue,very nearly transparent}](4,0,0)
arc[start angle=0, end angle=90, radius=4]node[inner sep=0](n11){}
-- ++(0,0,8.5)node[inner sep=0](n21){}
arc[start angle=90, end angle=0, radius=4] -- cycle;
\draw[](n21.center)--(0,0,8.5)--(4,0,8.5);
\draw[](0,4,0)--(n11.center);
% skew cylinder
\draw[ultra thick, preaction={fill=red,nearly transparent}] (4,0,0)
{[rotate around x=30]arc[start angle=0, end angle=90, radius=4]node[inner sep=0](n1){}}
-- ++(0,0,8.5) node[inner sep=0](n2){}
{[rotate around x=30]arc[start angle=90, end angle=0, radius=4]} -- cycle;
% the connections
\draw[ultra thick](n2.center)--(0,0,8.5)--(4,0,8.5);
\draw[thick, dashed](0,4,0)--(n1.center);
\end{tikzpicture}
\end{document}