一个非常简单的问题: 如何在Python(或Cython)中有效地计算以下数量。
给出3D中的多边形列表(多边形
有一个以下列形式给出的多边形列表:
vertex = np.array([[0, 0, 0], [0, 0, 1], [0, 1, 0],[1, 0, 0],[0.5, 0.5, 0.5]], order = 'F').T
polygons = np.array([3, 0, 1, 2, 4, 1, 2, 3 ,4])
即。 polygon是一维数组,包含[N,i1,i2,i3,i4,...]形式的条目, N是多边形中顶点的数量,然后是顶点数组中顶点的id数(在上面的例子中,有一个三角形有3个顶点[0,1,2],一个多边形有4个顶点[1,2] 1,3,4]
我需要计算信息:所有边的列表以及每条边的信息 哪些面包含这个边缘。
我需要快速完成:顶点的数量可能很大。
更新
多边形是闭合的,即多边形[4, 0, 1, 5, 7]
表示有4个顶点,边是0-1, 1-5, 5-7, 7-0
事实上,面是多边形的同义词。
答案 0 :(得分:0)
Dunno如果这是最快的选择,很可能不是,但它确实有效。我认为最慢的部分是edges.index((v, polygon[i + 1]))
我们必须找到这个边缘是否已经在列表中。由于edge是一对顶点索引,因此不需要顶点数组。我使用face_index作为多边形索引的引用,因为你没有写出face是什么。
vertex = [[0,0,0], [0,0,1], [0,1,0],[1,0,0],[0.5,0.5,0.5]]
polygons = [3,0,1,2,4,1,2,3,4]
_polygons = polygons
edges = []
faces = []
face_index = 0
while _polygons:
polygon = _polygons[1:_polygons[0] + 1]
polygon.append(polygon[0])
_polygons = _polygons[_polygons[0] + 1:]
for i, v in enumerate(polygon[0:-1]):
if not (v, polygon[i + 1]) in edges:
edges.append((v, polygon[i + 1]))
faces.append([face_index, ])
else:
faces[edges.index((v, polygon[i + 1]))].append(face_index)
face_index += 1
edges = map(lambda edge, face: (edge, face), edges, faces)
print edges
<<< [((0, 1), [0]), ((1, 2), [0, 1]), ((2, 0), [0]), ((2, 3), [1]), ((3, 4), [1]), ((4, 1), [1])]
您可以通过删除线polygon.append(polygon[0])
并将多边形的第一个顶点手动附加到多边形的顶点列表来加快速度,这应该不是问题。
我的意思是将polygons = [3,0,1,2,4,1,2,3,4]
更改为polygons = [3,0,1,2,0,4,1,2,3,4,1]
。
PS尝试使用PEP8。这是一种代码输入方式。它说你应该在迭代中的每个逗号之后放一个空格,这样就更容易阅读。