RSMesh 1.0.0
一个曲面重构的系统,输入为点云,输出为obj,stl等主流格式的网格文件,使用的方法为径向基函数插值,采取了并行优化、Intel-MKL等优化措施,支持百万级别的点云
载入中...
搜索中...
未找到
unisolvent_point_set.h
1//
2// Created by RainSure on 2024/1/22.
3//
4
5#ifndef RSMESH_UNISOLVENT_POINT_SET_H
6#define RSMESH_UNISOLVENT_POINT_SET_H
7
8#include "geometry/point3d.h"
9#include "polynomial/lagrange_basis.h"
10#include "polynomial/polynomial_basic_base.h"
11#include "types.h"
12#include <random>
13#include <set>
14#include <stdexcept>
15#include <vector>
16
17namespace rsmesh::polynomial {
19 static constexpr int kMaxTrial = 32;
20 public:
21 unisolvent_point_set(const geometry::vectors3d &points, int dimension, int degree) {
22 if(degree < 0) return;
23 auto n_points = points.rows();
24 auto n_poly_basis = polynomial_basis_base::basis_size(dimension, degree);
25
26 std::random_device rd;
27 std::mt19937 gen(rd());
28 std::uniform_int_distribution<index_t> dist(index_t{0}, n_points - 1);
29
30 std::set<index_t> set;
31 auto found = false;
32 auto trial = 0;
33 while(!found and trial < kMaxTrial) {
34 set.clear();
35
36 while(static_cast<index_t>(set.size()) < n_poly_basis) {
37 set.insert(dist(gen));
38 }
39
40 try {
41 lagrange_basis basis(dimension, degree,
42 points(std::vector<index_t>(begin(set), end(set)), Eigen::all));
43 found = true;
44 } catch (const std::domain_error&) {
45 // do nothing
46 }
47
48 trial ++;
49 }
50
51 if(!found and trial == kMaxTrial) {
52 throw std::runtime_error("Could not find a unisolvent set of points.");
53 }
54
55 point_idcs_.insert(begin(point_idcs_), begin(set), end(set));
56 }
57
58 [[nodiscard]] const std::vector<index_t>& point_indices() const {
59 return point_idcs_;
60 }
61
62 private:
63 std::vector<index_t> point_idcs_;
64 };
65}
66
67
68#endif //RSMESH_UNISOLVENT_POINT_SET_H
Eigen::Matrix< double, Eigen::Dynamic, 3, Eigen::RowMajor > vectors3d
3维向量的集合
Definition point3d.h:44
该命名空间下主要定义了多项式计算相关的类和函数