Я пытаюсь использовать провисание для загрузки сеток, чтобы обнаруживать не-манифольдные и открытые (граничные) ребра. Я использую индексы вершин, которые я получаю из обрезки, чтобы установить отношения между вершинами, ребрами и гранями. У меня есть класс лица, который выглядит, как этоИспользование противовеса для загрузки сеток и обнаружение в них краев и неадминирующих краев
#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.
Является ли это что-то не так, я делаю, или это их лучший способ?
Это, к сожалению, не решило, но это, безусловно, шаг в правильном направлении. Однако, поскольку все сетки, которые я загружаю, триангулированы, не следует ли также добавлять кромку каждые три индекса между первым и последним индексами? Я думаю, что попробую и посмотрю, какие результаты я получу –