2016-10-20 10 views
0

Я легко тесселировал две параметрические 3D поверхности (обе выпуклые поверхности).Я не могу триангулировать обычное облако точек

Эти два мозаичных параметрические поверхности:

enter image description here

Теперь мое намерение состоит в том, чтобы присоединиться как в один твердый. Но я получить это:

enter image description here enter image description here

Я использую Qhull для создания триангуляции Делоне, и кажется, что хорошо работает на 1-й выпуклой поверхности, но не для задней поверхности. :(

Это мой текущий код (детали взяты из Zivs)

#include "Qhull.h" 

using namespace orgQhull; 

void myQhull::Qhull::runQhull3D(const pcl::PCLPointCloud2& pointCloud, const char* args) 
{ 
    std::cout << "runQhull vertices" << std::endl; 
    numVertices = 0; 
    std::stringstream verticesSS; 
    m_externalPoints = new PointCoordinates(3,""); //3 = dimension 
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); 
    pcl::fromPCLPointCloud2(pointCloud, *cloud); 
    std::vector<double> allPoints; 

    for (unsigned int i = 0; i < cloud->size(); i++) { 
     allPoints.push_back(cloud->at(i).x); 
     allPoints.push_back(cloud->at(i).y); 
     allPoints.push_back(cloud->at(i).z); 
     verticesSS << cloud->at(i).x << " " << cloud->at(i).y << " " << cloud->at(i).z << "\n"; 
     numVertices++; 
    } 
    vertices += verticesSS.str(); 


    m_externalPoints->append(allPoints); //convert to vector<double> 
    runQhull(*m_externalPoints, args); 
} 


void myQhull::Qhull::runQhull(const PointCoordinates &points, const char *qhullCommand2) 
{ 
    std::string triangles; 
    std::stringstream ss; 
    numSimplices = 0; 
    int numFaces = 0; 

    std::cout << numVertices << std::endl; 
    std::cout << "runQhull facets" << std::endl; 

    orgQhull::Qhull qHull(points.comment().c_str(), points.dimension(), points.count(), &*points.coordinates(), qhullCommand2); 
    QhullFacetList facets = qHull.facetList(); 
    for (QhullFacetList::iterator it = facets.begin(); it != facets.end(); ++it) 
    { 
     if (!(*it).isGood()) continue; 
     QhullFacet f = *it; 
     QhullVertexSet vSet = f.vertices(); 
     auto coord = f.hyperplane().coordinates(); 

     numFaces = vSet.size(); 

     ss << numFaces; 
     for (QhullVertexSet::iterator vIt = vSet.begin(); vIt != vSet.end(); ++vIt) 
     { 
      QhullVertex v = *vIt; 
      QhullPoint p = v.point(); 
      double * coords = p.coordinates(); 
      ss << " " << p.id() << " "; 
     } 
     ss << "\n"; 
     numSimplices++; 


    } 

    simplices += ss.str(); 
    std::cout << numSimplices << std::endl; 

} 

void myQhull::Qhull::saveOff(std::string file) 
{ 
    std::cout << "Saving qhull.off" << std::endl; 
    std::ofstream offFile; 
    offFile.open(file); 

    offFile << "OFF\n"; 
    offFile << numVertices << " " << numSimplices << " 0"; 
    offFile << vertices; 
    offFile << simplices; 
    offFile.close(); 

} 


void myQhull::Qhull::run(const pcl::PCLPointCloud2& pointCloud) 
{ 
    Qhull qhull; 
    qhull.runQhull3D(pointCloud, "Qt"); 
    qhull.saveOff("qhull.off"); 

} 

Кроме того, я использовал greedy_projection из OpenCV, но без какого-либо успеха. Он способен выполнить только двух поверхностей тесселяции без присоединения к ним.

Любая идея, почему это происходит?

ответ

0

Наконец я нашел решение. Добавление «D», чтобы qhull.runQhull3D(pointCloud, "d Qt") формирует правильную триангуляции Делоне для верхней и Lowe r поверхность. Поэтому, поскольку они являются регулярными сетками, я вручную создаю грани, соединяющие вершины с двух поверхностей. Спасибо.