算法尝试(二)

一、球面坐标变换
  单位球所在基准空间,以转轴向北极单位向量记ez,定赤道某处为经度0度,球心向该点单位向量记ex,根据右手系,ey=outer_product(ez, ex)。从球心出发向量v_r指向球面上点P,沿经线向南单位向量记ey_s,沿纬线向东单位向量记ex_s,指向球心的为ez_s=-v_r。设该点的经纬度坐标为(alhpa, beta)。球面变换是求当转移到(alpha_new, beta_new)的P_new处,坐标系从coord(ex_s, ey_s, ez_s)变为coord(ex_s_new, ey_s_new, ez_s_new)的变换矩阵。
  记R_x(angle)、R_y(angle)和R_z(angle)分别为坐标系围绕其第一、二、三分量右手系旋转angle角的变换矩阵。当点从P平移到赤道上同经度点P1,球面坐标系变为coord(ex_s_1, ey_s_1, ez_s_1),有关系式:coord(ex_s_1, ey_s_1, ez_s_1) == transform(coord(ex_s, ey_s, ez_s),  R_x(beta))。同样,从P_new平移至赤道同经度点P2,球面坐标coord(ex_s_2, ey_s_2, ez_s_2) == transform(coord(ex_s_new, ey_s_new, ez_s_new), R_x(beta_new))。而从P1转至P2,有coord(ex_s_2, ey_s_2, ez_s_2) == transform(coord(ex_s_1, ey_s_1, ez_s_1), R_y(alpha - alpha_new))。从而,coord(ex_s_new, ey_s_new, ez_s_new) == transform(coord(ex_s, ey_s, ez_s), R_x(beta) * R_y(alpha - alpha_new) * R_x(-beta_new))。可见转换和和纬度差有关,始末纬度无关。
  简记P,P1,P2,P_new的球面坐标系和基准系分别为:(0),(1),(2),(3),(B),矩阵右乘代表坐标变换,另外的推导方法有:(1) == (0)R_x(beta),(B)R_z(alpha) == (1)C,(B)R_z(alpha_new) == (2)C,(2) == (3)R_x(beta_new),其中C={{0, 1, 0}, {0, 0, -1}, {-1, 0, 0}}。计算结果一致。另外还有别的导出方法,但实质一样,且需要注意的是正交变换是唯一的,因为正交矩阵是可逆的。

你可能感兴趣的:(算法)