交叉产品与决定因素

时间:2015-03-16 14:33:54

标签: python numpy vector scientific-computing pyqtgraph

我正在尝试使用pyqtgraph和numpy在Python中使用isosurface来确定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))

1 个答案:

答案 0 :(得分:0)

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

而不是这个

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, ::])

对于表示区域的行列式,必须沿着矩阵的行定义向量,但是要将向量臂分配给矩阵的列