2

非常に単純な質問: 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,...] の形式のエントリを含む 1D 配列です。N は多角形の頂点の数で、頂点配列の頂点の ID 番号です。 (上記の例では、3 つの頂点 [0,1,2] を持つ三角形が 1 つと、4 つの頂点 [1,2,3,4] を持つ多角形が 1 つあります。

情報を計算する必要があります。すべてのエッジのリストと、エッジごとに、このエッジを含む面の情報です。

頂点の数は多くなる可能性があります。

更新
多角形は閉じています。つまり、多角形[4, 0, 1, 5, 7]は 4 つの頂点とエッジが0-1, 1-5, 5-7, 7-0 あることを意味します。実際、面は多角形と同義です。

4

1 に答える 1

0

これが最速のオプションであるかどうかはわかりませんが、おそらくそうではありませんが、機能します。edges.index((v, polygon[i + 1]))最も遅い部分は、このエッジが既にリストにあるかどうかを確認する必要がある部分だと思います。エッジは頂点インデックスのペアであるため、頂点配列は実際には必要ありません。面が何であるかを書いていないので、ポリゴン インデックスへの参照として face_index を使用しました。

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を使用してみてください。コードタイピングスタイルです。読みやすくするために、イテラブルの各コンマの後にスペースを入れる必要があると書かれています。

于 2013-02-08T11:27:53.807 に答える