2

OpenMesh を使用するのは初めてで、メッシュ内のすべての頂点の原子価を計算する非常に単純な関数を実行しようとしています。

私の最初の試みはこのように見えます

Mesh::VertexIter vIterator, vBegin, vEnd;
Mesh::HalfedgeHandle initialEdge, nextEdge;

vBegin = mesh_.vertices_begin();
vEnd = mesh_.vertices_end();

int vertexValence;

for (vIterator = vBegin; vIterator != vEnd; ++vIterator) {
    initialEdge = mesh_.halfedge_handle(vIterator.handle());
    nextEdge = mesh_.next_halfedge_handle(initialEdge);
    vertexValence = 0;
    while (nextEdge != initialEdge) {
        vertexValence++;
        nextEdge = mesh_.next_halfedge_handle(nextEdge);
    }
    if(vIterator == vBegin){
        std::cout << "myCount = " << vertexValence << std::endl;  // prints 2
        std::cout << "meshCount = "<< mesh_.valence(vIterator)<< std::endl;  // prints 10
    }
}

価数は、メッシュの数とは異なります (std::cout を参照)。私は何かが欠けていることを知っています、誰でもエラーがどこにあるかを見ることができますか?

アップデート

次のコードを使用して動作させました

for(vIterator = vBegin; vIterator != vEnd; ++vIterator){
    vertexValence = 0;
    for (voIterator = mesh_.voh_iter(vIterator); voIterator; ++voIterator) {
        vertexValence++;
    }
    if(vIterator == vBegin){
        std::cout << "myCount = " << vertexValence << std::endl;
        std::cout << "openMeshCount = " << mesh_.valence(vIterator) << std::endl;
    }
}

これで両方の数値が一致しました。ただし、最初に配置したコードで同じことを実装できるかどうかを知りたいです。考え方は同じはずです。

4

1 に答える 1

2

あなたはこれを試してみるべきです:

for (vIterator = vBegin; vIterator != vEnd; ++vIterator) {
    vertexValence = 0;
    initialEdge = mesh_.halfedge_handle(vIterator.handle());
    nextEdge = initialEdge;

    do {
        vertexValence++;
        oppositeEdge = mesh_.opposite_halfedge_handle(nextEdge);
        nextEdge = mesh_.next_halfedge_handle(oppositeEdge);
    } while (initialEdge != nextEdge);
}

元の頂点に戻るには、反対側のハーフエッジを使用する必要があります。このページを見てください。ハーフエッジのデータ構造について簡単に説明しています。

于 2013-02-26T17:40:36.297 に答える