mindsponge.common.rigids_from_3_points

mindsponge.common.rigids_from_3_points(point_on_neg_x_axis, origin, point_on_xy_plane)[源代码]

Gram-Schmidt正交化过程。

通过输入局部坐标系的原点O,在x轴负半轴上的点A以及x-y平面上一点P的坐标,计算该局部坐标系相对于全局坐标系的变换矩阵。

首先根据三点坐标计算向量 \(\vec AO\)\(\vec OP\) 的坐标,再根据 rots_from_two_vecs 得到的两个向量计算旋转矩阵。

原点坐标到全局坐标系的原点坐标的距离为刚体的平移距离。

最后返回旋转矩阵与平移距离。

参考文献:

Jumper et al. (2021) Suppl. Alg. 21 ‘Gram-Schmidt process’

\[\begin{split}\begin{split} &\vec v_1 = \vec x_3 - \vec x_2 \\ &\vec v_2 = \vec x_1 - \vec x_2 \\ &\vec e_1 = \vec v_1 / ||\vec v_1|| \\ &\vec u_2 = \vec v_2 - \vec e_1(\vec e_1^T\vec v_2) \\ &\vec e_2 = \vec u_2 / ||\vec u_2|| \\ &\vec e_3 = \vec e_1 \times \vec e_2 \\ &rotation = (\vec e_1, \vec e_2, \vec e_3) \\ &translation = (\vec x_2) \\ \end{split}\end{split}\]
参数:
  • point_on_neg_x_axis (tuple) - 在x轴负半轴上的点A的坐标,长度为3,数据类型为标量或者shape相同的Tensor。

  • origin (tuple) - 当前局部坐标系的原点O的坐标,长度为3,数据类型为标量或者shape相同的Tensor。

  • point_on_xy_plane (tuple) - x-y平面上一点P的坐标,长度为3,数据类型为标量或者shape相同的Tensor。

返回:

tuple(rots, trans),长度为2,刚体的旋转矩阵 \((xx, xy, xz, yx, yy, yz, zx, zy, zz)\) 与平移距离 \((x, y, z)\) ,数据类型为标量或者shape相同的Tensor。

支持平台:

Ascend GPU

样例:

>>> import mindsponge
>>> A = (1, 2, 3)
>>> O = (4, 6, 8)
>>> P = (5, 8, 11)
>>> ans = mindsponge.common.rigids_from_3_points(A, O, P)
>>> print(ans)
((0.4242640686695021, -0.808290367995452, 0.40824828617045156, 0.5656854248926695,
-0.1154700520346678, -0.8164965723409039, 0.7071067811158369, 0.5773502639261153,
0.4082482861704521), (4,6,8))