我刚刚开始学习 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
。
您需要加载3d
TikZ 库才能使其工作(\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}