TiKZ 中的 3d 平面和旋转坐标系

TiKZ 中的 3d 平面和旋转坐标系

我对 TikZ 还很陌生(从今天开始),但我已经对它的所有功能感到惊讶。

我想绘制一个环(粒子加速器)的坐标系,显示粒子运动的三个方向,以及轨道不同点的速度矢量。

y这些坐标具有始终垂直于平面、z始终与轨道相切且x始终指向径向的特性。

是否有可能在轨道的不同位置显示这种行为?

这就是我今天所做的,但它既不优雅也不高效,因为我正在倾斜平面来获​​得透视,同时我想摆放一个不在同一平面上定义的坐标系。

我将衷心感谢您的帮助。

\documentclass{article}
\usepackage{verbatim}
\usepackage{tikz} 
\usepackage{tikz-3dplot}
\usepackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}
\setlength\PreviewBorder{5pt}
\begin{document}
\begin{tikzpicture}[scale=10,tdplot_main_coords]

\begin{scope}
\coordinate (coosys0) at (0,0,0);
\draw[blue,thick,->] (coosys0)-- (0.15,0,0) node[anchor=north east]{$x$};
\draw[blue,thick,->] (coosys0)-- (0,0.15,0) node[anchor=north west]{$z$};
\draw[blue,thick,->] (coosys0)-- (0,0,0.15) node[anchor=south]{$y$};
\end{scope}

\begin{scope} [yshift=-1.3,xshift=0.7,yslant=0.5,xslant=-1] 
\draw[rounded corners=12ex,black, thick] (0,0,0)rectangle(20pt,2ex);
\end{scope}

\end{tikzpicture}
\end{document}

答案1

代码

\documentclass{scrartcl}
\usepackage{tikz}
\usetikzlibrary{calc}

\begin{document}

\newcommand{\xangle}{7}
\newcommand{\yangle}{137.5}
\newcommand{\zangle}{90}

\newcommand{\xlength}{1}
\newcommand{\ylength}{0.5}
\newcommand{\zlength}{1}

\pgfmathsetmacro{\xx}{\xlength*cos(\xangle)}
\pgfmathsetmacro{\xy}{\xlength*sin(\xangle)}
\pgfmathsetmacro{\yx}{\ylength*cos(\yangle)}
\pgfmathsetmacro{\yy}{\ylength*sin(\yangle)}
\pgfmathsetmacro{\zx}{\zlength*cos(\zangle)}
\pgfmathsetmacro{\zy}{\zlength*sin(\zangle)}

\begin{tikzpicture}
[   x={(\xx cm,\xy cm)},
    y={(\yx cm,\yy cm)},
    z={(\zx cm,\zy cm)},
]
\fill[blue!50!gray!30, even odd rule] (0,0,0) circle (5) (0,0,0) circle (4);


\foreach \d in {11,57,95,177,225,270}
{   \draw[blue!80!black,->] (\d:4.5) -- (\d:5.5);
    \node[blue!80!black] at (\d:5.8) {z};
    \draw[green!80!black,->] (\d:4.5) -- ++(0,0,1);
    \node[green!80!black] at ($(\d:4.5)+(0,0,1.2)$) {y};
    \draw[red!80!black,->] (\d:4.5) -- ++ (\d+90:1);
    \node[red!80!black] at ($(\d:4.5)+(\d+90:1.3)$) {x};
    \fill[yellow!50!gray,draw=yellow!50!black] (\d:4.5) circle (0.05cm);
}

\end{tikzpicture}

\end{document}

结果

在此处输入图片描述

解释

  • 前 6 个命令设置笛卡尔单位向量的方向和长度蒂克兹用途。您还可以使用例如0/225/90 1/0.5/1散焦透视或-30/210/90 1/1/1等距透视。然后,您设置的值将传递给tikzpicture

  • 然后使用 绘制一个圆环even odd rule:所有填充奇数次的部分都实际填充,所有填充偶数次的部分都留空;第一个fill命令指定一个围绕原点的半径为 5 的圆,然后指定一个半径为 4 的圆,因此 '内部'(半径 <=4)填充两次(偶数),因此留空。

  • 然后foreach使用命令循环遍历多个点。此处的数字为度数,它们被保存\d以用于绘制命令。

  • 循环中的前 2 个命令 ( blue!80!black) 使用极地国家蒂克兹<angle>:<radius>。由于环从半径 4 延伸到 5,中间是 4.5。要绘制->长度为 1 的箭头 ( ),可以从 到 绘制\d:4.5\d:5.5您也可以使用(\d:4.5) -- ++ (\d:1),其中++意味着解释相对于上一个坐标的下一个坐标node放在同一个方向,只是更靠外(5.8

  • 对于垂直箭头,++使用 的概念。箭头的起点再次是\d:4.5,我们需要向上移动一个单位,因此 z 方向:++ (0,0,1)。对于节点,计算库。类似的东西\node at (a,b) ++ (c,d) {}失败了,但是计算库可以使用坐标进行计算:($ (a,b) + (c,d) $)。同样,节点只是稍微高一点(1.2)。

  • 对于切线分量,箭头再次从 开始\d:4.5。由于切线指向与 相差 90 度的方向\d,因此使用方式如下:++ (\d+90:1)。对于另一个方向,只需使用++ (\d-90:1)。节点再次沿着此路径放置得稍远一些(1.3)。

  • 最后,放置一个小黄点。注意明确使用单位(0.05cm)。这确保绘制的是圆形,否则(0.05)由于轴的选择,它将是椭圆形。

  • 我想我搞混了X方向,您可以通过更改节点的标签来轻松纠正它:{x}<-> {z}


补充

由于这很有趣,我对其进行了一些润色:

\pgfdeclarelayer{background layer}
\pgfsetlayers{background layer,main}

\begin{tikzpicture}
[   x={(\xx cm,\xy cm)},
    y={(\yx cm,\yy cm)},
    z={(\zx cm,\zy cm)},
]

\fill[blue!80!cyan, even odd rule] (0,0,0) circle (5) (0,0,0) circle (4);

\foreach \d in {5,20,...,350}
{   \draw[yellow!30!black,thin,densely dotted] (0,0) -- (\d:4.5);
    \draw[yellow,->,thick] (\d:4.5) -- (\d:5.5);
    %\node[yellow] at (\d:5.8) {x};
    \draw[orange,->,thick] (\d:4.5) -- ++(0,0,1);
    %\node[orange] at ($(\d:4.5)+(0,0,1.2)$) {y};
    \draw[red,->,thick] (\d:4.5) -- ++ (\d+90:1);
    %\node[red] at ($(\d:4.5)+(\d+90:1.3)$) {z};
    \fill[green!50!cyan,draw=black] (\d:4.5) circle (0.05cm);
}

\begin{pgfonlayer}{background layer}
    \fill[black] ($(current bounding box.south west)+(0,0)$) rectangle ($(current bounding box.north east)+(0,0)$);
\end{pgfonlayer}

\node[fill=white,opacity=0.4,text opacity=1,rounded corners=2mm,align=left] at (1,-1.5,0)
    {   \textcolor{yellow}{$\rightarrow$ x-direction}\\
        \textcolor{orange}{$\rightarrow$ y-direction}\\
        \textcolor{red}{$\rightarrow$ z-direction}
    };

\end{tikzpicture}

在此处输入图片描述

相关内容