![给定一个单位三维矢量(北极),绘制一个赤道圆](https://linux22.com/image/322680/%E7%BB%99%E5%AE%9A%E4%B8%80%E4%B8%AA%E5%8D%95%E4%BD%8D%E4%B8%89%E7%BB%B4%E7%9F%A2%E9%87%8F%EF%BC%88%E5%8C%97%E6%9E%81%EF%BC%89%EF%BC%8C%E7%BB%98%E5%88%B6%E4%B8%80%E4%B8%AA%E8%B5%A4%E9%81%93%E5%9C%86.png)
我找到了包裹 tikz-3dplot 非常有用,非常感谢 Jeff Hein 为此付出的所有努力和出色工作。
在看到许多描述 $\alpha-\beta-\gamma$ 的方法之后:
航海角度(俯仰、偏航、横滚)
矩阵旋转等等
我必须承认,这些让我很困惑。这可能是因为我有在脑子里旋转三个轴(三次!)的技能,知道我会落在哪里。
特别是上面链接的手册中的函数 tdplotsetrotatedcoords 非常重要。
我建议给定一个单位向量,我们找到三个旋转角度,然后从那里找到与之对应的大圆。也就是说,例如,如果我的向量是 $(1,0,0)$,大圆就在 $yz$ 平面上;如果我的向量是 $(0,0,1)$,大圆就在 $xy$ 平面上。这样,我只需要知道新的“北极”的方向(即三次旋转后的 $z$ 轴)就可以找到倾斜的赤道。这种参数化的优点是单位向量很容易想象,并且每个单位向量(被视为北极)只有一个赤道。
通过使用一些基本的三角函数,参数化似乎很容易。我现在就开始这项任务,但如果有人知道这项工作已经完成了,请告诉我。我不想重新发明轮子。
最终产品应该是一个宏,它是 tdplotsetrotatedcoords 的包装器,其中我们输入的不是 $\alpha, \beta, \gamma$,而是对应于新北极的三个坐标。这三个分量当然不能全部为零,因为它们位于单位球体的表面。
谢谢。
H。
答案1
我们要输入一个单位向量,即北极。三个坐标(x,y,z)。手册中用于评估 tikz-3dplot 坐标系旋转的方程tikz-3dplot 是方程 (2.3),它是三个旋转矩阵的乘积。由于我们只关心旋转后北极 (0,0,1) 移动到了哪里,因此我们可以将矩阵 (2.3) 乘以 (0,0,1),得到新的北极 N=(x_3, y_3, z_3)。通过匹配三个方程,我们发现只涉及 y_3 和 z_3。很容易看出 beta=arccos(z_3) ,如果 beta 不为 0,则 alpha=arcsin(y_3/beta)。该算法易于实现,此处称为 \getEquator。我还编写了一个小宏来绘制离开球体到北极的矢量。整个算法如下:
\documentclass[12pt]{article}
\usepackage{amsmath}
\usepackage{enumerate}
\usepackage{tikz}
\usepackage{xcolor}
\usepackage{tikz-3dplot}
\usepackage{hyperref}
\usepackage{ifthen}
\usepackage{pgfplots}
\usetikzlibrary{calc,3d,intersections, positioning,intersections,shapes}
\pgfplotsset{compat=1.11}
\newcommand\DrawVect[5]
{
\def\xt{#1}
\def\yt{#2}
\def\zt{#3}
\def\mycolor{#4}
\def\myR{#5}
% end of vector
\pgfmathsetmacro{\xte}{\myR*\xt}
\pgfmathsetmacro{\yte}{\myR*\yt}
\pgfmathsetmacro{\zte}{\myR*\zt}
\pgfmathsetmacro{\xtet}{\myR*\xt + \xt/\myR}
\pgfmathsetmacro{\ytet}{\myR*\yt + \yt/\myR}
\pgfmathsetmacro{\ztet}{\myR*\zt + \zt/\myR}
\draw[-latex, color=\mycolor, line width=1] (\xte,\yte,\zte) -- (\xtet , \ytet ,\ztet);
}
\newcommand\getEquator[2]
{
\def\yt{#1}
\def\zt{#2}
\pgfmathsetmacro{\betav}{acos(\zt)};
\def\gammav{0}
\ifthenelse{\equal{\betav}{0.0}}
{
\def\alphav{0}
}
{
\pgfmathsetmacro{\alphav}{asin(\yt/(sin(\betav))}
};
}
\begin{document}
\begin{center}
\begin{tikzpicture}[scale=1.0]
\tdplotsetmaincoords{80}{110}
\pgfmathsetmacro\R{sqrt(3)}
\coordinate (O) at (0,0,0);
\fill[ball color=white!10, opacity=0.2] (O) circle (\R); % 3D lighting effect
\begin{scope}[tdplot_main_coords, shift={(0,0)}]
\pgfmathsetmacro\R{sqrt(3)}
\pgfmathsetmacro{\thetavec}{0};
\pgfmathsetmacro{\phivec}{0};
\pgfmathsetmacro{\gammav}{0};
\tdplotsetrotatedcoords{\phivec}{\thetavec}{\gammav};
\def\x{1};
\def\y{0};
\def\z{0};
\DrawVect{\x}{\y}{\z}{blue}{\R};
\getEquator{\y}{\z};
\tdplotsetrotatedcoords{\alphav}{\betav}{\gammav};
\tdplotdrawarc[tdplot_rotated_coords,color=blue]{(O)}{\R}{0}{360}{}{};
\node[color=blue] at (-1,3.2,3.5) {\tiny
$N=$(\x,\y,\z)$ \implies \alpha=$\alphav, $\beta=$\betav, $\gamma=$\gammav};
\def\x{0};
\def\y{0};
\def\z{1};
\def\colr{red}
\DrawVect{\x}{\y}{\z}{\colr}{\R};
\getEquator{\y}{\z};
\tdplotsetrotatedcoords{\alphav}{\betav}{\gammav};
\tdplotdrawarc[tdplot_rotated_coords,color=\colr]{(O)}{\R}{0}{360}{}{};
\node[color=\colr, yshift=-3mm] at (-1,3.2,3.5) {\tiny
$N=$(\x,\y,\z)$ \implies \alpha=$\alphav, $\beta=$\betav, $\gamma=$\gammav};
\def\x{0};
\def\y{1};
\def\z{0};
\def\colr{black}
\DrawVect{\x}{\y}{\z}{\colr}{\R};
\getEquator{\y}{\z};
\tdplotsetrotatedcoords{\alphav}{\betav}{\gammav};
\tdplotdrawarc[tdplot_rotated_coords,color=\colr]{(O)}{\R}{0}{360}{}{};
\node[color=\colr, yshift=-6mm] at (-1,3.2,3.5) {\tiny
$N=$(\x,\y,\z)$ \implies \alpha=$\alphav, $\beta=$\betav, $\gamma=$\gammav};
\def\x{-0.577};
\def\y{0.577};
\def\z{0.577};
\def\colr{brown}
\DrawVect{\x}{\y}{\z}{\colr}{\R};
\getEquator{\y}{\z};
\tdplotsetrotatedcoords{\alphav}{\betav}{\gammav};
\tdplotdrawarc[tdplot_rotated_coords,color=\colr]{(O)}{\R}{0}{360}{}{};
\node[color=\colr, yshift=-9mm] at (-1,3.5,3.5) {\tiny
$N=$(\x,\y,\z)$ \implies \alpha=$\alphav, $\beta=$\betav, $\gamma=$\gammav};
%axis
\coordinate (X) at (5,0,0) ;
\coordinate (Y) at (0,3,0) ;
\coordinate (Z) at (0,0,3) ;
\draw[-latex] (O) -- (X) node[anchor=west] {$X$};
\draw[-latex] (O) -- (Y) node[anchor=north] {$Y$};
\draw[-latex] (O) -- (Z) node[anchor=south west] {$Z$};
% compute the equator in a different way.
\end{scope}
\end{tikzpicture}
\end{center}
\end{document}
它产生的图形如下。