26 double d = a->
data[0];
45 for (
int i = 0; i < n_points; i++) {
51 for (
int i = 0; i < n_points; i++) {
52 p_res[i] =
matd_op(
"M-M", p[i], p_mean);
58 for (
int i = 0; i < n_points; i++) {
69 double prev_error = HUGE_VAL;
71 for (
int i = 0; i < n_steps; i++) {
74 for (
int j = 0; j < n_points; j++) {
75 matd_t* M2_update =
matd_op(
"(M - M)*M*M", F[j], I3, *R, p[j]);
87 for (
int j = 0; j < n_points; j++) {
88 q[j] =
matd_op(
"M*(M*M+M)", F[j], *R, p[j], *t);
94 for (
int j = 0; j < n_points; j++) {
95 matd_t *M3_update =
matd_op(
"(M-M)*M'", q[j], q_mean, p_res[j]);
102 *R =
matd_op(
"M*M'", M3_svd.
U, M3_svd.
V);
113 for (
int j = 0; j < n_points; j++) {
118 for (
int j = 0; j < 4; j++) {
119 matd_t* err_vec =
matd_op(
"(M-M)(MM+M)", I3, F[j], *R, p[j], *t);
130 for (
int i = 0; i < n_points; i++) {
143 double polyval(
double* p,
int degree,
double x) {
145 for (
int i = 0; i <= degree; i++) {
146 ret += p[i]*pow(x, i);
161 static const int MAX_ROOT = 1000;
163 if (fabs(p[0]) > MAX_ROOT*fabs(p[1])) {
166 roots[0] = -p[0]/p[1];
173 double *p_der = malloc(
sizeof(
double)*degree);
174 for (
int i = 0; i < degree; i++) {
175 p_der[i] = (i + 1) * p[i+1];
178 double *der_roots = malloc(
sizeof(
double)*(degree - 1));
185 for (
int i = 0; i <= n_der_roots; i++) {
190 min = der_roots[i - 1];
194 if (i == n_der_roots) {
213 double root = 0.5*(lower + upper);
214 double dx_old = upper - lower;
216 double f =
polyval(p, degree, root);
217 double df =
polyval(p_der, degree - 1, root);
219 for (
int j = 0; j < 100; j++) {
220 if (((f + df*(upper - root))*(f + df*(lower - root)) > 0)
221 || (fabs(2*f) > fabs(dx_old*df))) {
223 dx = 0.5*(upper - lower);
231 if (root == upper || root == lower) {
236 df =
polyval(p_der, degree - 1, root);
245 roots[(*n_roots)++] = root;
246 }
else if(
polyval(p, degree, max) == 0) {
248 roots[(*n_roots)++] = max;
267 matd_t* R_t_1_tmp =
matd_op(
"M-(M'*M)*M", e_x, e_x, R_t_3, R_t_3);
284 double r31 =
MATD_EL(R_1_prime, 2, 0);
285 double r32 =
MATD_EL(R_1_prime, 2, 1);
286 double hypotenuse = sqrt(r31*r31 + r32*r32);
287 if (hypotenuse < 1e-100) {
293 r31/hypotenuse, -r32/hypotenuse, 0,
294 r32/hypotenuse, r31/hypotenuse, 0,
299 double sin_gamma = -
MATD_EL(R_trans, 0, 1);
300 double cos_gamma =
MATD_EL(R_trans, 1, 1);
302 cos_gamma, -sin_gamma, 0,
303 sin_gamma, cos_gamma, 0,
306 double sin_beta = -
MATD_EL(R_trans, 2, 0);
307 double cos_beta =
MATD_EL(R_trans, 2, 2);
308 double t_initial = atan2(sin_beta, cos_beta);
315 for (
int i = 0; i < n_points; i++) {
316 p_trans[i] =
matd_op(
"M'*M", R_z, p[i]);
317 v_trans[i] =
matd_op(
"M*M", R_t, v[i]);
338 for (
int i = 0; i < n_points; i++) {
339 matd_t* op_tmp1 =
matd_op(
"(M-M)MM", F_trans[i], I3, R_gamma, p_trans[i]);
340 matd_t* op_tmp2 =
matd_op(
"(M-M)MMM", F_trans[i], I3, R_gamma, M1, p_trans[i]);
341 matd_t* op_tmp3 =
matd_op(
"(M-M)MMM", F_trans[i], I3, R_gamma, M2, p_trans[i]);
360 for (
int i = 0; i < n_points; i++) {
361 matd_t* c0 =
matd_op(
"(M-M)(MM+M)", I3, F_trans[i], R_gamma, p_trans[i], b0_);
362 matd_t* c1 =
matd_op(
"(M-M)(MMM+M)", I3, F_trans[i], R_gamma, M1, p_trans[i], b1_);
363 matd_t* c2 =
matd_op(
"(M-M)(MMM+M)", I3, F_trans[i], R_gamma, M2, p_trans[i], b2_);
383 for (
int i = 0; i < n_points; i++) {
397 double p1 = 2*a2 - 4*a0;
398 double p2 = 3*a3 - 3*a1;
399 double p3 = 4*a4 - 2*a2;
408 for (
int i = 0; i < n_roots; i++) {
409 double t1 = roots[i];
415 if (a2 - 2*a0 + (3*a3 - 6*a1)*t1 + (6*a4 - 8*a2 + 10*a0)*t2 + (-8*a3 + 6*a1)*t3 + (-6*a4 + 3*a2)*t4 + a3*t5 >= 0) {
417 double t_cur = 2*atan(roots[i]);
420 if (fabs(t_cur - t_initial) > 0.1) {
421 minima[n_minima++] = roots[i];
429 double t_cur = minima[0];
436 ret =
matd_op(
"M'MMM'", R_t, R_gamma, R_beta, R_z);
438 }
else if (n_minima > 1) {
440 debug_print(
"Error, more than one new minimum found.\n");
456 double scale = info->
tagsize/2.0;
474 for (
int i = 0; i < 3; i++) {
475 for (
int j = 0; j < 3; j++) {
481 for (
int i = 0; i < 3; i++) {
497 double scale = info->
tagsize/2.0;
504 for (
int i = 0; i < 4; i++) {
506 (info->
det->
p[i][0] - info->
cx)/info->
fx, (info->
det->
p[i][1] - info->
cy)/info->
fy, 1});
519 for (
int i = 0; i < 4; i++) {