RSMesh 1.0.0
一个曲面重构的系统,输入为点云,输出为obj,stl等主流格式的网格文件,使用的方法为径向基函数插值,采取了并行优化、Intel-MKL等优化措施,支持百万级别的点云
载入中...
搜索中...
未找到
lagrange_basis.h
1//
2// Created by RainSure on 2024/1/21.
3//
4
5#ifndef RSMESH_LAGRANGE_BASIS_H
6#define RSMESH_LAGRANGE_BASIS_H
7
8#include "Eigen/Core"
9#include "Eigen/LU"
10#include "Eigen/SVD"
11#include "common/macros.h"
12#include "geometry/point3d.h"
13#include "polynomial/monomial_basis.h"
14#include "polynomial/polynomial_basic_base.h"
15#include "types.h"
16#include <stdexcept>
17
22namespace rsmesh::polynomial {
24 static constexpr double kRcondThreshold = 1e-10; // 用于判断奇异矩阵的阈值
25
26 public:
27 template<class Derived>
28 lagrange_basis(int dimension, int degree, const Eigen::MatrixBase<Derived>& points) :
29 polynomial_basis_base(dimension, degree), mono_basis_(dimension, degree) {
30 RSMESH_ASSERT(points.rows() == basis_size());
31
32 Eigen::MatrixXd p = mono_basis_.evaluate(points).transpose();
33
34 if(!is_invertible(p)) {
35 throw std::domain_error("The set of points is not unisolvent.");
36 }
37
38 coeffs_ = p.fullPivLu().inverse();
39 }
40
41 template<class Derived>
42 Eigen::MatrixXd evaluate(const Eigen::MatrixBase<Derived>& points) const {
43 return evaluate(points, geometry::points3d(0, 3));
44 }
45
46 template<class DerivedPoints, class DerivedGradPoints>
47 Eigen::MatrixXd evaluate(const Eigen::MatrixBase<DerivedGradPoints> &points,
48 const Eigen::MatrixBase<DerivedPoints> &grad_points) const {
49 auto pt = mono_basis_.evaluate(points, grad_points);
50
51 return coeffs_.transpose() * pt;
52 }
53
54 private:
55 static bool is_invertible(const Eigen::MatrixXd& m) {
56 auto svd = m.jacobiSvd();
57 const auto& sigmas = svd.singularValues();
58 if(sigmas(0) == 0.0) {
59 return false;
60 }
61
62 auto rcond = sigmas(sigmas.rows() - 1) / sigmas(0);
63 return rcond >= kRcondThreshold;
64 }
65 monomial_basis mono_basis_;
66
67 Eigen::MatrixXd coeffs_;
68 };
69}// namespace rsmesh::polynomial
70
71#endif //RSMESH_LAGRANGE_BASIS_H
vectors3d points3d
3维点的集合
Definition point3d.h:48
该命名空间下主要定义了多项式计算相关的类和函数