/* See {hr2_pmap_opt_generic.h}. */ /* Last edited on 2024-09-05 20:27:35 by stolfi */ #define _GNU_SOURCE #include #include #include #include #include #include #include void hr2_pmap_encode_generic(hr2_pmap_t *M, double y[]) { int32_t k = 0; for (int32_t i = 0; i < 3; i++) { for (int32_t j = 0; j < 3; j++) { y[k] = M->dir.c[i][j]; k++; } } assert(k == 9); double det = r3x3_det(&(M->dir)); if (det < 0) { for (int32_t j = 0; j < 3; j++) { double tmp = y[3+j]; y[3+j] = y[6+j]; y[6+j] = tmp; } } } void hr2_pmap_decode_generic(double y[], sign_t sgn, hr2_pmap_t *M) { int32_t k = 0; for (int32_t i = 0; i < 3; i++) { for (int32_t j = 0; j < 3; j++) { M->dir.c[i][j] = y[k]; k++; } } assert(k == 9); double det = r3x3_det(&(M->dir)); if (sgn*det < 0) { for (int32_t j = 0; j < 3; j++) { double tmp = M->dir.c[1][j]; M->dir.c[1][j] = M->dir.c[2][j]; M->dir.c[2][j] = tmp; } } r3x3_inv(&(M->dir), &(M->inv)); }