问题描述
我正在尝试使用3D alpha形状算法查找点云的表面。当我计算外接半径时,行列式a等于零,从而导致错误“在double_scalars中遇到的被零除”。我该怎么办?非常感谢!这是代码:
def alpha_shape_3D(points,alpha):
tetra = delaunay(points)
edge = []
for i1,i2,i3,i4 in tetra.vertices:
pa = points[i1]
pb = points[i2]
pc = points[i3]
pd = points[i4]
pa2 = np.dot(pa,pa)
pb2 = np.dot(pb,pb)
pc2 = np.dot(pc,pc)
pd2 = np.dot(pd,pd)
a = np.linalg.det(np.array([np.append(pa,1),np.append(pb,np.append(pc,np.append(pd,1)]))
Dx = np.linalg.det(np.array([np.array([pa2,pa[1],pa[2],1]),np.array([pb2,pb[1],pb[2],np.array([pc2,pc[1],pc[2],np.array([pd2,pd[1],pd[2],1])]))
Dy = - np.linalg.det(np.array([np.array([pa2,pa[0],pb[0],pc[0],pd[0],1])]))
Dz = np.linalg.det(np.array([np.array([pa2,1])]))
c = np.linalg.det(np.array([np.array([pa2,pa[2]]),pb[2]]),pc[2]]),pd[2]])]))
r = math.sqrt(math.pow(Dx,2) + math.pow(Dy,2) + math.pow(Dz,2) - 4 * a * c) / (2 * abs(a)) # error occurs here,since some value of a is zero.
if r<alpha:
edge.append([pa,pb,pc,pd])
tetras = np.array(edge)
# triangles
TriComb = np.array([(0,1,2),(0,3),2,(1,3)])
Triangles = tetras[:,TriComb].reshape(-1,3)
Triangles = np.sort(Triangles,axis=1)
# Remove triangles that occurs twice,because they are within shapes
TrianglesDict = defaultdict(int)
for tri in Triangles:TrianglesDict[tuple(tri)] += 1
Triangles=np.array([tri for tri in TrianglesDict if TrianglesDict[tri] ==1])
#edges
EdgeComb=np.array([(0,2)])
Edges=Triangles[:,EdgeComb].reshape(-1,2)
Edges=np.sort(Edges,axis=1)
Edges=np.unique(Edges,axis=0)
Vertices = np.unique(Edges)
return Vertices,Edges,Triangles
解决方法
如果没有您的 points
数据,很难确定,但看起来您的数据已退化。例如,如果您的所有点都在同一平面上,您就可以得到这个结果。