19 #include <vnl/vnl_least_squares_function.h>
20 #include <vnl/algo/vnl_svd.h>
21 #include <vnl/algo/vnl_rpoly_roots.h>
22 #include <vnl/algo/vnl_matrix_inverse.h>
23 #include <vnl/algo/vnl_matrix_inverse.h>
24 #include <vnl/algo/vnl_matrix_inverse.h>
25 #include <vnl/algo/vnl_matrix_inverse.h>
26 #include <vnl/algo/vnl_matrix_inverse.h>
27 #include <vnl/algo/vnl_matrix_inverse.h>
28 #include <vnl/algo/vnl_matrix_inverse.h>
29 #include <vnl/algo/vnl_matrix_inverse.h>
30 #include <vnl/algo/vnl_matrix_inverse.h>
31 #include <vnl/algo/vnl_matrix_inverse.h>
39 const std::vector<a_point> & cloud) :
43 void f(
const vnl_vector<double>& x, vnl_vector<double>& fx);
51 for (
int i = 0; i<9; i++)
54 for (
int i = 0; i< fx.size(); i++)
62 o <<
"****************" << std::endl;
63 o <<
"a_shape_quadric:" << std::endl;
64 o <<
"****************" << std::endl;
65 o <<
"This is a 'quadric' fitting class" << std::endl;
73 for (
short i=0;i<3;i++)
para_[i] = 1.;
74 for (
short i=3;i<9;i++)
para_[i] = 0.;
96 vnl_double_3 k(c.x(),c.y(),c.z());
97 double cp = dot_product(
b_,k)+dot_product(
A_*k,k)-1.;
111 const a_point & p4,
const a_point & p5,
const a_point & p6,
112 const a_point & p7,
const a_point & p8,
const a_point & p9)
115 p[0] = p1; p[1] = p2; p[2] = p3;
116 p[3] = p4; p[4] = p5; p[5] = p6;
117 p[6] = p7; p[7] = p8; p[8] = p9;
123 vnl_matrix<double> mat(9,9);
124 vnl_vector<double>
b(9);
125 for (
int i=0;i<9;i++)
127 double x =
pt[i].
x();
128 double y =
pt[i].
y();
129 double z =
pt[i].
z();
141 vnl_svd<double> svd(mat);
142 vnl_vector<double> x = svd.solve(
b);
143 for (
int i=0;i<9;i++)
153 vnl_vector<double> kn(
n-1);
159 for (
int i=1; i<
n; i++)
164 for (
int i=0; i<
n; i++)
168 if (k[i] < 1.e-6) k[i] = 0.;
173 for (
int i=1; i<
n; i++)
184 vnl_symmetric_eigensystem<double> eig(
A_.as_matrix());
186 d0_ = eig.get_eigenvalue(0);
187 d1_ = eig.get_eigenvalue(1);
188 d2_ = eig.get_eigenvalue(2);
224 vnl_double_3 alpha =
R_.transpose()*pt0;
225 vnl_double_3 beta =
R_.transpose()*
b_;
227 double a0 = alpha[0];
228 double a1 = alpha[1];
229 double a2 = alpha[2];
234 double c00 = a0*a0*
d0_;
235 double c01 = -2*a0*b0*
d0_;
236 double c02 = b0*b0*
d0_;
237 double c10 = a1*a1*
d1_;
238 double c11 = -2*a1*b1*
d1_;
239 double c12 = b1*b1*
d1_;
240 double c20 = a2*a2*
d2_;
241 double c21 = -2*a2*b2*
d2_;
242 double c22 = b2*b2*
d2_;
244 double d00 = c00*a00;
245 double d01 = c00*a01+c01*a00;
246 double d02 = c00*a02+c01*a01+c02*a00;
247 double d03 = c00*a03+c01*a02+c02*a01;
248 double d04 = c00*a04+c01*a03+c02*a02;
249 double d05 = c01*a04+c02*a03;
250 double d06 = c02*a04;
252 double d10 = c10*a10;
253 double d11 = c10*a11+c11*a10;
254 double d12 = c10*a12+c11*a11+c12*a10;
255 double d13 = c10*a13+c11*a12+c12*a11;
256 double d14 = c10*a14+c11*a13+c12*a12;
257 double d15 = c11*a14+c12*a13;
258 double d16 = c12*a14;
260 double d20 = c20*a20;
261 double d21 = c20*a21+c21*a20;
262 double d22 = c20*a22+c21*a21+c22*a20;
263 double d23 = c20*a23+c21*a22+c22*a21;
264 double d24 = c20*a24+c21*a23+c22*a22;
265 double d25 = c21*a24+c22*a23;
266 double d26 = c22*a24;
268 double dd0 = d00+d10+d20;
269 double dd1 = d01+d11+d21;
270 double dd2 = d02+d12+d22;
271 double dd3 = d03+d13+d23;
272 double dd4 = d04+d14+d24;
273 double dd5 = d05+d15+d25;
274 double dd6 = d06+d16+d26;
277 double e01 = 2*a0*b0*
d0_-b0*b0;
278 double e02 = -2*b0*b0*
d0_;
281 double e11 = 2*a1*b1*
d1_-b1*b1;
282 double e12 = -2*b1*b1*
d1_;
285 double e21 = 2*a2*b2*
d2_-b2*b2;
286 double e22 = -2*b2*b2*
d2_;
288 double f00 = e00*a00;
289 double f01 = e00*a01+e01*a00;
290 double f02 = e00*a02+e01*a01+e02*a00;
291 double f03 = e00*a03+e01*a02+e02*a01;
292 double f04 = e00*a04+e01*a03+e02*a02;
293 double f05 = e01*a04+e02*a03;
294 double f06 = e02*a04;
296 double f10 = e10*a10;
297 double f11 = e10*a11+e11*a10;
298 double f12 = e10*a12+e11*a11+e12*a10;
299 double f13 = e10*a13+e11*a12+e12*a11;
300 double f14 = e10*a14+e11*a13+e12*a12;
301 double f15 = e11*a14+e12*a13;
302 double f16 = e12*a14;
304 double f20 = e20*a20;
305 double f21 = e20*a21+e21*a20;
306 double f22 = e20*a22+e21*a21+e22*a20;
307 double f23 = e20*a23+e21*a22+e22*a21;
308 double f24 = e20*a24+e21*a23+e22*a22;
309 double f25 = e21*a24+e22*a23;
310 double f26 = e22*a24;
312 double f0 = f00+f10+f20;
313 double f1 = f01+f11+f21;
314 double f2 = f02+f12+f22;
315 double f3 = f03+f13+f23;
316 double f4 = f04+f14+f24;
317 double f5 = f05+f15+f25;
318 double f6 = f06+f16+f26;
325 double h1 = g0*a01+g1*a00;
326 double h2 = g0*a02+g1*a01+g2*a00;
327 double h3 = g0*a03+g1*a02+g2*a01;
328 double h4 = g0*a04+g1*a03+g2*a02;
329 double h5 = g1*a04+g2*a03;
332 vnl_vector<double> k(7);
340 vnl_vector<double> roots;
342 vnl_rpoly_roots poly(k2);
343 roots = poly.realroots();
344 vnl_double_3x3 I(0.);
350 for (
int i=0; i<roots.size(); i++)
352 vnl_svd<double> svd(I+2*roots(i)*
A_.as_matrix());
353 svd.zero_out_relative(1.e-6);
354 vnl_double_3 x = svd.solve(pt0-roots(i)*
b_.as_vector());
355 double li = (x-pt0).magnitude();
362 return a_point(x0(0),x0(1),x0(2));
367 vnl_svd<double> svd(
A_.as_matrix());
368 svd.zero_out_relative(1.e-6);
369 vnl_double_3 x = svd.solve(
b_.as_vector())/(-2.);
370 return a_point(x(0),x(1),x(2));
375 vnl_symmetric_eigensystem<double> eig(
Ap_.as_matrix());
376 double d0 = eig.get_eigenvalue(0);
377 double d1 = eig.get_eigenvalue(1);
378 double d2 = eig.get_eigenvalue(2);
379 return a_point(d2,d1,d0);
384 vnl_symmetric_eigensystem<double> eig(
Ap_.as_matrix());
385 vnl_double_3
n = eig.get_eigenvector(2);
386 return a_point(
n(0),
n(1),
n(2));
391 vnl_symmetric_eigensystem<double> eig(
Ap_.as_matrix());
392 vnl_double_3
n = eig.get_eigenvector(1);
393 return a_point(
n(0),
n(1),
n(2));
398 vnl_symmetric_eigensystem<double> eig(
Ap_.as_matrix());
399 vnl_double_3
n = eig.get_eigenvector(0);
400 return a_point(
n(0),
n(1),
n(2));
406 return (
pt-proj).norm();
414 std::cerr <<
"hint: ";
415 for (
int j=0; j<9; j++)
423 while ((k<j)&&(passed))
432 std::cerr << it <<
" ";
434 std::cerr << std::endl;
440 std::vector<a_point> pts2;
441 int cs0 = pts.size();
453 std::cout <<
"A:" << std::endl;
455 std::cout <<
"b:" << std::endl;
456 std::cout <<
b_ << std::endl;
457 std::cout <<
"center:" << std::endl;
458 std::cout << this->
center() << std::endl;
459 std::cout <<
"Ap:" << std::endl;
461 std::cout <<
"eigen values:" << std::endl;
463 std::cout <<
"eigen vectors:" << std::endl;
464 std::cout <<
"n1: " << this->
n1() << std::endl;
465 std::cout <<
"n2: " << this->
n2() << std::endl;
466 std::cout <<
"n3: " << this->
n3() << std::endl;
vnl_vector< double > clean_poly(vnl_vector< double > &k)
const std::vector< a_point > & cloud_
a_shape_quadric_function(a_shape_quadric &shape, const std::vector< a_point > &cloud)
void f(const vnl_vector< double > &x, vnl_vector< double > &fx)
a_point principals() const
void export_triangles(const unsigned int nseg, const std::vector< a_point > &pts) const
void fit_cloud(std::vector< a_point > &pts, short nl=1)
void random_hint(const std::vector< a_point > &pts)
static const std::string help()
virtual double dist_point(a_point p) const
virtual a_point closest_point(const a_point p) const
virtual void export_matrices() const
void export_points(const unsigned int nseg, const std::vector< a_point > &pts) const
virtual void p9pts(const a_point *pt)
vnl_vector< double > para_
void fit_cloud(const std::vector< a_point > &pts, vnl_least_squares_function &fn)
static const std::string help()
void para(const int i, const double val)
int best_fitting_cloud(const std::vector< a_point > &pts, std::vector< a_point > &pts2)