MPA網格化算法思路
第一步:初始化一個種子三角面。(隨機選點,基於該點進行臨近搜索到第二點;在基於該線段中點臨近搜索到第三點)
圖1
第二步:在種子三角面的基礎上,進行面片的擴充,利用邊的中點進行臨近搜索,碰到合適的點,就會跟這條邊構成一個新的三角面,同時構造出兩條新邊。依次類推… 直到隊列中不再有滿足條件外邊提供中點檢索為止。
第三步:尋找新的種子三角面,進行第二步;直到再也無法找到合適的種子三角面,退出循環。
第四步:輸出mesh,包含生成三角面,以及原始點雲。
圖2
主要算法實現:
for (size_t i = 0; i < num; i+=10) { if (point_vect[i].size()>0) { continue; } PointType searchPoint = cloud_ptr->points[i]; initializeTriangle(searchPoint); //第一步 初始化一個種子三角面 while (true) { if (edge_queue.empty()) { //std::cout << "MPA::initializeTriangle() failed ..." << std::endl; break; } PCTTM_Edge search_edge = edge_queue.front(); bool bad_edge = false; for (size_t i = 0; i < point_vect[search_edge.p_index_first].size(); i++) { if (point_vect[search_edge.p_index_first][i].p_index == search_edge.p_index_end && point_vect[search_edge.p_index_first][i].ptp_relation == 2) { bad_edge = true; } } if (bad_edge) { edge_queue.pop(); continue; } searchPointMPA(search_edge, 5); //第二步 搜索點 擴展邊 edge_queue.pop(); } }
實現結果:
17萬個點,構建了32.7萬個面,目前用時26.774秒。