RSMesh 1.0.0
一个曲面重构的系统,输入为点云,输出为obj,stl等主流格式的网格文件,使用的方法为径向基函数插值,采取了并行优化、Intel-MKL等优化措施,支持百万级别的点云
载入中...
搜索中...
未找到
biharmonic2d.h
1//
2// Created by RainSure on 2024/2/22.
3//
4
5#ifndef RSMESH_BIHARMONIC2D_H
6#define RSMESH_BIHARMONIC2D_H
7
8#include "rbf_base.h"
9
14namespace rsmesh::rbf {
15 class biharmonic2d final : public rbf_base {
16 public:
17 using rbf_base::rbf_base;
18
19 explicit biharmonic2d(const std::vector<double>& params) {
20 set_parameters(params);
21 }
22
23 [[nodiscard]] std::unique_ptr<rbf_base> clone() const override {
24 return std::make_unique<biharmonic2d>(*this);
25 }
26
27 [[nodiscard]] int cpd_order() const override {
28 return 2;
29 }
30
31 [[nodiscard]] double evaluate_isotropic(const vector3d& diff) const override {
32 auto slope = parameters().at(0);
33 auto r = diff.norm();
34
35 if(r == 0.0) {
36 return 0.0;
37 }
38 return slope * r * r * std::log(r);
39 }
40
41 [[nodiscard]] vector3d evaluate_gradient_isotropic(const vector3d& diff) const override {
42 auto slope = parameters().at(0);
43 auto r = diff.norm();
44
45 if(r == 0.0) {
46 return vector3d::Zero();
47 }
48
49 auto coeff = slope * (1.0 + 2.0 * std::log(r));
50 return coeff * diff;
51 }
52
53 [[nodiscard]] matrix3d evaluate_hessian_isotropic(const vector3d& ) const override {
54 throw std::runtime_error("Hessian of biharmonic2d is not implemented");
55 }
56
57 [[nodiscard]] int num_parameters() const override {
58 return 1;
59 }
60
61 [[nodiscard]] const std::vector<double>& parameter_lower_bounds() const override {
62 static const std::vector<double> lower_bounds{0.0};
63 return lower_bounds;
64 }
65
66 [[nodiscard]] const std::vector<double>& parameter_upper_bounds() const override {
67 static const std::vector<double> upper_bounds{std::numeric_limits<double>::infinity()};
68 return upper_bounds;
69 }
70 };
71
72} // namespace rsmesh::rbf
73
74#endif //RSMESH_BIHARMONIC2D_H
该命名空间下主要定义了径向基函数相关的类和函数