Diamond 1988年的旋转叠加算法(+尺度变换)
superpose3d的Python项目详细描述
使用旋转、平移和缩放变换注册三维点云。
用法
def Superpose3D(X_i, # <-- Nx3 array of coords for the "frozen" point cloud
x_i, # <-- Nx3 array of coords for the "mobile" point cloud
w_i=None, #<- optional weights for the calculation of RMSD
# (default w_i = 1 for all i)
allow_rescale=False) #<--attempt to rescale mobile point cloud?
superpose3d()接受xyz坐标的两个有序列表(或numpy数组) (具有相同长度,n)表示点云(x_i中的点 x_i)。将它们视为刚性对象,“superpose3D()”尝试叠加 他们使用旋转,平移,以及(可选地)使用缩放 最小化均方根距离的变换(rmsd) 在任一点云的对应点之间,其中rmsd定义为:
RMSD = sqrt((Sum_i w_i * |X_i - Sum_j(c*R_ij*x_j + T_i))|^2) / (Sum_j w_j))
如果w_i=none,则使用相等的权重。在这种情况下:
RMSD = sqrt(( Sum_i |X_i - Sum_j(c*R_ij*x_j + T_i) )|^2 ) / N)
…其中:
T_j = a translation vector (a 1-D numpy array containing x,y,z displacements),
R_ij = a rotation matrix (a 3x3 numpy array whose determinant = 1),
c = a scalar (a number)
此函数返回一个4元组,其中包含以下最佳值:
(RMSD, T, R, c)
此函数实现了本文方法的一个更通用的变体: R.Diamond(1988年) “关于旋转叠加问题的注记”, 水晶行动。A44,第211-216页。
这个版本已经稍微增加了一些以支持规模转换。(即用标量乘。这对于在不同放大倍数下拍摄的同一物体的两个不同注释的三维立体图像的配准非常有用。
请注意,如果启用缩放转换(即如果allow_rescale=true),则在函数返回负的c值时应小心。负c值对应于反转(反射)。因此,如果使用这个函数来比较分子的构象,可能应该设置allow_rescale=false。这将阻止分子与其立体异构体的匹配。