/* See {hr2_pmap_opt_similarity.h}. */ /* Last edited on 2024-09-05 13:47:48 by stolfi */ #define _GNU_SOURCE #include #include #include #include #include #include #include #include void hr2_pmap_encode_similarity(hr2_pmap_t *M, double y[]) { double A00 = M->dir.c[0][0]; y[0] = M->dir.c[0][1] / A00; y[1] = M->dir.c[0][2] / A00; y[2] = M->dir.c[1][1] / A00; y[3] = M->dir.c[1][2] / A00; } void hr2_pmap_decode_similarity(double y[], sign_t sgn, hr2_pmap_t *M) { M->dir.c[0][0] = 1.00; M->dir.c[0][1] = y[0]; M->dir.c[0][2] = y[1]; M->dir.c[1][0] = 0.00; M->dir.c[1][1] = y[2]; M->dir.c[1][2] = y[3]; M->dir.c[2][0] = 0.0; if (sgn > 0) { M->dir.c[2][1] = - M->dir.c[1][2]; M->dir.c[2][2] = + M->dir.c[1][1]; } else { M->dir.c[2][1] = + M->dir.c[1][2]; M->dir.c[2][2] = - M->dir.c[1][1]; } r3x3_inv(&(M->dir), &(M->inv)); /* Just in case: */ M->inv.c[1][0] = 0.0; M->inv.c[2][0] = 0.0; }