我对 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}