Python:使3D椭圆(扁圆/扁长)适合3D点

问题描述 投票:0回答:1

尊敬的stackoverflow用户,

我面临如下问题:我想在我的python脚本中将3D椭球体适合3D数据点。

起始数据是一组x,y和z坐标(笛卡尔坐标)。我想得到的是3D数据点的凸包的最佳拟合椭球的定义方程中的a和c。

等式在正确旋转和平移的坐标系中:

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLmltZ3VyLmNvbS82SDdYcFU2LmdpZiJ9” alt =“椭圆方程”>

所以我理想地要做的任务是:

  1. 查找3D数据点的凸包

  2. 将最佳椭圆形拟合到凸包,并得到a和c

您知道是否有一些库允许使用最少的代码行在Python中执行此操作?还是我必须用有限的数学知识(在寻找最合适的椭球体时实际上为零)显式地编码所有这些步骤?

感谢您的帮助,祝您愉快!

python computational-geometry ellipse geometry-surface
1个回答
0
投票

好吧,我将scipy的凸包算法与this website上的某些python函数结合起来找到了解决方案。>

让我们假设您得到一个x坐标的numpy向量,一个y坐标的numpy向量以及一个z坐标的numpy向量,分别名为x,y和z。这对我有用:

from   scipy.spatial            import ConvexHull, convex_hull_plot_2d
import numpy as np
from   numpy.linalg import eig, inv

#let us assume some definition of x, y and z

#get convex hull of molecular surface
surface  = np.stack((conf.x,conf.y,conf.z), axis=-1)
hullV    = ConvexHull(surface)
lH       = len(hullV.vertices)
hull     = np.zeros((lH,3))
for i in range(len(hullV.vertices)):
    hull[i] = surface[hullV.vertices[i]]
hull     = np.transpose(hull)         

#fit ellipsoid on convex hull
eansa            = ls_ellipsoid(hull[0],hull[1],hull[2]) #get ellipsoid polynomial coefficients
print("coefficients:"  , eansa)
center,axes,inve = polyToParams3D(eansa,False)   #get ellipsoid 3D parameters
print("center:"        , center)
print("axes:"          , axes)
print("rotationMatrix:", inve)
© www.soinside.com 2019 - 2024. All rights reserved.