RSMesh 1.0.0
一个曲面重构的系统,输入为点云,输出为obj,stl等主流格式的网格文件,使用的方法为径向基函数插值,采取了并行优化、Intel-MKL等优化措施,支持百万级别的点云
载入中...
搜索中...
未找到
rbf_evaluator.h
1//
2// Created by RainSure on 2024/2/12.
3//
4
5#ifndef RSMESH_RBF_EVALUATOR_H
6#define RSMESH_RBF_EVALUATOR_H
7
8#include "Eigen/Core"
9#include <memory>
10#include "common/macros.h"
11#include "fmm/fmm_evaluator.h"
12#include "fmm/fmm_tree_height.h"
13#include "geometry/bbox3d.h"
14#include "geometry/point3d.h"
15#include "model.h"
16#include "polynomial/monomial_basis.h"
17#include "polynomial/polynomial_evaluator.h"
18#include "types.h"
19
20namespace rsmesh::interpolation {
21 template<int Order = 10>
24 public:
25 rbf_evaluator(const model& model, const geometry::points3d& src_points) :
26 n_poly_basis_(model.poly_basis_size()) {
27 auto n_src_points = src_points.size();
28 auto bbox = geometry::bbox3d::from_points(src_points);
29 a_ = std::make_unique<fmm::fmm_evaluator<Order>>(model, fmm::fmm_tree_height(n_src_points), bbox);
30 if(n_poly_basis_ > 0) {
31 p_ = std::make_unique<PolynomialEvaluator>(model.poly_dimension(), model.poly_degree());
32 }
33 set_source_points(src_points);
34 }
35
36 rbf_evaluator(const model& model, const geometry::points3d& src_points, const geometry::bbox3d& bbox)
37 : n_poly_basis_(model.poly_basis_size()){
38 auto n_src_points = src_points.size();
39 a_ = std::make_unique<fmm::fmm_evaluator<Order>>(model, fmm::fmm_tree_height(n_src_points), bbox);
40 if(n_poly_basis_ > 0) {
41 p_ = std::make_unique<PolynomialEvaluator>(model.poly_dimension(), model.poly_degree());
42 }
43 set_source_points(src_points);
44 }
45
46 rbf_evaluator(const model& model, int tree_height, const geometry::bbox3d& bbox)
47 : n_poly_basis_(model.poly_basis_size()){
48 a_ = std::make_unique<fmm::fmm_evaluator<Order>>(model, tree_height, bbox);
49 if(n_poly_basis_ > 0) {
50 p_ = std::make_unique<PolynomialEvaluator>(model.poly_dimension(), model.poly_degree());
51 }
52 }
53
54 [[nodiscard]] valuesd evaluate() const {
55 auto y = a_->evaluate();
56
57 if(n_poly_basis_ > 0) {
58 // add polynomial terms.
59 y += p_->evaluate();
60 }
61 return y;
62 }
63
64 [[nodiscard]] valuesd evaluate(const geometry::points3d& points) const {
65 set_field_points(points);
66 return evaluate();
67 }
68
69 void set_field_points(const geometry::points3d& points) const {
70 a_->set_field_points(points);
71 if(n_poly_basis_ > 0) {
72 p_->set_field_points(points);
73 }
74 }
75
76 void set_source_points(const geometry::points3d& points) {
77 n_src_points_ = points.rows();
78
79 a_->set_source_points(points);
80 }
81
82 template<class Derived>
83 void set_weights(const Eigen::MatrixBase<Derived>& weights) {
84 RSMESH_ASSERT(weights.rows() == n_src_points_ + n_poly_basis_);
85
86 a_->set_weights(weights.head(n_src_points_));
87
88 if(n_poly_basis_ > 0) {
89 p_->set_weights(weights.tail(n_poly_basis_));
90 }
91 }
92
93 private:
94 const index_t n_poly_basis_;
95
96 index_t n_src_points_{};
97 std::unique_ptr<fmm::fmm_evaluator<Order>> a_;
98 std::unique_ptr<PolynomialEvaluator> p_;
99 };
100}
101
102#endif //RSMESH_RBF_EVALUATOR_H
描述了一个插值模型
Definition model.h:21
vectors3d points3d
3维点的集合
Definition point3d.h:48
该命名空间下主要定义了插值相关的类和函数