RSMesh 1.0.0
一个曲面重构的系统,输入为点云,输出为obj,stl等主流格式的网格文件,使用的方法为径向基函数插值,采取了并行优化、Intel-MKL等优化措施,支持百万级别的点云
载入中...
搜索中...
未找到
monomial_basis.h
1//
2// Created by RainSure on 2024/1/21.
3//
4
5#ifndef RSMESH_MONOMIAL_BASIS_H
6#define RSMESH_MONOMIAL_BASIS_H
7
8#include "common/macros.h"
9#include "geometry/point3d.h"
10#include "polynomial_basic_base.h"
11#include "types.h"
12#include "Eigen/Core"
13
14namespace rsmesh::polynomial {
16 public:
17 explicit monomial_basis(int dimension, int degree) : polynomial_basis_base(dimension, degree) {
18 RSMESH_ASSERT(degree >= 0 and degree <= 2);
19 }
20 template<class DerivedPoints>
21 Eigen::MatrixXd evaluate(const Eigen::MatrixBase<DerivedPoints>& points) const {
22 return evaluate(points, geometry::points3d(0, 3));
23 }
24
25 template<class DerivedPoints, class DerivedGradPoints>
26 Eigen::MatrixXd evaluate(const Eigen::MatrixBase<DerivedPoints> &points,
27 const Eigen::MatrixBase<DerivedGradPoints>& grad_points) const {
28 auto mu = points.rows();
29 auto sigma = grad_points.rows();
30 Eigen::MatrixXd result(basis_size(), mu + dimension() * sigma);
31 switch(dimension()) {
32 case 1:
33 switch(degree()) {
34 case 0:
35 for(index_t i = 0; i < mu; i ++) {
36 result(0, i) = 1.0; // 1
37 }
38 for(index_t i = 0; i < sigma; i ++) {
39 auto i_x = mu + i;
40 result(0, i_x) = 0.0; // 1_x
41 }
42 break;
43 case 1:
44 for(index_t i = 0; i < mu; i ++) {
45 auto p = points.row(i);
46 result(0, i) = 1.0; // 1
47 result(1, i) = p(0); // x
48 }
49 for(index_t i = 0; i < sigma; i ++) {
50 auto i_x = mu + i;
51 result(0, i_x) = 0.0; // 1_x
52 result(1, i_x) = 1.0; // x_x = 1
53 }
54 break;
55 case 2:
56 for(index_t i = 0; i < mu; i ++) {
57 auto p = points.row(i);
58 result(0, i) = 1.0; // 1
59 result(1, i) = p(0); // x
60 result(2, i) = p(0) * p(0); // x^2
61 }
62 for(index_t i = 0; i < sigma; i ++) {
63 auto i_x = i + mu;
64 auto p = grad_points.row(i);
65 result(0, i_x) = 0.0; // 1_x
66 result(1, i_x) = 1.0; // x_x
67 result(2, i_x) = 2.0 * p(0); // x^2_x
68 }
69 break;
70 default:
71 RSMESH_UNREACHABLE();
72 break;
73 }
74 break;
75 case 2:
76 switch(degree()) {
77 case 0:
78 for(index_t i = 0; i < mu; i ++) {
79 result(0, i) = 1.0; // 1
80 }
81 for(index_t i = 0; i < sigma; i ++) {
82 auto i_x = mu + 2 * i;
83 auto i_y = mu + 2 * i + 1;
84 result(0, i_x) = 0.0;
85 result(0, i_y) = 0.0;
86 }
87 break;
88 case 1:
89 for(index_t i =0 ; i < mu; i ++) {
90 auto p = points.row(i);
91 result(0, i) = 1.0; // 1
92 result(1, i) = p(0); // x
93 result(2, i) = p(1); // y
94 }
95 for(index_t i = 0; i < sigma; i ++) {
96 auto i_x = mu + 2 * i;
97 auto i_y = mu + 2 * i + 1;
98 result(0, i_x) = 0.0; // 1_x
99 result(0, i_y) = 0.0; // 1_y;
100 result(1, i_x) = 1.0; // x_x;
101 result(1, i_y) = 0.0; // x_y;
102 result(2, i_x) = 0.0; // y_x;
103 result(2, i_y) = 1.0; // y_y;
104 }
105 break;
106 case 2:
107 for(index_t i = 0; i < mu; i ++) {
108 auto p = points.row(i);
109 result(0, i) = 1.0; // 1
110 result(1, i) = p(0); // x
111 result(2, i) = p(1); // y
112 result(3, i) = p(0) * p(0); // x^2
113 result(4, i) = p(0) * p(1); // xy
114 result(5, i) = p(1) * p(1); // y*y
115 }
116 for(index_t i = 0; i < sigma; i ++) {
117 auto p = grad_points.row(i);
118 auto i_x = mu + 2 * i;
119 auto i_y = mu + 2 * i + 1;
120 result(0, i_x) = 0.0; // 1_x
121 result(0, i_y) = 0.0; // 1_y
122 result(1, i_x) = 1.0; // x_x
123 result(1, i_y) = 0.0; // x_y
124 result(2, i_x) = 0.0; // y_x
125 result(2, i_y) = 1.0; // y_y
126 result(3, i_x) = 2.0 * p(0); // x^2_x
127 result(3, i_y) = 0.0; // x^2_y
128 result(4, i_x) = p(1); // xy_x
129 result(4, i_y) = p(0); // xy_y
130 result(5, i_x) = 0.0; // y^2_x
131 result(5, i_y) = 2.0 * p(1); // y^2_y
132 }
133 break;
134 default:
135 RSMESH_UNREACHABLE();
136 break;
137 }
138 break;
139 case 3:
140 switch(degree()) {
141 case 0:
142 for(index_t i = 0; i < mu; i ++) {
143 result(0, i) = 1.0; // 1
144 }
145 for(index_t i = 0; i < sigma; i ++) {
146 auto i_x = mu + 3 * i;
147 auto i_y = mu + 3 * i + 1;
148 auto i_z = mu + 3 * i + 2;
149 result(0, i_x) = 0.0; // 1_x
150 result(0, i_y) = 0.0; // 1_y
151 result(0, i_z) = 0.0; // 1_z
152 }
153 break;
154 case 1:
155 for(index_t i = 0; i < mu; i ++) {
156 auto p = points.row(i);
157 result(0, i) = 1.0; // 1
158 result(1, i) = p(0); // x
159 result(2, i) = p(1); // y
160 result(3, i) = p(2); // z
161 }
162 for(index_t i = 0; i < sigma; i ++) {
163 auto i_x = mu + 3 * i;
164 auto i_y = mu + 3 * i + 1;
165 auto i_z = mu + 3 * i + 2;
166 result(0, i_x) = 0.0; // 1_x
167 result(0, i_y) = 0.0; // 1_y
168 result(0, i_z) = 0.0; // 1_z
169 result(1, i_x) = 1.0; // x_x
170 result(1, i_y) = 0.0; // x_y
171 result(1, i_z) = 0.0; // x_z
172 result(2, i_x) = 0.0; // y_x
173 result(2, i_y) = 1.0; // y_y
174 result(2, i_z) = 0.0; // y_z
175 result(3, i_x) = 0.0; // z_x
176 result(3, i_y) = 0.0; // z_y
177 result(3, i_z) = 1.0; // z_z
178 }
179 break;
180 case 2:
181 for(index_t i = 0; i < mu; i ++) {
182 auto p = points.row(i);
183 result(0, i) = 1.0; // 1
184 result(1, i) = p(0); // x
185 result(2, i) = p(1); // y
186 result(3, i) = p(2); // z
187 result(4, i) = p(0) * p(0); // x^2
188 result(5, i) = p(0) * p(1); // xy
189 result(6, i) = p(0) * p(2); // xz
190 result(7, i) = p(1) * p(1); // y^2
191 result(8, i) = p(1) * p(2); // yz
192 result(9, i) = p(2) * p(2); // z^2
193 }
194 for (index_t i = 0; i < sigma; i++) {
195 auto p = grad_points.row(i);
196 auto i_x = mu + 3 * i;
197 auto i_y = mu + 3 * i + 1;
198 auto i_z = mu + 3 * i + 2;
199 result(0, i_x) = 0.0; // 1_x
200 result(0, i_y) = 0.0; // 1_y
201 result(0, i_z) = 0.0; // 1_z
202 result(1, i_x) = 1.0; // x_x
203 result(1, i_y) = 0.0; // x_y
204 result(1, i_z) = 0.0; // x_z
205 result(2, i_x) = 0.0; // y_x
206 result(2, i_y) = 1.0; // y_y
207 result(2, i_z) = 0.0; // y_z
208 result(3, i_x) = 0.0; // z_x
209 result(3, i_y) = 0.0; // z_y
210 result(3, i_z) = 1.0; // z_z
211 result(4, i_x) = 2.0 * p(0); // x^2_x
212 result(4, i_y) = 0.0; // x^2_y
213 result(4, i_z) = 0.0; // x^2_z
214 result(5, i_x) = p(1); // xy_x
215 result(5, i_y) = p(0); // xy_y
216 result(5, i_z) = 0.0; // xy_z
217 result(6, i_x) = p(2); // xz_x
218 result(6, i_y) = 0.0; // xz_y
219 result(6, i_z) = p(0); // xz_z
220 result(7, i_x) = 0.0; // y^2_x
221 result(7, i_y) = 2.0 * p(1); // y^2_y
222 result(7, i_z) = 0.0; // y^2_z
223 result(8, i_x) = 0.0; // yz_x
224 result(8, i_y) = p(2); // yz_y
225 result(8, i_z) = p(1); // yz_z
226 result(9, i_x) = 0.0; // z^2_x
227 result(9, i_y) = 0.0; // z^2_y
228 result(9, i_z) = 2.0 * p(2); // z^2_z
229 }
230 break;
231 default:
232 RSMESH_UNREACHABLE();
233 break;
234 }
235 break;
236 default:
237 RSMESH_UNREACHABLE();
238 break;
239 }
240
241 return result;
242 }
243 };
244}
245
246#endif //RSMESH_MONOMIAL_BASIS_H
vectors3d points3d
3维点的集合
Definition point3d.h:48
该命名空间下主要定义了多项式计算相关的类和函数