35 {n[0], m[0], n[1] * m[2] - n[2] * m[1], n[1], m[1], n[2] * m[0] - n[0] * m[2], \
36 n[2], m[2], n[0] * m[1] - n[1] * m[0]}
38#define VEC3_DOT(x, y) (x[0] * y[0] + x[1] * y[1] + x[2] * y[2])
39#define VEC3_SCALE(a, x) {a * x[0], a * x[1], a * x[2]}
40#define VEC3_SUB(x, y) {x[0] - y[0], x[1] - y[1], x[2] - y[2]}
47lambdatwist_p3p(
const double *iny1,
56 double y1[3], y2[3], y3[3];
58 memcpy(y1, iny1,
sizeof(y1));
59 memcpy(y2, iny2,
sizeof(y2));
60 memcpy(y3, iny3,
sizeof(y3));
70 const double dx12[3] = VEC3_SUB(x1, x2);
71 const double dx13[3] = VEC3_SUB(x1, x3);
72 const double dx23[3] = VEC3_SUB(x2, x3);
75 const double a12 = VEC3_DOT(dx12, dx12);
76 const double a13 = VEC3_DOT(dx13, dx13);
77 const double a23 = VEC3_DOT(dx23, dx23);
80 const double b12 = VEC3_DOT(y1, y2);
81 const double b13 = VEC3_DOT(y1, y3);
82 const double b23 = VEC3_DOT(y2, y3);
123 const double a23b123 = 2.0 * a23 * (b12 * b13 * b23 - 1.0);
124 const double s12_sq = 1.0 - b12 * b12;
125 const double s13_sq = 1.0 - b13 * b13;
126 const double s23_sq = 1.0 - b23 * b23;
128 const double c3 = a13 * (a13 * s23_sq - a23 * s13_sq);
129 const double c2 = a23 * (a23 - a12) * s13_sq + a13 * (a23b123 + (2.0 * a12 + a13) * s23_sq);
130 const double c1 = a23 * (a23 - a13) * s12_sq + a12 * (a23b123 + (2.0 * a13 + a12) * s23_sq);
131 const double c0 = a12 * (a12 * s23_sq - a23 * s12_sq);
137 const double gamma = reduced_cubic_real_root(c2 / c3, c1 / c3, c0 / c3);
148 const double D0_00 = a23 + gamma * a23;
149 const double D0_01 = -a23 * b12;
150 const double D0_02 = -gamma * a23 * b13;
151 const double D0_11 = a23 - a12 - gamma * a13;
152 const double D0_12 = (a12 + gamma * a13) * b23;
153 const double D0_22 = -a12 + gamma * (a23 - a13);
154 const double D0[6] = {
155 D0_00, D0_01, D0_02, D0_11, D0_12, D0_22,
162 eig3x3known0(D0, E, sigma);
165 const double v = sqrt(-sigma[1] / sigma[0]);
174 double s,
tmp, w0, w1, a, b, c, tau1, tau2;
177 tmp = 1.0 / (s * E[1] - E[0]);
178 w0 = (E[3] - s * E[4]) *
tmp;
179 w1 = (E[6] - s * E[7]) *
tmp;
186 a = (a13 - a12) * w1 * w1 + 2.0 * a12 * b13 * w1 - a12;
187 b = -2.0 * (a13 * b12 * w1 - a12 * b13 * w0 + w0 * w1 * (a12 - a13));
188 c = a13 + (a13 - a12) * w0 * w0 - 2.0 * a13 * b12 * w0;
193 if (quadratic_real_roots(a, b, c, &tau1, &tau2)) {
199#define COMPUTE_LAMBDA(tau) \
207 const double tmp = (tau) * (-2.0 * b23 + (tau)) + 1.0; \
208 const double l2 = sqrt(a23 / tmp); \
210 const double l3 = (tau) * l2; \
212 const double l1 = w0 * l2 + w1 * l3; \
220 COMPUTE_LAMBDA(tau1);
221 COMPUTE_LAMBDA(tau2);
227 tmp = 1.0 / (s * E[1] - E[0]);
228 w0 = (E[3] - s * E[4]) *
tmp;
229 w1 = (E[6] - s * E[7]) *
tmp;
230 a = (a13 - a12) * w1 * w1 + 2.0 * a12 * b13 * w1 - a12;
231 b = -2.0 * (a13 * b12 * w1 - a12 * b13 * w0 + w0 * w1 * (a12 - a13));
232 c = a13 + (a13 - a12) * w0 * w0 - 2.0 * a13 * b12 * w0;
233 if (quadratic_real_roots(a, b, c, &tau1, &tau2)) {
234 COMPUTE_LAMBDA(tau1);
235 COMPUTE_LAMBDA(tau2);
239 double X[9] = MIX(dx12, dx13);
244 for (k = 0; k < valid; k++) {
246 gauss_newton_refineL(L[k], a12, a13, a23, b12, b13, b23);
248 const double l1 = L[k][0], l2 = L[k][1], l3 = L[k][2];
249 const double l1y1[3] = VEC3_SCALE(l1, y1);
250 const double dly12[3] = VEC3_SUB(l1y1, l2 * y2);
251 const double dly13[3] = VEC3_SUB(l1y1, l3 * y3);
254 const double Y[9] = MIX(dly12, dly13);
257 mat3_mul(R[k], Y, X);
261 mat3vec3_mul(Rx1, R[k], x1);
262 vec3_sub(t[k], l1y1, Rx1);
Cubic root finder, specialized for P3P solving.
Eigenvalue solver for 3x3 symmetric matrices with known zero eigenvalue, specialized for P3P solving.
Matrix operations, specialized for P3P solving.
Quadratic root finder, specialized for P3P solving.
Gauss-Newton refinement of Λ, specialized for P3P solving.
Definition comp_scratch.c:130
Vector subtraction and normalization, specialized for P3P solving.