32eig3x3known0(
const double *M,
double *E,
double *sigma)
47 const double m1 = M[0];
48 const double m2 = M[1];
49 const double m3 = M[2];
50 const double m5 = M[3];
51 const double m6 = M[4];
52 const double m9 = M[5];
55 const double m2_sq = m2 * m2;
56 const double m1_plus_m5 = m1 + m5;
60 const double p1 = -m1_plus_m5 - m9;
64 const double p0 = -m2_sq - m3 * m3 - m6 * m6 + m1 * (m5 + m9) + m5 * m9;
69 reduced_quadratic_real_roots(p1, p0, &sigma1, &sigma2);
71 if (fabs(sigma1) > fabs(sigma2)) {
79 const double r1 = sigma[0];
80 const double r2 = sigma[1];
92 const double m1m5_minus_m2sq = m1 * m5 - m2_sq;
93 const double m2m6_minus_m3m5 = m2 * m6 - m3 * m5;
94 const double m2m3_minus_m1m6 = m2 * m3 - m1 * m6;
98 const double tmp1 = 1.0 / (r1 * (r1 - m1_plus_m5) + m1m5_minus_m2sq);
99 const double tmp2 = 1.0 / (r2 * (r2 - m1_plus_m5) + m1m5_minus_m2sq);
102 double a11 = (r1 * m3 + m2m6_minus_m3m5) * tmp1;
103 double a12 = (r1 * m6 + m2m3_minus_m1m6) * tmp1;
104 double a21 = (r2 * m3 + m2m6_minus_m3m5) * tmp2;
105 double a22 = (r2 * m6 + m2m3_minus_m1m6) * tmp2;
108 const double rnorm1 = 1.0 / sqrt(a11 * a11 + a12 * a12 + 1.0);
109 const double rnorm2 = 1.0 / sqrt(a21 * a21 + a22 * a22 + 1.0);
Quadratic root finder, specialized for P3P solving.