2013-02-24 41 views
1

這是我第一次使用OpenMesh,我正在嘗試做一個非常簡單的函數來計算網格中所有頂點的化合價。計算網格的頂點化合價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 
    } 
} 

的價數是從什麼的絲網目數(見性病::法院)不同。我知道我錯過了一些東西,誰能看到錯誤在哪裏?

UPDATE

我做它通過使用下面的代碼

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; 
    } 
} 

現在,這兩個號碼相匹配的工作。不過,我想知道是否可以在我放入的第一個代碼中實現相同的功能。這個想法應該是一樣的。

回答

1

你應該試試這個:

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); 
} 

你必須使用相反的半邊回到原來的頂點,看看this page,有半邊數據結構的簡要說明。

+0

是的,我剛剛意識到我正在用我的第一個代碼繞過一個三角形。感謝這一點,我認爲我的第二個代碼背後有類似的東西。 – BRabbit27 2013-02-26 18:59:59