在 x---y 平面上绘制 3D 圆柱体和圆形

在 x---y 平面上绘制 3D 圆柱体和圆形

我正在尝试在三维空间中绘制一个圆柱体,并且还想在 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 节点默认放置在一个坐标中心。 可以使用修饰符abovebelowright和来解决这个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};

相关内容