RSMesh 1.0.0
一个曲面重构的系统,输入为点云,输出为obj,stl等主流格式的网格文件,使用的方法为径向基函数插值,采取了并行优化、Intel-MKL等优化措施,支持百万级别的点云
载入中...
搜索中...
未找到
rbf_base.h
1//
2// Created by RainSure on 2024/1/31.
3//
4
5#ifndef RSMESH_RBF_BASE_H
6#define RSMESH_RBF_BASE_H
7
8#include<memory>
9#include"geometry/point3d.h"
10#include<stdexcept>
11#include<string>
12#include<vector>
13
14namespace rsmesh::rbf{
15 class rbf_base {
16 protected:
17 using matrix3d = geometry::matrix3d;
18 using vector3d = geometry::vector3d;
19
20 public:
21 virtual ~rbf_base() = default;
22
23 rbf_base(rbf_base&&) = delete;
24 rbf_base& operator=(const rbf_base&) = delete;
25 rbf_base& operator=(rbf_base&&) = delete;
26
27 [[nodiscard]] const geometry::linear_transformation3d& anisotropy() const {
28 return aniso_;
29 }
30
31 [[nodiscard]] virtual std::unique_ptr<rbf_base> clone() const = 0;
32
33 [[nodiscard]] virtual int cpd_order() const = 0;
34
35 [[nodiscard]] double evaluate(const vector3d& diff) const {
36 auto a_diff = geometry::transform_vector(aniso_, diff);
37 return evaluate_isotropic(a_diff);
38 }
39
40 [[nodiscard]] vector3d evaluate_gradient(const vector3d& diff) const {
41 auto a_diff = geometry::transform_vector(aniso_, diff);
42 return evaluate_gradient_isotropic(a_diff);
43 }
44
45 [[nodiscard]] matrix3d evaluate_hessian(const vector3d& diff) const {
46 auto a_diff = geometry::transform_vector(aniso_, diff);
47 return aniso_.transpose() * evaluate_hessian_isotropic(a_diff) * aniso_;
48 }
49
50 [[nodiscard]] virtual double evaluate_isotropic(const vector3d& diff) const = 0;
51
52 [[nodiscard]] virtual vector3d evaluate_gradient_isotropic(const vector3d& diff) const = 0;
53
54 [[nodiscard]] virtual matrix3d evaluate_hessian_isotropic(const vector3d& diff) const = 0;
55
56 [[nodiscard]] virtual int num_parameters() const = 0;
57
58 [[nodiscard]] virtual const std::vector<double>& parameter_lower_bounds() const = 0;
59
60 [[nodiscard]] virtual const std::vector<double>& parameter_upper_bounds() const = 0;
61
62 [[nodiscard]] const std::vector<double>& parameters() const {return params_;}
63
64 void set_anisotropy(const geometry::linear_transformation3d& aniso) {
65 if(aniso.determinant() <= 0.0) {
66 throw std::invalid_argument("aniso must have a position determinant");
67 }
68
69 aniso_ = aniso;
70 }
71
72 void set_parameters(const std::vector<double>& params) {
73 if(static_cast<int>(params.size()) != num_parameters()) {
74 throw std::invalid_argument("params.size() must have " + std::to_string(num_parameters()) + " elements.");
75 }
76 params_ = params;
77 }
78 protected:
79 rbf_base() : aniso_(geometry::linear_transformation3d::Identity()) {}
80
81 rbf_base(const rbf_base&) = default;
82
83 private:
84 std::vector<double> params_;
86 };
87} // rsmesh::rbf
88
89#endif //RSMESH_RBF_BASE_H
vector3d transform_vector(const linear_transformation3d &lhs, const vector3d &v)
对一个三维向量进行线性变换
Definition point3d.h:87
Eigen::Matrix< double, 3, 3, Eigen::RowMajor > linear_transformation3d
线性变换矩阵
Definition point3d.h:53
Eigen::RowVector3d vector3d
3维向量
Definition point3d.h:30
Eigen::Matrix< double, 3, 3, Eigen::RowMajor > matrix3d
3维矩阵
Definition point3d.h:34
该命名空间下主要定义了径向基函数相关的类和函数