RSMesh 1.0.0
一个曲面重构的系统,输入为点云,输出为obj,stl等主流格式的网格文件,使用的方法为径向基函数插值,采取了并行优化、Intel-MKL等优化措施,支持百万级别的点云
载入中...
搜索中...
未找到
rbf_direct_evaluator.cpp
1//
2// Created by RainSure on 2024/2/3.
3//
4#include"interpolation/rbf_direct_evaluator.h"
5#include"numeric/sum_accumulator.h"
6
7namespace rsmesh::interpolation {
8 rbf_direct_evaluator::rbf_direct_evaluator(const model& model, const geometry::points3d& source_points
9 , const geometry::points3d& source_grad_points)
10 : model_(model), dim_(model.poly_dimension()), l_(model.poly_basis_size()),
11 mu_(source_points.rows()), sigma_(source_grad_points.rows()), src_points_(source_points), src_grad_points_(source_grad_points) {
12 if(l_ > 0) {
13 p_ = std::make_unique<PolynomialEvaluator>(model.poly_dimension(), model.poly_degree());
14 }
15 }
16
17 rbf_direct_evaluator::rbf_direct_evaluator(const rsmesh::model &model, const geometry::points3d &source_points) :
18 rbf_direct_evaluator(model, source_points, geometry::points3d(0, 3)) {
19
20 }
21
22 valuesd rbf_direct_evaluator::evaluate() const {
23 auto y_accm = std::vector<numeric::sum_accumulator<double>>(n_fld_points_);
24
25 auto weights = weights_.head(mu_);
26 auto grad_weights = weights_.segment(mu_, dim_ * sigma_).reshaped<Eigen::RowMajor>(sigma_, dim_);
27
28 const auto& rbf = model_.rbf();
29 for(index_t i = 0; i < n_fld_points_; i ++) {
30 for(index_t j = 0; j < mu_; j ++) {
31 y_accm.at(i) += weights[j] * rbf.evaluate(fld_points_.row(i) - src_points_.row(j));
32 }
33 for(index_t j = 0; j < sigma_; j ++) {
34 y_accm.at(i) += grad_weights.row(j).dot(
35 -rbf.evaluate_gradient(fld_points_.row(i) - src_points_.row(j)).head(dim_)
36 );
37 }
38 }
39 if(l_ > 0) {
40 // Add polynomial terms
41 auto poly_val = p_->evaluate();
42 for(index_t i = 0; i < n_fld_points_; i ++) {
43 y_accm.at(i) += poly_val(i);
44 }
45 }
46
47 valuesd y(n_fld_points_);
48 for(index_t i = 0; i < n_fld_points_; i ++) {
49 y(i) = y_accm.at(i).get();
50 }
51 return y;
52 }
53
54 void rbf_direct_evaluator::set_field_points(const geometry::points3d &field_points) {
55 n_fld_points_ = static_cast<index_t>(field_points.rows());
56 fld_points_ = field_points;
57 if(l_ > 0) {
58 p_->set_field_points(fld_points_);
59 }
60 }
61}
描述了一个插值模型
Definition model.h:21
vectors3d points3d
3维点的集合
Definition point3d.h:48
该命名空间下主要定义了插值相关的类和函数