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 Rest DSL路由无法启动路由,因为同一端点不允许有多个使用者   jvm有没有像JConsole或VisualVM这样的工具可以告诉我“类、对象、引用变量在java中存储在哪里?”   java为什么我的列表中的所有元素看起来都一样?   java运行时。运行shell脚本的exec无法打开文件   JPopupMenu的JMenuItem的java热键   会话在Java中被覆盖   如何在java中去除字符串中的尖锐重音?   java Mockito监视一个接口,模拟它的默认方法,获取NullPointerException   javascript如何在jquery中禁用同一时间选择   将数组列表附加到现有CSV文件,但它会附加并清除存储在Java文件中的以前的数据   java从我的jar中访问pdf文件   java Sonar issue参数必须为非Null,但标记为可为Null   java Salesforce流式API:在网络故障之后和重新订阅之前获取事件   在Java 1.8.0_65上运行Play2.0应用程序时出现playframework错误   java为什么字母的ASCII由方法自动转换。toCharArray()?   java如何知道JDialog是否关闭?   java向服务器发送POST请求,服务器的响应为null,启动   java如何设置JTable中特定单元格的值?   ImagePlus中的java保存问题