RSMesh 1.0.0
一个曲面重构的系统,输入为点云,输出为obj,stl等主流格式的网格文件,使用的方法为径向基函数插值,采取了并行优化、Intel-MKL等优化措施,支持百万级别的点云
载入中...
搜索中...
未找到
distance_filter.cpp
1//
2// Created by RainSure on 2023/11/1.
3//
4
5#include "point_cloud/distance_filter.h"
6#include "point_cloud/kdtree.h"
7#include <set>
8#include <tuple>
9
10namespace rsmesh {
11 namespace point_cloud {
12
13 distance_filter::distance_filter(const geometry::points3d &points, double distance) :
14 distance_filter(points, distance, trivial_indices(static_cast<index_t >(points.rows()))) {
15
16 }
17
18 distance_filter::distance_filter(const geometry::points3d &points, double distance,
19 const std::vector<index_t> &indices) : n_points_(static_cast<index_t >(points.rows())) {
20 if (distance <= 0.0) {
21 throw std::invalid_argument("distance_threshold must be greater than 0.0");
22 }
23
24 kdtree tree(points, true);
25
26 std::vector<index_t> nn_indices;
27 std::vector<double> nn_distances;
28 std::set<index_t> indices_to_remove;
29
30 for (auto i : indices) {
31 if(indices_to_remove.find(i) != indices_to_remove.end()) continue;
32
33 geometry::points3d p = points.row(i);
34 std::tie(nn_indices, nn_distances) = tree.radius_search(p, distance);
35
36 for(auto j : nn_indices) {
37 if(j != i) {
38 indices_to_remove.insert(j);
39 }
40 }
41 }
42
43 for(auto i : indices) {
44 if(indices_to_remove.find(i) == indices_to_remove.end()) {
45 filtered_indices_.push_back(i);
46 }
47 }
48 }
49 } // rsmesh
50} // point_cloud
vectors3d points3d
3维点的集合
Definition point3d.h:48
本系统的主命名空间,包含了common, examples, fmm, geometry, numeric, point_cloud等子命名空间