python — я не могу триангулировать обычное облако точек

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

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

введите описание изображения здесь

Теперь я намерен объединить оба в одно тело. Но я получаю это:

введите описание изображения здесь
введите описание изображения здесь

Я использую 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") генерирует правильную триангуляцию Делоне для верхней и нижней поверхности.
Поэтому, поскольку они являются регулярными сетками, я вручную создаю ребро, соединяющее вершины из двух поверхностей.
Спасибо.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]