2016-02-09 2 views
0

Я пытаюсь использовать провисание для загрузки сеток, чтобы обнаруживать не-манифольдные и открытые (граничные) ребра. Я использую индексы вершин, которые я получаю из обрезки, чтобы установить отношения между вершинами, ребрами и гранями. У меня есть класс лица, который выглядит, как этоИспользование противовеса для загрузки сеток и обнаружение в них краев и неадминирующих краев

#include "Face2.h" 

Face2::Face2() 
{ 
} 

Face2::Face2(std::vector<unsigned int> indices) 
{ 
    m_indices = indices; 
} 

bool Face2::containsEdge(const Edge2 &edge) 
{ 
// for(unsigned int i = 0; i < m_indices.size(); i++) 
// { 
//  if(edge.getStartIndex() == m_indices[i]){ 
//   for(unsigned int i = 0; i < m_indices.size(); i++) 
//   { 
//    edge.getEndIndex() == m_indices[i] 
//   } 

//  } 
// } 
    for(unsigned int i = 0; i < m_indices.size(); i++) 
    { 
     if(edge.getStartIndex() == m_indices[i]) 
     { 
      for(unsigned int j = 0; j < m_indices.size(); j++) 
      { 
       if(edge.getEndIndex() == m_indices[j]) return true; 
      } 
     } 
    } 
    return false; 
} 

std::vector<unsigned int> Face2::getIndices() const 
{ 
    return m_indices; 
} 

void Face2::setIndices(const std::vector<unsigned int> &indices) 
{ 
    m_indices = indices; 
} 

мой край класс в основном только структура данных, которая содержит начальный индекс Эджа и конечный индекс. Моего класс сетки содержит зЬй :: вектора граней и станд :: вектора кромок, которые получают населенный, как это:

for(unsigned int i = 0; i < m_indices.size()-1; i+=2) 
    { 
     m_edges2.push_back(Edge2(m_indices[i], m_indices[i])); 
    } 

    for(unsigned int i = 0; i < m_indices.size()-1; i+=3) 
    { 
     std::vector<unsigned int> faceData; 
     faceData.push_back(m_indices[i]); 
     faceData.push_back(m_indices[i+1]); 
     faceData.push_back(m_indices[i+2]); 
     m_faces2.push_back(Face2(faceData)); 
    } 

моя главная функция имеет следующий код:

std::cout << "Number of edges2: " << m->getEdges2().size() << std::endl; 
    std::cout << "Number of faces2: " << m->getFaces2().size() << std::endl; 
    std::cout << "finished " << std::endl; 

    unsigned int nonManif = 0; 
    unsigned int boundary = 0; 

    for(unsigned int i = 0; i < m->getEdges2().size(); i++) 
    { 
     unsigned int edgeCount = 0; 
     for(unsigned int j = 0; j < m->getFaces2().size(); j++) 
     { 
      if(m->getFaces2().at(j).containsEdge(m->getEdges2().at(i))) 
      { 
       edgeCount++; 
      } 
     } 

     std::cout << "Edge#" << i << " occurences: " << edgeCount << std::endl; 
     if(edgeCount > 2) nonManif++; 
     else if(edgeCount < 2) boundary++; 
    } 

    std::cout << "Non-Manifold: " << nonManif << std::endl; 
    std::cout << "Boundary: " << boundary << std::endl; 

я получаю право количество ребер и граней из этого. Как бы то ни было, количество граничных ребер сильно отличается от того, что я получаю от meshlab для той же модели. и количество краев не многообразия всегда 0.

Является ли это что-то не так, я делаю, или это их лучший способ?

ответ

1

Я думаю, что есть ошибка здесь:

m_edges2.push_back(Edge2(m_indices[i], m_indices[i])); 

Я предполагаю, что это должно быть:

m_edges2.push_back(Edge2(m_indices[i], m_indices[i + 1])); 

Закрепление это может решить вашу проблему

Существует также другая ошибка в создании граней цикл с верхней итерационной границей, которая может вызвать UB. Это должно быть:

i < m_indices.size()-2 
+0

Это, к сожалению, не решило, но это, безусловно, шаг в правильном направлении. Однако, поскольку все сетки, которые я загружаю, триангулированы, не следует ли также добавлять кромку каждые три индекса между первым и последним индексами? Я думаю, что попробую и посмотрю, какие результаты я получу –

Смежные вопросы