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。这将阻止分子与其立体异构体的匹配。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java在读取属性文件时获取空指针   java NoSuchMethodError:org。springframework。靴子网状物servlet。错误错误控制器。最新SpringCloudStarter NetflixZuul中的getErrorPath()   java Spring不使用相同的JDBC连接   sqlite DB中带方括号的java数据   如何编译基于Maven的Java项目以从命令行运行它   java如何限制cowndown计时器的操作(例如登录)   java如何使用spring和springboot应用程序配置数据库?我想知道如何回答这类问题?   java中的buildpath不支持java。图书馆路径   java如何使用条目集在树映射上迭代?   java如何将IndexOf与Scanner结合使用?   xml Java SAX解析器进程监视   java在多台远程机器上运行并行junit测试   当我尝试在ListView中动态添加项时,单击按钮时java崩溃