首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于QHull的SciPy凸包体积

基于QHull的SciPy凸包体积
EN

Stack Overflow用户
提问于 2014-07-14 09:17:07
回答 2查看 9.7K关注 0票数 12

我试着用得到一组点的凸包SciPy包装器用于QHull体积。

根据QHull文档,我应该通过"FA"选项来获得总表面积和体积。

这是我得到的..。我做错了什么?

代码语言:javascript
复制
> pts
     [(494.0, 95.0, 0.0), (494.0, 95.0, 1.0) ... (494.0, 100.0, 4.0), (494.0, 100.0, 5.0)]


> hull = spatial.ConvexHull(pts, qhull_options="FA")

> dir(hull)

     ['__class__', '__del__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_qhull', '_update', 'add_points', 'close', 'coplanar', 'equations', 'max_bound', 'min_bound', 'ndim', 'neighbors', 'npoints', 'nsimplex', 'points', 'simplices']

 > dir(hull._qhull)
     ['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-14 10:34:07

不管您传入哪些参数,似乎没有任何直接获得所需结果的明显方法。如果您使用的是ConvexHull,而不是Delaunay (它还提供了大部分与凸包相关的信息),那么计算自己应该不会太困难。

代码语言:javascript
复制
def tetrahedron_volume(a, b, c, d):
    return np.abs(np.einsum('ij,ij->i', a-d, np.cross(b-d, c-d))) / 6

from scipy.spatial import Delaunay

pts = np.random.rand(10, 3)
dt = Delaunay(pts)
tets = dt.points[dt.simplices]
vol = np.sum(tetrahedron_volume(tets[:, 0], tets[:, 1], 
                                tets[:, 2], tets[:, 3]))

根据注释,编辑,下面是获得凸包卷的更快的方法:

代码语言:javascript
复制
def convex_hull_volume(pts):
    ch = ConvexHull(pts)
    dt = Delaunay(pts[ch.vertices])
    tets = dt.points[dt.simplices]
    return np.sum(tetrahedron_volume(tets[:, 0], tets[:, 1],
                                     tets[:, 2], tets[:, 3]))

def convex_hull_volume_bis(pts):
    ch = ConvexHull(pts)

    simplices = np.column_stack((np.repeat(ch.vertices[0], ch.nsimplex),
                                 ch.simplices))
    tets = ch.points[simplices]
    return np.sum(tetrahedron_volume(tets[:, 0], tets[:, 1],
                                     tets[:, 2], tets[:, 3]))

用一些合成的数据,第二种方法似乎快了2倍,数值精度似乎很好(小数点15位!)虽然必须有更多的病理病例:

代码语言:javascript
复制
pts = np.random.rand(1000, 3)

In [26]: convex_hull_volume(pts)
Out[26]: 0.93522518081853867

In [27]: convex_hull_volume_bis(pts)
Out[27]: 0.93522518081853845

In [28]: %timeit convex_hull_volume(pts)
1000 loops, best of 3: 2.08 ms per loop

In [29]: %timeit convex_hull_volume_bis(pts)
1000 loops, best of 3: 1.08 ms per loop
票数 15
EN

Stack Overflow用户

发布于 2016-08-24 08:16:36

虽然这个问题已经庆祝了它的第二个生日,我想指出,现在,枕木包装自动报告的体积(和面积)计算的Qhull。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24733185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档