1.功能概述
使用Tools>Sand box (research)>compute kd-tree
访问此工具。
该功能可以用于论文写作中的KD树绘图。
2.完整操作
3.算法源码
static double s_kdTreeMaxErrorPerCell = 0.1;
void MainWindow::doActionComputeKdTree()
{
ccGenericPointCloud* cloud = nullptr;
if ( haveOneSelection() )
{
ccHObject* ent = m_selectedEntities.back();
bool lockedVertices;
cloud = ccHObjectCaster::ToGenericPointCloud(ent,&lockedVertices);
if (lockedVertices)
{
ccUtils::DisplayLockedVerticesWarning(ent->getName(),true);
return;
}
}
if (!cloud)
{
ccLog::Error("Selected one and only one point cloud or mesh!");
return;
}
bool ok;
s_kdTreeMaxErrorPerCell = QInputDialog::getDouble(this, "Compute Kd-tree", "Max error per leaf cell:", s_kdTreeMaxErrorPerCell, 1.0e-6, 1.0e6, 6, &ok);
if (!ok)
return;
ccProgressDialog pDlg(true, this);
//computation
QElapsedTimer eTimer;
eTimer.start();
ccKdTree* kdtree = new ccKdTree(cloud);
if (kdtree->build(s_kdTreeMaxErrorPerCell, CCLib::DistanceComputationTools::MAX_DIST_95_PERCENT, 4, 1000, &pDlg))
{
qint64 elapsedTime_ms = eTimer.elapsed();
ccConsole::Print("[doActionComputeKdTree] Timing: %2.3f s",static_cast<double>(elapsedTime_ms)/1.0e3);
cloud->setEnabled(true); //for mesh vertices!
cloud->addChild(kdtree);
kdtree->setDisplay(cloud->getDisplay());
kdtree->setVisible(true);
kdtree->prepareDisplayForRefresh();
#ifdef QT_DEBUG
kdtree->convertCellIndexToSF();
#else
kdtree->convertCellIndexToRandomColor();
#endif
addToDB(kdtree);
refreshAll();
updateUI();
}
else
{
ccLog::Error("An error occurred!");
delete kdtree;
kdtree = nullptr;
}
}
4.相关代码
[1] C++代码: PCL KD树的使用
[2] python代码: Open3D KDTree的使用
[3] matlab代码:matlab KD树的使用