圆周上的 3D TikZ 线

圆周上的 3D TikZ 线

我刚刚开始学习 TikZ,我制作了一些 2D 图像,我想制作哈勃望远镜的 3D 线框。望远镜的主体基本上是一对管子,前面的一个比另一个略窄。我曾想过画一系列圆圈,然后沿着它们画线来创建一个圆柱体。

问题是,我的线条没有落在圆的周长上。我使用 circle 命令在平面上绘制圆圈,(y,z)同时x沿望远镜的长度变化。我曾想过使用方程式计算线条的端点y = radius * cos(\theta)z = radius * sin(\theta)但线条结果略微偏离圆柱体的表面。我尝试了很多不同的方法。一件非常奇怪的事情(对我来说)是,如果我为线条计算指定半径(厘米),线条就会方式圆柱体。尽管在 中指定了圆的半径cm


\tikzset{
    MyPersp/.style={scale=1.8,x={(-0.8cm,-0.4cm)},y={(0.8cm,-0.4cm)},z={(0cm,1cm)}}
}

\newcommand{\hubble}[0] {%
    \foreach \x in {0,0.25,...,1.0} {
        \draw[very thick] (\x,0,0) circle (0.75cm);
    }
    \draw[very thick] (1.25,0,0) circle ({1.25cm / 2});
    \foreach \x in {1.5,1.75,...,2.25} {
        \draw[very thick] (\x,0,0) circle (0.5cm);
    }

    \foreach \r/\x/\xx in {0.75/0/1,0.5/1.5/2.25}{
        \foreach \theta in {0,30,...,360}{
            \def\y{{\r*cos(\theta)}}
            \def\z{{\r*sin(\theta)}}
            \draw[very thick](\x,\y,\z) -- (\xx,\y,\z);
        }
    }
}

\begin{tikzpicture}[MyPersp]

\hubble

\end{tikzpicture}

生成的图像

答案1

这可能是需要对原始代码进行最少修改的解决方案:

\newcommand{\hubble}[0] {%
    \foreach \x in {0,0.25,...,1} {
       \begin{scope}[canvas is yz plane at x=\x]
        \draw[very thick] (0,0) circle (0.75cm);
       \end{scope}
    }
    %\draw[very thick] (1.25,0,0) circle ({1.25cm / 2});
    \foreach \x in {1.5,1.75,...,2.25} {
          \begin{scope}[canvas is yz plane at x=\x]
        \draw[very thick] (0,0) circle (0.5cm);
       \end{scope}
    }

    \foreach \r/\x/\xx in {0.75/0/1,0.5/1.5/2.25}{
        \foreach \theta in {0,30,...,360}{
            \def\y{{\r*cos(\theta)}}
            \def\z{{\r*sin(\theta)}}
            \draw[very thick](\x,\y,\z) -- (\xx,\y,\z);
        }
    }

}

正如您所见,诀窍是每次在新的x坐标处绘制圆时将 yz 平面指定为“活动画布”。现在可以按常规方式指定圆的半径和圆心2d

您需要加载3dTikZ 库才能使其工作(\usetikzlibrary{3d}在加载 TikZ 包后,自然在序言中插入该行)。

即使您改变透视参数,线条仍会保持一致地保持在圆圈上。

答案2

这样怎么样:我让圆沿 z 轴增长。小圆的半径为 1,大圆的半径为 2,圆的 z 轴间距为 0.6 个单位。从极坐标我们知道和x=r cos(phi)y=r sin(phi)我不知道您是否希望将其自定义,但这可以轻松添加。

\documentclass[parskip]{scrartcl}
\usepackage[margin=15mm]{geometry}
\usepackage{tikz}

\begin{document}

\pgfmathsetmacro{\zdeg}{10}
\pgfmathsetmacro{\zx}{cos(\zdeg)}
\pgfmathsetmacro{\zy}{sin(\zdeg)}

\begin{tikzpicture}[z={(\zx*1cm,\zy*1cm)}]
    \foreach \z in {0,...,5}
    {   \draw (0,0,\z*0.6) circle (1);
        \draw (0,0,\z*0.6+3) circle (2);
    }
    \foreach \deg in {1,...,18}
    {   \pgfmathsetmacro{\xval}{cos(20*\deg)}
        \pgfmathsetmacro{\yval}{sin(20*\deg)}
        \draw (\xval,\yval,0) -- (\xval,\yval,3);
        \draw (2*\xval,2*\yval,3) -- (2*\xval,2*\yval,6);
    }
\end{tikzpicture}

\end{document}

在此处输入图片描述

相关内容