给定一个单位三维矢量(北极),绘制一个赤道圆

给定一个单位三维矢量(北极),绘制一个赤道圆

我找到了包裹 tikz-3dplot 非常有用,非常感谢 Jeff Hein 为此付出的所有努力和出色工作。

在看到许多描述 $\alpha-\beta-\gamma$ 的方法之后:

  1. 欧拉角

  2. 航海角度(俯仰、偏航、横滚)

  3. 矩阵旋转等等

    我必须承认,这些让我很困惑。这可能是因为我有在脑子里旋转三个轴(三次!)的技能,知道我会落在哪里。

特别是上面链接的手册中的函数 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}

它产生的图形如下。

已知极点画赤道

相关内容