if (argparser_keyword_present(pp, "-matrix")) { /* Parse the nine entries of the projective matrix, row order: */ r3x3_t A; int i, j; for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { A.c[i][j] = argparser_get_next_double(pp, -BIG, +BIG); } } o->M.dir = A; r3x3_inv(&A, &(o->M.inv)); } else if (argparser_keyword_present(pp, "-points")) { hr2_point_t ip[4], op[4]; /* Parse the four input points {ip[0..3]}: */ int i; for (i = 0; i < 4; i++) { ip[i].c.c[0] = 1.0; ip[i].c.c[1] = argparser_get_next_double(pp, -BIG, +BIG); ip[i].c.c[2] = argparser_get_next_double(pp, -BIG, +BIG); } /* Parse the four output points {op[0..3]}: */ for (i = 0; i < 4; i++) { op[i].c.c[0] = 1.0; op[i].c.c[1] = argparser_get_next_double(pp, -BIG, +BIG); op[i].c.c[2] = argparser_get_next_double(pp, -BIG, +BIG); } hr2_pmap_t IM = hr2_pmap_from_four_points(&(ip[0]), &(ip[1]), &(ip[2]), &(ip[3])); hr2_pmap_t OM = hr2_pmap_from_four_points(&(op[0]), &(op[1]), &(op[2]), &(op[3])); r3x3_mul(&(IM.inv), &(OM.dir), &(o->M.dir)); r3x3_mul(&(OM.inv), &(IM.dir), &(o->M.inv)); } else { r3x3_ident(&(o->M.dir)); r3x3_ident(&(o->M.inv)); } /* ---------------------------------------------------------------------- */