【问题标题】:cross product versus determinant叉积与行列式
【发布时间】:2015-05-18 17:20:28
【问题描述】:

我正在尝试使用 pyqtgraph 和 numpy 在 Python 中使用等值面来确定 3D 体积的表面积。问题不在于等值面的生成,而在于从向量计算面积。

如果理解正确,2个向量(A X B)的叉积的大小代表了它们定义的平行四边形的面积。 类似地,3x3 矩阵的行列式,其中第一行是单位向量,决定了由其他 2 行定义的向量的平行四边形的面积。

我正在使用下面的代码,但我得到了不同的答案(尽管幅度相同)

np.linalg.norm(n, ord=1)

185088.05

triarea = (np.abs(np.linalg.det(triedges)))
tot = np.sum(triarea)

289059.69600568933 有人对这里发生的事情有任何想法吗?

以下是我正在使用的完整 Python 代码。

#import tiff file
print("Loading volume...")
img = tifffile.imread(r"C:\Users\Nachiket\Desktop\C1-confocal-series.tif")
print("Done")
print("Generating isosurface...")
verts, faces = pg.isosurface(img, img.max()/5.)
print("Done")


#creating an indexed array of vertices
tris = verts[faces]

#calculate area from normals
n = np.cross( tris[::,1 ] - tris[::,0]  , tris[::,2 ] - tris[::,0] )
narea = np.linalg.norm(n, ord=1)

#calculate determinant using unit vectors

triedges = np.zeros(tris.shape)

triedges[::,0]=([[1,1,1]])  #unit vectors
triedges[::,1]=(tris[::,1] - tris[::,0])
triedges[::,2]=(tris[::,2] - tris[::,0])

triarea = np.abs(np.linalg.det(triedges))
tot = np.sum(np.abs(triarea))

【问题讨论】:

    标签: python numpy vector scientific-computing pyqtgraph


    【解决方案1】:

    我认为分配试验索引值的方式导致了问题。

    不是这个

    triedges[::,0]=([[1,1,1]]) #unit vectors
    triedges[::,1]=(tris[::,1] - tris[::,0])
    triedges[::,2]=(tris[::,2] - tris[::,0])
    

    triedges[0, ::]=([[1,1,1]]) #unit vectors
    triedges[1, ::]=(tris[1, ::] - tris[0, ::])
    triedges[2, ::]=(tris[2, ::] - tris[0, ::])
    

    对于表示面积的行列式,向量必须沿矩阵的行定义,但您将向量臂分配给矩阵的列

    【讨论】:

    • 不,不是这样。 Tryges 是一个大堆栈 n x 3 x 3 ,其中 n 表示三角形的数量,并沿第 0 列进行评估。见截图:imgur.com/V1w34bb
    猜你喜欢
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    • 1970-01-01
    • 2012-11-08
    • 2013-11-15
    • 2011-06-30
    相关资源
    最近更新 更多