我正在尝试在三维空间中绘制一个圆柱体,并且还想在 x-y 平面上绘制它的投影。
我找到了第一个答案这里非常有用。我只是将其复制粘贴到我的文档中,并按如下方式进行修改(修改仅在 \begin{tikzpicture} 标签内):
\documentclass[parskip]{scrartcl}
\usepackage[margin=15mm]{geometry}
\usepackage{tikz}
\pgfmathsetmacro{\xdeg}{30}
\pgfmathsetmacro{\xx}{cos(\xdeg)}
\pgfmathsetmacro{\xy}{sin(\xdeg)}
\pgfmathsetmacro{\ydeg}{120}
\pgfmathsetmacro{\yx}{cos(\ydeg)}
\pgfmathsetmacro{\yy}{sin(\ydeg)}
\pgfmathsetmacro{\zdeg}{80}
\pgfmathsetmacro{\zx}{cos(\zdeg)}
\pgfmathsetmacro{\zy}{sin(\zdeg)}
\newcommand{\tdcyl}[5]{% origin x, origin y, origin z, radius, height
\path (1,0,0);
\pgfgetlastxy{\cylxx}{\cylxy}
\path (0,1,0);
\pgfgetlastxy{\cylyx}{\cylyy}
\path (0,0,1);
\pgfgetlastxy{\cylzx}{\cylzy}
\pgfmathsetmacro{\cylt}{(\cylzy * \cylyx - \cylzx * \cylyy)/ (\cylzy * \cylxx - \cylzx * \cylxy)}
\pgfmathsetmacro{\ang}{atan(\cylt)}
\pgfmathsetmacro{\ct}{1/sqrt(1 + (\cylt)^2)}
\pgfmathsetmacro{\st}{\cylt * \ct}
\filldraw[fill=white] (#4*\ct+#1,#4*\st+#2,#3) -- ++(0,0,#5) arc[start angle=\ang,delta angle=-180,radius=#4] -- ++(0,0,-#5) arc[start angle=\ang+180,delta angle=180,radius=#4];
\filldraw[fill=white] (#1,#2,#3+#5) circle[radius=#4];
}
\begin{tikzpicture}[x={(\xx*1cm,\xy*1cm)},y={(\yx*1cm,\yy*1cm)},z={(\zx*1cm,\zy*1cm)}]
\tdcyl{-3}{-3}{0}{1}{3} % x y z r h
\tdcyl{0}{0}{0}{1}{3} % x y z r h
\draw (-3,0,0) -- (3,0,0) node[circle,fill=white] {x};
\draw (0,-3,0) -- (0,3,0) node[circle] {y};
\draw (0,0,-3) -- (0,0,3) node[circle] {z};
\end{tikzpicture}
\end{document}
我添加了另一个圆柱体并调整了位置以满足我的需要。结果如下:
这几乎就是我想要的,只是我想看到该圆柱体在 x-y 平面上的投影,但不幸的是,顶部圆柱体隐藏了整个圆。
当我禁用顶部圆柱体时:
\begin{tikzpicture}[x={(\xx*1cm,\xy*1cm)},y={(\yx*1cm,\yy*1cm)},z={(\zx*1cm,\zy*1cm)}]
\tdcyl{-3}{-3}{0}{1}{3} % x y z r h
\draw (-3,0,0) -- (3,0,0) node[circle,fill=white] {x};
\draw (0,-3,0) -- (0,3,0) node[circle] {y};
\draw (0,0,-3) -- (0,0,3) node[circle] {z};
\end{tikzpicture}
现在再次显示投影:
但顶部圆柱体丢失了...
我怎样才能使顶部圆柱体透明,或者,更好的是;我怎样才能创建一个长圆柱体并强调其在 x-y 平面上的投影?
顺便问一下,上面代码中标签 x、y、z 的位置由什么决定?我想重新定位它们,使它们不会与轴重叠。
提前致谢!
答案1
清理您的代码示例以使其成为可编译的 MWE 并显示它应显示的输出后,我得到以下代码及其输出:
\documentclass{standalone}
\usepackage{tikz}
\pgfmathsetmacro{\xdeg}{30}
\pgfmathsetmacro{\xx}{cos(\xdeg)}
\pgfmathsetmacro{\xy}{sin(\xdeg)}
\pgfmathsetmacro{\ydeg}{120}
\pgfmathsetmacro{\yx}{cos(\ydeg)}
\pgfmathsetmacro{\yy}{sin(\ydeg)}
\pgfmathsetmacro{\zdeg}{90}
\pgfmathsetmacro{\zx}{cos(\zdeg)}
\pgfmathsetmacro{\zy}{sin(\zdeg)}
\newcommand{\tdcyl}[5]{% origin x, origin y, origin z, radius, height
\path (1,0,0);
\pgfgetlastxy{\cylxx}{\cylxy}
\path (0,1,0);
\pgfgetlastxy{\cylyx}{\cylyy}
\path (0,0,1);
\pgfgetlastxy{\cylzx}{\cylzy}
\pgfmathsetmacro{\cylt}{(\cylzy * \cylyx - \cylzx * \cylyy)/ (\cylzy * \cylxx - \cylzx * \cylxy)}
\pgfmathsetmacro{\ang}{atan(\cylt)}
\pgfmathsetmacro{\ct}{1/sqrt(1 + (\cylt)^2)}
\pgfmathsetmacro{\st}{\cylt * \ct}
\draw[] (#4*\ct+#1,#4*\st+#2,#3) -- ++(0,0,#5) arc[start angle=\ang,delta angle=-180,radius=#4] -- ++(0,0,-#5) arc[start angle=\ang+180,delta angle=180,radius=#4];
\draw[] (#1,#2,#3+#5) circle[radius=#4];
}
\begin{document}
\begin{tikzpicture}[x={(\xx*1cm,\xy*1cm)},y={(\yx*1cm,\yy*1cm)},z={(\zx*1cm,\zy*1cm)}]
\tdcyl{0}{0}{-3}{1}{3} % x y z r h
\tdcyl{0}{0}{0}{1}{3} % x y z r h
\draw (-3,0,0) -- (3,0,0) node[right] {x};
\draw (0,-3,0) -- (0,3,0) node[left] {y};
\draw (0,0,-3) -- (0,0,3) node[above] {z};
\end{tikzpicture}
\end{document}
那么我改变了什么?
为了使圆柱体在 xy 平面上的投影可见,我将绘制\filldraw
圆柱体的宏中的两个命令更改为简单\draw
命令:
%Before
\filldraw[fill=white] (#4*\ct+#1,#4*\st+#2,#3) -- ++(0,0,#5) arc[start angle=\ang,delta angle=-180,radius=#4] -- ++(0,0,-#5) arc[start angle=\ang+180,delta angle=180,radius=#4];
\filldraw[fill=white] (#1,#2,#3+#5) circle[radius=#4];
%After
\draw[] (#4*\ct+#1,#4*\st+#2,#3) -- ++(0,0,#5) arc[start angle=\ang,delta angle=-180,radius=#4] -- ++(0,0,-#5) arc[start angle=\ang+180,delta angle=180,radius=#4];
\draw[] (#1,#2,#3+#5) circle[radius=#4];
示例中的旧命令将圆柱体表面绘制为不透明的白色区域,而更改后的命令仅绘制其轮廓,使圆柱体保持透明。
您的第二个问题是轴标签与轴线的干扰。 原因是 tikZ 节点默认放置在一个坐标中心。 可以使用修饰符above
、below
、right
和来解决这个left
问题,修饰符会告诉 tikZ 相对于坐标移动节点的内容。 代码如下:
\draw (-3,0,0) -- (3,0,0) node[right] {x};
\draw (0,-3,0) -- (0,3,0) node[left] {y};
\draw (0,0,-3) -- (0,0,3) node[above] {z};