球坐标与直角坐标的转换

                     

贡献者: addis

预备知识 1 球坐标系的定义,四象限 Arctan 函数

1. 坐标的变换

   当我们讨论球坐标和直角坐标的转换时,通常令两个原点重合,取极轴($\theta = 0$)为 $z$ 轴的正方向,$\theta = \pi/2$,$\phi = 0$ 为 $x$ 轴的正方向,$\theta = \pi/2$,$\phi = \pi/2$ 为 $y$ 轴的正方向。这时两种坐标之间的变换关系为

\begin{equation} \begin{cases} x = r\sin \theta \cos \phi \\ y = r\sin \theta \sin \phi \\ z = r\cos \theta \end{cases}~. \end{equation}
\begin{equation} \left\{\begin{aligned} r &= \sqrt {x^2 + y^2 + z^2} \\ \theta &= \operatorname{Arctan} \left(\sqrt{x^2 + y^2}, z \right) \\ \phi &= \operatorname{Arctan} (y, x) \end{aligned}\right. ~.\end{equation}
证明见下文,其中 $ \operatorname{Arctan} $ 函数(也记为 $ \operatorname {atan2}$)的定义见式 1 。注意根据式 1 ,同一个直角坐标可以对应不同的极坐标,例如将 $\phi$ 增加 $2\pi$ 的整数倍,又例如对 $z$ 轴上的点 $\phi$ 可以取任意值。但根据式 2 ,我们可以找到两种坐标间的一一对应关系。

2. 矢量分量的变换

预备知识 2 三维旋转矩阵

   在直角坐标系中,$ \hat{\boldsymbol{\mathbf{x}}} , \hat{\boldsymbol{\mathbf{y}}} , \hat{\boldsymbol{\mathbf{z}}} $ 是 $x,y,z$ 轴的三个正交归一向量,在球坐标系中,$ \hat{\boldsymbol{\mathbf{r}}} , \hat{\boldsymbol{\mathbf{\theta}}} , \hat{\boldsymbol{\mathbf{\phi}}} $ 是三个正交归一向量(定义见图 1 ). 两组基底之间的变换关系为

\begin{equation} \begin{cases} \hat{\boldsymbol{\mathbf{r}}} = R_{11} \hat{\boldsymbol{\mathbf{x}}} + R_{12} \hat{\boldsymbol{\mathbf{y}}} + R_{13} \hat{\boldsymbol{\mathbf{z}}} \\ \hat{\boldsymbol{\mathbf{\theta}}} = R_{21} \hat{\boldsymbol{\mathbf{x}}} + R_{22} \hat{\boldsymbol{\mathbf{y}}} + R_{23} \hat{\boldsymbol{\mathbf{z}}} \\ \hat{\boldsymbol{\mathbf{\phi}}} = R_{31} \hat{\boldsymbol{\mathbf{x}}} + R_{32} \hat{\boldsymbol{\mathbf{y}}} + R_{33} \hat{\boldsymbol{\mathbf{z}}} \end{cases}~, \end{equation}
\begin{equation} \begin{cases} \hat{\boldsymbol{\mathbf{x}}} = R_{11} \hat{\boldsymbol{\mathbf{r}}} + R_{21} \hat{\boldsymbol{\mathbf{\theta}}} + R_{31} \hat{\boldsymbol{\mathbf{\phi}}} \\ \hat{\boldsymbol{\mathbf{y}}} = R_{12} \hat{\boldsymbol{\mathbf{r}}} + R_{22} \hat{\boldsymbol{\mathbf{\theta}}} + R_{32} \hat{\boldsymbol{\mathbf{\phi}}} \\ \hat{\boldsymbol{\mathbf{z}}} = R_{13} \hat{\boldsymbol{\mathbf{r}}} + R_{23} \hat{\boldsymbol{\mathbf{\theta}}} + R_{33} \hat{\boldsymbol{\mathbf{\phi}}} \end{cases}~. \end{equation}
证明见下文,其中 $ \boldsymbol{\mathbf{R}} $ 是关于两个角度的三维旋转矩阵
\begin{equation} \boldsymbol{\mathbf{R}} = \begin{pmatrix} \sin\theta\cos\phi & \sin\theta\sin\phi & \cos\theta\\ \cos\theta\cos\phi & \cos\theta\sin\phi & -\sin\theta\\ -\sin\phi & \cos\phi & 0 \end{pmatrix} ~. \end{equation}
这是一个单位正交矩阵,满足 $ \boldsymbol{\mathbf{R}} ^{-1} = \boldsymbol{\mathbf{R}} ^{\mathrm{T}} $,每行(列)都是一个单位矢量,且行(列)之间正交。

   若某点处任意矢量 $ \boldsymbol{\mathbf{v}} $ 在直角坐标系和球坐标系中分别表示为(注意 $ \hat{\boldsymbol{\mathbf{r}}} , \hat{\boldsymbol{\mathbf{\theta}}} , \hat{\boldsymbol{\mathbf{\phi}}} $ 的方向和该点的位置有关)

\begin{equation} \boldsymbol{\mathbf{v}} = v_x \hat{\boldsymbol{\mathbf{x}}} + v_y \hat{\boldsymbol{\mathbf{y}}} + v_z \hat{\boldsymbol{\mathbf{z}}} ~, \end{equation}
\begin{equation} \boldsymbol{\mathbf{v}} = v_r \hat{\boldsymbol{\mathbf{r}}} + v_\theta \hat{\boldsymbol{\mathbf{\theta}}} + v_\phi \hat{\boldsymbol{\mathbf{\phi}}} ~. \end{equation}
则坐标变换关系可以用矩阵乘法表示
\begin{equation} \begin{pmatrix}v_r \\ v_\theta \\ v_\phi\end{pmatrix} = \boldsymbol{\mathbf{R}} \begin{pmatrix}v_x \\ v_y \\ v_z\end{pmatrix} ~, \end{equation}
\begin{equation} \begin{pmatrix}v_x \\ v_y \\ v_z\end{pmatrix} = \boldsymbol{\mathbf{R}} ^{\mathrm{T}} \begin{pmatrix}v_r \\ v_\theta \\ v_\phi\end{pmatrix} ~, \end{equation}
该关系可以用于把矢量场 $ \boldsymbol{\mathbf{v}} ( \boldsymbol{\mathbf{r}} )$ 在直角坐标系和球坐标系间变换。

推导

   把空间中一点 $P$ 的位矢 $r \, \hat{\boldsymbol{\mathbf{r}}} $ 分解为垂直于 $xy$ 平面的分量 $z = r\cos \theta $ 和 $xy$ 平面的分量 $r\sin \theta $。后者又可以进而分解成 $x$ 分量 和 $y$ 分量 $x = r\sin \theta \cos \phi$, $y = r\sin \theta \sin \phi$,这就得到了式 1

   在直角坐标系中,有 $r = \sqrt {x^2 + y^2 + z^2}$,代入式 1 中的三条关系,就可以很容易解出式 2 中的三条关系。

   现在推导变换关系(式 3 )。由于 $ \hat{\boldsymbol{\mathbf{r}}} , \hat{\boldsymbol{\mathbf{\theta}}} , \hat{\boldsymbol{\mathbf{\phi}}} $ 都是关于 $(r, \theta, \phi)$ 的函数,所以在考察某一点 $(r, \theta, \phi)$ 时,要计算 $ \hat{\boldsymbol{\mathbf{r}}} $ 在 $ \hat{\boldsymbol{\mathbf{x}}} , \hat{\boldsymbol{\mathbf{y}}} , \hat{\boldsymbol{\mathbf{z}}} $ 方向的投影,可以先把 $ \hat{\boldsymbol{\mathbf{r}}} $ 平移使其起点为坐标原点,那么它终点的直角坐标就是投影长度。首先易知终点的球坐标是 $(1, \theta, \phi)$, 根据式 1 变换到直角坐标为

\begin{equation} (\sin \theta \cos \phi,\,\sin \theta \sin \phi,\,\cos \theta)~. \end{equation}
写成矢量的形式,就是
\begin{equation} \hat{\boldsymbol{\mathbf{r}}} = \sin \theta \cos \phi \, \hat{\boldsymbol{\mathbf{x}}} + \sin \theta \sin \phi \, \hat{\boldsymbol{\mathbf{y}}} + \cos \theta \, \hat{\boldsymbol{\mathbf{z}}} ~. \end{equation}
至于式 3 的第二条,要计算 $ \hat{\boldsymbol{\mathbf{\theta}}} $ 在 $ \hat{\boldsymbol{\mathbf{x}}} , \hat{\boldsymbol{\mathbf{y}}} , \hat{\boldsymbol{\mathbf{z}}} $ 方向的投影,同样把起点平移到坐标原点,由于 $ \hat{\boldsymbol{\mathbf{\theta}}} $ 是 $ \hat{\boldsymbol{\mathbf{r}}} $ 向下转动 $90^\circ$ 即 $\theta$ 增加 $\pi/2$,所以终点的球坐标为 $(1, \theta + \pi /2, \phi)$,根据式 1 变换到直角坐标再化简就得到
\begin{equation} \hat{\boldsymbol{\mathbf{\theta}}} = \cos \theta \cos \phi \, \hat{\boldsymbol{\mathbf{x}}} + \cos \theta \sin \phi \, \hat{\boldsymbol{\mathbf{y}}} - \sin \theta \, \hat{\boldsymbol{\mathbf{z}}} ~. \end{equation}
最后,$ \hat{\boldsymbol{\mathbf{\phi}}} $ 平移到原点后,终点的球坐标为 $(1, \pi/2, \phi+\pi/2)$,同理可得式 3 第三条。将基底变换式 3 式 4 分别代入式 7 式 6 得坐标变换式 9 式 8 ,详见 “三维旋转矩阵”。

3. 两方向的夹角

预备知识 3 点乘

   若已知球坐标系中两个方向的单位向量分别为 $(1, \theta_1, \phi_1)$ 和 $(1, \theta_2, \phi_2)$ 如何求它们之间的夹角 $\alpha$ 呢?我们可以先计算两个单位矢量的直角坐标,然后对它们进行内积即可得到两矢量夹角的余弦值。由式 1 ,两矢量的直角坐标分别为

\begin{equation} (\sin\theta_1\cos\phi_1,\ \sin\theta_1\sin\phi_1,\ \cos\theta_1)~, \qquad (\sin\theta_2\cos\phi_2,\ \sin\theta_2\sin\phi_2,\ \cos\theta_2)~. \end{equation}
对它们做点乘(式 3 )就得到夹角的余弦值,利用三角恒等式(式 5 ),得
\begin{equation} \begin{aligned} \cos\alpha &= \sin\theta_1\cos\phi_1\sin\theta_2\cos\phi_2 + \sin\theta_1\sin\phi_1 \sin\theta_2\sin\phi_2 + \cos\theta_1 \cos\theta_2\\ &= \sin\theta_1\sin\theta_2(\cos\phi_1 \cos\phi_2 + \sin\phi_1\sin\phi_2) + \cos\theta_1 \cos\theta_2\\ &= \sin\theta_1\sin\theta_2 \cos\left(\phi_2-\phi_1\right) + \cos\theta_1 \cos\theta_2~.\\ \end{aligned} \end{equation}

Matlab 代码

   在 Matlab 中,sph2cart 中 $\theta$ 的定义是本文中 $\pi/2 - \theta$。所以我们可以另外定义一个符合本文的函数

代码 1:Sph2Cart.m
% physics version of sph2cart
function [X,Y,Z] = Sph2Cart(R,Th,Ph)
[X,Y,Z] = sph2cart(Ph,pi*0.5-Th,R);
end


致读者: 小时百科一直以来坚持所有内容免费,这导致我们处于严重的亏损状态。 长此以往很可能会最终导致我们不得不选择大量广告以及内容付费等。 因此,我们请求广大读者热心打赏 ,使网站得以健康发展。 如果看到这条信息的每位读者能慷慨打赏 10 元,我们一个星期内就能脱离亏损, 并保证在接下来的一整年里向所有读者继续免费提供优质内容。 但遗憾的是只有不到 1% 的读者愿意捐款, 他们的付出帮助了 99% 的读者免费获取知识, 我们在此表示感谢。

                     

友情链接: 超理论坛 | ©小时科技 保留一切权利