![问题](https://linux22.com/image/433076/%E9%97%AE%E9%A2%98.png)
问题
描述和示例
我想创建一个由各个层组成的圆柱体,然后从正面视图中切出各个部分,以便显示各个层的组成。
思考过程
- 弄清楚如何创建圆柱体
- 将圆形/椭圆形改为圆弧
- 将暴露的表面画成平行四边形
- 在中间圆柱周围每层画两个圆弧并连接起来
- 绘制更多暴露的表面
1. 弄清楚如何创建圆柱体
- 绘制圆柱体和其他形状
- 圆柱套圆柱
- 同心圆柱(不知道这里面发生了什么)
2. 将圆形/椭圆形改为圆弧
我已经卡在这部分了,我发现如何通过修改答案来绘制椭圆弧这个问题但我不确定如何将圆弧的两端连接到椭圆的中心以创建可填充的形状。
3. 将暴露的表面画成平行四边形
对于圆,计算跨越某个角度的圆弧的精确坐标很容易,但我不确定如何计算椭圆。我想知道我是否可以让 TikZ 找到椭圆弧的起点和终点坐标。一旦我得到这些点,我想使用它--
并cycle
描绘出暴露的表面就很容易了。
4. 在中间圆柱周围每层画两个圆弧并连接起来
与问题 2 类似,但我必须循环遍历两个圆弧的起点和终点。
5. 绘制更多暴露的表面
与 3 相同。
到目前为止我尝试过的
我一直在浏览 TikZ 手册,但笨拙的措辞和不直观的流程让我有点不知所措。我查找了一些看似相关的问题,并尝试重新使用答案中的代码,但最终我对框架不够熟悉,无法很好地掌握我应该在这里做什么。
有没有适合新手的方法来实现这一点?我想我在 TikZ 手册中看到了一些 3D 示例,但我对 Z 轴不感兴趣。我试图在 XY 平面上创建一个图像,其中 Z 轴直接指向页面外,如果这有意义的话。
答案1
我提供了一个解决方案,它使用等距轴,并利用了绘图的对称性。只需几个 tikz 样式,您就能拥有它。
\documentclass[border=2mm]{standalone}
\usepackage {tikz}
\usetikzlibrary{3d}
\pgfmathsetmacro\ip{0.5*sqrt(3)} % isometric perspective factor
\tikzset%
{% styles
base/.style ={draw=#1, fill=#1!20,thick},
inner/.style={draw=#1, fill=#1!10,thick},
outer/.style={draw=#1, left color=#1!50,right color=#1!20,thick},
}
\begin{document}
\begin{tikzpicture}[line cap=round,line join=round,%
x={({-\ip cm,-0.5 cm})},y={(\ip cm,-0.5 cm)},z={(0 cm,1 cm)}]
% dimensions
\def\r{2} % inner cylinder radius
\def\h{3} % inner cylinder height
\def\a{20} % inner cylinder (semi)angle
\def\R{3} % outer cylinder radius
\def\H{2.5} % outer cylinder height
\def\A{30} % outer cylinder (semi)angle
% outer cylinder, top base
\draw[base=red,canvas is xy plane at z=\H] (0,0) circle (\R);
% inner cylinder
\draw[base=blue,canvas is xy plane at z=\h] (0,0) circle (\r);
\foreach\i in {-1,1}
{%
\begin{scope}[x={(-\i*\ip cm, -0.5 cm)},y={(\i*\ip cm, -0.5 cm)}]
\draw[inner=blue,rotate around z=45+\a,canvas is xz plane at y=0] (0,0) rectangle (\r,\h);
\draw[outer=blue] (45+\a:\r) arc (45+\a:45+\A:\r) --++ (0,0,\H) arc (45+\A:135:\r) --++
(0,0,\h-\H) arc (135:45+\a:\r) -- cycle;
\end{scope}
}
% outer cylinder
\foreach\i in {-1,1}
{%
\begin{scope}[x={(-\i*\ip cm, -0.5 cm)},y={(\i*\ip cm, -0.5 cm)}]
\draw[inner=red,rotate around z=45+\A,canvas is xz plane at y=0] (\r,0) rectangle (\R,\H);
\draw[outer=red] (45+\A:\R) arc (45+\A:135:\R) --++ (0,0,\H) arc (135:45+\A:\R) -- cycle;
\draw[red,thick,line cap=butt,canvas is xy plane at z=\H] (45+\A:\r) arc (45+\A:135:\r);
\end{scope}
}
\end{tikzpicture}
\end{document}
更新:我添加了一个圆柱体和底座
\newcommand
以使代码更具可定制性。
\documentclass[border=2mm]{standalone}
\usepackage {tikz}
\usetikzlibrary{3d}
\pgfmathsetmacro\ip{0.5*sqrt(3)} % isometric perspective factor
\newcommand{\cylinder}[5] % inner radius, outer radius, height, (semi)angle, color
{%
\foreach\i in {-1,1}
{%
\begin{scope}[x={(-\i*\ip cm, -0.5 cm)},y={(\i*\ip cm, -0.5 cm)}]
\draw[thick,#5,fill=#5!20,rotate around z=45+#4,canvas is xz plane at y=0] (#1,0) rectangle (#2,#3);
\draw[thick,#5,left color=#5!40,right color=#5!10] (45+#4:#2) arc (45+#4:135:#2) --++ (0,0,#3) arc (135:45+#4:#2) -- cycle;
\draw[thick,#5,fill=#5!10,canvas is xy plane at z=#3] (135:#2) arc (135:45+#4:#2) -- (45+#4:#1) arc (45+#4:135:#1);
\end{scope}
}
}
\newcommand{\base}[4] % outer radius, height, (semi)angle, color
{%
\draw[thick,#4,fill=#4!10,canvas is xy plane at z=#2] (0,0) -- (45+#3:#1) arc (45+#3:405-#3:#1);
}
\begin{document}
\begin{tikzpicture}[line cap=round,line join=round,%
x={({-\ip cm,-0.5 cm})},y={(\ip cm,-0.5 cm)},z={(0 cm,1 cm)}]
% bases higher to lower
\base{4}{1}{35}{gray}
\base{3}{2}{30}{blue}
\base{2}{3}{25}{red}
\base{1}{4}{20}{green}
% cylindric surfaces, inner to outer
\cylinder{0}{1}{4}{20}{green}
\cylinder{1}{2}{3}{25}{red}
\cylinder{2}{3}{2}{30}{blue}
\cylinder{3}{4}{1}{35}{gray}
\end{tikzpicture}
\end{document}
答案2
外半径称为R
,内半径称为r
,外开口角称为alpha
,内称为beta
,外壳高度称为h
,内圆柱高度称为H
。然后,您可以安装一些视图,绘制一些弧线和线,并使用一些剪辑。
\documentclass[tikz,border=3mm]{standalone}
\usepackage{tikz-3dplot}
\tdplotsetmaincoords{70}{0}
\begin{document}
\begin{tikzpicture}[tdplot_main_coords,line join=round,line cap=round,
declare function={alpha=50;beta=30;R=4;r=3;h=3;H=4;}]
\path (0,0,0) coordinate (O) (0,0,h) coordinate (h) (0,0,H) coordinate (H);
\begin{scope}[canvas is xy plane at z=0]
\draw[fill=red!30,draw=red,shift={(h)}]
(-90+alpha/2:R)
arc[start angle=-90+alpha/2,end angle=270-alpha/2,radius=R]
-- (-90-alpha/2:r)
arc[start angle=270-alpha/2,end angle=-90+alpha/2,radius=r]
-- cycle;
\draw[fill=red!30,draw=red]
(-90+alpha/2:R) -- (-90+alpha/2:r) -- ++ (h) -- ++ (-90+alpha/2:R-r)
-- cycle
(-90-alpha/2:R) -- (-90-alpha/2:r) -- ++ (h) -- ++ (-90-alpha/2:R-r)
-- cycle;
\draw[fill,red,radius=R] (-90+alpha/2:R) arc[start angle=-90+alpha/2,end angle=0]
-- ++ (h) arc[start angle=0,end angle=-90+alpha/2] -- cycle
(-90-alpha/2:R) arc[start angle=-90-alpha/2,end angle=-180]
-- ++ (h) arc[start angle=-180,end angle=-90-alpha/2] -- cycle;
\clip[radius=r] (-90+alpha/2:r) -- ++ (h)
arc[start angle=-90+alpha/2,end angle=0] --
([yshift=\pgflinewidth]H-|r,0)
arc[start angle=0,end angle=180]--
(h-|-r,0)
arc[start angle=180,end angle=270-alpha/2]
-- (-90-alpha/2:r) arc[start angle=-90-alpha/2,end angle=-90+alpha/2];
\draw[fill,blue,radius=r] (-90+beta/2:r) arc[start angle=-90+beta/2,end angle=0]
-- ++ (H) arc[start angle=0,end angle=-90+beta/2] -- cycle
(-90-beta/2:r) arc[start angle=-90-beta/2,end angle=-180]
-- ++ (H) arc[start angle=-180,end angle=-90-beta/2] -- cycle;
\draw[fill=blue!30,draw=blue]
(-90+beta/2:r) -- (0,0) -- ++ (H) -- ++ (-90+beta/2:r)
-- cycle
(-90-beta/2:r) -- (0,0) -- ++ (H) -- ++ (-90-beta/2:r)
-- cycle;
\draw[fill=blue!60,draw=blue,shift={(H)}]
(-90+beta/2:r)
arc[start angle=-90+beta/2,end angle=270-beta/2,radius=r]
-- (0,0) -- cycle;
\end{scope}
\end{tikzpicture}
\end{document}